Invoke comme dans Masm pour Yasm & Nasm :)

Oui je sais, le titre va en faire fuir plus d’un, d’autres vont encore me dire que j’ai définitivement sombré… Mais regardez ma belle macro :

%macro invoke 2-*
  extern %1
  %rotate %0-1
  %rep  %0-1
    push    %1
    %rotate -1
  %endrep
  %rotate %0
  call	%1
%endmacro

Traduisons; M/Y/Nasm sont tous les 3 des assembleurs x86. M pour Microsoft, Y pour ?? je ne sais pas et N pour Netwide. Ces derniers temps je me suis remis à l’assembleur et j’ai jeté mon dévolus sur Yasm (dispo sur Cygwin). C’est un rewrite de Nasm sous licence BSD. Ce dernier comprend la syntaxe de Nasm, Gas (le Gnu Assembleur) et même un peu de Tasm (Feu l’assembleur de Borland ou j’ai passé du bon temps). Le soucis c’est que j’ai aussi de vagues relents de Masm appris dans ma  folle jeunesse et ce dernier est fort utile pour Windows. Masm dispose de la commande Invoke et il connait toutes les librairies Microsoft, cela permet de rapidement et clairement faire un call à une librairie quelquonque. Si on ne dispose pas d’Invoke, pour appeler une api windows il suffit de poser sur la pile les arguments en sens inverse à la documentation. Je m’explique, par exemple pour un simple popup sous Windows la documentation Microsoft dit :

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);

Sans Invoke dans Yasm, pour faire un programme qui popup et quitte c’est comme cela :

global _start ; Addresse de départ

extern ExitProcess, MessageBoxA ; Déclaration des Externals calls 

section .data
	boxtitle db "Box Title",0
	boxtext db "Hello World", 0 
section .code
_start:
	push	0			; Type O, okbox
	push 	boxtitle	; Caption
	push 	boxtext 	; Title
	push 	0			; Handle Optionnal
	call 	MessageBoxA	; Appel API
	push 	0			; Error Code
	call 	ExitProcess	; Appel API

Sous Masm (M pour Microsoft) il y a une convention d’appel bien sympa, qui remet les paramètres dans le bon sens et qui clarifie le code, le fameux Invoke Et bien sur en contrepartie il y a un tombereau d’includes et de fichiers à se trainer.

.model flat,stdcall 

include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib

.data 
	boxtitle db "Box Title",0
	boxtext db "Hello World", 0 
.code 
_start: 
	invoke MessageBox, NULL, addr boxtext, addr boxtitle, MB_OK 
	invoke ExitProcess, NULL

Mais grâce à c’te macro, c’est le meilleur des deux mondes :

%include "mymacro.mac"
global _start ; Addresse de départ

section .data
	boxtitle db "Box Title",0
	boxtext db "Hello World", 0 
section .code
_start:
	invoke	MessageBoxA, 0, boxtext, boxtitle, 0
	invoke	ExitProcess, 0

Bon après pour les fondus de macro qui aiment les includes il y a bien NasmX mais je ne veux pas mettre le doigt dans des includes qui sont pas à moi et je ne sais pas si ca marche bien avec Yasm ;)

A+

Ps: Pour compiler Yasm et pour Linker Golink

John@ACME1482138535 ~/code/
$ yasm toto.asm -f win32 -o toto.obj

John@ACME1482138535 ~/code/
$ golink /entry _start toto.obj  kernel32.dll user32.dll

GoLink.Exe Version 0.28.0.0 - Copyright Jeremy Gordon 2002/12 - JG@JGnet.co.uk
Output file: toto.exe
Format: win32 size: 2,048 bytes
Posted in Coding | Tagged , , , , , | Leave a comment

Virtual Machine, ou Real Machine

Détection d’une VM

Comment en 2013 détecter si nous sommes dans une machine virtuelle ? Avant pour Vmware, Xen, Kvm et Virtual PC c’était assez la foire, de sombres in/out dans les backdoors systèmes, des instructions non documentées ou longues comme le bras, Red/Blue Pills … Etc

http://handlers.sans.org/tliston/ThwartingVMDetection_Liston_Skoudis.pdf
http://brundlelab.wordpress.com/2012/10/21/detecting-vmware/
http://my.opera.com/jaelanicu/blog/just-another-vm-detection-was-vm-detection-combo

C’est tellement la foire que les Malwares de tous poils n’hésitent pas à labourer la registry à la recherche des mac addresses et de nom de drivers spécifiques.

Arrivé en 2013, Avec l’avènement des CPU ‘awares en virtualisation’, l’industrie semble s’être enfin organisée, Voici donc une solution simple; l’instruction CpuID permet de savoir si la machine est Virtualisée. C’est le Bit 31 de ECX pour un appel à Cpuid avec EAX à 1.

Si Ensuite on fait un appel à l’instruction CpuID avec EAX à 0x4000000 le résultat dans EBX,ECX,EDX donne une string sans équivoque;

"VMwareVMware" : Vmware Workstation/Fusion/EsX
"KVMKVMVKM" : Kvm
"Microsoft Hv" : HyperV
"XenVMMXe" : Xen

http://msdn.microsoft.com/en-us/library/windows/hardware/ff542428(v=vs.85).aspx
http://www.mjmwired.net/kernel/Documentation/kvm/cpuid.txt

Pour finir un petit “Poc” qui fonctionne bien, dispo pour les plus courageux ici

Hypervisor

;  Find Virtualisation Engine

global _start                     ; visibility for linker
extern ExitProcess, MessageBoxA   ; externals calls    

section .data
boxtitle db "Detection",0
boxtext  db "Types : 0 None, 1 Generic, 2 Vmware, 3 Xen, 4 Kvm, 5 HyperV", 0x0D 
         db "Detected Type :"
vm	 db 0
legend   db 0x0D, "String: "
sebx     db '    '
secx     db '    '
sedx     db '    '
zero	 db 0

section .text code align=16

_start:
	mov		eax,1		; Eax = 1
	cpuid				; Cpuid
	shr		ecx,31		; Selection bit 31
	mov		byte [vm],cl ;	Virtualisation found 
	dec		cl			; test cl = 1
	jnz		nothyperv		; Si cl = 0, c'est pas Virtual
	mov 	        eax,0x40000000	; Info Virtualisation
	cpuid  
	mov		dword [sebx],ebx	; Conserve les Jolie String
	mov		dword [secx],ecx 	; 
	mov		dword [sedx],edx 	; 

	xor 	        ebx,ecx			; Genere un Hash pas cher
	cmp		ebx,'VMwa' ^ 'reVM' 	; Est-ce Vmware
	jne		notvm
	mov		byte [vm],2			
notvm:
	cmp		ebx,'XenV' ^ 'MMXe'		; Est-ce Xen
	jne		notxen
	mov		byte [vm],3
notxen:
	cmp		ebx,'KVMK' ^ 'VMKV'		; Est-ce KVM
	jne		notkvm
	mov		byte [vm],4
notkvm:
	cmp		ebx, 'Micr' ^ 'osof'	; Est-ce HyperV
	jne		nothyperv
	mov		byte [vm],5
nothyperv:

.print:

	add 	byte [vm],0x30		; Convert to Ascii	
	push	0	; Type okbox
	push 	boxtitle ; Caption
	push 	boxtext  ; Title
	push 	0	; Handle Optionnal
	call 	MessageBoxA			; Print
	push	0  ; exitcode
	call 	ExitProcess			; Quit

.end

 

Posted in Malware, Reverse | Tagged , , , | Leave a comment

FareIT, Chronique d’un droppeur

Voyons aujourd’hui comment dépaqueter et analyser ce FareIT

Depacking

Le packer est suffisant pour un newbies comme moi, il m’a, comme il se doit, bien paummé. Une fois de plus je n’ai pas trouvé un saut propre du style JMP EAX et au final je ne sais pas ou il saute. L’animal est en plusieurs ‘stages’ et évidemment des pans entiers de code sont réservés et réécrits au vol. Et comme si cela ne suffisait pas, du code semble pris depuis les ressources (Icones, Curseur etc..)
Bref me rendant à l’évidence sur mes limites, je l’ai breaké en cours d’exécution pour le dumper. J’ai pris la tangeante aux techniques que je vous ai décrit précédemment (Voir post depacking). Principalement parce que cet animal ne s’attache pas a un process, je pouvais toujours l’y attendre ! J’ai essayé un ‘trace’ dans OllyDbg et cela à été “winwin”.

Quand on ouvre l’exécutable dans IDA on se rend compte rapidement que le code couvre une toute petite partie (grace à la barre, le code c’est le bleu et le rouge).

Code BarreFort de ce postulat et ne voyants pas de code réservant de la Heap, j’ai donc noté les offsets me disant, tôt ou tard, il sautera dans ce code dépacké. Le code est incompréhensible pour ida de l’offset 0x401000 à 0x41C000 (la grosse plage grise avant la flêche). Je sort mon Ollydbg et lui demande de pauser la trace quand EIP se trouve dans cette plage (CTRL+T)

Trace Configuration

Ensuite on fait “Trace -> Run Hit Trace” et hoo miracle, le code se break et il semblerai que le segment de data soit bien remplis.

Paused

Pourquoi suis-je à 0x40154A qui ne ressemble pas franchement à un début de fonction. En fait le ‘Trace’ de OllyDbg met un breakpoint avant tout saut ou embranchement. De fait il faut remonter un peut pour trouver le début de la procédure (un classique push ebp, mov ebp,esp) qui est à 0x401522. Il suffit ensuite de noter les EIP posés sur la pile afin de plus tard remonter tel un saumon les jumps afin de remonter à ce qui semble être le début du programme dépacké (Original Entry Point)

Find OEP

Dans le dépacker, je suppute qu’il y a un antidumper (un détournement d’IAT ou autre j’en sais rien). Car quand on tente de dumper l’exécutable avec LordPE, cela ne marche pas. Au mieux il manque des pans de code au pire on a droit à ce genre de messages.

LordPE Failed

Heureusement, dans OllyDbg, sur la vue dump, bouton droit de la souris, “Backup” -> “Save Data to file” fonctionne (Pourquoi ?? ca dépasse mes maigres compétences, si un lecteur sait HELP ME). Il suffit ensuite de Rebuilder l’exe avec LordPE, mais attention de lui dire de ne pas Wiper la table de relocation (car le packer a fourré aussi du code dedans). C’est dans les options de LordPE. On s’occupera de l’OEP après vous allez comprendre pourquoi.

Anti-Désassemblage primaire:

Quand on va voir les procédures dont on a noté l’adresse dans la stack précédement on se rend compte que ces salaud utilisent une technique fort bien connu pour offusquer le code. Voici un exemple;

Ca déconne à partir de 0x041E31

Before

En effet IDA aime suivre les sauts, ils se servent donc de cette spécificité pour décaler le code avec un saut bidon et le rendre ilisible et inintéligible par le désassembler. Dans la vraie vie, ce saut n’est jamais possible JB saute si le Carry Flag est à 1, mais l’instruction CLC (Clear Carry Flag) le met à 0 systématiquement. Ce qui se passe en vrai c’est le Push adresse et ret. Voila à quoi ressemble le vrai code :

After Mais pour décoder cela dans IDA il faut passer tout en data (touche D) allez sur le bon offset et re-analyser (touche C). En plus de cela, dans certains car il faut aussi supprimer la fonction car elle est fusionnée avec une autre. Bref c’est chiant. Mais heureuseument, cette petite joyeuseté arrive toujours de la même façons, il est facile de la retrouver. En Hexa ce bout de code est :

68 ZZ YY XX WW   : Push DWORD WWXXYYZZ
F8 : CLC
72 01 : JMP +1
C3 : RET
FF : Garbage

Et il y a de nombreux ‘anti-desassembleur’ dans ce droppeur. Etonnament il y en a pile poil 32.

$ grep -boa $'\x68'....$'\xf8\x72\x01\xC3\xFF' backup_00400000.bin.bin  | wc -l
32

Allors on y va gaiment, corrigeons ce code. On va transformer tout cela en gros champ de NOP. J’ai aussi un tools a chal pour cela ! ;) une bête subsitution avec regex.

