Secciones
1. ¿Qué es Footprinting?
El footprinting es la fase inicial de cualquier prueba de seguridad (o pentest), donde recopilamos tanta información como sea posible sobre el objetivo, sin interactuar directamente con los sistemas (pasivo) o realizando sondas mínimas (activo). Pensad en ello como planear una expedición: no vamos a cavar sin criterio, sino a estudiar mapas, rutas y recursos.
Objetivo: Mapear la infraestructura de la víctima para descubrir dominios, subdominios, rangos IP, servicios activos y arquitecturas internas.
2. Principios Fundamentales de la Enumeración
Antes de lanzarnos a las herramientas, debemos interiorizar algunas preguntas guía:
- ¿Qué vemos?
- ¿Qué no vemos?
- ¿Cómo podemos aprovechar lo visible?
- ¿Qué pistas oculta lo invisible?
Estos principios nos mantienen atentos tanto a la superficie como a lo que subyace, evitando centrarnos solo en lo obvio.
3. Metodología en Seis Capas
Dividimos el footprinting en tres grandes bloques—infraestructura, hosts y sistema operativo—pero, para orientarnos, lo estructuramos en seis capas:
Capa | Objetivo |
---|---|
1. Presencia en Internet | Dominios, subdominios, ASN, IPs, seguridad frontal. |
2. Puerta de Enlace | Firewalls, WAF, VPN, proxys. |
3. Servicios Accesibles | Identificar puertos, versiones, configuraciones. |
4. Procesos | Flujos de datos, dependencias de procesos. |
5. Privilegios | Usuarios, grupos, permisos en servicios. |
6. Configuración SO | Versiones, parches, archivos de configuración. |
En este post nos centraremos en la enumeración basada en infraestructura y en la enumeración basada en host.
4. Enumeración Basada en Infraestructura
4.1. Información de Dominio y Subdominios
- Transparencia de Certificados Extraemos detalles de certificados públicos para descubrir subdominios:
curl -s "https://crt.sh/?q=ejemplo.com&output=json" | jq .
Explicación: Esto devuelve un JSON con cada certificado emitido, incluyendo common_name
y name_value
, valioso para listar subdominios .
- Filtrar subdominios únicos:
curl -s "https://crt.sh/?q=ejemplo.com&output=json" | jq . | grep name_value | cut -d":" -f2 | tr -d '\" ' | sort -u
Explicación: Tras obtener el JSON, extraemos valores limpios y únicos .
- Resolución de hosts:
for host in $(cat subdomains.txt);do
host $host | grep "has address" | awk '{print $1, $4}'
done
Explicación: Asocia cada subdominio con su IP, filtrando solo los alojados internamente.
- Shodan Automático
for ip in $(cut -d' ' -f2 hosts.txt); do
shodan host $ip;
done
Explicación: Detalla servicios y puertos expuestos, perfecto para IoT y sistemas integrados .
- Registros DNS
dig ANY ejemplo.com
Explicación: A
, MX
, NS
, TXT
y SOA
revelan direcciones IP, mail servers, DNS delegados y validaciones TXT (SPF, DKIM, etc.) .
4.2. Identificando Proveedores en la Nube
- Buckets y Blobs: Google Dorks y herramientas como GrayHatWarfare para descubrir S3, GCP y Azure.
- Cloudflare, WAFs y Proxies: Servicios como Domain.Glass indican si una web está detrás de protección avanzada.
5. Enumeración Basada en Host
5.1. FTP
El FTP es un protocolo de texto claro que aún se utiliza en muchos entornos internos.
- Cliente FTP:
ftp <FQDN/IP>
- Conexión sin cifrado:
nc -nv 10.129.14.136 21
telnet 10.129.14.136 21
- Conexión con TLS:
openssl s_client -connect 10.129.14.136:21 -starttls ftp
- Descubrir scripts NSE:
find /usr/share/nmap/scripts/ -name 'ftp-*.nse'
- Escaneo Nmap:
sudo nmap -sV -p21 -sC -A 10.129.14.136 --script-trace
Explicación: Detecta versiones, scripts por defecto y traza la interacción.
- Anonimato FTP:
sudo apt install vsftpd
cat /etc/vsftpd.conf | grep -v "#"
cat /etc/ftpusers
ftp 10.129.14.136
-
anonymous_enable=YES
habilita login anónimo.anon_upload_enable=YES
permite subir archivos.
- Uso práctico:
ftp> ls
ftp> get Important\ Notes.txt
ftp> put testupload.txt
ftp> ls -R
Explicación: Listar, descargar y cargar archivos puede revelar datos y, en caso de subida, servir para payloads de RCE.
- Descarga masiva:
wget -m --no-passive ftp://anonymous:anonymous@10.129.14.136
tree .
Explicación: Captura toda la estructura FTP localmente.
TFTP
El Trivial File Transfer Protocol (TFTP) es una versión ligera de FTP que opera sobre UDP en el puerto 69 y carece de autenticación. Solo permite transferencias de archivos en modo lectura o escritura en directorios configurados como compartidos.
Comandos básicos de TFTP:
Comando | Descripción |
---|---|
connect <host> [port] | Establece el servidor remoto (puerto opcional). |
get <archivo> | Descarga el archivo desde el servidor al cliente. |
put <archivo> | Carga el archivo desde el cliente al servidor. |
quit | Sale de la sesión TFTP. |
status | Muestra el estado de la conexión y modo de transferencia. |
verbose | Activa/desactiva modo detallado. |
Práctica: conecta al servicio TFTP y descarga un archivo de prueba.
$ tftp 10.129.14.128 69
tftp> connect 10.129.14.128
tftp> get test.txt
tftp> quit
5.2. SMB
Server Message Block (SMB) es el protocolo Windows para compartir archivos e impresoras (puertos TCP 139 y 445). Con Samba, Unix también puede ofrecer estos servicios.
Herramientas y ejemplos:
- Listar recursos compartidos con sesión nula:
smbclient -N -L //10.129.14.128
- Conectarse a un recurso y explorar:
smbclient //10.129.14.128/notes
smb: \> ls
smb: \> get prep-prod.txt
- RPC y SAMR:
rpcclient -U "" 10.129.14.128
samrdump.py 10.129.14.128
- Enumeración avanzada con enum4linux-ng:
git clone https://github.com/cddmp/enum4linux-ng.git
cd enum4linux-ng
pip3 install -r requirements.txt
./enum4linux-ng.py 10.129.14.128 -A
- SMBMap y CrackMapExec para listar shares y permisos:
smbmap -H 10.129.14.128
crackmapexec smb 10.129.14.128 --shares -u '' -p ''
5.3. NFS (Network File System)
NFS permite montar recursos remotos como si fueran locales. Usa principalmente los puertos UDP/TCP 2049.
Comandos básicos de NFS:
showmount -e <FQDN/IP> # Muestra exports disponibles
mount -t nfs <FQDN/IP>:/<share> ./target-NFS/ -o nolock # Montar share en local
umount ./target-NFS/ # Desmontar recurso montado
5.4. DNS (Sistema de Nombres de Dominio)
La enumeración DNS revela registros y posibles subdominios.
dig ns <domain.tld> @<nameserver> # Solicitud NS específica
dig any <domain.tld> @<nameserver> # Registros ANY
dig axfr <domain.tld> @<nameserver> # Transferencia de zona (AXFR)
dnsenum --dnsserver <nameserver> --enum -p 0 -s 0 -o found_subdomains.txt -f ~/subdomains.list <domain.tld> # Fuerza bruta de subdominios
5.5. SNMP
El Simple Network Management Protocol (SNMP) supervisa y configura dispositivos de red en UDP 161 (traps en 162). Las versiones v1/v2c transmiten en texto claro; v3 añade autenticación y cifrado.
Comandos de enumeración:
snmpwalk -v2c -c public 10.129.14.128
onesixtyone -c community-list.txt 10.129.14.128
braa public@10.129.14.128:.1.3.6.*
Tip: en un laboratorio, configura tu propio servidor SNMP para practicar traps y MIB.
5.6. SMTP / IMAP / POP3
- SMTP (puerto 25/587/465): prueba con Telnet o STARTTLS:
telnet 10.129.14.128 25
EHLO example.com
STARTTLS
Consulta relé abierto, VRFY
y EXPN
para verificar buzones.
- IMAP (puerto 143/993) con cURL o OpenSSL:
curl -k 'imaps://10.129.14.128' --user user:pass openssl s_client -connect 10.129.14.128:993
Navega carpetas y usa comandos LOGIN
, LIST
, FETCH
.
- POP3 (puerto 110/995): conecta y usa
USER
,PASS
,STAT
,LIST
,RETR
,QUIT
.
5.7. Bases de Datos
MySQL
mysql -u <user> -p<pass> -h 10.129.14.128
Escanea con Nmap (--script=mysql*
) y prueba credenciales vacías.
MSSQL
mssqlclient.py <user>@10.129.14.128 -windows-auth
También hay scripts de Impacket para enumerar login y bases.
Oracle (TNS)
Para interactuar con el listener Oracle TNS y verificar la conectividad básica:
curl -X GET http://10.129.204.235/testing.txt
Prueba tnsping
y Nmap (--script tnscmds
).
Herramientas y pasos adicionales para Oracle
- Instalación de dependencias y clientes:
sudo apt-get install libaio1 python3-dev alien -y
git clone https://github.com/quentinhardy/odat.git
cd odat/
git submodule init && git submodule update
wget https://download.oracle.com/otn_software/linux/instantclient/2112000/instantclient-basic-linux.x64-21.12.0.0.0dbru.zip
unzip instantclient-basic-linux.x64-21.12.0.0.0dbru.zip
wget https://download.oracle.com/otn_software/linux/instantclient/2112000/instantclient-sqlplus-linux.x64-21.12.0.0.0dbru.zip
unzip instantclient-sqlplus-linux.x64-21.12.0.0.0dbru.zip
export LD_LIBRARY_PATH=$(pwd)/instantclient_21_12:$LD_LIBRARY_PATH
export PATH=$(pwd)/instantclient_21_12:$PATH
pip3 install cx_Oracle python3-scapy colorlog termcolor passlib python-libnmap pycryptodome
- Ver ayuda de ODAT:
./odat.py -h
- Escaneo del listener con Nmap:
sudo nmap -p1521 -sV 10.129.204.235 --open
- Fuerza bruta de SID con Nmap:
sudo nmap -p1521 -sV 10.129.204.235 --open --script oracle-sid-brute
- Enumeración completa con ODAT:
./odat.py all -s 10.129.204.235
- Conexión manual con SQL*Plus:
sqlplus scott/tiger@10.129.204.235/XE
- Enumeración con SQL*Plus:
SELECT table_name FROM all_tables;
SELECT * FROM user_role_privs;
sqlplus scott/tiger@10.129.204.235/XE AS SYSDBA
SELECT * FROM user_role_privs;
- Carga de archivos con ODAT (utlfile):
echo "Oracle File Upload Test" > testing.txt
./odat.py utlfile -s 10.129.204.235 -d XE -U scott -P tiger --sysdba --putFile C:\inetpub\wwwroot testing.txt ./testing.txt
curl -X GET http://10.129.204.235/testing.txt
5.8. IPMI
La Interfaz de Gestión Inteligente de la Plataforma usa UDP 623 para gestión en out‑of‑band.
msf6 auxiliary(scanner/ipmi/ipmi_version) RHOSTS=10.129.14.128
msf6 auxiliary(scanner/ipmi/ipmi_dumphashes) RHOSTS=10.129.14.128
5.9. SSH
SSH es el estándar para administración remota segura en el puerto TCP 22.
Comandos de exploración y autenticación:
ssh-audit.py <FQDN/IP>
ssh -v user@10.129.14.128
ssh -i private.key user@10.129.14.128
ssh user@10.129.14.128 -o PreferredAuthentications=password
nmap -sV -p22 --script=ssh* 10.129.14.128
5.10. RDP
RDP es el protocolo de escritorio remoto de Windows en el puerto TCP 3389.
git clone https://github.com/CiscoCXSecurity/rdp-sec-check.git
cd rdp-sec-check
./rdp-sec-check.pl 10.129.201.248 # Verificar cifrado y NLA
xfreerdp /u:<user> /p:"<password>" /v:<FQDN/IP> # Cliente RDP en Linux
evil-winrm -i <FQDN/IP> -u <user> -p <password> # WinRM remoto
nwmiexec.py <user>:"<password>"@<FQDN/IP> "<system command>" # Comandos WMI