Buscar contraseñas tras la intrusión: ficheros, backups y reutilización
Dónde buscar contraseñas cuando ya tienes shell: configuración de la web, bases de datos, historiales, backups cifrados y cómo probar cada una con todos los usuarios.
Cuando consigues tu primera shell en una máquina de Hack The Box, casi siempre eres www-data o un usuario de servicio. El salto al usuario siguiente rara vez es un exploit: es una contraseña olvidada en un fichero que alguien reutilizó para su cuenta. En el catálogo de PwnAtlas es, con diferencia, la técnica más repetida: aparece en casi un centenar de máquinas.
Esta guía es el método que conviene seguir siempre, en este orden, antes de lanzar exploits de kernel o perderte con linpeas.
Lo mínimo que tienes que saber
- Las aplicaciones web necesitan la contraseña de su base de datos en claro en algún fichero. Esa contraseña suele ser también la de un usuario del sistema.
- Las bases de datos guardan los usuarios de la aplicación, normalmente con hashes que puedes crackear.
- Los backups (
.zip,.tar,.7z,.bak,.old) guardan versiones antiguas de todo lo anterior, a veces con contraseñas que ya se cambiaron en el original. - Toda contraseña que encuentres se prueba con todos los usuarios y todos los servicios. Es lo que más gente se salta.
Requisitos
- Una shell en la víctima, mejor una TTY completa:
suno funciona sin ella. - En tu máquina:
johnohashcat(guía de cracking de hashes) ynetexecohydrapara probar contraseñas en bloque. - Para practicar: PermX, Boardlight o TwoMillion, las tres fáciles y de Linux.
Paso 1: quién hay en la máquina
Antes de buscar contraseñas, apunta a quién se las vas a probar:
grep -E 'sh$' /etc/passwd | cut -d: -f1
ls /home
root
mtz
Esos son los usuarios con shell. Guárdalos en un fichero usuarios.txt en tu máquina.
Paso 2: la configuración de la aplicación web
Ve a la raíz de la web (/var/www, /srv, /opt) y busca los ficheros de configuración típicos de cada tecnología:
| Tecnología | Fichero |
|---|---|
| WordPress | wp-config.php |
| Laravel y casi todo lo moderno | .env |
| Joomla | configuration.php |
| Drupal | sites/default/settings.php |
| Django | settings.py |
| Spring | application.properties o application.yml |
| Rails | config/database.yml |
| Node | config.js, .env, config/default.json |
| Tomcat | conf/tomcat-users.xml |
Si no sabes qué aplicación es, busca a lo bruto:
grep -rniE "(pass(word|wd)?|pwd|secret|token)\s*[=:>]" /var/www /opt /srv /etc 2>/dev/null \
| grep -viE "\.(js|css|svg)|placeholder|example" | head -50
/var/www/chamilo/app/config/configuration.php:20:$_configuration['db_password'] = '...';
El 2>/dev/null es imprescindible: sin él la salida se llena de Permission denied. El segundo grep quita ruido de librerías JavaScript.
Truco
En PermX la contraseña de la base de datos de Chamilo es la del usuario mtz; en Boardlight, la del conf.php de Dolibarr sirve para larissa; y en TwoMillion, la del .env es la de admin por SSH. Tres máquinas, el mismo patrón.
Paso 3: dentro de la base de datos
Con la contraseña de la base de datos, entra y saca los usuarios de la aplicación:
mysql -u chamilo -p -h 127.0.0.1 -e 'show databases;'
mysql -u chamilo -p -h 127.0.0.1 chamilo -e 'select username,password from user;'
Si la aplicación usa SQLite, el fichero suele llamarse *.db, *.sqlite o *.sqlite3:
find / -name "*.db" -o -name "*.sqlite*" 2>/dev/null | grep -v -E "^/(proc|usr/share|sys)"
sqlite3 app.db '.tables'
sqlite3 app.db 'select * from users;'
Los hashes que saques se crackean en tu máquina. Identifica el formato antes de lanzar nada ($2y$ es bcrypt, $6$ es SHA-512 crypt, 32 caracteres hexadecimales suele ser MD5).
Paso 4: historiales y ficheros personales
Mira en cada /home/* al que tengas acceso y en /root si puedes leerlo:
ls -la /home/*/ 2>/dev/null
cat /home/*/.bash_history /home/*/.mysql_history /home/*/.python_history 2>/dev/null
find / \( -name ".git-credentials" -o -name ".netrc" -o -name ".pgpass" -o -name "*.kdbx" \
-o -path "*/.docker/config.json" \) 2>/dev/null
.bash_historya veces tiene unmysql -u root -pContraseñao unsshpass..git-credentialsguarda usuario y token en claro.- Un
.kdbxes una base de datos de KeePass:keepass2john fichero.kdbx > hashy a crackear. - Las claves privadas SSH tienen su propia guía de claves SSH.
Paso 5: backups y comprimidos
Los backups aparecen en /var/backups, /opt, la raíz de la web o el home de alguien. Búscalos por extensión:
find / \( -name "*.bak" -o -name "*.old" -o -name "*.zip" -o -name "*.tar*" -o -name "*.7z" \
-o -name "*backup*" \) -type f 2>/dev/null | grep -v -E "^/(proc|usr|sys|snap)"
Si un comprimido tiene contraseña, sácalo a tu máquina y crackéalo:
zip2john backup.zip > zip.hash
john --wordlist=/usr/share/wordlists/rockyou.txt zip.hash
admin@it (backup.zip)
Para 7-Zip usa 7z2john. En Tabby la contraseña del zip de la web es la del usuario ash; en Surveillance un volcado antiguo de la base de datos guarda el hash de matthew; y en Netmon la copia de la configuración de PRTG tiene una contraseña con el año anterior: prueba con el año actual.
Cuidado
Los zip con cifrado AES no se crackean con el formato de ZipCrypto. zip2john lo detecta solo, pero si john dice No password hashes loaded, revisa que el fichero no esté corrupto (un unzip -l backup.zip debe listar el contenido).
Paso 6: probar cada contraseña con todos
Con la lista de usuarios y la de contraseñas encontradas, pruébalas todas. Dentro de la máquina, con su:
su mtz
Desde tu máquina, contra SSH, en bloque:
nxc ssh 10.10.11.23 -u usuarios.txt -p contrasenas.txt --continue-on-success
SSH 10.10.11.23 22 10.10.11.23 [+] mtz:<contraseña> Linux - Shell access!
En Windows y Active Directory, lo mismo contra SMB y WinRM (nxc smb y nxc winrm). Si hay muchos usuarios de dominio, lee antes la parte de password spraying de la enumeración de Active Directory para no bloquear cuentas.
En Windows
Los equivalentes rápidos, desde PowerShell:
Get-ChildItem C:\inetpub,C:\Users,C:\ -Include *.config,*.xml,*.ini,*.txt,*.kdbx -Recurse -ErrorAction SilentlyContinue | Select-String -Pattern "password" -List
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
El historial de PowerShell, los ficheros unattend.xml y las credenciales guardadas están en la guía de volcado de credenciales en Windows.
Errores típicos
su: must be run from a terminal: tu shell no es una TTY. Estabilízala primero.- La contraseña funciona con
supero no por SSH: el servidor puede tenerPasswordAuthentication noo limitar usuarios conAllowUsers. Entra consuy deja tu clave SSH. greptarda una eternidad: no busques en/entero; limita a/var/www,/opt,/srv,/homey/etc.- Contraseñas con caracteres especiales: ponlas entre comillas simples en la terminal; con
$o!entre dobles, bash las cambia. - El hash no crackea con rockyou: prueba con reglas (
--rules=best64en hashcat) o con variaciones de las contraseñas que ya tienes.
Y después
Marca el apartado de credenciales en la checklist de post-explotación y sigue con la escalada por sudo, SUID y capabilities. Los comandos de búsqueda de linPEAS automatizan buena parte de esto, pero ya sabes qué está mirando.