$binpatch.py backup_00400000.bin.bin "\x68(....)\xF8\x72\x01\xC3\xFF" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"

Et si on ouvre maintenant l’exe, Ida est très, très heureux.

Patched

FIN DU DEPACKING.

La procédure DELAY

 

Encore que pour avoir un exe qui soit ‘TipTop’ et éventuellement exécutable, il faut refaire le dump avec un hardware breakpoint juste au début du programme dépacké. Dans la fameuse loop random en 0x41072C que l’on à trouvé parce que l’on a suivis les valeurs sur la stack. Le premier ‘retour’ de fonction trouvé sur la stack est 0x410756.

ReturnEt la on se dit.. hooo J’avais demandé à Ollydbg de breaker si EIP était entre 0x401000 à 0x41C000, il aurait dû s’arrêter avant. Il aurait dû, s’il avait correctement analysé le code. L’obfuscation l’a attrapé lui aussi je pense (Ou alors c’est un coup des vents solaires).

Perdu

Heureusement il n’a pas été bien loin après. Revenons à notre stack et le retour vers 0x410756, ce retour arrive en plein dans la procédure ‘delay’. Cette procédure est un ‘Timer’ dont l’unique but est de patienter de facons aléatoire avant de lancer le ‘malware’.

PeITTimer

Mais tout cela IDA l’avait déja deviné, c’est lui qui a nommé la procédure ‘Start’ automatiquement avec un EP foireux dans l’exe ;) c’est beau !

A+

Posted in Malware, Reverse | Tagged , , , , , | Leave a comment

HSBC.Zip Alias FareIT

Et voila qui est fait, notre malware funky est FareIT (Sample 3b9b00d63b8bda442cca5c37f171d2a3). C’est donc bien un droppeur voleur de mots de passe sans aucunes autres velléités. Je l’ai désossé de bout en bout (482 Fonctions) et je doit dire qu’il a su bien m’amuser (merci messieurs). Au menu de l’anti-debug, de l’anti-dump, de l’anti-désassemblage. on verra tous ceci en détail, mais je vous livre déjà la bête “nue”.

FAREIT

Il va de soit que l’on va passer du temps à regarder chaque fonctions rigolote, promis ! La bête est plus que velue en moissonnage au final il gère le vol de mot de passe de 97 applications (Les Harv_xx dans le schéma) !!. je n’ai jamais vus cela avant, c’est exceptionnel.

Une fois de plus… les antivirus sont bien au top sur la classification ;)

Antivirus        Résultat                        Mise à jour
Agnitum          -                                20130321
AhnLab-V3        Spyware/Win32.Zbot               20130321
AntiVir          TR/PSW.Tepfer.EB.27              20130321
Antiy-AVL        -                                20130321
Avast            Win32:Malware-gen                20130321
AVG              Generic32.NCV                    20130321
BitDefender      Trojan.Generic.KDZ.11452         20130321
ByteHero         -                                20130320
CAT-QuickHeal    -                                20130321
ClamAV           -                                20130320
Commtouch        W32/Trojan.LOJP-6882             20130321
Comodo           UnclassifiedMalware              20130321
Emsisoft         Trojan.Win32.Agent.AMN (A)       20130321
eSafe            -                                20130319
ESET-NOD32       Win32/PSW.Fareit.A               20130321
F-Prot           W32/Trojan3.EYV                  20130321
F-Secure         Trojan.Generic.KDZ.11452         20130321
Fortinet         -                                20130321
GData            Trojan.Generic.KDZ.11452         20130321
Ikarus           Trojan-PWS.Fareit                20130321
Jiangmin         -                                20130321
K7AntiVirus      Trojan                           20130321
Kaspersky        Trojan-PSW.Win32.Tepfer.hise     20130321
Kingsoft         Win32.PSWTroj.Tepfer.hi.(kcloud) 20130318
Malwarebytes     Trojan.FakeMS                    20130321
McAfee           RDN/Generic PWS.y!hj             20130321
McAfee-GW-Ed     RDN/Generic PWS.y!hj             20130321
Microsoft        PWS:Win32/Fareit.gen!I           20130321
MicroWorld-eScan -                                20130321
NANO-Antivirus   -                                20130321
Norman           Kryptik.MFC                      20130321
nProtect         -                                20130321
Panda            Trj/Genetic.gen                  20130321
PCTools          Trojan.Zbot                      20130321
Sophos           Troj/Zbot-EDW                    20130321
SUPERAntiSpyware -                                20130321
Symantec         Trojan.Zbot                      20130321
TheHacker        -                                20130321
TotalDefense     -                                20130321
TrendMicro       TSPY_ZBOT.SMUA                   20130321
TrendMicro-HCall TROJ_GEN.F47V0320                20130321
ViRobot          -                                20130321

 

Je vous le livrerait commenté avec son IDB à l’occasion de son désossage.

A bientôt.

 

Posted in Malware, Reverse | Tagged , , | Leave a comment

Mon mail HSBC, Hoo encore un Malware

Hsbc Mail

Evidemment dans le mail que j’ai reçu il y avait un ZIP ;) dans ce ZIP, un Executable PE avec look and feel de PDF Russe.

PDF RusseEt bien en fait c’est pas un vrai PDF figurez vous .. si si …

Bon je ne sais pas encore quel malware c’est vraiment ( MD5 3b9b00d63b8bda442cca5c37f171d2a3 ) Il est packé semble t’il en utilisant un packer qui Utilise aPLib assez visible

$ peentro.py message_zdm.exe 
Section Entropy Bytes   Size    MD5                                     Remark
.text   7.44    8       107328  1a3465a3f270bbd128a8202e454a5e5d        High Entropy
.text   5.17    6       3891    3c116b3fb8f16dfedf0ba5eff9596797
.rdata  5.17    6       1530    36d737d4e452aba945f82f48a72cf377
.data   0.62    1       140     97a0c8b703ed297b12412ac3b2e6016a
.rdata4 -0.00   0       1000    0f343b0931126a20f133d67c2b018a3b        Unusal Segment
.rdata3 -0.00   0       1000    0f343b0931126a20f133d67c2b018a3b        Unusal Segment
.rdata2 -0.00   0       1000    0f343b0931126a20f133d67c2b018a3b        Unusal Segment
.rsrc   4.29    5       12616   de12c9c486b3869517202636f87596d3
aPLib v1.01  -  the smaller the better :)
Copyright (c) 1998-2009 by Joergen Ibsen, All Rights Reserved.
More information: http://www.ibsensoftware.com/

Ce qui veut dire  que je suis pas sortis du bois pour l’avoir propre ;)

Quoi qu’il en soit çà m’a énervé, je l’ai dumpé (Je sais c’est pas beau) Voici les premiers C&C à download et les autres exécutables qu’il tente d’attraper.

http://www.rpc-ea.com:8080/ponyb/gate.php
http://213.186.47.54:8080/ponyb/gate.php
http://84.38.66.46:8080/ponyb/gate.php
http://24.bodytitehidef.com/ponyb/gate.php
http://www.5th3rd.com/HYKtQe.exe
http://216.119.115.113/ddBH20.exe
http://correctrxpharmacy.com/edZ.exe
http://bensonfarms.com/KezD.exe
http://entrepreneurnavigator.com/TEM2.exe

La Bestiole va aussi aller pécher les crédentials dans les fichiers/registre de configuration de CoffeeCup Software, Directory Opus, FlashFXP, FileZilla, Total Commander, Bullet Proof FTP, TurboFTP, LeapFTP, SecureFX, FireFTP, 3DFTP, SoftX FTP Client, BlazeFTP, FTP Now, Far Manager, Cute FTP, Fling,  Expandrive, Opera, FireFox, K-Meleon, Chrome et Ersatzs en ‘ium’, IncredibleMail, Pocomail, Becky Internet Mail, The Bat!, WinMail, WindowsLiveMail… (Impressionnant hein). Elle fera des requêtes HTTP, Bref tout ce qu’on espère d’un Malware. Mais je vois pas de VNC ce coup ci.

Et pour finir, voici la liste des 254 mots de passe qu’il ne faut VRAIMENT pas utiliser car ils sont inclus dans ce malware pour le grand public ;)

000000
1111
11111
111111
11111111
112233
123123
123321
1234
12345
123456
1234567
12345678
123456789
1234567890
123abc
123qwe
1q2w3e
1q2w3e4r
222222
55555
654321
666666
7777
7777777
aaaaaa
abc123
adidas
admin
amanda
andrew
angel
angel1
angels
anthony
apple
asdf
asdfasdf
asdfgh
ashley
asshole
austin
baby
bailey
banana
bandit
baseball
batman
benjamin
billgates
biteme
blabla
blahblah
blessed
blessing
blink182
bubbles
buster
canada
cassie
charlie
cheese
chelsea
chicken
chris
christ
church
cocacola
compaq
computer
cookie
cool
corvette
creative
dakota
dallas
daniel
danielle
david
destiny
dexter
diamond
digital
dragon
eminem
emmanuel
enter
faith
flower
foobar
football
football1
forever
forum
freedom
friend
friends
fuckoff
fuckyou
fuckyou1
gates
gateway
genesis
george
gfhjkm
ghbdtn
ginger
google
grace
green
guitar
hahaha
hallo
hannah
happy
hardcore
harley
heaven
hello
hello1
helpme
hockey
hope
hotdog
hunter
ilovegod
iloveyou
iloveyou!
iloveyou1
iloveyou2
internet
james
jasmine
jason
jasper
jennifer
jessica
jesus
jesus1
john
john316
jordan
jordan23
joseph
joshua
junior
justin
killer
kitten
knight
letmein
london
looking
love
lovely
loving
lucky
maggie
master
matrix
matthew
maverick
maxwell
merlin
michael
michelle
mickey
microsoft
mike
monkey
mother
muffin
mustang
mustdie
mylove
myspace1
nathan
nicole
nintendo
none
nothing
onelove
online
orange
pass
passw0rd
password
password1
peace
peaches
peanut
pepper
phpbb
pokemon
poop
power
praise
prayer
prince
princess
purple
qazwsx
qwert
qwerty
qwerty1
rachel
rainbow
red123
richard
robert
rotimi
samantha
sammy
samuel
saved
scooby
scooter
secret
shadow
shalom
silver
single
slayer
smokey
snoopy
soccer
soccer1
sparky
spirit
startrek
starwars
stella
summer
sunshine
superman
rainbow
red123
richard
robert
rotimi
samantha
sammy
samuel
saved
scooby
scooter
secret
shadow
shalom
silver
single
slayer
smokey
snoopy
soccer
soccer1
sparky
spirit
startrek
starwars
stella
summer
sunshine
superman
taylor
test
testing
testtest
thomas
thunder
tigger
trinity
trustno1
victory
viper
welcome
whatever
william
windows
winner
wisdom
zxcvbnm

Allez creusons ;)

Posted in Malware, Reverse | Tagged , , , | Leave a comment

Mon Facture.exe est un Zeus

Bon c’est officiel, il semblerait que mon Facture.exe laborieusement dépacké dans un précédent article (Hash 17832c9a78b36c8a3133e2c2e24ebc3b9896763a chez Malware.lu, version dépackée hash 13d0f11c18170923fa88005309a9ec16 ) Soit en fait un bon vieux malware Zeus. Et voici pourquoi ;

Quand on le regarde un peu sous toutes ses coutures, on se rend compte que 2 fonctions sont souvent appelées  Ces fonctions sont des déobfuscateurs de string, car en plus d’être packé ce malware contient des strings obfusquée (décidémment il ne veulent pas qu’on voye ce qu’il font ).

La première fonction est à l’offset 0x0040E8AA, c’est un double xor. On l’appelle en mettant dans EAX l’offset de la string voulue du grand tableau d’encodage, et le résultat est une string décodée posé a l’emplacement de EDI.

Zeus Xor

Le tableau a le format suivant ;

  • 1 Word :  Clef d’encodage du Xor de cette string
  • 1 Word : Longueur de la string
  • 1 DWord : Addresse de la chaine encodée

