224 lines
5.9 KiB
Bash
224 lines
5.9 KiB
Bash
#!/bin/bash
|
|
# Havoc C2 Framework installer with EDR evasion features
|
|
|
|
set -e
|
|
TEMP_DIR=$(mktemp -d)
|
|
LOG_FILE="/root/Tools/havoc_installer.log"
|
|
HAVOC_DIR="/root/Tools/havoc"
|
|
HAVOC_DATA_DIR="/root/Tools/havoc/data"
|
|
HAVOC_VERSION="0.5.0"
|
|
HAVOC_GITHUB="https://github.com/HavocFramework/Havoc"
|
|
GO_VERSION="1.19"
|
|
|
|
# Function to log messages
|
|
log() {
|
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a $LOG_FILE
|
|
}
|
|
|
|
# Function to generate random strings
|
|
random_string() {
|
|
local length=${1:-8}
|
|
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $length | head -n 1
|
|
}
|
|
|
|
# Install required dependencies
|
|
log "Installing dependencies..."
|
|
apt-get update >/dev/null 2>&1
|
|
apt-get install -y git golang-go make build-essential mingw-w64 nasm cmake \
|
|
ninja-build python3-pip libfontconfig1 libglu1-mesa-dev libgtest-dev \
|
|
libspdlog-dev libboost-all-dev libncurses5-dev libgdbm-dev libssl-dev \
|
|
libreadline-dev libffi-dev libsqlite3-dev libbz2-dev mesa-common-dev \
|
|
qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5websockets5 \
|
|
libqt5websockets5-dev >/dev/null 2>&1
|
|
|
|
# Setup Go environment
|
|
log "Setting up Go environment..."
|
|
mkdir -p /root/go
|
|
export GOPATH=/root/go
|
|
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
|
|
|
|
# Clone Havoc repository
|
|
log "Cloning Havoc repository..."
|
|
if [ -d "$HAVOC_DIR" ]; then
|
|
log "Havoc directory already exists, updating..."
|
|
cd $HAVOC_DIR
|
|
git pull
|
|
else
|
|
git clone --quiet $HAVOC_GITHUB $HAVOC_DIR
|
|
cd $HAVOC_DIR
|
|
fi
|
|
|
|
# Generate unique identifiers for EDR evasion
|
|
RANDOMIZED_BUILD_ID=$(random_string 16)
|
|
log "Using randomized build ID: $RANDOMIZED_BUILD_ID"
|
|
|
|
# Build Havoc teamserver
|
|
log "Building Havoc teamserver..."
|
|
cd $HAVOC_DIR/Teamserver
|
|
go mod download
|
|
sed -i "s/const Version = \".*\"/const Version = \"${HAVOC_VERSION}-${RANDOMIZED_BUILD_ID}\"/" pkg/common/metadata.go
|
|
make
|
|
|
|
# Build Havoc client
|
|
log "Building Havoc client..."
|
|
cd $HAVOC_DIR/Client
|
|
mkdir -p build
|
|
cd build
|
|
cmake -GNinja ..
|
|
ninja
|
|
|
|
# Generate self-signed SSL certificates for Teamserver
|
|
mkdir -p $HAVOC_DATA_DIR/certs
|
|
cd $HAVOC_DATA_DIR/certs
|
|
|
|
if [ ! -f havoc.key ] || [ ! -f havoc.crt ]; then
|
|
log "Generating self-signed SSL certificates..."
|
|
|
|
# Generate random values for certificate
|
|
COUNTRY="US"
|
|
STATE=$(random_string 8)
|
|
LOCALITY=$(random_string 8)
|
|
ORGANIZATION=$(random_string 10)
|
|
COMMON_NAME=$(random_string 12).com
|
|
|
|
# Create OpenSSL config
|
|
cat > openssl.cnf << EOF
|
|
[req]
|
|
distinguished_name = req_distinguished_name
|
|
x509_extensions = v3_req
|
|
prompt = no
|
|
|
|
[req_distinguished_name]
|
|
C = $COUNTRY
|
|
ST = $STATE
|
|
L = $LOCALITY
|
|
O = $ORGANIZATION
|
|
CN = $COMMON_NAME
|
|
|
|
[v3_req]
|
|
keyUsage = critical, digitalSignature, keyAgreement
|
|
extendedKeyUsage = serverAuth
|
|
subjectAltName = @alt_names
|
|
|
|
[alt_names]
|
|
DNS.1 = $COMMON_NAME
|
|
DNS.2 = localhost
|
|
EOF
|
|
|
|
# Generate certificate
|
|
openssl req -x509 -newkey rsa:4096 -keyout havoc.key -out havoc.crt -days 3650 -nodes -config openssl.cnf
|
|
chmod 600 havoc.key
|
|
chmod 644 havoc.crt
|
|
|
|
log "Generated SSL certificates with CN=$COMMON_NAME"
|
|
fi
|
|
|
|
# Create systemd service for Havoc Teamserver
|
|
log "Creating systemd service for Havoc Teamserver..."
|
|
cat > /etc/systemd/system/havoc.service << EOF
|
|
[Unit]
|
|
Description=Havoc C2 Teamserver
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
Group=root
|
|
WorkingDirectory=$HAVOC_DIR/Teamserver
|
|
ExecStart=$HAVOC_DIR/Teamserver/teamserver server --profile $HAVOC_DATA_DIR/profiles/default.yaotl
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
# Security measures
|
|
PrivateTmp=true
|
|
ProtectHome=false
|
|
NoNewPrivileges=true
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Create default Havoc profile directory
|
|
mkdir -p $HAVOC_DATA_DIR/profiles
|
|
|
|
# Create default Havoc profile
|
|
log "Creating default Havoc profile..."
|
|
cat > $HAVOC_DATA_DIR/profiles/default.yaotl << EOF
|
|
Teamserver {
|
|
Host = "0.0.0.0"
|
|
Port = 40056
|
|
|
|
Build {
|
|
Compiler64 = "/usr/bin/x86_64-w64-mingw32-gcc"
|
|
Compiler86 = "/usr/bin/i686-w64-mingw32-gcc"
|
|
Nasm = "/usr/bin/nasm"
|
|
}
|
|
}
|
|
|
|
Operators {
|
|
admin {
|
|
Password = "$(random_string 12)"
|
|
}
|
|
}
|
|
|
|
Listeners {
|
|
http {
|
|
Name = "http"
|
|
KillDate = "2030-01-01"
|
|
WorkingHours = "0:00-23:59"
|
|
Hosts = ["0.0.0.0"]
|
|
HostBind = "0.0.0.0"
|
|
HostRotation = "round-robin"
|
|
Port = 8080
|
|
PortBind = 8080
|
|
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
|
|
Headers = ["Accept: */*"]
|
|
Uris = ["/api/v1", "/dashboard"]
|
|
Secure = false
|
|
}
|
|
|
|
https {
|
|
Name = "https"
|
|
KillDate = "2030-01-01"
|
|
WorkingHours = "0:00-23:59"
|
|
Hosts = ["0.0.0.0"]
|
|
HostBind = "0.0.0.0"
|
|
HostRotation = "round-robin"
|
|
Port = 443
|
|
PortBind = 443
|
|
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
|
|
Headers = ["Accept: */*"]
|
|
Uris = ["/api/v2", "/content"]
|
|
Secure = true
|
|
Cert = "$HAVOC_DATA_DIR/certs/havoc.crt"
|
|
Key = "$HAVOC_DATA_DIR/certs/havoc.key"
|
|
}
|
|
}
|
|
|
|
Demon {
|
|
Sleep = 2
|
|
SleepJitter = 50
|
|
|
|
Injection {
|
|
Spawn64 = "C:\\Windows\\System32\\notepad.exe"
|
|
Spawn32 = "C:\\Windows\\SysWOW64\\notepad.exe"
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Set proper permissions
|
|
log "Setting proper permissions..."
|
|
chmod 755 $HAVOC_DIR/Teamserver/teamserver
|
|
chmod 755 $HAVOC_DIR/Client/havoc
|
|
|
|
# Create symlinks to executables in /usr/local/bin
|
|
ln -sf $HAVOC_DIR/Teamserver/teamserver /usr/local/bin/havoc-teamserver
|
|
ln -sf $HAVOC_DIR/Client/havoc /usr/local/bin/havoc-client
|
|
|
|
# Enable and start Havoc service
|
|
log "Enabling and starting Havoc service..."
|
|
systemctl daemon-reload
|
|
systemctl enable havoc
|
|
systemctl start havoc
|
|
|
|
log "Havoc C2 installation completed!" |