PENTEST EN LA VIDA REAL - Setup del LAB y Fase de Reconocimiento
Lanzamiento de VM de Google Cloud ☁️
Instalación de gcloud cli
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates gnupg curl
curl [https://packages.cloud.google.com/apt/doc/apt-key.gpg](https://packages.cloud.google.com/apt/doc/apt-key.gpg) | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] [https://packages.cloud.google.com/apt](https://packages.cloud.google.com/apt) cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
sudo apt-get update && sudo apt-get install google-cloud-cli
Iniciamos sesión en la cuenta donde tengamos la prueba gratuita habilitada:
gcloud init
Lanzamos la máquina:
gcloud compute instances create lehack-lab \
--zone=europe-southwest1-a \
--machine-type=n2-standard-8 \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud \
--boot-disk-size=200GB \
--boot-disk-type=pd-ssd \
--enable-nested-virtualization \
--metadata=ssh-keys="username:public key"
Para generar una clave pública:
ssh-keygen -t rsa -b 4096
Para encender la máquina:
gcloud compute instances start lehack-lab --zone=europe-southwest1-a
Para apagar la máquina
gcloud compute instances stop lehack-lab --zone=europe-southwest1-a
Instalación del LAB 🧪
🔗 https://github.com/Pennyw0rth/NetExec-Lab/blob/main/LeHack-2025/docs/install_with_virtualbox.md
# Deshabilitar característica de virtualización de KVM para que funcione
sudo rmmod kvm_intel
sudo rmmod kvm
# Actualizamos los paquetes
sudo apt update && sudo apt upgrade -y
# Instalamos virtualbox
wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo gpg --dearmor --yes --output /usr/share/keyrings/oracle-virtualbox-2016.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] https://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
sudo apt-get update
sudo apt install virtualbox-7.0 -y
#Tocamos Ciertas configutaciones para que vb funcione
sudo apt install -y build-essential dkms linux-headers-$(uname -r)
sudo /sbin/vboxconfig
#Instalamamos vagrant (nos sirve para crear las vms rápidamente)
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt install vagrant
# Instalamos ciertos plugins
vagrant plugin install winrm
vagrant plugin install winrm-fs
vagrant plugin install winrm-elevated
# Ruby
sudo snap install ruby --classic
sudo gem install winrm winrm-fs winrm-elevated
# Ansible nos va a servir para inyectarle las configuraciones vulnerables
sudo apt install ansible
git clone https://github.com/Pennyw0rth/NetExec-Lab.git
cd NetExec-Lab/LeHack-2025/
ansible-galaxy install -r ansible/requirements.yml
# Levantamos las máquinas, esto le va a costar un buen rato, lo que recomiendo es hacerlo en una tmux
cd ~/NetExec-Lab/LeHack-2025/ad/LEHACK/providers/virtualbox
vagrant up
# Le metemos las configuraciones vulnerables a los labs con ansible
cd NetExec-Lab/LeHack-2025/ansible
export ANSIBLE_COMMAND="ansible-playbook -i ../ad/LEHACK/data/inventory -i ../ad/LEHACK/providers/virtualbox/inventory.yml"
export LAB="LEHACK"
cd NetExec-Lab/LeHack-2025/scripts
#Este comando le va a costar como 1:30 horas
chmod +x provisionning.sh
./provisionning.sh
ansible-playbook -i ../ad/LEHACK/providers/virtualbox/inventory_disablevagrant.yml disable_vagrant.yml
ansible-playbook -i ../ad/LEHACK/providers/virtualbox/inventory_disablevagrant.yml reboot.yml rebootsrv01.yml
Instalación de Herramientas necesarias 🔧
NetExec:
sudo apt install pipx git
pipx ensurepath
pipx install git+https://github.com/Pennyw0rth/NetExec
source /home/user/.bashrc
Nmap y ARPscan:
sudo apt install nmap arp-scan
Gobuster y httpx:
curl -OL https://go.dev/dl/go1.26.2.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.26.2.linux-amd64.tar.gz
nano /home/m0b/.bashrc
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$(go env GOPATH)/bin
source /home/m0b/.bashrc
go install github.com/OJ/gobuster/v3@latest
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
Scripts que menciono en el vídeo ⭐️
manageLab.sh
#!/bin/bash
# Lista de nuestras máquinas del laboratorio
VMS=("LEHACK-DC01" "LEHACK-DC02" "LEHACK-SRV01" "LEHACK-SRV02")
TOTAL_VMS=${#VMS[@]}
# Si la opción es "on"
if [ "$1" == "on" ]; then
echo "[+] Encendiendo el laboratorio de forma silenciosa (headless)..."
for vm in "${VMS[@]}"; do
VBoxManage startvm "$vm" --type headless
done
echo "[*] Monitorizando el arranque..."
while true; do
# Mostramos la lista actual
echo "--------------------------------------"
VBoxManage list runningvms
# Contamos cuántas máquinas LEHACK están encendidas
RUNNING=$(VBoxManage list runningvms | grep -c "LEHACK")
if [ "$RUNNING" -ge "$TOTAL_VMS" ]; then
echo "--------------------------------------"
echo "[+] ¡El laboratorio está 100% operativo!"
break
fi
sleep 2 # Pausa de 2 segundos para no saturar la CPU con consultas
done
# Si la opción es "off"
elif [ "$1" == "off" ]; then
echo "[-] Apagando el laboratorio de forma segura (ACPI)..."
for vm in "${VMS[@]}"; do
VBoxManage controlvm "$vm" acpipowerbutton
done
echo "[*] Monitorizando el apagado..."
while true; do
# Mostramos la lista actual
echo "--------------------------------------"
VBoxManage list runningvms
# Contamos cuántas máquinas LEHACK siguen encendidas
RUNNING=$(VBoxManage list runningvms | grep -c "LEHACK")
if [ "$RUNNING" -eq 0 ]; then
echo "--------------------------------------"
echo "[+] ¡Todas las máquinas virtuales se han apagado!"
break
fi
sleep 2
done
echo "[!] Apagando el sistema host en 5 segundos..."
sleep 5
sudo shutdown -h now
# Si el usuario no pone nada o se equivoca
else
echo "Uso incorrecto."
echo "Para encender: ./lab_control.sh on"
echo "Para apagar: ./lab_control.sh off"
exit 1
fi
multi_nmap.sh
#!/bin/bash
# Comprobar si se pasó el objetivo como argumento
if [ $# -ne 1 ]; then
echo "Uso: $0 <IP | rango_CIDR | archivo_con_IPs>"
echo "Ejemplo 1 (Rango): $0 10.86.4.0/24"
echo "Ejemplo 2 (Una IP): $0 192.168.1.50"
echo "Ejemplo 3 (Archivo): $0 objetivos.txt"
exit 1
fi
INPUT="$1"
# Determinar si la entrada es un archivo que existe, o una IP/Rango
if [ -f "$INPUT" ]; then
echo "[+] Archivo detectado. Cargando IPs desde: $INPUT"
TARGET="-iL $INPUT"
else
echo "[+] IP o Rango detectado: $INPUT"
TARGET="$INPUT"
fi
# Top 100 puertos más comunes (TCP)
ports=(20 21 22 23 25 53 67 68 69 80 88 110 111 123 137 138 139 143 161 162 179 194 443 445 465 514 515 520 546 547 587 631 636 989 990 993 995 1080 1194 1433 1434 1521 1723 1812 1813 2049 2082 2083 2086 2087 2095 2096 3306 3389 3690 4060 4444 5432 5500 5900 6000 6001 6002 6003 6004 6005 6379 6667 7000 7001 8080 8443 8888 9000 9090 10000 11211 27017 28017 50000 49152 49153 49154 49155 49156 49157)
echo ""
echo "=== Escaneo de puertos comunes ==="
for port in "${ports[@]}"; do
echo "[*] Escaneando puerto $port ..."
sudo nmap -p $port $TARGET -sS --open -oG - | awk "/${port}\/open/ {print \$2}" > "${port}.txt"
# Si el archivo está vacío (-s comprueba si tiene contenido), lo eliminamos
if [ ! -s "${port}.txt" ]; then
rm -f "${port}.txt"
fi
done
echo "[-] Escaneo de puertos comunes completado."
echo ""
# Puertos web más comunes
web_ports=(80 443 8080 8443 8000 8888 9090 3000 5000)
echo "=== Escaneo de puertos web comunes ==="
for port in "${web_ports[@]}"; do
echo "[*] Escaneando puerto web $port ..."
sudo nmap -p $port $TARGET -sS --open -oG - | awk "/${port}\/open/ {print \$2}" > "${port}.txt"
# Misma limpieza para los puertos web
if [ ! -s "${port}.txt" ]; then
rm -f "${port}.txt"
fi
done
echo "[-] Escaneo de puertos web completado."
echo ""
# Generar urls.txt con las IPs encontradas
echo "=== Generando urls.txt ==="
> urls.txt # limpiar archivo si existe
for port in "${web_ports[@]}"; do
# Como hemos borrado los vacíos, solo procesamos si el archivo existe (-f)
if [ -f "${port}.txt" ]; then
# Asignar HTTPS si es 443 o 8443, de lo contrario usar HTTP
if [ "$port" == "443" ] || [ "$port" == "8443" ]; then
protocol="https"
else
protocol="http"
fi
# Escribir en el archivo urls.txt
awk "{print \"$protocol://\"\$0\":$port\"}" "${port}.txt" >> urls.txt
fi
done
echo "[+] Archivo urls.txt generado con éxito."