Il est posé à l’offset 0x00402C7E

Zeus Xortable

Et bien sur les strings sont des belles stringZ xorées avec leur 0 à la fin ;)

Zeus StringZ

J’ai donc pondu un petit script pour sortir d’un coup toutes ces strings, je l’ai mis dans mon Git de Tools à Chall (Après tout c’est juste un chall à 0 points)

$ ./dcod_zeustr.py 
Str:00 Len:000e Key:007c Off:0040499c %s://%s:%s@%s/
Str:01 Len:0003 Key:00e1 Off:00404998 ftp
Str:02 Len:0004 Key:00cf Off:00404990 pop3
Str:03 Len:0009 Key:0085 Off:00404984 anonymous
Str:04 Len:001d Key:002a Off:00404964 grabbed\%S_%02u_%02u_%02u.txt
Str:05 Len:0019 Key:00c0 Off:00404948 Grabbed data from: %s

%S
Str:06 Len:0030 Key:00dd Off:00404914 %s%s
Referer: %S
User input: %s
%sPOST data:

%S
Str:07 Len:0007 Key:0005 Off:0040490c *EMPTY*
Str:08 Len:0009 Key:0021 Off:00404900 *UNKNOWN*
Str:09 Len:000a Key:00a6 Off:004048f4  *BLOCKED*
Str:0a Len:0012 Key:00d8 Off:004048e0 Content-Type: %s

Str:0b Len:000a Key:0077 Off:004048d4 ZCID: %S

Str:0c Len:0021 Key:00a5 Off:004048b0 application/x-www-form-urlencoded
Str:0d Len:0032 Key:001b Off:0040487c HTTP authentication: username="%s", password="%s"

Str:0e Len:0022 Key:0052 Off:00404858 HTTP authentication (encoded): %S

Str:0f Len:000f Key:00cd Off:00404848 Mozilla\Firefox
Str:10 Len:0007 Key:00e1 Off:00404840 user.js
Str:11 Len:000c Key:0095 Off:00404830 profiles.ini
Str:12 Len:0009 Key:00e2 Off:00404824 Profile%u
Str:13 Len:000a Key:009b Off:00404818 IsRelative
Str:14 Len:0004 Key:0096 Off:00404810 Path
Str:15 Len:0146 Key:00d0 Off:004046c8 user_pref("network.cookie.cookieBehavior", 0);
user_pref("privacy.clearOnShutdown.cookies", false);
user_pref("security.warn_viewing_mixed", false);
user_pref("security.warn_viewing_mixed.show_once", false);
user_pref("security.warn_submit_insecure", false);
user_pref("security.warn_submit_insecure.show_once", false);

Str:16 Len:0055 Key:0085 Off:00404670 user_pref("browser.startup.homepage", "%s");
user_pref("browser.startup.page", 1);

Str:17 Len:0029 Key:005b Off:00404644 Software\Microsoft\Internet Explorer\Main
Str:18 Len:000a Key:0032 Off:00404638 Start Page
Str:19 Len:0033 Key:001b Off:00404604 Software\Microsoft\Internet Explorer\PhishingFilter
Str:1a Len:0007 Key:0022 Off:004045fc Enabled
Str:1b Len:0009 Key:0037 Off:004045f0 EnabledV8
Str:1c Len:002c Key:007e Off:004045c0 Software\Microsoft\Internet Explorer\Privacy
Str:1d Len:000c Key:00ab Off:004045b0 CleanCookies
Str:1e Len:0044 Key:0069 Off:00404568 Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\%u
Str:1f Len:0004 Key:006c Off:00404560 1406
Str:20 Len:0004 Key:0043 Off:00404558 1609
Str:21 Len:001b Key:00c2 Off:0040453c Accept-Encoding: identity

Str:22 Len:0005 Key:000c Off:00404534 TE:

Str:23 Len:0014 Key:0059 Off:0040451c If-Modified-Since:

Str:24 Len:000a Key:0053 Off:00404510 
Path: %s

Str:25 Len:0006 Key:0036 Off:00404508 %s=%s

Str:26 Len:0007 Key:0017 Off:00404500 *@*.txt
Str:27 Len:0003 Key:00d4 Off:004044fc Low
Str:28 Len:0026 Key:009c Off:004044d4 Wininet(Internet Explorer) cookies:
%S
Str:29 Len:0005 Key:0057 Off:004044cc Empty
Str:2a Len:0017 Key:0097 Off:004044b4 Macromedia\Flash Player
Str:2b Len:000f Key:0081 Off:004044a4 flashplayer.cab
Str:2c Len:0005 Key:0056 Off:0040449c *.sol
Str:2d Len:0014 Key:006a Off:00404484 Windows Address Book
Str:2e Len:001e Key:0058 Off:00404464 SOFTWARE\Microsoft\WAB\DLLPath
Str:2f Len:0007 Key:006f Off:0040445c WABOpen
Str:30 Len:0010 Key:007e Off:00404448 Windows Contacts
Str:31 Len:0006 Key:00f2 Off:00404440 A8000A
Str:32 Len:0003 Key:007c Off:0040443c 1.0
Str:33 Len:002f Key:0036 Off:0040440c EmailAddressCollection/EmailAddress[%u]/Address
Str:34 Len:0017 Key:000e Off:004043f4 Windows Mail Recipients
Str:35 Len:001a Key:002d Off:004043d8 Outlook Express Recipients
Str:36 Len:000f Key:00e7 Off:004043c8 Outlook Express
Str:37 Len:0014 Key:00e5 Off:004043b0 account{*}.oeaccount
Str:38 Len:001f Key:006e Off:00404390 Software\Microsoft\Windows Mail
Str:39 Len:0024 Key:00fd Off:00404368 Software\Microsoft\Windows Live Mail
Str:3a Len:000a Key:007f Off:0040435c Store Root
Str:3b Len:0004 Key:00fb Off:00404354 Salt
Str:3c Len:0004 Key:00a9 Off:0040434c 0x%s
Str:3d Len:000c Key:00df Off:0040433c Windows Mail
Str:3e Len:0011 Key:0055 Off:00404328 Windows Live Mail
Str:3f Len:000e Key:00a6 Off:00404318 MessageAccount
Str:40 Len:000c Key:00e1 Off:00404308 Account_Name
Str:41 Len:0012 Key:0040 Off:004042f4 SMTP_Email_Address
Str:42 Len:001e Key:00c1 Off:004042d4 %sAccount name: %s
E-mail: %s

Str:43 Len:0031 Key:001a Off:004042a0 %s:
	Server: %s:%u%s
	Username: %s
	Password: %s

Str:44 Len:0009 Key:00b7 Off:00404294 %s_Server
Str:45 Len:000c Key:001b Off:00404284 %s_User_Name
Str:46 Len:000c Key:00fc Off:00404274 %s_Password2
Str:47 Len:0007 Key:0031 Off:0040426c %s_Port
Str:48 Len:0014 Key:0061 Off:00404254 %s_Secure_Connection
Str:49 Len:0004 Key:000b Off:0040424c SMTP
Str:4a Len:0004 Key:0015 Off:00404244 POP3
Str:4b Len:0004 Key:00be Off:0040423c IMAP
Str:4c Len:0006 Key:000a Off:00404234  (SSL)
Str:4d Len:0012 Key:00b7 Off:00404220 ftp://%s:%s@%s:%u

Str:4e Len:000f Key:00c6 Off:00404210 ftp://%s:%s@%s

Str:4f Len:0012 Key:008a Off:004041fc ftp://%S:%S@%S:%u

