StreamIO
Executive summary — StreamIO is a long chain of credentials leading to more credentials, where every link means bypassing a different control: a SQL injection behind a blacklist WAF on
watch.streamio.htbdumps MD5 hashes that unlock the web portal; a hiddendebugparameter in the admin panel turns out to be an LFI that exposes the source code and the credentials of a more privileged MSSQL user; that user opens up a second SQL injection which, withoutsysadminrights, becomes an exfiltration channel by writing into a visible table to read a backup database holding a new domain user; that user yields user.txt and a Firefox profile with saved credentials that, through password reuse, are also valid on the domain; and that domain account turns out to own an AD group with ReadLAPSPassword over the domain controller itself, handing over the local administrator password and, with it, root.txt plus a full DCSync.
| Platform | Hack The Box |
| Operating system | Windows Server 2019 Build 17763 (Domain Controller for streamIO.htb) |
| Difficulty | Medium |
| Status | Retired |
| Target IP | 10.129.48.165 |
Attack map
[443/HTTPS] watch.streamio.htb -- blacklist-WAF SQLi (bypass: avoid "or"/"null")
| UNION SELECT -> 30 MD5 hashes -> rockyou -> yoshihide (web login)
v
[admin panel] streamio.htb -- hidden "debug" parameter
| LFI (php://filter) -> source -> MSSQL db_admin creds + 2nd SQLi in movie_inc.php
v
[MSSQL] 2nd SQLi (stacked, movie_id) as db_admin -- not sysadmin, no xp_cmdshell
| UPDATE->UNION channel (second-order read) -> streamio_backup..users -> nikk37 (MD5)
v
[WinRM] nikk37 : get_dem_girls2@yahoo.com -> user.txt
| Firefox profile (key4.db+logins.json+cert9.db) -> firefox_decrypt -> JDgodd
v
[AD] JDgodd Owns/WriteOwner over CORE STAFF -> ReadLAPSPassword on the DC
| dacledit + bloodyAD -- self-membership -> reads ms-Mcs-AdmPwd
v
[ROOT] Local Administrator (LAPS) = domain admin on the DC -> root.txt + DCSync
1. Reconnaissance
sudo nmap -p- --min-rate 3000 -T4 -Pn -oN nmap-allports.txt 10.129.48.165
sudo nmap -p53,80,88,135,139,389,443,445,464,636,3268,5985,9389 -sCV -Pn -oN nmap-services.txt 10.129.48.165
A TTL of 127 plus the port set (53/88/135/139/389/445/464/636/3268/5985/9389, on top of IIS on 80/443) identify a Windows Domain Controller with a website on top. The TLS certificate on port 443 hands over the real hostnames, common when the vhost isn't in public DNS:
443/tcp ssl/http
| ssl-cert: Subject: commonName=streamIO/countryName=EU
| Subject Alternative Name: DNS:streamIO.htb, DNS:watch.streamIO.htb
|_clock-skew: mean: 7h00m07s
echo "10.129.48.165 streamio.htb watch.streamio.htb dc.streamio.htb DC" | sudo tee -a /etc/hosts
Two separate web applications sit behind the same certificate: streamio.htb (login portal) and watch.streamio.htb (movie search). SMB rejects the null session (STATUS_ACCESS_DENIED) — expected on a properly configured DC — so the way in has to be through the web.
Worth noting, not acting on yet: the +7 hour clock skew nmap reports. Kerberos is very sensitive to clock drift, but it never became a blocker here — noted in case it matters later.
Resumen ejecutivo — StreamIO es una cadena larga de credenciales que llevan a más credenciales, donde cada eslabón exige rodear un control distinto: una SQL injection protegida por un WAF de lista negra en
watch.streamio.htbvuelca hashes MD5 que dan acceso al portal web; un parámetro ocultodebugen el panel de administración resulta ser un LFI que expone el código fuente y las credenciales de un usuario MSSQL más privilegiado; ese usuario abre una segunda inyección SQL que, sin privilegios desysadmin, se convierte en canal de exfiltración escribiendo en una tabla visible para leer una base de datos de backup con un usuario de dominio nuevo; ese usuario da user.txt y un perfil de Firefox con credenciales guardadas que, por reutilización de contraseña, valen también para el dominio; y esa cuenta de dominio resulta ser propietaria de un grupo de AD con ReadLAPSPassword sobre el propio controlador de dominio, lo que entrega la contraseña del administrador local y, con ella, root.txt y un DCSync completo.
| Plataforma | Hack The Box |
| Sistema operativo | Windows Server 2019 Build 17763 (Domain Controller de streamIO.htb) |
| Dificultad | Medium |
| Estado | Retired |
| IP objetivo | 10.129.48.165 |
Mapa del ataque
[443/HTTPS] watch.streamio.htb -- SQLi con WAF de lista negra (bypass: sin "or"/"null")
| UNION SELECT -> 30 hashes MD5 -> rockyou -> yoshihide (login web)
v
[panel admin] streamio.htb -- parametro oculto "debug"
| LFI (php://filter) -> fuente -> creds MSSQL db_admin + 2a SQLi en movie_inc.php
v
[MSSQL] 2a SQLi (apilada, movie_id) como db_admin -- sin sysadmin, sin xp_cmdshell
| canal UPDATE->UNION (second-order read) -> streamio_backup..users -> nikk37 (MD5)
v
[WinRM] nikk37 : get_dem_girls2@yahoo.com -> user.txt
| perfil de Firefox (key4.db+logins.json+cert9.db) -> firefox_decrypt -> JDgodd
v
[AD] JDgodd Owns/WriteOwner sobre CORE STAFF -> ReadLAPSPassword sobre el DC
| dacledit + bloodyAD -- auto-membership -> lee ms-Mcs-AdmPwd
v
[ROOT] Administrator local (LAPS) = admin de dominio en el DC -> root.txt + DCSync
1. Reconocimiento
sudo nmap -p- --min-rate 3000 -T4 -Pn -oN nmap-allports.txt 10.129.48.165
sudo nmap -p53,80,88,135,139,389,443,445,464,636,3268,5985,9389 -sCV -Pn -oN nmap-services.txt 10.129.48.165
Un TTL de 127 y el juego de puertos (53/88/135/139/389/445/464/636/3268/5985/9389, más 80/443 de IIS) identifican un Domain Controller de Windows con un sitio web encima. El certificado TLS del puerto 443 entrega los nombres de host reales, algo habitual cuando el vhost no está en un DNS público:
443/tcp ssl/http
| ssl-cert: Subject: commonName=streamIO/countryName=EU
| Subject Alternative Name: DNS:streamIO.htb, DNS:watch.streamIO.htb
|_clock-skew: mean: 7h00m07s
echo "10.129.48.165 streamio.htb watch.streamio.htb dc.streamio.htb DC" | sudo tee -a /etc/hosts
Hay dos aplicaciones web distintas detrás del mismo certificado: streamio.htb (portal con login) y watch.streamio.htb (buscador de películas). SMB rechaza la sesión nula (STATUS_ACCESS_DENIED) — como es de esperar en un DC bien configurado —, así que la vía de entrada tiene que ser web.
Detalle a anotar y no tocar todavía: el desfase de reloj de +7 horas que reporta nmap. Kerberos es muy sensible al desfase horario, pero aquí no llega a ser un obstáculo — se deja anotado por si hiciera falta más adelante.
This content is Root Access only. Everything else on the site — the free tier, the whole public library — stays open.
See Root Access plansNo account? Create one free then upgrade from your console.
Este contenido es solo para Root Access. Todo lo demás del sitio — el nivel gratuito, toda la biblioteca pública — sigue abierto.
Ver planes de Root Access¿Sin cuenta? Crea una gratis y luego mejora desde tu consola.