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