Str:50 Len:001c Key:0064 Off:004041dc yA36zA48dEhfrvghGRg57h5UlDv3
Str:51 Len:0009 Key:009f Off:004041d0 sites.dat
Str:52 Len:0009 Key:0080 Off:004041c4 quick.dat
Str:53 Len:000b Key:0064 Off:004041b8 history.dat
Str:54 Len:0002 Key:0085 Off:004041b4 IP
Str:55 Len:0004 Key:007c Off:004041ac port
Str:56 Len:0004 Key:0088 Off:004041a4 user
Str:57 Len:0004 Key:006a Off:0040419c pass
Str:58 Len:0013 Key:00ef Off:00404188 SOFTWARE\FlashFXP\3
Str:59 Len:000a Key:001f Off:0040417c datafolder
Str:5a Len:000a Key:004b Off:00404170 *flashfxp*
Str:5b Len:0008 Key:003b Off:00404164 FlashFXP
Str:5c Len:000b Key:00f9 Off:00404158 wcx_ftp.ini
Str:5d Len:000b Key:0039 Off:0040414c connections
Str:5e Len:0007 Key:001d Off:00404144 default
Str:5f Len:0004 Key:00ad Off:0040413c host
Str:60 Len:0008 Key:00ea Off:00404130 username
Str:61 Len:0008 Key:009e Off:00404124 password
Str:62 Len:0020 Key:00dd Off:00404100 SOFTWARE\Ghisler\Total Commander
Str:63 Len:000a Key:0072 Off:004040f4 ftpininame
Str:64 Len:000a Key:0046 Off:004040e8 installdir
Str:65 Len:000a Key:0096 Off:004040dc *totalcmd*
Str:66 Len:0011 Key:00af Off:004040c8 *total*commander*
Str:67 Len:0009 Key:00e3 Off:004040bc *ghisler*
Str:68 Len:000f Key:0089 Off:004040ac Total Commander
Str:69 Len:000a Key:0006 Off:004040a0 ws_ftp.ini
Str:6a Len:0008 Key:00ab Off:00404094 _config_
Str:6b Len:0004 Key:007d Off:0040408c HOST
Str:6c Len:0004 Key:0053 Off:00404084 PORT
Str:6d Len:0003 Key:0039 Off:00404080 UID
Str:6e Len:0003 Key:007f Off:0040407c PWD
Str:6f Len:0018 Key:005a Off:00404060 SOFTWARE\ipswitch\ws_ftp
Str:70 Len:0007 Key:0023 Off:00404058 datadir
Str:71 Len:000a Key:00d5 Off:0040404c *ipswitch*
Str:72 Len:0006 Key:008b Off:00404044 WS_FTP
Str:73 Len:0005 Key:0060 Off:0040403c *.xml
Str:74 Len:000b Key:0056 Off:00404030 /*/*/Server
Str:75 Len:0004 Key:00a8 Off:00404028 Host
Str:76 Len:0004 Key:003a Off:00404020 Port
Str:77 Len:0004 Key:00d1 Off:00404018 User
Str:78 Len:0004 Key:0048 Off:00404010 Pass
Str:79 Len:000b Key:0095 Off:00404004 *filezilla*
Str:7a Len:0009 Key:0060 Off:00403ff8 FileZilla
Str:7b Len:001e Key:00d2 Off:00403fd8 SOFTWARE\Far\Plugins\ftp\hosts
Str:7c Len:001f Key:002c Off:00403fb8 SOFTWARE\Far2\Plugins\ftp\hosts
Str:7d Len:0008 Key:0023 Off:00403fac hostname
Str:7e Len:0008 Key:006d Off:00403fa0 username
Str:7f Len:0004 Key:0026 Off:00403f98 user
Str:80 Len:0008 Key:00ec Off:00403f8c password
Str:81 Len:000b Key:00ac Off:00403f80 FAR manager
Str:82 Len:0029 Key:0039 Off:00403f54 SOFTWARE\martin prikryl\winscp 2\sessions
Str:83 Len:0008 Key:00b0 Off:00403f48 hostname
Str:84 Len:000a Key:0007 Off:00403f3c portnumber
Str:85 Len:0008 Key:003a Off:00403f30 username
Str:86 Len:0008 Key:0022 Off:00403f24 password
Str:87 Len:0006 Key:004b Off:00403f1c WinSCP
Str:88 Len:000b Key:003c Off:00403f10 ftplist.txt
Str:89 Len:0008 Key:0039 Off:00403f04 ;server=
Str:8a Len:0006 Key:0065 Off:00403efc ;port=
Str:8b Len:0006 Key:00d6 Off:00403ef4 ;user=
Str:8c Len:000a Key:00d3 Off:00403ee8 ;password=
Str:8d Len:000e Key:0014 Off:00403ed8 ftp*commander*
Str:8e Len:000d Key:0066 Off:00403ec8 FTP Commander
Str:8f Len:001e Key:00dd Off:00403ea8 SOFTWARE\ftpware\coreftp\sites
Str:90 Len:0004 Key:0076 Off:00403ea0 host
Str:91 Len:0004 Key:0066 Off:00403e98 port
Str:92 Len:0004 Key:00dd Off:00403e90 user
Str:93 Len:0002 Key:0016 Off:00403e8c pw
Str:94 Len:0007 Key:007f Off:00403e84 CoreFTP
Str:95 Len:0005 Key:006f Off:00403e7c *.xml
Str:96 Len:000c Key:0032 Off:00403e6c FavoriteItem
Str:97 Len:0004 Key:000d Off:00403e64 Host
Str:98 Len:0004 Key:002a Off:00403e5c Port
Str:99 Len:0004 Key:00b1 Off:00403e54 User
Str:9a Len:0008 Key:00df Off:00403e48 Password
Str:9b Len:0037 Key:0051 Off:00403e10 SOFTWARE\smartftp\client 2.0\settings\general\favorites
Str:9c Len:0012 Key:0031 Off:00403dfc personal favorites
Str:9d Len:002c Key:0013 Off:00403dcc SOFTWARE\smartftp\client 2.0\settings\backup
Str:9e Len:0006 Key:00e5 Off:00403dc4 folder
Str:9f Len:0008 Key:000e Off:00403db8 SmartFTP
Str:a0 Len:000c Key:0035 Off:00403da8 userinit.exe
Str:a1 Len:0004 Key:004f Off:00403da0 pass
Str:a2 Len:001e Key:00fd Off:00403d80 certs\%s\%s_%02u_%02u_%04u.pfx
Str:a3 Len:0007 Key:00f3 Off:00403d78 grabbed
Str:a4 Len:000b Key:00d7 Off:00403d6c os_shutdown
Str:a5 Len:0009 Key:002a Off:00403d60 os_reboot
Str:a6 Len:000d Key:0052 Off:00403d50 bot_uninstall
Str:a7 Len:000a Key:0045 Off:00403d44 bot_update
Str:a8 Len:000e Key:00b7 Off:00403d34 bot_update_exe
Str:a9 Len:000a Key:00bc Off:00403d28 bot_bc_add
Str:aa Len:000d Key:0016 Off:00403d18 bot_bc_remove
Str:ab Len:0016 Key:0006 Off:00403d00 bot_httpinject_disable
Str:ac Len:0015 Key:009d Off:00403ce8 bot_httpinject_enable
Str:ad Len:000b Key:00e3 Off:00403cdc fs_path_get
Str:ae Len:000d Key:0043 Off:00403ccc fs_search_add
Str:af Len:0010 Key:002a Off:00403cb8 fs_search_remove
Str:b0 Len:000c Key:0017 Off:00403ca8 user_destroy
Str:b1 Len:000b Key:0062 Off:00403c9c user_logoff
Str:b2 Len:000c Key:002e Off:00403c8c user_execute
Str:b3 Len:0010 Key:00e4 Off:00403c78 user_cookies_get
Str:b4 Len:0013 Key:001c Off:00403c64 user_cookies_remove
Str:b5 Len:000e Key:00c4 Off:00403c54 user_certs_get
Str:b6 Len:0011 Key:0026 Off:00403c40 user_certs_remove
Str:b7 Len:000e Key:006d Off:00403c30 user_url_block
Str:b8 Len:0010 Key:008d Off:00403c1c user_url_unblock
Str:b9 Len:0011 Key:00ef Off:00403c08 user_homepage_set
Str:ba Len:0013 Key:0060 Off:00403bf4 user_ftpclients_get
Str:bb Len:0015 Key:0044 Off:00403bdc user_emailclients_get
Str:bc Len:0014 Key:00ea Off:00403bc4 user_flashplayer_get
Str:bd Len:0017 Key:003d Off:00403bac user_flashplayer_remove
Str:be Len:0012 Key:007e Off:00403b98 Not enough memory.
Str:bf Len:0018 Key:00ce Off:00403b7c Script already executed.
Str:c0 Len:0023 Key:006a Off:00403b58 Failed to load local configuration.
Str:c1 Len:0023 Key:00c0 Off:00403b34 Failed to save local configuration.
Str:c2 Len:0025 Key:00df Off:00403b0c Failed to execute command at line %u.
Str:c3 Len:001b Key:00d6 Off:00403af0 Unknown command at line %u.
Str:c4 Len:0003 Key:0070 Off:00403aec OK.
Str:c5 Len:0007 Key:000b Off:00403ae4 Winsta0
Str:c6 Len:0007 Key:00cc Off:00403adc default
Str:c7 Len:001c Key:000d Off:00403abc screenshots\%s\%04x_%08x.jpg
Str:c8 Len:0007 Key:00a2 Off:00403ab4 unknown
Str:c9 Len:000a Key:002a Off:00403aa8 image/jpeg
Str:ca Len:002d Key:00e9 Off:00403a78 Software\Microsoft\Windows\Currentversion\Run
Str:cb Len:003b Key:00bb Off:00403a3c SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%s
Str:cc Len:0010 Key:00a2 Off:00403a28 ProfileImagePath
Str:cd Len:000f Key:00de Off:00403a18 unknown\unknown
Str:ce Len:004c Key:00db Off:004039c8 :d
rd /S /Q "%s"
rd /S /Q "%s"
if exist "%s" goto d
if exist "%s" goto d
Str:cf Len:0007 Key:00b9 Off:004039c0 dwm.exe
Str:d0 Len:000c Key:0063 Off:004039b0 taskhost.exe
Str:d1 Len:000b Key:006d Off:004039a4 taskeng.exe
Str:d2 Len:000b Key:00c1 Off:00403998 wscntfy.exe
Str:d3 Len:000a Key:0002 Off:0040398c ctfmon.exe
Str:d4 Len:000b Key:0032 Off:00403980 rdpclip.exe
Str:d5 Len:000c Key:009a Off:00403970 explorer.exe
Str:d6 Len:0017 Key:00f8 Off:00403958 V	%08X
C	%08X
PS	%08X
Str:d7 Len:0010 Key:0007 Off:00403944 BOT NOT CRYPTED!
Str:d8 Len:0029 Key:0001 Off:00403918 SOFTWARE\Microsoft\Windows\CurrentVersion
Str:d9 Len:000b Key:00b9 Off:0040390c InstallTime
Str:da Len:0010 Key:006b Off:004038f8 WindowsProductId
Str:db Len:000b Key:00e3 Off:004038ec %s_%08X%08X
Str:dc Len:000b Key:00df Off:004038e0 fatal_error
Str:dd Len:0007 Key:00b7 Off:004038d8 unknown
Str:de Len:0074 Key:0059 Off:00403860 SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List
Str:df Len:0072 Key:00be Off:004037e8 SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\AuthorizedApplications\List
Str:e0 Len:0015 Key:005d Off:004037d0 %windir%\explorer.exe
Str:e1 Len:0030 Key:00a1 Off:0040379c %windir%\explorer.exe:*:Enabled:Windows Explorer
Str:e2 Len:0053 Key:00b7 Off:00403748 netsh advfirewall firewall add rule name="explore" dir=in action=allow program="%s"
Str:e3 Len:000c Key:00e4 Off:00403734 wtsapi32.dll
Str:e4 Len:0015 Key:00e2 Off:0040371c WTSEnumerateSessionsW
Str:e5 Len:000d Key:000e Off:0040370c WTSFreeMemory
Str:e6 Len:0011 Key:0032 Off:004036f8 WTSQueryUserToken
Str:e7 Len:000b Key:0028 Off:004036ec userenv.dll
Str:e8 Len:001f Key:002e Off:004036cc GetDefaultUserProfileDirectoryW
Str:e9 Len:000a Key:0011 Off:004036c0 user32.dll
Str:ea Len:000b Key:004c Off:004036b4 MessageBoxW
Str:eb Len:0009 Key:008e Off:004036a8 ntdll.dll

Tout un programme n’est-ce pas !! La seconde fonction de décodage est disponible la l’offset 0x0040E874 et fait la même chose (Le mystêre reste entier, pourquoi 2 fonctions ??)

Zeus Xor2

On retrouve dans ces strings des chaines de controle du botnet plus qu’explicite que google hésite à identifier comme Zeus 2.0 ou Citadel :

Str:a6 Len:000d Key:0052 Off:00403d50 bot_uninstall
Str:a7 Len:000a Key:0045 Off:00403d44 bot_update
Str:a8 Len:000e Key:00b7 Off:00403d34 bot_update_exe
Str:a9 Len:000a Key:00bc Off:00403d28 bot_bc_add
Str:aa Len:000d Key:0016 Off:00403d18 bot_bc_remove
Str:ab Len:0016 Key:0006 Off:00403d00 bot_httpinject_disable
Str:ac Len:0015 Key:009d Off:00403ce8 bot_httpinject_enable
Str:b0 Len:000c Key:0017 Off:00403ca8 user_destroy
Str:b1 Len:000b Key:0062 Off:00403c9c user_logoff
Str:b2 Len:000c Key:002e Off:00403c8c user_execute
Str:b3 Len:0010 Key:00e4 Off:00403c78 user_cookies_get
Str:b4 Len:0013 Key:001c Off:00403c64 user_cookies_remove
Str:b5 Len:000e Key:00c4 Off:00403c54 user_certs_get
Str:b6 Len:0011 Key:0026 Off:00403c40 user_certs_remove
Str:b7 Len:000e Key:006d Off:00403c30 user_url_block
Str:b8 Len:0010 Key:008d Off:00403c1c user_url_unblock
Str:b9 Len:0011 Key:00ef Off:00403c08 user_homepage_set
Str:ba Len:0013 Key:0060 Off:00403bf4 user_ftpclients_get
Str:bb Len:0015 Key:0044 Off:00403bdc user_emailclients_get
Str:bc Len:0014 Key:00ea Off:00403bc4 user_flashplayer_get
Str:bd Len:0017 Key:003d Off:00403bac user_flashplayer_remove

Quels sont les fonctionnalitées du notre ;

A l’offset 0x0041D2BA on retrouve un envoit sur un socket de la string RFB 003.003 ca sent le VNC Serveur ( RFB pour le protocole Remote Frame Buffer )

Zeus VNC

En décodant toutes les string et analysant un peut le code, on se rend compte que le malware est capable d’aller farfouiller dans bon nombre de fichier/base de registre de configuration de softs clients FTP à la recherche de crédentials. Le point d’entrée de ce moissonnage en masse est 0x00412B05

Farfouillage FTP

Autre truc Funky.. Manifestement il se permettra d’ouvrir le firewall.

$ ./decode.py  | egrep netsh
Str:e2 Len:0053 Key:00b7 Off:00403748 netsh advfirewall firewall add rule name="explore" dir=in action=allow program="%s"

Et j’en passe, Il s’approche de près des certificats, émettra des requêtes http. Bref c’est la fête et je suis loin d’avoir tout regardé et compris, il reste encore quelques fonction d’offuscation qui gardent encore leur mystère (voir 0x0041B6ED).

Xor Inconnu

Alors, Zeus v2 ou Citadel, c’est la fonction qui parse les options de la ligne de commande qui m’a convaincu du Zeus. Dans notre code l’executable peut être lancé avec les options “f” “n” ou “v”

Start Options

On peut trouver grace à google des ersatz de sources de Zeus qui semblent confirmer cela, Et encore j’ai pas la fonction “info” moi:
zeus optionsMais quoi qu’il en soit, je suis loin d’avoir les options d’un Citatel si on en croit le blog de Hexacorn.

C’est donc un Zeus v2. Et c’est là qu’on se rend compte aussi de la qualité de la classification des malware par les antivirus (Quand c’est détecté) ;) Il faut les comprendre, avec ce qui doit sortir tous les jours c’est de l’abattage.

Antivirus        Résultat                        Mise à jour
Agnitum          -                               20121126
AhnLab-V2        Trojan/Win32.Zbot               20121126
AntiVir          TR/Rogue.kdv.796538.1           20121127
Antiy-AVg        -                               20121127
Avast            Win32:Malware-gen               20121127
AVG              -                               20121127
BitDefender      Trojan.Generic.KDV.796538       20121127
ByteHero         -                               20121116
CAT-QuickHeal    -                               20121127
ClamAV           -                               20121127
Commtouch        -                               20121127
Comodo           TrojWare.Win32.Trojan.Agent.Gen 20121126
DrWeb            Trojan.Winlock.7431             20121127
Emsisoft         Trojan.Win32.Zbot (A)           20121127
eSafe            -                               20121126
ESET-NOD32       a variant of Win32/Injector.ZMJ 20121126
F-Prot           -                               20121127
F-Secure         Trojan.Generic.KDV.796538       20121127
Fortinet         W32/Zbot.AQW!tr.pws             20121127
GData            Trojan.Generic.KDV.796538       20121127
Ikarus           Trojan.Win32.Inject             20121127
Jiangmin         -                               20121127
K7AntiVirus      -                               20121126
Kaspersky        Trojan.Win32.Inject.ewuu        20121127
Kingsoft         -                               20121119
McAfee           PWS-Zbot.gen.aqw                20121127
McAfee-GW-Ed     PWS-Zbot.gen.aqw                20121126
Microsoft        PWS:Win32/Zbot                  20121127
MicroWorld-eScan Trojan.Generic.KDV.796538       20121127
Norman           W32/Ransom.CNY                  20121127
nProtect         Trojan.Generic.KDV.796538       20121127
Panda            Trj/CI.A                        20121126
PCTools          -                               20121127
Rising           -                               20121126
Sophos           Mal/EncPk-AFN                   20121127
SUPERAntiSpyware -                               20121127
Symantec         -                               20121127
TheHacker        -                               20121126
TotalDefense     -                               20121126
TrendMicro       -                               20121127
TrendMicro-HCall TROJ_GEN.F4AHZKQ                20121127
VBA32            -                               20121124
VIPRE            Trojan.Win32.Generic!BT         20121127
ViRobot          Trojan.Win32.A.Inject.176000    20121127

Bon je vous quitte je vient de recevoir un mail de HSBC me demandant d’ouvrir un message sécurisé en .zip ;)

Posted in Malware, Reverse | Tagged , , , , | 2 Comments

Le Packing (for newbies) Part 2

Rappelons nous le dernier post. On était arrivé à la conclusion que notre exécutable était packé (On a d’ailleur a cette occasion appris ce que c’était), mais on patinait dans la choucroute pour le dépacker de façons automatique. On va donc devoir sortir tout l’attirail pour tenter de le dépacker, J’ai nommé IDA pour désassembler et Ollydgb pour débugger et le vénérable LORD_PE pour dumper le processus depuis la ram. Pour une somme modique on peut tout faire avec IDA sur une vaste gamme de systèmes avec des plugins comme IDA_Dumper. Ha l’argent, c’est probablement la raison pour laquelle tout le monde se tourne vers OllyDbg (Enfin pour l’instant en 32Bits uniquement). Il nous faudra aussi d’autres petits tools. Nous y reviendrons plus tard.

Pour s’échauffer on va reprendre notre Hello World packé sous UPX de la partie 1 de cet article et on va se le dé-packer à la main.

Le cas simple “find the Jump”

L’idée est la suivante; Que va faire un packer simple, il va décompresser/déobfusquer le code réel, puis il vas sauter dedans pour l’exécuter. La première méthode dans le cas d’un packer pour newbies est de trouver oû est ce saut, d’y poser un breakpoint, de laisser faire le programme dépackant et quand on arrive à notre breakpoint on dumpe le programme et on crée un nouvel exécutable.

Ouvrons notre hello world upx dans IDA, dés-fois que cela serait simple. Et heureusement oui, UPX c’est bien pour l’apprentissage. Au premier abords ca fait peur. En y regardant plus près, il n’y a qu’une seule fonction. Et on trouve facilement le saut car IDA nous informe qu’au dela de ce saut, le il n’y a pas de programme exécutable (sp-analysis failed). Il n’y a pas encore de programme car le décompresseur n’a pas été lancé. Là c’est facile ida vois bien qu’il n’y a pas de code derrière le “JMP”, mais cela peut être moins évident avec un saut de type “call registre” ou un “ret”.

Upx in IDA

On se met sur la ligne de saut, on appuie sur “space” pour avoir le désassembler en vue liste et on note l’adresse du saut (Ici 0x004076EB).

Ida Jump Upx

Ensuite on ouvre OllyDbg, on charge l’exécutable. On met un point d’arrêt (F2) au même endroit.

Olly Dbg Breakpoint

Voila, le piège est en place, ne reste plus qu’a lancer. Quand Ollydbg rend la main on est devant notre saut, on step d’une instruction (F7) et on se retrouve devant notre code dépacké. On note la valeur d’Eip, ici 0x00401130, c’est là que le vrai programme commence.

Upx Jump address

Il ne reste qu’a dumper le programme, Pour cela on lance notre LORD_PE (Nota il y a plein de soft qui font la même chose, même des plugins OllyDbg le font (ex PE_Dumper) , choisis tes armes camarade).

On sélectionne notre exécutable et on le dump “Full”.

Lord_PE Dump

Là notre LORD_PE fait un truc étonnant dont il faut avoir conscience. Il “Rebuild Import Table”

Lord_PE Export

Apparté, Rebuilding de l’IAT : Dans un executable PE, l’IAT de son nom complet Import Adress Table est un tableau de correspondances pour les fonctions importées (Un appel a une fonction de Kernel32.dll par exemple). Elle contient ce qui doit être importé ainsi que le nom des dites DLL (Pour les amis des ELF on peut considéré cela comme une genre de GOT). C’est indépendant de la version de windows, au démarrage la correspondance fonction vers l’adresse de la lib est remise en place. En plus de cela, notre Packer a nettoyé cette IAT avec les fonction que seul lui utilise, une fois dépacké, il faut donc remettre l’IAT en ordre. A la main, on oublie, mais avec le bon tools c’est simple.

Pour plus d’informations sur l’IAT je vous encourage à lire ce lien.

Mais ce n’est pas tout ! Il faut encore changer l’EP, l’Entry Point. C’est a dire l’emplacement en mémoire où va démarrer le programme. Il faut que l’on démarre là où on a finis le dépacking (rapellez vous l’addresse 0x00401130 que l’on a noté ).

On reprend LordPE, on prend l’option PE Editor, on édite l’exécutable que l’on vient de dumper. On change l’Entry Point. La base étant 0x0040000 il suffit de mettre 0x1130 dans la case.

Entry Point

Voila c’est finis, on a retrouvé notre executable “décompréssé”, Avec son code et ses strings en clair.

$ strings hello-upx-dumped.exe  | grep hello
hello World !

Malheureusement c’est rarement aussi facile qu’avec UPX.

La méthode ‘Regarde le Tas’

Si le packers commence par sauver la valeur de la pile ou fait un gros PUSHA (haaa ce formidable 32 Bits, il va me manquer). On peut aussi penser à mettre un break point hardware sur la position mémoire de la pile. En se disant, arrivé dans notre code packé, la pile sera revenue à la position initiale. Upx fait aussi comme cela, il est nickel comme exemple cet UPX. Pour faire ceci avec OllyDbg je lance mon programme, je passe le PUSHAD (f7) en step by step, je vais sur la valeur du registre ESP et je l’affiche dans le dump.

pushaddepack

Je selection le word qui se trouve à l’emplacement de ma pile, et j’insère un breakpoint hardware en R/W.

Hardware Breakpoint

Je lance le programme… Et hoo miracle il rend la main dans la fameuse boucle (que l’on connais maintenant) et qui va sauter sur le programme dépacké. il suffit de faire un peu pas à pas jusqu’au saut et on se retrouve là aussi en 0x00401130

stack jump codeA partir de là, Dump, IAT et EP..comme précédemment et c’est bon.

La technique de siY0ug

Mais dans la vraie vie c’est pas toujours aussi rose, même s’il n’y a pas d’anti debugger, on peut errer dans le code pendant des jours à chercher le saut. Par exemple notre facture.exe (Hash 17832c9a78b36c8a3133e2c2e24ebc3b9896763a chez Malware.lu). Il contient 131 fonctions, du code long comme le bras avec utilisation du co-processeur arithmétique, des champs complet de calls dans tous les sens, pas de pusha au début (par contre de la réservation de heap).. Bref… Glups.

facture

Nous voici acculé. Pas de dépackeur tout fait, Trop alambiqué dans IDA. C’est à ce moment là que l’on pleure auprès d’un compagnon de café qui lâche la méthode suivante. Dixit le gaillard (Et c’est pas une tanche coté déssossage) on arrive à dépacker 3/4 des packeur de PE avec du malware dedans. L’idée est la suivante;

On va laisser le malware faire son un-package et on va breaker quand monsieur va faire un appel bien sentis à kernel32. Généralement quand il est en train d’injecter son code dans un autre process (c’est typique pour un malware voir ceci). Actuellement on a vu des packer qui se décompressent dans le même segment mémoire, mais certain se prennent du heap et y sortent carrément un autre executable.

Bon comme çà, ça parait simple, mais ne déconnez pas, faite ceci dans un environnement clos. Une bonne grosse sandbox; Cuckoo, Vmware, au pire un poste dédié.

Si vous ratez le breakpoint, vous êtes poncé, si le dépackeur contient aussi une saloperie,  vous êtes poncé., Si le malware s’attache pas à un process comme vous le pensez, vous êtes poncé; Bref à chaque mauvaise manip, vous êtes poncé.

Reprenons Ollydbg. On ouvre l’exécutable, on demande la fenêtre “Executable Modules” (Alt+E) on sélectionne Kernel32, on fait “show names” (ctrl+N). Devant nous apparaît la fenêtre avec la liste de toutes les fonctions de Kernel32.dll

show names

On cherche “WriteProcessMemory” (Il suffit de taper les premières lettres) et on met en place un breakpoint (F2).

writeprocessmemory

Ensuite , confiant on lance le programme. Quand celui ci rend la main juste avant la fonction. Dans la stack on retrouve les paramètre d’appel à cette fonction, et si on fait “Follow in dump” de l’addresse du “Buffer” on se rend compte que dans ce buffer on est en présence d’un exécutable complet.

executable depacked

Là c’est différent, c’est un programme complet qu’il faudra extraire du dump mémoire. Soyez heureux, pas de IAT et d’EP à tripoter).

Si ça ne va pas avec cette fonction là … On peut essayer les fonctions suivantes

Maintenant extrayons notre exécutable de la mémoire. Sur le dump mémoire sous OllyDbg on fait Bouton droit de la souris => Backup => Create Backup. on se retrouve avec un dump mémoire complet de ce processus. Il suffit de trouver ou commence l’exécutable, et découper. et pour cela, on remercie Zbikowski !!! on cherche les MZ

$ grep -boa MZ backup_00140000.bin.bin 
21792:MZ
27676:MZ
53930:MZ
114271:MZ
116204:MZ
197816:MZ
308269:MZ

Pas de bol il y en a un ou deux.. on les essaye plus précis, on a vu dans le dump mémoire que c’était MZ suivis de 0x90 0x00.

$ grep -boa MZ$'\x90\x00' backup_00140000.bin.bin 
21792:MZ?
197816:MZ?

Ouf plus que 2 à essayer, Rappelons nous l’original packé était :

$ peentro.py facture.exe.malv 
Section	Entropy	Bytes	Size	MD5					Remark
.code	5.65	6	8503	6d7c8f47c89843bafb8d8a0912730242	
.text	6.49	7	9716	5e70fa9623805d69b6e548873c23d37f	
.rdata	1.75	2	188	96fdc428b50e1fa15bc8ce78d17a0525	
.data	5.29	6	2796	cd00c1734804fcf8f776f8ce3431b129	
.rsrc	2.94	3	4444	0b5ae9b8bfbc2ecfcb22c9578e800439

Extrayons le premier.  (Note : la valeur pour le tail est +1 par rapport au grep.)

$ tail -c+21793 backup_00140000.bin.bin > facture1.unpacked
$ peentro.py facture1.unpacked 
Section	Entropy	Bytes	Size	MD5					Remark
.code	5.65	6	8503	6d7c8f47c89843bafb8d8a0912730242	
.text	6.49	7	9716	5e70fa9623805d69b6e548873c23d37f	
.rdata	1.75	2	188	96fdc428b50e1fa15bc8ce78d17a0525	
.data	5.29	6	2796	cd00c1734804fcf8f776f8ce3431b129	
.rsrc	2.94	3	4444	0b5ae9b8bfbc2ecfcb22c9578e800439

Zut, on est retombé sur l’original.. Allons y pour le second candidat :

$ tail -c+197817 backup_00140000.bin.bin > facture2.unpacked
$ peentro.py facture2.unpacked 
Section	Entropy	Bytes	Size	MD5					Remark
.text	6.72	7	134836	97f0523f3fa408480c81e763935aedc1	
.data	1.58	2	8276	841bea2427018da084fc8db606a058f8	
.reloc	5.67	6	5778	d251d79e05658d968ee468f36f562f3e

Bingo un autre executable !  Allons y.. tentons un strings, somme nous victorieux ?? (Le grep étrange c’est pour n’attraper que les digram les plus utilisé en anglais, ca évite pas mal de strings random)

$ strings -10 facture2.unpacked | egrep 'th|he|in|er|an|re|nd|at'
Content-Length
Authorization
Transfer-Encoding
Accept-Encoding
If-Modified-Since
userenv.dll
CreateEnvironmentBlock
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)
Content-Type: application/x-www-form-urlencoded
ObtainUserAgentString
cabinet.dll
FCIFlushCabinet
bepfLvtcklre
v6!!2>6-7<=)+,.an"*&%/--gulh!y
GdipCreateBitmapFromHBITMAP
GdipGetImageEncodersSize
GdipGetImageEncoders
GdipSaveImageToStream
CreateStreamOnHGlobal
CreateCompatibleDC
CreateCompatibleBitmap
GetProcAddress
NtCreateThread
NtCreateUserProcess
NtQueryInformationProcess
RtlUserThreadStart
LdrGetDllHandle
GetModuleHandleW
GetPrivateProfileStringW
CreateFileW
FlushFileBuffers
GetPrivateProfileIntW
GetProcAddress
EnterCriticalSection
CloseHandle
WaitForSingleObject
FileTimeToDosDateTime
CreateMutexW
FindFirstFileW
SetEndOfFile
FreeLibrary
CreateProcessW
SetFilePointerEx
CreateDirectoryW
GetCurrentThread
VirtualFree
VirtualQueryEx
Thread32First
VirtualFreeEx
HeapCreate
Thread32Next
GetTimeZoneInformation
GetTempPathW
RemoveDirectoryW
FindNextFileW
CreateToolhelp32Snapshot
GetVolumeNameForVolumeMountPointW
GetFileInformationByHandle
CreateThread
ExpandEnvironmentStringsW
SetThreadPriority
GetCurrentThreadId
CreateEventW
GetThreadContext
SetThreadContext
CreateFileMappingW
CreateRemoteThread
GetUserDefaultUILanguage
TerminateProcess
GetCommandLineW
GetComputerNameW
GetVersionExW
DuplicateHandle
GetCurrentProcessId
GetNativeSystemInfo
DispatchMessageW
SendMessageTimeoutW
SetWindowLongW
CharUpperW
CharLowerA
GetWindowLongW
TranslateMessage
WindowFromPoint
GetTopWindow
ExitWindowsEx
CharLowerBuffA
OpenWindowStationW
GetUserObjectInformationW
SetThreadDesktop
GetProcessWindowStation
CreateWindowStationW
CloseWindowStation
GetThreadDesktop
SetProcessWindowStation
CreateDesktopW
RegisterClassA
DefWindowProcW
CallWindowProcW
CallWindowProcA
RegisterClassW
ReleaseCapture
DefWindowProcA
GetClipboardData
RegisterClassExW
GetCapture
GetUpdateRect
BeginPaint
SetCapture
GetWindowDC
RegisterClassExA
GetUpdateRgn
GetShellWindow
GetWindowThreadProcessId
SendMessageW
PostThreadMessageW
GetMenuState
SystemParametersInfoW
MenuItemFromPoint
SetKeyboardState
RegisterWindowMessageW
GetKeyboardState
MapWindowPoints
SetWindowPos
GetWindowInfo
GetWindowRect
PrintWindow
IntersectRect
CharLowerW
GetSidSubAuthority
CryptAcquireContextW
OpenThreadToken
GetSidSubAuthorityCount
GetTokenInformation
RegCreateKeyExW
RegQueryValueExW
CreateProcessAsUserW
CryptCreateHash
ConvertStringSecurityDescriptorToSecurityDescriptorW
CryptHashData
InitiateSystemShutdownExW
GetLengthSid
ConvertSidToStringSidW
wvnsprintfW
PathIsDirectoryW
PathFindFileNameW
PathRemoveFileSpecW
PathAddBackslashW
PathSkipRootW
PathCombineW
PathAddExtensionW
PathUnquoteSpacesW
PathRemoveBackslashW
PathMatchSpecW
wvnsprintfA
PathIsURLW
PathQuoteSpacesW
PathRenameExtensionW
SHGetFolderPathW
ShellExecuteW
CommandLineToArgvW
GetUserNameExW
CoCreateInstance
CoUninitialize
CLSIDFromString
StringFromGUID2
CreateCompatibleBitmap
CreateDIBSection
CreateCompatibleDC
freeaddrinfo
getaddrinfo
WSAAddressToStringW
CryptUnprotectData
PFXImportCertStore
CertDeleteCertificateFromStore
CertOpenSystemStoreW
CertCloseStore
CertEnumCertificatesInStore
CertDuplicateCertificateContext
PFXExportCertStoreEx
HttpQueryInfoA
InternetConnectA
InternetQueryOptionW
InternetCrackUrlA
InternetReadFile
InternetSetOptionA
HttpSendRequestA
InternetOpenA
InternetCloseHandle
InternetQueryOptionA
HttpSendRequestExA
HttpSendRequestExW
InternetQueryDataAvailable
InternetReadFileExA
HttpSendRequestW
GetUrlCacheEntryInfoW
InternetSetStatusCallbackW
HttpAddRequestHeadersW
HttpAddRequestHeadersA
NetUserGetInfo
NetApiBufferFree
NetUserEnum

Et en unicode, y a t’il des strings ?

$ strings -el -10 facture2.unpacked 
kernel32.dll
S:(ML;;NRNWNX;;;LW)
SeSecurityPrivilege
S:(ML;CIOI;NRNWNX;;;LW)
SeShutdownPrivilege
SeTcbPrivilege
SOFTWARE\Microsoft
cGlobal\%08X%08X%08X
SysListView32
CiceroUIWndFrame
ConsoleWindowClass

Pas mal, quel sont maintenant les dll utilisées ?

$ objdump -x facture2.unpacked | grep "DLL Name"
DLL Name: KERNEL32.dll
DLL Name: USER32.dll
DLL Name: ADVAPI32.dll
DLL Name: SHLWAPI.dll
DLL Name: SHELL32.dll
DLL Name: Secur32.dll
DLL Name: ole32.dll
DLL Name: GDI32.dll
DLL Name: WS2_32.dll
DLL Name: CRYPT32.dll
DLL Name: WININET.dll
DLL Name: OLEAUT32.dll
DLL Name: NETAPI32.dll

Ho le support du réseau est arrivé ;) et plein d’autres DLLs qui laissent a penser que le malware est bien juteux

Et bien voila, c’est une victoire il semblerai la bête soit dé-packée. Ne reste plus qu’a l’analyser… Une broutille ;)

Mais ca c’est pour une autre fois.

Posted in Reverse | Tagged , , , | Leave a comment

[Invisible/150] Appel au boycott.

Ce weekend j’ai encore tenté d’aider maigrement l’équipe de Big-Daddy au CTF Forbidden Bits. Ce n’est pas facile de résoudre un chall sans qu’une des brutes de l’équipe ne le finisse avant vous. Heureusement je suis tombé sur le chall (Invisible/150) où ils avaient manifestement renoncés :). L’énoncé est ici : blank.html

Comme on peut le constater c’est une page vide. Si on regarde dedans on constate que ce vide est plein de tabulations, d’espaces et de retour chariots.

$ hexdump real.html | head
0000000 2020 0920 0909 0920 0909 200a 2020 090a
0000010 090a 2020 0920 0a20 0909 0909 2020 0a09
0000020 2009 0920 2020 0920 0920 0a0a 0a20 0920
0000030 2020 2020 0909 0a0a 2020 0920 2020 0920
0000040 0920 200a 2020 0909 2009 0920 0a09 2020
0000050 0a20 0a09 2009 2020 2009 090a 0909 2009
0000060 0920 090a 2020 2009 2020 0909 0a09 200a
0000070 200a 2009 2020 0920 0a09 200a 2020 2009
0000080 2020 0909 0a09 2020 0920 2009 0909 2020
0000090 200a 2020 090a 090a 2020 0920 0a20 0909

Et c’est là que ce genre de chall sombre dans ce que je n’aime pas du tout; le non sens.

On regarde si c’est pas du Morse… On regarde si c’est pas du Snow… (Snow est une méthode de stéganographie élaborée qui se base sur les espaces). Toujours rien…

Là on se tourne vers DuckDuckGo, pour “WhiteSpace” on découvre qu’il y a aussi un language de programmation éponyme (Le language Whitespace pas le language éponyme :) )

 https://en.wikipedia.org/wiki/Whitespace_(programming_language)

Et là on se dit “Non Quoi”… J’ai trouvé sur un site de fan un interpreteur perl déja tout cuit. Au premiers abords le truc est pas content.

$perl whitespace.pl real.htlm
[stuck]^c
$perl whitespace.pl < real.html
wrong

Ne comprenant pas d’où sort ce “wrong” je trouve l’option qui debug le programme. On se rend compte que oui c’est bien un script Whitespace.  Me voici enfin avec le debug suivant.

$ perl whitespace.pl < real.html -d
command list: AAABBBABBBCAAACBCBAAABACBBBBAABCBAABAAABABCCACABAAAABBCCAAABAAABABCAAABBBAABBCAAACBCBAAABACBBBBAABCBAABAAABBBCCACABAAAABBCCAAABAAABBBCAAABBABBAACAAACBCBAAABACBBBBAABCBAABAABAAACCACABAAAABBCCAAABAABAAACAAABBAAAABCAAACBCBAAABACBBBBAABCBAABAABAABCCACABAAAABBCCAAABAABAABCAAABBABBBACAAACBCBAAABACBBBBAABCBAABAABABACCACABAAAABBCCAAABAABABACAAABBAABBBCAAACBCBAAABACBBBBAABCBAABAABABBCCACABAAAABBCCAAABAABABBCAAABABABAACACABCAAAAABBABAAACACABCAAAAABBAABABCACABCAAAAABAAAAACACABCAAAAABBABABBCACABCAAAAABBAABABCACABCAAAAABBBBAABCACABCAAAAABAAAAACACABCAAAAABBABAABCACABCAAAAABBBAABBCACABCAAAAABAAAAACACABCAAAAABABABBBCACABCAAAAABBAABABCACABCAAAAABABBBBBCACABCAAAAABBAAAABCACABCAAAAABBBAABACACABCAAAAABBAABABCACABCAAAAABABBBBBCACABCAAAAABAABBBACACABCAAAAABBAAAABCACABCAAAAABBBAABBCACABCAAAAABBBABABCACABCAAAAABBBAABBCACABCAAAAABAABCACABCAACCCCCCCAAABAAAABBCAAABBBABBBCBCAAAAABBBAABACBCAAAAABBABBBBCBCAAAAABBABBBACBCAAAAABBAABBBCBCAACCC
posiiton: 0     command: AAn push_number 119
posiiton: 11     command: AAn push_number
posiiton: 15     command: BCBA read_char
posiiton: 19     command: AAn push_number
posiiton: 24     command: BBB retrieve
posiiton: 27     command: BAAB subtract
posiiton: 31     command: CBAl jump_ifzero ABAAABAB
posiiton: 43     command: CACl jump ABAAAABB
posiiton: 55     command: CAAl set_label ABAAABAB
posiiton: 67     command: AAn push_number 115
posiiton: 78     command: AAn push_number
posiiton: 82     command: BCBA read_char
posiiton: 86     command: AAn push_number
posiiton: 91     command: BBB retrieve
posiiton: 94     command: BAAB subtract
posiiton: 98     command: CBAl jump_ifzero ABAAABBB
posiiton: 110     command: CACl jump ABAAAABB
posiiton: 122     command: CAAl set_label ABAAABBB
posiiton: 134     command: AAn push_number 108
posiiton: 145     command: AAn push_number
posiiton: 149     command: BCBA read_char
posiiton: 153     command: AAn push_number
posiiton: 158     command: BBB retrieve
posiiton: 161     command: BAAB subtract
posiiton: 165     command: CBAl jump_ifzero ABAABAAA
posiiton: 177     command: CACl jump ABAAAABB
posiiton: 189     command: CAAl set_label ABAABAAA
posiiton: 201     command: AAn push_number 97
posiiton: 212     command: AAn push_number
posiiton: 216     command: BCBA read_char
posiiton: 220     command: AAn push_number
posiiton: 225     command: BBB retrieve
posiiton: 228     command: BAAB subtract
posiiton: 232     command: CBAl jump_ifzero ABAABAAB
posiiton: 244     command: CACl jump ABAAAABB
posiiton: 256     command: CAAl set_label ABAABAAB
posiiton: 268     command: AAn push_number 110
posiiton: 279     command: AAn push_number
posiiton: 283     command: BCBA read_char
posiiton: 287     command: AAn push_number
posiiton: 292     command: BBB retrieve
posiiton: 295     command: BAAB subtract
posiiton: 299     command: CBAl jump_ifzero ABAABABA
posiiton: 311     command: CACl jump ABAAAABB
posiiton: 323     command: CAAl set_label ABAABABA
posiiton: 335     command: AAn push_number 103
posiiton: 346     command: AAn push_number
posiiton: 350     command: BCBA read_char
posiiton: 354     command: AAn push_number
posiiton: 359     command: BBB retrieve
posiiton: 362     command: BAAB subtract
posiiton: 366     command: CBAl jump_ifzero ABAABABB
posiiton: 378     command: CACl jump ABAAAABB
posiiton: 390     command: CAAl set_label ABAABABB
posiiton: 402     command: AAn push_number 84
posiiton: 413     command: ACA duplicate_last
posiiton: 416     command: BCAA print_char
posiiton: 420     command: AAn push_number 104
posiiton: 431     command: ACA duplicate_last
posiiton: 434     command: BCAA print_char
posiiton: 438     command: AAn push_number 101
posiiton: 449     command: ACA duplicate_last
posiiton: 452     command: BCAA print_char
posiiton: 456     command: AAn push_number 32
posiiton: 466     command: ACA duplicate_last
posiiton: 469     command: BCAA print_char
posiiton: 473     command: AAn push_number 107
posiiton: 484     command: ACA duplicate_last
posiiton: 487     command: BCAA print_char
posiiton: 491     command: AAn push_number 101
posiiton: 502     command: ACA duplicate_last
posiiton: 505     command: BCAA print_char
posiiton: 509     command: AAn push_number 121
posiiton: 520     command: ACA duplicate_last
posiiton: 523     command: BCAA print_char
posiiton: 527     command: AAn push_number 32
posiiton: 537     command: ACA duplicate_last
posiiton: 540     command: BCAA print_char
posiiton: 544     command: AAn push_number 105
posiiton: 555     command: ACA duplicate_last
posiiton: 558     command: BCAA print_char
posiiton: 562     command: AAn push_number 115
posiiton: 573     command: ACA duplicate_last
posiiton: 576     command: BCAA print_char
posiiton: 580     command: AAn push_number 32
posiiton: 590     command: ACA duplicate_last
posiiton: 593     command: BCAA print_char
posiiton: 597     command: AAn push_number 87
posiiton: 608     command: ACA duplicate_last
posiiton: 611     command: BCAA print_char
posiiton: 615     command: AAn push_number 101
posiiton: 626     command: ACA duplicate_last
posiiton: 629     command: BCAA print_char
posiiton: 633     command: AAn push_number 95
posiiton: 644     command: ACA duplicate_last
posiiton: 647     command: BCAA print_char
posiiton: 651     command: AAn push_number 97
posiiton: 662     command: ACA duplicate_last
posiiton: 665     command: BCAA print_char
posiiton: 669     command: AAn push_number 114
posiiton: 680     command: ACA duplicate_last
posiiton: 683     command: BCAA print_char
posiiton: 687     command: AAn push_number 101
posiiton: 698     command: ACA duplicate_last
posiiton: 701     command: BCAA print_char
posiiton: 705     command: AAn push_number 95
posiiton: 716     command: ACA duplicate_last
posiiton: 719     command: BCAA print_char
posiiton: 723     command: AAn push_number 78
posiiton: 734     command: ACA duplicate_last
posiiton: 737     command: BCAA print_char
posiiton: 741     command: AAn push_number 97
posiiton: 752     command: ACA duplicate_last
posiiton: 755     command: BCAA print_char
posiiton: 759     command: AAn push_number 115
posiiton: 770     command: ACA duplicate_last
posiiton: 773     command: BCAA print_char
posiiton: 777     command: AAn push_number 117
posiiton: 788     command: ACA duplicate_last
posiiton: 791     command: BCAA print_char
posiiton: 795     command: AAn push_number 115
posiiton: 806     command: ACA duplicate_last
posiiton: 809     command: BCAA print_char
posiiton: 813     command: AAn push_number 9
posiiton: 821     command: ACA duplicate_last
posiiton: 824     command: BCAA print_char
posiiton: 828     command: CCC end
posiiton: 831     command: CCC end
posiiton: 834     command: CAAl set_label ABAAAABB
posiiton: 846     command: AAn push_number 119
posiiton: 857     command: BCAA print_char
posiiton: 861     command: AAn push_number 114
posiiton: 872     command: BCAA print_char
posiiton: 876     command: AAn push_number 111
posiiton: 887     command: BCAA print_char
posiiton: 891     command: AAn push_number 110
posiiton: 902     command: BCAA print_char
posiiton: 906     command: AAn push_number 103
posiiton: 917     command: BCAA print_char
posiiton: 921     command: CCC end
ABAAAABB = 846
ABAAABAB = 67
ABAAABBB = 134
ABAABAAA = 201
ABAABAAB = 268
ABAABABA = 335
ABAABABB = 402
position=0
 stack=
position=11
 stack=119
position=15
 stack=119,0
position=19
 stack=119
position=24
 stack=119,0
position=27
 stack=119,0
position=31
 stack=119
position=43
 stack=
position=846
 stack=
position=857
 stack=119
position=861
 stack=
position=872
 stack=114
position=876
 stack=
position=887
 stack=111
position=891
 stack=
position=902
 stack=110
position=906
 stack=
position=917
 stack=103
position=921
 stack=
wrong

La on se dit qu’on pousse beaucoup sur la pile pour n’afficher que “wrong”.  Dumpons la stack .. (en Whitespace mais ou vis t’on !!)

$ perl whitespace.pl < real.html -d 2>&1 | grep push_number | cut -d " " -f 10 | perl -lane "print chr($_)" | tr -d "\n"
wslangThe key is We_are_Nasus   wrong

Bingo ;), Et la en relisant le programme on se dit qu’il eu été plus malin de lire le source avant de le lancer bêtement. On comprend alors rapidement que le programme veut que l’on tape “wslang”

$perl whitespace.pl real.html
wslang
The key is We_are_Nasus

Au final je dit..STOP PLUS JAMAIS de challs en WhiteSpace, en BrainFuck, en Piet, en Haskell :) ou n’importe quel autre language à la Con. Filez une VM de packer PE ca sera beaucoup plus didactique !

Posted in Challenge | Tagged , | Leave a comment

Le Packing (For Newbies) Part 1

Il y a quelques temps j’ai reçu un mail m’indiquant un soucis de facturation quelconque  Ce mail contenait, hooo joie, un executable nommé facture.exe tout simplement attaché au mail. Je me suis empressé de regarder la bête :

Vous pouvez retrouver cette bête sur malware.lu sous le hash 17832c9a78b36c8a3133e2c2e24ebc3b9896763a

[MODE PROMO ON] Malware.lu, T’en veux, y en na ! T’en re-veux, il y en re-na ! [MODE PROMO OFF].

A quoi ressemble mon malware

Commençons par savoir ce que c’est. Pas de doutes c’est bien un executable PE (Portable Executable) pour Windows. ;)

$ file facture.exe.malv    
facture.exe.malv: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

Voyons voir avec quels DLLs ce truc est linké pour savoir ce que potentiellement il peut faire :

$ objdump -x facture.exe.malv  | grep Name:
	DLL Name: MSVCRT.dll
	DLL Name: KERNEL32.dll
	DLL Name: USER32.DLL
	DLL Name: GDI32.DLL
	DLL Name: SHELL32.DLL

Ce qui est étonnant c’est qu’il ne semble pas appeller Winsock (généralement WS2_32.dll). Un malware sans support tcp cela ne se fait plus de nos jours. De plus ce genre de trucs par mail c’est généralement un droppeur dont l’unique but est d’installer une autre saloperie downloadée plus loin. Cherchons vraiiiiiiment, peut être charge t’il la dll dynamiquement.

$ strings -a facture.exe.malv | grep -i dll
uxtheme.dll
DllGetVersion
COMCTL32.DLL
msimg32.dll
MSVCRT.dll
KERNEL32.dll
USER32.DLL
GDI32.DLL
SHELL32.DLL

Y a t’il une maigre strings en unicode ?

$ strings -a -el facture.exe.malv  
$

rien, non, rien de rien.

Toujours pas de winsock. Le salaud cache son jeu. Serait t’il packé ?

Mode Mother Knowledge ON…Mode Mother Knowledge ON…Mode Mother Knowledge ON…

Qu’est ce qu’un executable packé Maryse ?

Pour les avides de connaissance (voir son wikipedia). Un exécutable packé est un exécutable contenant un autre exécutable  Cela remonte du temps ou la disquette faisait pas plus de 740Ko. L’idée d’origine de cette aberration est la suivante; j’ai un gros exécutable. Je vais le compresser et autour je met un autre exécutable lanceur qui le décompressera en mémoire et lancera. Cela permet d’avoir un exécutable final plus petit qui fait juste un peut plus de travail au lancement initial.

Packed Exe

Les méchants créateurs de malware l’on vite compris. Non seulement ca compresse mais surtout l’autre effet c’est que cela offusque l’exécutable principal. Les chaines de caractères n’apparaissent plus en clair dans l’exécutable posé sur le disque. En plus ils peuvent ainsi réutiliser le même malware, si il est détecté un jour, il suffit de changer l’enveloppeur. Et les enveloppeur sont bien chiadés. Fait comme il faut pour perdre toute personne qui tente de les comprendres ou toutes sandbox d’antivirus.

C’est un sport prospère la création de packer, je vous conseille la lecture de cet article (Packers) pour vous rendre compte de la “vastitude” de la chose.

Dans le civil les packers dit “légaux” les plus connus sont UPX et Armadillo. Mais aucuns malware digne de ce nom n’utilise directement ceux ci pour une raison évidente; Ils sont connus, donc facile à dépacker car des tools existent pour ca. Donc les antivirus aussi savent les depacker. Au mieux on trouvera des version UPX trafiquées. Dans le peloton des packer utilisés on trouvera aussi FSG, Aspack, Morphine et Mew.

Allez, ca plait toujours , un petit TP. Packons un “hello world” avec un tools de niveau newbies:

Soit le programme hello.c suivant qui affiche le traditionnel hello world.

#include <stdio.h>

int main ()
{
	printf("hello World !\n");
}

on le compile pour Windows, on le strip (pour virer les infos de debugeage) et on calcule son hash md5

$ i586-mingw32msvc-gcc hello.c -o hello.exe && strip hello.exe 
$ md5sum hello
1d21d9cd12d40bc8f18d6c5cdc428bd3  hello.exe

Notre programme évidemment fonctionne à merveille.

$ wine ./hello.exe 
hello World !

Et si on recherche les chaines de charactères (ici toute chaine ascii de plus de 10 lettres), on retrouve bien notre “hello world” à l’intérieur du binaire.

$ strings -10 -a hello.exe 
!This program cannot be run in DOS mode.
libgcj_s.dll
_Jv_RegisterClasses
hello World !
ExitProcess
GetModuleHandleA
GetProcAddress
SetUnhandledExceptionFilter
__getmainargs
__p__environ
__p__fmode
__set_app_type
KERNEL32.dll
msvcrt.dll

Packons le, évidement son md5 change. Pour tout antivirus bas du front ce serait un ‘autre’ exécutable.

$ upx -9 hello.exe -o hello-upx.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2010
UPX 3.05        Markus Oberhumer, Laszlo Molnar & John Reiser   Apr 27th 2010

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
      4608 ->      3072   66.67%    win32/pe     hello-upx.exe                 

Packed 1 file.
thanatos@cyanide:~/code/hello$ md5sum hello-upx.exe 
b4d52b91a4d42b2cbe0ff7fde0964b78  hello-upx.exe

Et il marche toujours (C’est un peu le but).

$ wine ./hello-upx.exe 
hello World !

Mais par contre, la chaine “hello world” maintenant compressée dans l’exécutable à disparue :

$ strings -10 -a hello-upx.exe 
!This program cannot be run in DOS mode.
libgcj_s.dll
sterClasses#he
ExitProces
GetModuleHand
d:5ptionFil9
__g'mainarg
KERNEL32.DLL
msvcrt.dll
LoadLibraryA
GetProcAddress
VirtualProtect
VirtualAlloc
VirtualFree
ExitProcess

Alors imaginez maintenant un packer dont le seul but est de cacher le vrai payload au yeux des antivirus, il aura 2 buts dans la vie; Cacher ‘Fortement’ le vrai payload et rendre très compliqué la décompression du vrai exécutable par un être humain ou un antivirus. D’autres malwares (Probablement russes) poussent le vice et utilisent le concept des Matriochka et repackent l’executable déja packé.

Bien sur on vient juste d’effleurer le haut de l’iceberg. Tous les packers ne sortent pas un second exécutable tout propre en mémoire, certains décompressent juste un bout de code sur la heap et sautent dessus. D’autre implémentent une machine virtuelle propriétaire “à la java”, le tout pourris d’antidebugger juste pour le fun. Et là on fait moins le mariole.

Mode Mother Knowledge OFF…Mode Mother Knowledge OFF…Mode Mother Knowledge OFF…

Mais reprenons notre facture.exe.

Yara qui ri !

Maintenant que l’on sait ce qu’est un packer. Comment savoir si notre facture.exe est packé ? Le premier indice, on vient de le voir c’est de regarder les strings et les fonctions importées dans l’exécutable, si le résultat est très maigre pour un gros exécutable, c’est louche.

Le second indice c’est de regarder les segments de l’exécutable. En fonction du packer il peut réveler le packing. Avec UPX par exemple pour notre hello world packé, c’est sans équivoques :

$ objdump hello-upx.exe -h 
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 UPX0          00006000  00401000  00401000  00000200  2**2
                  CONTENTS, ALLOC, CODE
  1 UPX1          00000800  00407000  00407000  00000200  2**2
                  CONTENTS, ALLOC, LOAD, CODE, DATA
  2 UPX2          00000200  00408000  00408000  00000a00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
no symbols

Les noms des sections sont atypiques et en plus elle se chevauchent (Upx0 et Upx1 commencent à l’offset 200 dans le ficher). Un executable “normal” contient généralement toujours un .text ou .code et un .data. Notre hello world n’échappe pas à la règle:

$ objdump hello.exe -h
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         000005f4  00401000  00401000  00000400  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
  1 .data         00000034  00402000  00402000  00000a00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rdata        00000034  00403000  00403000  00000c00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .bss          00000070  00404000  00404000  00000000  2**2
                  ALLOC
  4 .idata        00000214  00405000  00405000  00000e00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
no symbols

Un compilateur “standard” ne sort jamais des clous suivants : ‘.text’, ‘.bss’, ‘.rdata’, ‘.data’, ‘.rsrc’, ‘.edata’, ‘.idata’, ‘.pdata’, ‘.debug’,  ‘.xdata’, ‘.reloc’, ‘.rsrc’, ‘.code’ et ‘.tls’

Qu’en est t’il de notre facture.exe … je dirait pas de bol :

$ objdump facture.exe.malv -h
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .code         00002137  00401000  00401000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .text         000025f4  00404000  00404000  00002600  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .rdata        000000bc  00407000  00407000  00004c00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .data         00000600  00408000  00408000  00004e00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  4 .rsrc         0000115c  00409000  00409000  00005400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
no symbols

Ici malheureusement, le nom des sections semble très normal.

Troisième indice pouvant révéler la présence d’un package (Ne pas perdre le moral), la taille, le type, et l’entropie des sections. Prenons un vrai executable pour comparer; Ce que certain utilisateurs de Vi ou Emac considère eux aussi commun un pure malware, j’ai nommé Notepad.exe. Si c’est un gros exe avec très peu de code et beaucoup de data c’est louche. L’entropie sur une section de code peut révéler la présence d’un exe packé. La différence est flagrante si on fait l’exercice avec un bête UPX.  J’utilise ici un de mes script (dispo dans dans le chall tool) qui doit tout à l’excellente librairie python pe_file

$ peentro.py notepad.exe 
Section	Entropy	Bytes	MD5					Remark
.text	6.28	7	e2c89efc10b642edb8b21d71878e69eb	
.data	0.76	1	347ef5c176ef9739d0e2c9f04346b7d3	
.rsrc	7.37	8	9bce8d34eb3d836c984e8935746d222d	 High Entropy
.reloc	6.43	7	4b0ee59eff3683cc8ee9361119d7e3c6	

$ peentro.py notepadupx.exe 
Section	Entropy	Bytes	MD5					Remark
UPX0	-0.00	0	d41d8cd98f00b204e9800998ecf8427e	Unusual Name.
UPX1	7.89	8	4eee658d2f4753f70343fb613bdd5282	Unusual Name. High Entropy
.rsrc	7.37	8	44e6a801c6d9aaa6588e6829ea11f861	 High Entropy

C’est recta l’entropie de la section UPX1 est élevée (Sur .rsrc pour ressources, (image, icones tout cela, cela peut arriver, ce n’est pas grave)). Un autre exemple avec un packer commercial VmProctect sur un fichier quelquonque.

$ peentro.py Chat.exe 
Section Entropy Bytes Size MD5 Remark 
.text -0.00    0 19764  d41d8cd98f00b204e9800998ecf8427e 
.data -0.00    0 4512   d41d8cd98f00b204e9800998ecf8427e 
.rsrc 3.31     4 2344   a4e53a7b515468a21cb94cfd0b2d24d0 
.vmp0 -0.00    0 62376  d41d8cd98f00b204e9800998ecf8427e Unusal Segment 
.tls -0.00     0 24     620f0b67a91f7f74151bc5be745b7110 
.vmp1 7.90     8 113862 6ae0ced50031e23605f6ac8130bbf0ae Unusal Segment,High Entropy

Idem d’étranges sections et une entropie galopante.  Qu’en est t’il de notre facture.exe ??

$ peentro.py facture.exe.malv 
Section Entropy Bytes   Size    MD5                                     Remark
.code   5.65    6       8503    6d7c8f47c89843bafb8d8a0912730242
.text   6.49    7       9716    5e70fa9623805d69b6e548873c23d37f
.rdata  1.75    2       188     96fdc428b50e1fa15bc8ce78d17a0525
.data   5.29    6       2796    cd00c1734804fcf8f776f8ce3431b129
.rsrc   2.94    3       4444    0b5ae9b8bfbc2ecfcb22c9578e800439

les salaud… on est bien là… rien a redire ! l’entropie ne révèle rien non plus. Un bon exemple ce facture.exe.

Arrivé la, on demande un miracle. C’est là qu’apparaît une nouvelle race d’outils, le détecteur de packing. J’en connais 2, le premier sous windows est Peid (Et il sent le sapin, malgré sa forte réputation), le second, tendance, free, open source et évolutif est Yara. Pour plus d’info sur Yara, je vous conseille la lecture de Misc Nr 65.

$ yara -r packer.yara facture.exe.malv 
PureBasic4xNeilHodgson facture.exe.malv

Mais voila, dans notre cas, le pire qu’il puisse arriver arrive. Yara trouve bien un éventuel nom de Packer (et encore). Normalement on saute de joie et on se tourne vers le tools de dépacking. Car si il existe de nombreux packeur, heureusement il existe aussi de nombreux de-packeurs, (voir http://www.exetools.com/unpackers.htm pour une belle collection). Mais là, j’ai pas la queue d’un dépackeur associé à ce truc. C’est domage car c’est super sympas avec un dépackeur associé.

$ yara  -r packer.yara hello-upx.exe 
UPXv20MarkusLaszloReiser hello-upx.exe
UPXV200V290MarkusOberhumerLaszloMolnarJohnReiser hello-upx.exe
UPX20030XMarkusOberhumerLaszloMolnarJohnReiser hello-upx.exe
UPX290LZMAMarkusOberhumerLaszloMolnarJohnReiser hello-upx.exe

$ upx -d hello-upx.exe 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2010
UPX 3.05        Markus Oberhumer, Laszlo Molnar & John Reiser   Apr 27th 2010

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
      4608 <-      3072   66.67%    win32/pe     hello-upx.exe

Unpacked 1 file.

Bon on se démonte pas. On va mettre les doigts dans le cambouis et on va pas lacher et on va le dépacker avec les doigts ce facture.exe.

Mais cela, ca sera au prochain numéro !  …

On résume;
On sait ce qu’est un exe packé et pourquoi
On sait que les antivirus on pas facile !
On sait ce qu’il faut regarder tenter de sentir si c’est packé.
On sait que c’est pas une science exacte.

 

Posted in Reverse | Tagged , , , | Leave a comment

Mosaique bien, Floutage pas bien !

Week-end dernier, gentiment invité par l’équipe Big-Daddy, j’ai participé (très légèrement) à Ghost in the Shellcode, le CTF de la ShmooCon, une convention de sécurité américaine. Un des chall m’a scié. Il fallait trouver où on allait.. et une photo était fournie.

hakycam-52b55789c59d1b7cd5ee77c7f21c0a3a299fc2c4

Évidemment, cette photo à été retournée dans tous les sens, elle est passé au strings, on lui a vérifié les lsb de toutes les façons possibles.. Rien. Là je me suis dit, pourquoi ne pas essayer de la dé-flouter un peu. J’avoue, j’ai usé Gimp en vain sans un seul résultat correct. Désespéré, labourant le Google je suis tombé sur ce grand malade :

http://yuzhikov.com/articles/BlurredImagesRestoration1.htm

Je n’espère pas que tous le monde comprenne l’équation. Mais Il n’a pas fallu longtemps avant que le miracle ne se produise :

deblured

Cela dépend évidemment du type de floutage, mais cela peut se révéler miraculeux.

Moralité; Ami jeune de banlieue, dans le doute, à la prochaine kalachnikov pour laquelle tu expliquera tes techniques de vente à un journaliste de TF1. Exige le bandeau noir plutôt que du floutage !!

 

 

Posted in Challenge | Tagged , , | 1 Comment