Archive

Archive for the ‘Analiza’ Category

VBox,Virtual PC,VMware i IDT Hooking

October 27th, 2009 Icewall 4 comments

Będzie to dość stosunkowo lightowy post o “anomaliach”, które wystąpiły podczas moich testów z hookowaniem tablicy IDT pod wymienionymi w tytule post’a wirtualnymi maszynami. Dlaczego lightowy? Ponieważ żeby ustalić detale związane z sytuacjami, które później zaprezentuje, wymagało by to spooorego research’u odnośnie sposobu działania wewnętrznego mechanizmu poszczególnych wirtualnych maszyn (tak sądzę :P ).
Także proponuje traktować niniejszy post jako ciekawostkę/(wektor do badań) niż jako rezultat głębszego researchu.

Cała historia zaczyna się od momentu kiedy chciałem przetestować najprostszy w życiu hook na procedure KiSystemService poprzez modyfikacje jej adresu w tablicy IDT. Oto fragment kodu zakładający hook:

void IDTHook()
{
IDTINFO idtInfo;
IDTENTRY *idt_entries;
IDTENTRY *int2e_entry;
DbgPrint("[+] IDTHook");
//pobranie IDTINFO
idtInfo = getIDTInfo();
//pobranie *tablicy IDT
idt_entries = getIDTEntries(&idtInfo);

//zapisanie oryginalnego IDTENTRY_2E
orgIDTEntry_2e = idt_entries[KiSystemService_INDEX];
//zapisanie DWORD'a na potrzeby funkcji hookujacej
orgKiSystemService = MAKELONG(orgIDTEntry_2e.LowOffset,orgIDTEntry_2e.HiOffset);
__asm cli;//wylacz obsluge maskowalnych przerwan
idt_entries[KiSystemService_INDEX].LowOffset = (unsigned short)(&MySystemService);
idt_entries[KiSystemService_INDEX].HiOffset  = (unsigned short)(((unsigned long)(&amp;MySystemService))<<16);
__asm lidt idtInfo;
__asm sti;//wlacz obsluge maskowalnych przerwan

}

‘kod MySystemService przepisany w calosci z „Subverting Windows Kernel”‘

__declspec(naked) MySystemService()
{

__asm{
pushad
pushfd
push fs
mov bx,0x30
mov fs,bx
push ds
push es
//do something

//Finish:
pop es
pop ds
pop fs
popfd
popad

jmp	orgKiSystemService;
}
}
/* __asm { sysenter VPC } */

Bez większego wachania i namysłow postanowiłem przetestować wynikowy driver pod Virtual PC(ver. 6.0.192.0 + additions)[OS: Windows XP SP3 Eng], z którego zwykłem korzystać. Ku mojemu zaskoczeniu (bo liczyłem co najwyżej na BSOD’a :P ) przy próbie założenia hook’a wystąpił wewnętrzny błąd vpc:
vpc_crash_error
Hym…dziwna kwestia pomyślałem. Między czasie przypomniałem sobie, że przecież system może w ogóle nie korzystać z IDT jeżeli posiadany przez nas procesor dysponuje obsługą instrukcji sysenter/syscall. Rzut okiem pod vpc na wywolanie jednego z najbardziej popularnych native api:
ZwOpenFile
, rozwiało moje wątpliwości:
vpc_syscalls_handler

Sam error „wywalony” przez vpc wskazywał na to, że to nic stricte związanego z samym systemem, a raczej z vm, a teraz dodatkowo wiemy, że sens zakładania hook’a na IDT pod vpc jest raczej nie wielki (przez co POWINIEN być nie szkodliwy) ;) . Postanowiłem wykonać test jeszcze raz po odinstalowaniu z systemu additions. Tu ponownie zaskoczenie, bo system zachował się tak jak powinien, czyli:
udało się zainstalować hook’a
oraz żaden z breakpoint’ów(po dłuższej chwili), które założyłem na MySystemService nie został wywołany.
Zobaczmy teraz jak się sprawy maja pod VirtualBoxem.

/* __asm { INT VirtualBox } */

Ver. 3.0.8 r53138 + additions
OS pozostaje bez zmian pod każdą maszynką.

Pierwszą kwestią, którą tutaj sprawdziłem jest sposób przejścia procesu z r3 do r0.
vbox_syscalls_handler

Wyśmienicie! Jak widać na załączonym obrazku pod VBoxem możemy śmiało testować hooki na IDT. Tak mi się bynajmniej wydawało…
Ładuje driver,przekazuje odpowiedni IOCL_code do moje driver’a, który wywoła instalacje hook’a i … :
vbox_crash
cała akcja kończy się nie oczekiwanem crash’em VBox’a.
Długo nie myśląc odinstalowalem dodatki z systemu i ponowiłem próbę.
Udało się!Instalacja hook’a przebiegła bez problemowo, ale podczas paru kolejnych prób zdarzał mi się BSOD’nąć system z komunikatem, który jedno znacznie wskazywał, że nastąpiła próba dostępu do stronnicowanego obszaru pamięci.Windbg wskazywał następującą linijke kodu jako przyczyne zła:

idt_entries[KiSystemService_INDEX].LowOffset = (unsigned short)(&amp;amp;MySystemService);

Eeee delikatnie dziwne,,,IDT w obszarze stronnicowanej pamięci o_0?
Delikatnie zmodyfikowałem więc kod instalujący hook, po przez zmapowanie tablicy IDT pod NIEstronnicowany obszar pamieci. Kod prezentuje się teraz następująco:

void IDTHook()
{
IDTINFO idtInfo;
IDTENTRY *idt_entries;
IDTENTRY *int2e_entry;
DbgPrint("[+] IDTHook");
//pobranie IDTINFO
idtInfo = getIDTInfo();
//pobranie *tablicy IDT
idt_entries = getIDTEntries(&amp;idtInfo);

//try to map it
idt_entries = mapMemory(idt_entries,idtInfo.IDTLimit);// NOWA LINIA
//update idtinfo struct
idtInfo.HiIDTbase  = HIWORD(idt_entries);
idtInfo.LowIDTbase = LOWORD(idt_entries);

//zapisanie oryginalnego IDTENTRY_2E
orgIDTEntry_2e = idt_entries[KiSystemService_INDEX];
//zapisanie DWORD'a na potrzeby funkcji hookujacej
orgKiSystemService = MAKELONG(orgIDTEntry_2e.LowOffset,orgIDTEntry_2e.HiOffset);
__asm cli;//wylacz obsluge maskowalnych przerwan
idt_entries[KiSystemService_INDEX].LowOffset = (unsigned short)(&amp;amp;MySystemService);
idt_entries[KiSystemService_INDEX].HiOffset  = (unsigned short)(((unsigned long)(&amp;MySystemService))&gt;&gt;16);
__asm lidt idtInfo;
__asm sti;//wlacz obsluge maskowalnych przerwan

}

Ten prosty zabieg wyeliminował pojawianie się BSOD’ów.

/* __asm { VMware sysenter } */


VMware Workstation
6.5.3 build-185404

Rzut oka na przejście r3 – > r0:
vmware_syscalls_handler
Jak widać użyty jest tu sysenter. Nie będę się rozpisywał przy vmware i od razu powiem, że instalacja hooka przebiega tutaj bez problemowo czy to z zainstalowanymi dodatkami czy bez.

Na podsumowanie sporządziłem następującą tabelkę:
table

Jak zwykle komentarze i wszelkiego rodzaju sugestie mile widziane ;) .

SecDay 2009

September 24th, 2009 Icewall No comments

Wczoraj, to jest 22.09.2009r zakończyła się dwu dniowa konferencja SecDay 2009 organizowana przez Lukasz Błażys’a, która odbyła się we Wrocławiu, a jak nie trudno się domyślić była ona związana z ogólno pojętym bezpieczeństwem w IT. Z wielką przyjemnością muszę przyznać, że pierwszy raz ….UWAGA…….UWAGA miałem okazję:
brać czynny udział == być prelegentem!
na tego typu event’e.
LGIM0042

Emocje były wielkie …… ale jak dokładnie było możecie przeczytać poniżej:
Na wstępie powiem, że nie będę w żaden sposób komentował prezentacji Team’u HSPL w składzie (chronologicznie względem kolejności wystąpień):

Mateusz “j00ru” Jurczyk
Adam “pi3″ Zabrocki
Gynvael Coldwind

Żeby nikt nie zarzucał mi, że cukruje kolegą z pracy to tylko powiem, że każda prezentacja była petardą i warto na nie rzucić okiem :P ..Heheh.
More details below…

/* SecDay 2009 dzień pierwszy */
Jako, że obecnie mieszkam we Wrocławiu to kwestie dotarcia na konferencje pominę ponieważ nie było w niej nic nadzwyczajnego(15min taxi)….taaa to nie to samo co 5h spędzonych w pociągu w drodze na confidence :P .

Konferencje rozpoczął :
Dariusz Puchalak
prezentując temat:
„Bezpieczeństwo czy wydajność pracy?”
Niestety muszę się przyznać, że delikatnie się spóźniłem na ten wykład(sorry Darek :P ).
Już parę razy miałem okazje słuchać prezentacji Darka i także tym razem była ona prowadzona na wysokim poziomie. Ze względu na porę dnia długo nie zastanawiałem się
nad propozycją jaką Dariusz umieścił w swoim temacie i wybrałem …..NIEBEZPIECZEŃSTWO.:D.

Przemysław Świercz
Bezpieczeństwo Bluetooth
Na wstępie trzeba wspomnieć, że był to debiut Przemka co moim zdaniem po wysłuchaniu jego prelekcji jest jak najbardziej na plus. Temat myślę, że jak najbardziej na czasie, bo przecież bluetooth można spotkać teraz praktycznie w każdym telefonie komórkowym, większości nowych TV,itd. Prezentacja była mocno techniczna (a takie właśnie uwielbiam) + zabawne anegdoty prowadzącego działające silnie na wyobraźnie ;) .
Jeżeli ktoś jest zainteresowany bezpieczeństwo Bluetooth to myślę, że warto prześledzić tą prezentacje.

/* Przerwa na kafkę i po niej …*/

Mateusz Jurczyk
Bootkit vs Windows
Jako, że j00ru prowadzi własny blog to zachęcam do przeczytania jego relacji z konferencji jak i pobrania materiałów -> j00ru’s blog

/* Przerwa obiadowa */
Mówiąc krótko i kolokwialnie „obiad był bez szału”, także nie mogę tutaj przyznać ani plusa ani minusa, ale na pewno wypadł o wiele lepiej niż tegoroczny podawany na confidence’e.
Małego minusa dam za to, że dwa dni była ta sama potrawa:P,,,,gdzie kucharz „zostawił” fantazję!?

wracamy do prelekcji:

Krzysztof Maćkowiak
„Zarządzanie ryzykiem podstawą profesjonalnego podejścia do bezpieczeństwa informacji i ciągłości działania.”
Prezentacja jak najbardziej wykonana jak i poprowadzona w sposób profesjonalny, chociaż nie interesująca mnie zbytnio ze względu na obszar działań jakie poruszała. Dlatego też 3/4 jej czasu przegadałem z carstein’em o niuansach związanych z pentestingiem :P .

Grzegorz Błoński
Problem ulotu elektromagnetycznego.
Bardzo interesująca prezentacja, mocno techniczna podczas, której mogliśmy zobaczyć parę narzędzi do monitorowania ulotu elektromagnetycznego stworzonych przez autora przy wykorzystaniu popularnych kart telewizyjnych :D . Jeżeli byłeś/jesteś fanem serialu MacGyver masz zbędną kartę TV to nie czekaj tylko przeanalizuj powyższą prezentacje i rozpocznij własne badania!

Michał Melewski
Metodyka testów penetracjnych.
Moim zdaniem elegancko wykonana prezentacja, przejrzysta, przedstawiona na luzie, dająca do myślenia jeżeli chodzi o podejście do pentestów. Dzięki za źródło do refleksji ;) .

Leszek Miś
Rootkity w systemie Linux.
Niestety prelegent nie dotarł na konferencje, a szkoda bo z chęcią posłuchałbym jak wygląda kwestia związana z rootkit’ami na linuxach.

Janusz Żmudziński
Monitorowanie bezpieczeństwa jako istotny element skutecznego zarządzania bezpieczeństwem informacji
?

/* SecDay 2009 dzień drugi */
Jako, że miałem przyjemność rozpocząć dzień drugi to przejdę od razu do drugiej prezentacji, a o własnej wspomnę na końcu relacji.

Konrad Zuwała
Solaris jako bezpieczna platforma serwerowa.
Od strony technicznej prezentacja jak najbardziej poprowadzona bardzo dobrze. Przeznaczona raczej dla administratorów i w tym kręgu znalazła ona grono słuchaczy jak i wywołała burzliwą dyskusję.

Błażej Miga
Zagrożenia w Internecie – DNS
Muszę powiedzieć, że na opublikowanie tej prezentacji czekam ponieważ pojawiło się w niej parę smaczków, które z chęcią bym przetestował. Hehe no i pojawił się w niej kod python’owy z wykorzystaniem modułu scapy.. jak widać prelegent wie co dobre;).

/* Dinner */

Jakub Bryl
Testowanie planów ciągłości działania
?

Adam Zabrocki
Unusual bugs
Adam obiecał wystartować z nową stroną/blogiem, a wtedy na pewno będziecie mieli okazje przejrzeć jego materiały ;) .

Gynvael Coldwind
PHP Internals (not another RFI/SQLI)
Relacja Gyn’a + jego materiały. -> LINK

Robert Dąbrowski
Monitoring bezpiecznej sieci – praktyczne wykorzystanie logów.
Przepraszam, ale prezentacje komercyjnych produktów mnie nie interesują. Tu chodzi o research w dobrym klimacie tzw „piwnicznym klimacie”:D!

I tak kończy się lista prelegentów wraz ich tematami, których miałem przyjemność w większości wysłuchać.

Jeżeli chodzi o mój temat to brzmi on następująco:
Bugs in malware
Moim główny zamiarem było uświadomienie słuchaczy o tym, że w wieluuuuu przypadkach tworzony malware NIE jest doskonały, bardzo często tworzą go ludzie, którzy nie mają nawet średnich umiejętności programistycznych, a gruntowne testowanie swojego tworu jest dla nich abstrakcją. Często zdarza mi się spoglądając w kod malware’u pomyśleć o wyrażeniu : tragizm połączony z idiotyzmem. Czy taki obraz złośliwego oprogramowania przedstawiany jest w prasie i mediach? NIE. Oczywiście głównymi hasłami jakie pojawiają się są następujące:
„nowy błyskawicznie rozprzestrzeniający się worm”
„bardzo trudny do usunięcia trojan”
„trudno wykrywalny wirus”
„maszynka do wykradania poufnych danych”
itp.

Taki obraz, będący totalną generalizacją na temat malware’u, który rzekomo jest absolutnie genialny, trudny do usunięcia, napisany przez pr0 cod3r0w miałem na zamiarze usunąć z mapy rzeczywistości słuchaczy, a przynajmniej wzbogacić ją o informacje, które pokazują „troszeczke” inny obraz tych „złośliwych” aplikacji ;) . Czy mi się udało ?;]. Mam taką nadzieję;).

Jeżeli chodzi o moje materiały to możecie je pobrać stąd:
(Pliki sa oczywiscie w formacie ZIP.Przepraszam za utrudnienia w pobieraniu, ale takie są uroki korzystania z wordpress’a.)
Prezentacja -> prezentacja_Icewall_SecDay_2009.zip(ODP&PDF)
Pełna paczka(prezentacja + filmiki) -> Icewall_SecDay_2009.zip

W kwestii wyjaśnienia: Jeden z filmików zbudził delikatne kontrowersje dlatego też został odpowiednio ocenzurowany.

Hiperlinki w ODP jak i w PDF’e są ustawione w sposób relatywny, także można na nie klikać dowoli jeżeli zachowacie następująco strukturę katalogów:

Delephant
GetCodec
Zeus
prezentacja.odp
prezentacja.pdf


PS: Możliwe, że nawet do końca tygodnia pojawi się photo jaki i video relacja z konferencji dla której myśle stworze osobny post. Na video relacji będziecie mogli obejrzeć wszystkie prelekcje ludzi zarówno z HSPL jak i Vexillium. Także bądźcie czujni;),będzie co oglądać.

Pozdrawiam i zapraszam na kolejną edycje SecDay już we wrzesniu, bo warto;).

Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych – PART II

August 29th, 2009 Icewall No comments

Tak jak wspominałem w poprzednim poście niniejszy będzie o sposobach (de)szyfrowania stosowanych w pewnej rodzinie trojanów bankowych pisanych w delphi.

Oczywiście tradycyjnie zaczniemy od przedstawienia naszego bohatera:
[=]Dane[=]

Antivirus	Version	Last Update	Result
a-squared	4.5.0.24	2009.08.28	Trojan-Spy.Win32.Bancos!IK
AhnLab-V3	5.0.0.2	2009.08.28	-
AntiVir	7.9.1.7	2009.08.28	TR/Spy.Banker.DS.5102592
Antiy-AVL	2.0.3.7	2009.08.24	-
Authentium	5.1.2.4	2009.08.28	-
Avast	4.8.1335.0	2009.08.28	Win32:Spyware-gen
AVG	8.5.0.406	2009.08.28	PSW.Banker5.IQR
BitDefender	7.2	2009.08.28	DeepScan:Generic.Banker.OT.4CC5D1C8
CAT-QuickHeal	10.00	2009.08.28	-
ClamAV	0.94.1	2009.08.28	Trojan.Agent-119128
Comodo	2125	2009.08.28	-
DrWeb	5.0.0.12182	2009.08.28	Trojan.PWS.Banker.based
eSafe	7.0.17.0	2009.08.27	-
eTrust-Vet	31.6.6706	2009.08.28	-
F-Prot	4.5.1.85	2009.08.27	-
F-Secure	8.0.14470.0	2009.08.28	-
Fortinet	3.120.0.0	2009.08.28	W32/Banker.B!tr.pws
GData	19	2009.08.28	DeepScan:Generic.Banker.OT.4CC5D1C8
Ikarus	T3.1.1.68.0	2009.08.28	Trojan-Spy.Win32.Bancos
Jiangmin	11.0.800	2009.08.28	-
K7AntiVirus	7.10.830	2009.08.28	-
Kaspersky	7.0.0.125	2009.08.28	-
McAfee	5723	2009.08.28	PWS-Banker.gen.b
McAfee+Artemis	5723	2009.08.28	Artemis!504F1C591479
McAfee-GW-Edition	6.8.5	2009.08.28	Trojan.Spy.Banker.DS.5102592
Microsoft	1.5005	2009.08.28	TrojanSpy:Win32/Bancos.gen!C
NOD32	4378	2009.08.28	probably a variant of Win32/Spy.Banker.QEO
Norman		2009.08.28	W32/Banker.EKFF
nProtect	2009.1.8.0	2009.08.28	-
Panda	10.0.2.2	2009.08.28	Trj/CI.A
PCTools	4.4.2.0	2009.08.28	-
Prevx	3.0	2009.08.28	-
Rising	21.44.40.00	2009.08.28	Trojan.PSW.Win32.Banker.dnl
Sophos	4.45.0	2009.08.28	Mal/Generic-A
Sunbelt	3.2.1858.2	2009.08.28	-
Symantec	1.4.4.12	2009.08.28	Infostealer.Bancos
TheHacker	6.3.4.3.389	2009.08.27	-
TrendMicro	8.950.0.1094	2009.08.28	-
VBA32	3.12.10.10	2009.08.28	-
ViRobot	2009.8.28.1907	2009.08.28	-
VirusBuster	4.6.5.0	2009.08.28	TrojanSpy.Banker.CDVF
Additional information
File size: 5102592 bytes
MD5   : 504f1c5914799e5122c69620c0b892e2
SHA1  : 32980745998151bda4a9e3bab767201ebc52fc0a
SHA256: 54d974192dd53aba186d56803087224ff8f8b0aba9687604332891842bb5ef58

[=]Prolog[=]
Tak jak pewnie udało wam się zauważyć w poprzednim poście malware ten posiada np. zaszyfrowane ścieżki, do których zostaną wykonana jego kopie. Przykładowy zaszyfrowany ciąg wygląda tak:
GpfSH6zZTMrbRdHp865kP21JPNHqQMvdSrn1R6mWLNDbSdDSJMLkTI19RcbZQM5oN51oRsToOMrXSrn9RcbZQM5iQNfXSbnNQMvaRtTpCp8kPNXb

gdzie po deszyfrowaniu otrzymujemy łańcuch:
C:\Documents and Settings\All Users\Menu Iniciar\Programas\Inicializar\Windows32.exe

W jaki sposób funkcjonuje ten algorytm ? Tego dowiemy się już za chwilę.
Wcześniej jednak sprecyzuje „elementy”, które w tym malware’e wymagają deszyfrowania:

- ścieżki, do który kopiowany jest malware
- tytuły okien IE(malware używa tytułów okien do rozpoznania czy user znajduje się obecnie na stronie, dla której trojan ma przygotowany np. fałszywy panel logowania)
- treść fałszywych komunikatów mówiących o tym, że np. Internet Explorer wykonał
nieprawidłową operacje i zostanie zamknięty.

w niektórych wersjach także:
- login&hasło do serwera ftp/mysql używanego jako drop host
- adresy email na które mają zostać przesłane skradzione dane

Warto tutaj wspomnieć o różnicy, która występuje w podejściu autorów trojana obecnego i tego z poprzedniego postu. Jak pamiętamy tam autor nie dość, że stosował różnego rodzaju klucze xor’ujące to jeszcze zmieniały się w nieznacznym stopniu same procedury szyfrowania. Tutaj spoglądając na wygląd ciągów reprezentujących zaszyfrowane dane:
encrypted_strings

Można zakładać, że procedura deszyfrująca jest jedna, globalna. Po dokładnej analizie okazuje się, że faktycznie tak jest i nadszedł czas żeby przyjrzeć się jej bliżej.
Oczywiście jej lokalizację można w prosty sposób ustalić po przez przejście do kawałka kodu, który odwołuje się do jednego z zaszyfrowanych ciągów:
decryption_routine_call
Wywołanie funkcji deszyfrującej. Oczywiście argumenty, są przekazywane zgodnie z konwencja __fastcall typową dla Borlanda.

[=]Analiza[=]
Procka deszyfrująca przedstawia się następująco:
decryption_routine
gdzie:
ESI – długość zaszyfrowanego ciągu
Local.1 – pointer na zaszyfrowany ciąg

Jak widać procka jest o wiele pokaźniejsza od tych, które mogliśmy obserwować w poprzednim malware’e.
[=]Deszyfrowanie[=]
Bez większe zastanawiania się tworzymy decryptor, który w pythonie przedstawia się następująco:

import sys
#Delephant decryption script 

ascii_table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"

def decrypt(encrypted):
    decrypted = []
    local_4 = 0
    edi     = 0
    for index in range(0,len(encrypted)):
        pos = ascii_table.find(encrypted[index])
        if pos < 0:
            return "Encrypted string is in unproper format"
        pos = pos + (local_4 << 6)
        local_4 = pos
        edi = edi + 6
        if edi < 8:
            continue
        edi = edi - 8
        local_4 = local_4 % ( 1 << (edi & 0xff ) )
        pos = ( pos >> (edi & 0xff) ) & 0x800000ff
        if pos < 0:
            pos = ( (pos - 1) & 0xffffff00 ) + 1
        decrypted.append( chr(pos) )
    return "".join(decrypted)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print "Usage: %s encrypted_string" % sys.argv[0]
        sys.exit(0)
    print decrypt(sys.argv[1])

Rezultat deszyfrowania losowo wybranych stringów:
result_of_decryption

Warto tutaj zauważyć jedną znacząco różnice:

MOV EAX,[Local.5] ; kolejny znak z zaszyfrowanego ciagu
MOV EDX,zloavgtr.00480BAC ; ASCI „0123456789ABCD….”
CALL StrPos
MOV EBX,EAX
DEC EBX

i odpowiednik tego kodu w Python’e:

pos = ascii_table.find(encrypted[index])

Trzeba być tutaj świadomym jednej rzeczy, a mianowicie tego ze StrPos Borlandowy indexuje pozycje znaków w stringu od 1 a find Pythonowy od 0. Dlatego też w kodzie pythona nie pojawia się dekrementacja wartości pozycji znaku do odszyfrowania.

[=]Epilog[=]
Jak można zauważyć, procedura deszyfrująca tego trojana jest objętościowa ok.3 razy większa od tych, z którymi mieliśmy do czynienie w poprzednim sampel’u co jednak nie przeszkodziło nam w stworzeniu python’ego decryptor’a.
Jeżeli chodzi o algorytmy wykorzystywanego przez ten malware’u do „szyfrowania„ skradzionych danych to są to przeważnie:
- URL Encode
- Base64

ze względu na powszechność nie zostały one tutaj opisane.

Na sam koniec dla ciekawych, chcących przeanalizować krok po kroku działanie decryptor’a pare stringów do deszyfracji:

“IKLuS6nlScK”
“IMvcRt9jOUVZRo1fRcDlSd9bT64X851oPMLkOsXX86DlSd9bT65jPMvqPI1l86DXRN1l84HfPsbqRou”
“H65aRtCWIMvZRt9oPNHlSomWK6zo86PXTczo86HfPsbqPI1kRtPXRMLkT6Kk”
“K6zo86PXTczoB21fRcPlScrb86baPMvqQMPfOs7dusyi865dPMvZQM4i86DlRdHX”
“Kt8eOIak84PXTczo86HfPsbqON8WOI1pTM4WSsLkQ64WP64WT65YPMnX86DlSd9bT65jPMvqPIu”
“LNDruN9fRoukBYukBYukBYukBZe”
“K6zo86rlT6bsRo1aPI1JPMTrSc5kvs4WSsLr84D1KbJ3Jo14HI1JHKTLKa5Enq4WP6LsPI1pPN8WKcLZOMHXStHoOMHlB21JRsnfOsbqOMrlSo1nTMKWLczZwY18OM9fR6bqPI1pPNKWGs5oTEDl86Hb85DbPtLoOMxdOI1ERtPXRMLkT6Kk”
“Gc5kOsyWINHX+Y0j84PbQNHl851XSc4WLczZwY0WBI1DQMDoRtDlPdGWIMvqPN9kPNGWHNXmR6zoPN8″

Reversowanie trojanów pisanych w Delphi/BCB.

August 7th, 2009 Icewall No comments

Jako, że kolejny post z cyklu „Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych” , który mam w planach napisać, będzie o algorytmach szyfrowania wykorzystanych w trojanach napisanych w Delphi :D (tak tak, poczekajcie jeszcze pare lat i będzie wysyp trojanów pisanych w .NET… using System.malwares.bankers; i go go go !!! :D ) , to postanowiłem wcześniej napisać co nie co o moim ogólnym podejściu do trojanów pisanych w tym właśnie języku oraz narzędzi ułatwiających ich analizę.

Nasz dzisiejszy „bohater” przedstawia się następująco:
[=]Dane[=]

Antywirus	Wersja	Ostatnia aktualizacja	Wynik
a-squared	4.5.0.24	2009.08.02	Trojan-Banker.Win32.Banker!IK
AhnLab-V3	5.0.0.2	2009.08.01	Win-Trojan/Banker.7315456.D
AntiVir	7.9.0.238	2009.08.02	TR/Agent.GGO.1
Antiy-AVL	2.0.3.7	2009.07.31	-
Authentium	5.1.2.4	2009.08.02	W32/Trojan.BZCX
Avast	4.8.1335.0	2009.08.01	Win32:Banker-CXH
AVG	8.5.0.406	2009.08.02	PSW.Banker4.AJJ
BitDefender	7.2	2009.08.02	Generic.Spy.Bank.ZWQ.720719B9
CAT-QuickHeal	10.00	2009.07.30	-
ClamAV	0.94.1	2009.08.02	-
Comodo	1840	2009.08.02	TrojWare.Win32.Spy.Banker.OHT
DrWeb	5.0.0.12182	2009.08.02	Trojan.PWS.Banker.12795
eSafe	7.0.17.0	2009.07.30	Win32.Banker.cwo
eTrust-Vet	31.6.6650	2009.08.01	-
F-Prot	4.4.4.56	2009.08.02	W32/Trojan.BZCX
F-Secure	8.0.14470.0	2009.08.01	Trojan-Banker.Win32.Banker.fgw
Fortinet	3.120.0.0	2009.08.02	Spy/Banker
GData	19	2009.08.02	Generic.Spy.Bank.ZWQ.720719B9
Ikarus	T3.1.1.64.0	2009.08.02	Trojan-Banker.Win32.Banker
Jiangmin	11.0.800	2009.08.02	-
K7AntiVirus	7.10.808	2009.08.01	-
Kaspersky	7.0.0.125	2009.08.02	Trojan-Banker.Win32.Banker.fgw
McAfee	5695	2009.08.01	PWS-Banker.gen.cb
McAfee+Artemis	5695	2009.08.01	PWS-Banker.gen.cb
McAfee-GW-Edition	6.8.5	2009.08.02	Heuristic.BehavesLike.Win32.Spyware.K
Microsoft	1.4903	2009.08.02	TrojanSpy:Win32/Banker.USW
NOD32	4299	2009.08.02	Win32/Spy.Banker.OHJ
Norman	6.01.09	2009.07.31	W32/Banker.BQZT
nProtect	2009.1.8.0	2009.08.02	-
Panda	10.0.0.14	2009.08.02	Trj/Banker.gen
PCTools	4.4.2.0	2009.08.02	TrojanSpy.Banker.ARXE
Rising	21.40.62.00	2009.08.02	Trojan.Spy.Win32.Banker.c
Sophos	4.44.0	2009.08.02	Mal/DelpBanc-A
Sunbelt	3.2.1858.2	2009.08.02	Bulk Trojan
Symantec	1.4.4.12	2009.08.02	Infostealer.Bancos
TheHacker	6.3.4.3.375	2009.08.01	Trojan/Spy.Banker.cwo
TrendMicro	8.950.0.1094	2009.07.31	-
VBA32	3.12.10.9	2009.08.02	Trojan-Spy.Win32.Banker.cwo
ViRobot	2009.7.31.1863	2009.07.31	-
VirusBuster	4.6.5.0	2009.08.02	TrojanSpy.Banker.ARXE

Dodatkowe informacje
File size: 7319552 bytes
MD5   : d9e6a8e34c8c6f33919c33889c23811c
SHA1  : 38bb2fbb82e419d044a2a9e9199eb948eb891679
SHA256: 9fe271dbe89dd60d072789f49197d217edf75d9ed5a46fc5e94e28c7522341d8
TrID  : File type identification65.9% (.EXE) InstallShield setup (43065/22/16)13.0% (.EXE) Win32 Executable Generic (8527/13/3)11.6% (.DLL) Win32 Dynamic Link Library (generic) (7583/30/2)3.1% (.EXE) Win16/32 Executable Delphi generic (2072/23)
3.0% (.EXE) Generic Win/DOS Executable (2002/3)
ssdeep: 98304:aVwdUDdAVtUSlUTE2PIEH4B4Yo1qIZtDxHw7SbrKD:anAUkQPIYA49m
PEiD  : -
RDS   : NSRL Reference Data Set

Ja kto przeważnie bywa sygnaturki, są bardzo ooooooogggggólne. Jeżeli nawet, któraś z nich wskazuje na jakiś bardziej konkretny typ trojana to analiza techniczna bardzoooooo mija się z rzeczywistością, weźmy chociażby :
Symantec – Infostealer.Bancos
Morał jest taki, że ludki pracujące nad tego typu malware’em, a m.in. są to osoby z brazylijskich slumsów oraz innych biednych krajów A.Pd, (polecam tutaj wystąpienie
Mikko Hypponen : Online Crime and Crime Online
) nie robią sobie urlopów :D .

[=]Prolog[=]
Jeżeli kiedykolwiek zdarzyło Ci się pisać w BCB/Delphi aplikację z GUI (bo na takich będziemy się skupiać) to możesz podejrzewać, a jeżeli już je reversowałeś to jesteś świadom, że narzut kodu wygenerowanego przez kompilator, który nie specjalnie nas interesuje jest dość spory. Dodatkowo mamy tu do czynienia z budową silnie obiektową (masa metod wirtualnych, delegaty [tak tak, borland dostarcza do tego celu specyfikatora „__closure”],wielodziedziczenie,itp.) przez co nasza analiza jest nieco „utrudniona”(interpretuj. utrudniać: wydłużać czas zabawy :D ). Dlatego też, pokarze parę narzędzi oraz plugin’ów do nich, które przyspieszą samą analizę kodu jak i pomogą nam na znalezienie tych fragmentów, które zastały napisane przez autora trojana.

[=]Analiza[=]
Na początku naszej analizy zastanówmy się jakie akcje są przeważnie wykonywane podczas początkowego uruchomienia trojana. Z mojego doświadczenia wynika, że są to przeważnie następujące działania :
- kopiowanie własnej instancji do katalogu systemowego
- dodanie wpisu w rejestrze pozwalającego na auto uruchomienie trojana po reboot’e systemu
- rejestracja zainfekowanej maszyny

Ok, na początek tyle ustaleń nam wystarczy teraz pojawia się kwestia jak zlokalizować ten kod?
Oczywiście niektórzy z was mogli pomyśle, od razu o rozwiązaniu w stylu ustawianiu BP na api, które w jakiś sposób są powiązane z wyżej wymienionymi akcjami. Jest to na pewno jakiś sposób, ale w przypadku aplikacji Borlandowskich warto użyć paru dodatkowych narzędzi poza disassambler’em i debugger’em żeby osiągnąć naprawdę interesujące rezultaty, ale o tym za chwilę. Obejrzyjmy wstępnie kod trojana:
ida_wstepny_kod
Na chwilę obecną powyższy kod nie daje nam zbyt wiele informacji, widać „rzetelne sprawdzanie błędów” :D , tworzenie mutex’a i wywołanie paru metod na globalnym obiekcie off_500864.Pierwszą rzeczą, która z pewnością ułatwi nam dalsze analizowanie kodu są FLIRT’y(więcej informacji TU), które dostarcza nam IDA Pro w wersji komercyjnej. Trudno mi powiedzieć jak wygląda kwestia z wersją Free, niestety nie testowałem, także jeżeli ktoś z was będzie testował lub już to zrobił to dajcie znać ;) . Załadujmy odpowiednie FLIRT’y i rzućmy okiem na kod po tym zabiegu:
flirts
code_after_flirts_load
Ahhh….na mój gust kod wygląda już znacznie lepiej ;) .
Jak widać IDA zastąpiła większość wywołań VCL’owych metod sygnaturami przez co kod jest znacznie czytelniejszy. Warto jeszcze tutaj zastosować tryb:
Options->Demangled names
I przy wyborze „Show demangled C++ names as” zaznaczyć radio box „Names” czego rezultatem będzie poniższy wynik:

code_after_flirts_load_comments_as_FunName
Wracając do kodu, osoby, które miały styczność czy to z BCB czy Delphi już na pewno rozpoznają ten fragment.Tak tak jest to standardowy kod, którego główny cel możemy określić na:
- automatyczne tworzenie form używanych w projekcie
oraz obsługę komunikatów do nich napływających.

Porównamy teraz kod z pod IDA’y z kodem jednej z moich aplikacji pisanych w RAD Studio 2007( dawne wersje nazywane były Borland C++ Builder):
code_from_RAD
Tak jak widać kod jest uderzająco podobny, z czego morał taki, że dzięki IDA’e i sygnaturką zaoszczędziliśmy czas na analizowaniu standardowych VCL’owych metod.

Ok, wszystko fajnie, ale dalej nie mamy żadnych szczegółów związanych z naszymi wcześniejszymi ustaleniami. Po listingu z IDA’y możemy stwierdzić, że przy uruchomieniu trojana tworzone są automatycznie 3 formy, co wiąże się z wywołaniem pewnych zdarzeń. Zanim jednak omówimy sobie te zdarzenia przyjrzyjmy się wszystkim formą. Do tego celu oczywiście posłużymy się resource editor’em. Wyróżnie tutaj dwa:

Komercyjny:
PE Explorer: genialny edytor zasobów i nie tylko. Umożliwia podgląd form znajdujących się w zasobach, komponentów znajdujących się na nich (Timerów,Buttonów,Obrazów,…) oraz ich właściwości.

Darmowy:
DFM Editor: autorstwa MiTeC’ka jest darmowym prawie że odpowiednikiem PE Explorer’a, jeżeli chodzi o samo edytowanie zasobów. Jedynym mankamentem tego narzędzia jest brak możliwości podglądu obrazków znajdujących się na formach co w przypadku identyfikacji przeznaczenia formy(np. dzięki umieszczonym bannerą czy imitacją form przeznaczonych do logowania, możemy określić jakich banków klienci są narażeni na atak przez danego trojana już po samym analizowaniu zasobów) jest bardzo użyteczne.
W naszych badaniach identyfikacja przeznaczania danej formy pod kątem konkretnego banku jest zbyteczna ( a nawet z paru względów zabroniona :P ). Rzućmy okiem do zasobów:
resource_preview
(Niektóre nazwy form były zbyt oczywistymi skrótami nazw banków przez co musiałem je troszeczkę ocenzurować.)

Jak widzimy trojan ten posiada sporą dawkę fałszywych form imitujących panel’e do logowania, wirtualne klawiatury, a skończywszy na oknach prezentujących imitacje crash’u IE czy nawet BSOD’a :D .
Jest jednak parę form. :
TAup – Application update?
TCMD – Commands ?
TFUNC – Functions ?

które nie posiadają charakterystycznych Bitmap, lecz np. komponenty takie jak :
TTimer
TIdSMTP
TIdMessage

i tym formą się przyjrzymy.
Przeglądając komponenty znajdujące się na wyżej wymienionych formach szybko dochodzimy do wniosku, że tak naprawdę tylko TCMD jest formą, która może nas zainteresować, ponieważ:
TAup – co prawda posiada komponent TTimer lecz nie ma on podczepionego event handler’a.
aup
Czyżby autor trojana doznał chwilowego przebłysku oraz chęci dodania kolejnej funkcjonalności po czym, po krótkie chwili porzucił tą idee, oraz wszelkie elementy z nią związane? Tego się nigdy nie dowiemy.

TFUNC – ta forma jest kompletnie pusta.
Nie mogę tego inaczej skomentować niż jako wyjątkowego przejawu nonszalancji :D .

func
TCMD
Rzućmy okiem na najbardziej interesujące nas komponenty oraz ich własności:

object CMD: TCMD
  OnActivate = FormActivate
  OnCreate = FormCreate
  object TPrincipal: TTimer
    OnTimer = TPrincipalTimer
    Left = 8
  end
  object Tcook: TTimer
    Interval = 100
    OnTimer = TcookTimer
    Left = 40
  end
  object Tsite: TTimer
    Enabled = False
    Interval = 50
    OnTimer = TsiteTimer
    Left = 72
  end
  object Tjanela: TTimer ;
            nie wierzcie, że event handler jest ustawiany dynamicznie:P
	To raczej kolejny przejaw wrodzonej rozrzutności autora malware’u.
    Left = 104
  end
  object Taup: TTimer
    Enabled = False
    Interval = 720000
    OnTimer = TaupTimer
    Left = 136
  end
end

resource_preview_TCMD
Jak widać forma ta posiada obsłużone dwa zdarzenia:

  OnActivate = FormActivate
  OnCreate   = FormCreate

Oba, są idealne do tego żeby podpiąć w ich obsłudze wszystkie 3 wymienione przeze mnie początkowe działania wykonywane przez większość trojanów.
W pozostałych event handler’ach:

TaupTimer
TsiteTimer
TcookTimer
TPrincipalTimer

związanych z eventem OnTimer:
można się raczej spodziewać akcji takich jak:
- aktualizacji trojana
- wysyłania skradzionych danych do twórcy malware’u
- monitorowania aktualnych procesów w systemie (i cykliczne ubijanie np. firewall’a)
czy monitorowania odwiedzanych stron.

Ok., mamy więc ustalone parę procek, których kod chcielibyśmy prześledzić. Nasuwa się pytanie:
W jaki sposób uzyskać ich VirtualAddress?
Odpowiedzią jest:
DeDe
Wszystkie informacje o DeDe jak i sam tool znajdziecie tutaj RCE Tools.

Ładujemy naszego trojana w DeDe i po parunastu sekundach otrzymujemy taki o to rezultat:
_preview_into_dede
Wspaniale! Jak możemy zaobserwować na powyższym screen’e DeDe dostarczyło nam informacji o zdeklarowanych przez użytkownika klasach (np. TCMD), Event handler’ach oraz miejscach ich lokalizacji!
Podsumowując uzyskane informacje mamy:

OnTime:

TaupTimer         = 004FD5C8
TsiteTimer          = 004FD0A0
TcookTimer 	      = 004FC834
TPrincipalTimer = 004FACE4

oraz eventy związane bezpośrednio z formą:

OnActivate = FormActivate =  004F7C44
OnCreate   = FormCreate    =  004FAC44

Oczywiście teraz nasza analiza staje się o wiele wiele prostsza, ponieważ bezpośrednio możemy zająć się interesującymi nas fragmentami kodu bez przedzierania się przez standardowe procedury.
Dla potwierdzenia wcześniejszych założeń związanych z operacjami wykonywanymi na starcie przez trojana, rzućmy okien na kod wykonywany przy event’e OnCreate, czyli:
FormCreate @ 004FAC44:
oncreate
Mhmm sporo call’i, których IDA nie rozpoznała jako standardowych wywołań, więc najprawdopodobniej, są to pomocnicze metody napisane przez „programistę”. Zanim jednak przejdziemy do ich przeglądania, skorzystamy ponownie z dobrodziejstwa informacji dostarczanych przez DeDe, a mowa tutaj dokładnie o pliku MAP.
map_export
Dzięki wyexportowaniu informacji takich jak:

- event handlers
- control references

do pliku map
map_file_preview
oraz załadowaniu go do IDA’y: (polecam plugin Fast IDB2Sig and LoadMap) disassemblowany przez nas kod staje się ponownie jeszcze bardziej czytelny:
oncreate_with_map
To co najbardziej rzuca się w oczy to fakt zamiany nazwy call’a i jego komentarza z :

loc_4FACBD:
mov     dl, 1
mov     eax, [ebx+318h] ;
call    unknown_libname_172 ; Delphi2006/BDS2006 Visual Component Librar

na

loc_4FACBD:
mov     dl, 1
mov     eax, [ebx+318h] ; Taup:N.A.
call    SetEnabled      ; ExtCtrls.TTimer.SetEnabled(TTimer;Boolean)

odrazu widać, że jest to fragment kodu aktywujący Timer : Taup.
Ok, przyjrzyjmy się którejś z metod, której sposób działania jest nam jeszcze nie znany. Sprawdźmy jako pierwszą :
sub_483BE8
add_to_registry
Ahh jak widać metoda ta wykonuje operacje na rejestrze, a po głębszej analizie okazuje się, że dodaje ona do klucza :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
wartość : Windows32 zawierającą scieżkę do kopi trojana, czyli
sub_483BE8 możemy zaklasyfikować jako :
- dodanie wpisu w rejestrze pozwalającego na auto uruchomienie trojana po reboot’e systemu

Super!!! jedno z założeń odnalezione. Idźmy dalej:
sub_483D78:
instation_copy

Jak widać w najwyżej położonym bloku widocznym na screen’e, zostaje sprawdzona wersja systemu operacyjnego ( Windows XP/NT/98 itd.) i na tej podstawie podejmowane, są działanie takie jak:
deskrypcja stringu
pobranie parametru wywołania aplikacji
oraz wykonanie kopi pliku gdzie parametrami, są rezultaty operacji dwóch poprzednich funkcji
…czy coś wam to mówi :D ?,,,,,a teraz
CopyFile(ParamStr(),Decrypt()) :D ?
Tak jest! Oczywiście widać tutaj bloki instrukcji odpowiedzialnych za kopiowanie instancji trojana do charakterystycznych katalogów uzależnionych od wersji systemu Windows.
sub_483D78
- kopiowanie własnej instancji do katalogu systemowego

Na tym poprzestaniemy nasze dalsze dochodzenie, bo nie dokładna analiza techniczna była naszym celem, a jedynie przekonanie się o tym jaki potencjał niesie zastosowanie :
- sygnatur IDA’y
- informacji o adresach metod/obiektów uzyskanych dzięki DeDe
oraz pliku MAP

A co z naszym ulubionym Olkiem :D ? Czyż nie było by miło prowadzić dynamicznej analizy kodu mając do dyspozycji możliwości Olka ,sygnaturki IDA’y i możliwość załadowania pliku MAP ? Oczywiście byłoby, a najlepsze w tym jest to, że da się to osiągnąć!

[=]Olly’s time[=]
Żeby osiągnąć powyższe możliwości wystarczy tak naprawdę jeden plugin:
GoDup

GoDup_preview
Żeby dostrzec różnice po zastosowaniu kolejnych zabiegów w wykonaniu tego pluginu, ustawmy się na kod handler’a TPricipalTimer @ 004FACE4:
pure_olly_code
po zastosowaniu sygnatur:
sig_olly_code
dorzućmy jeszcze informacje z pliku MAP:
map_olly_code

Czyż kod nie wygląda piękniej? :D .

Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych.

July 23rd, 2009 Icewall 2 comments

Post otwierający serie postów traktujących o sposobie szyfrowania i deszyfrowania czy to:
- plików konfiguracyjnych
- skradzionych danych
- ciągów znaków reprezentujących np. nazwę winapi

wykorzystywanym przez twórców trojanów bankowych.
Przedstawiając kolejne rodziny trojanów postaram się je ułożyć w kolejności zaczynając od tych stosujących najmniej skomplikowany sposób szyfrowania do tych prezentujących coraz to bardziej złożony rodzaj algorytmów ( o ile ,którykolwiek z nich można tak określić :P ).
Pierwszy twór, któremu się przyjrzymy na VirusTotal przedstawia się w sposób następujący: 7050369f20acdb4587872ff1eccf43f3cccddf5dc03c7cd6a936a383a6863aac
[=]Dane[=]

Antivirus	Version	Last Update	Result
AhnLab-V3	5.0.0.2	2009.04.26	Dropper/Agent.61440.AF
AntiVir	7.9.0.156	2009.04.25	TR/BHO.gcw
Authentium	5.1.2.4	2009.04.25	W32/Dropper.AHBB
Avast	4.8.1335.0	2009.04.25	Win32:Trojan-gen {Other}
AVG	8.5.0.287	2009.04.26	Dropper.Agent.LCJ
BitDefender	7.2	2009.04.26	Trojan.Generic.1252968
CAT-QuickHeal	10.00	2009.04.25	TrojanDropper.Agent.abjf
Comodo	1130	2009.04.25	TrojWare.Win32.Trojan.Agent.Gen
DrWeb	4.44.0.09170	2009.04.26	Trojan.Fakealert.3764
F-Prot	4.4.4.56	2009.04.25	W32/Dropper.AHBB
F-Secure	8.0.14470.0	2009.04.25	Trojan-Dropper.Win32.Agent.abjf
Fortinet	3.117.0.0	2009.04.26	PossibleThreat
GData	19	2009.04.26	Trojan.Generic.1252968
Ikarus	T3.1.1.49.0	2009.04.26	Trojan-Dropper.Agent
K7AntiVirus	7.10.716	2009.04.25	Trojan-Dropper.Win32.Agent.abjn
Kaspersky	7.0.0.125	2009.04.26	Trojan-Dropper.Win32.Agent.abjf
McAfee	5596	2009.04.25	Generic.dx
McAfee+Artemis	5596	2009.04.25	Generic.dx
McAfee-GW-Edition	6.7.6	2009.04.26	Trojan.BHO.gcw
Microsoft	1.4602	2009.04.26	Trojan:Win32/Relbma.A
NOD32	4035	2009.04.25	Win32/BHO.NDB
Norman		2009.04.24	W32/Agent.KPCN
nProtect	2009.1.8.0	2009.04.26	Trojan-Dropper/W32.Agent.61440.AW
Panda	10.0.0.14	2009.04.26	Generic Trojan
Prevx1	3.0	2009.04.26	High Risk Worm
Sophos	4.41.0	2009.04.26	Mal/Generic-A
Sunbelt	3.2.1858.2	2009.04.24	Trojan-Downloader.Win32.FraudLoad.vdxo
Symantec	1.4.4.12	2009.04.26	Trojan Horse
TheHacker	6.3.4.1.314	2009.04.26	Trojan/Dropper.Agent.abjf
TrendMicro	8.700.0.1004	2009.04.25	TROJ_AGENT.PRPR
VBA32	3.12.10.3	2009.04.25	Trojan-Dropper.Win32.Agent.abjf
VirusBuster	4.6.5.0	2009.04.25	Trojan.DR.Agent.IMHD

Additional information
File size: 61440 bytes
MD5   : fa1faad9a5db4f33173ee0b439e410f6
SHA1  : 5aea25ef14f52930ebc3520a1bf43b1b74573899
SHA256: 7050369f20acdb4587872ff1eccf43f3cccddf5dc03c7cd6a936a383a6863aac
PEiD  : Armadillo v1.71

Jak widać nazwy sygnatur, są bardzo ogólne co może wskazywać jedynie na wieeeeele mutacji tej rodziny pojawiających się w sieci.

[=]Prolog[=]
Tak jak wspominałem wcześniej będziemy się przyglądać trojanom stosującym coraz to bardziej wyrafinowane metody szyfrowania, więc zgodnie z nasza konwencją niniejszy
sampel, a dokładnie metody stosowane przez niego nie powinny szokować( no chyba, że prostotą :D ).
Jakie elementy będą „wymagały” tu deszyfrowania:
- plik konfiguracyjny
- dll’ka, która jest instalowana w systemie jako BHO
- adres url wskazujący na drop host

Napisałem „wymagały” ,ponieważ tak na dobrą sprawę akurat w tym konkretnym samplu np.autor postanowił ułatwić badaczowi sprawę i plik konfiguracyjny jest dropowany do filesystem’u już po deszyfrowaniu :D . Inna kwestią jest to, że zamiast deszyfrować konkretne elementy, można zrobić dump’a całego procesu i np. w przypadku kiedy config jest deszyfrowany przez trojana tylko i wyłącznie na czas użycia, liczyć na to, że w dump’e znajdziemy go już w plain-text’e. Podejść do sprawy jest wiele, ale w naszych badaniach zależeć nam będzie na tym, żeby poznać algorytm szyfrowania i w miarę możliwości go odwrócić. Oczywiście zdarzają się przypadki gdzie:
- nie zależy nam na poznawaniu algorytmu używanego przez trojana, bo jest to sampel należący do rodziny, która widzimy pierwszy raz i nie koniecznie będzie dla nas użyteczny z różnych względów. Wtedy oczywiście idziemy po najmniejsze lini oporu.
- procedura deszyfrująca jest na tyle duża, a my na tyle leniwi ;], lub mało zainteresowani jej odwracaniem nie podejmujemy się pisania dekryptora od zera, ale np. wykorzystujemy prockę używaną przez trojana w charakterze shellcode’u (o tym więcej w dalszych postach).

[=] Analiza [=]
Ok., pora na analizę naszego celu. Jako, że zależy nam tylko na procedurach (de)szyfrującyh to bezpośrednio będę wskazywał elementy oraz ich lokalizacje, które będą wymagały naszej interwencji. Ewentualne pokaże sposoby na znalezienie interesujących nas części kodu procedur.
Tak na dobrą sprawę wszystkich istotne elementy, które postaramy się deszyfrować znajdują się w zasobach(‘Resource Directory’) pliku wykonywalnego. Może podejrzeć zasoby używając do tego celu np.
CFF Explorer’a:
resource_dirView

Jak widać na powyższym screen’e dane w takiej postaci niczego nam nie mówią, ale w miarę wykonywanej przez nas deszyfracji wszystko stanie się bardziej klarowne. Deszyfrować zwartość zasobów zaczniemy od końca czyli od „WFP”.Zanim zaczniemy, wykonajmy dump zasobu do plik np.
C:\config i sprawdźmy jego entropię:
config_entropy

Już spieszę z wyjaśnieniami. Skala, którą widać po prawej reprezentuje poziom entropii w zakresie od 0-8. Tak jak obiecywałem algorytm(y) szyfrowania użyty w tym trojanie będzie prosty o czym już teraz możemy się przekonać analizując wykres. Wartości funkcji, są dość nie regularne i rozciągają się w zakresie od 4,2 do 5,4. Od razu wspomnę, że ciekawszych procek szyfrujących można się spodziewać w przypadku entropii na poziomie 7-8.
Dla porównania wykres entropii dump’a traffic’u zawierającego dll’ki, ściągane przez Mebroot’a:
C&C_response_entropy

[=]Analiza procedur szyfrujących[=]
Jak już wiemy interesujące nas bloki danych znajdują się w resource directory. Teraz rodzi się pytanie w jaki sposób odnaleźć funkcje (de)szyfrującą/e? Każdy kto pisał aplikacje z użyciem winapi, korzystającą z katalogu zasobów skojarzył od razu funkcje „FindResourceA/W”, która zwraca uchwyt do zasobu, którego nazwę podamy jako jeden z parametrów tego api.
Więc nasuwają się tutaj dwa podejścia, a tak naprawdę jedno chyba najbardziej logiczne ;].
- wyszukać wszystkie referencje do wywołań api FindResourceA/W
albo odnaleźć wszystkie referencje do stringu „WFP” .

Oczywiście posłużymy się tutaj podejściem drugim które najprawdopodobniej od razu wskaże nam okolice kodu zawierającego procedurę deszyfrującą.
wfp_resource

Ohoo…wygląda na strzał w dziesiątkę, co prawda na razie nie widać jakichkolwiek manipulacji na uzyskanym pointerze do zasobu, zerknijmy jednak do procedury :
CALL zly_troj.0040155F
mając na uwadze, że argumentami tej procki są:
arg1 : pointer do zasobu „WFP”
arg2 : rozmiar zasobu „WFP”

wfp_decryption_proc
Ahhh udało nam się zlokalizować prockę deszyfrującą!(zielona ramka).
Jak widać okazała się nią prosta operacja xorująca każdy bajt z kluczem o wartości:
0×13.

[=]Deszyfrowanie[=]
Oczywiście po tym co właśnie zobaczyliśmy stworzenie własnego deszyfratora, który „sksoruje”, każdy bajt dumpu zasobu, który wcześniej wykonaliśmy z kluczem 0×13.
Świetnie się do tego nada JEDNOLINIJKOWY skrypt w python’e:

"".join(map(lambda x: chr(ord(x)^0x13),file(r'C:\config','rb').read()))

, a oto rezultat:
decrypted_wfp
widać teraz, że rzeczywiście jest to plik konfiguracyjny zapisany w xml’u.

Przejdźmy do następnego zasobu.
„REM”
Rzućmy okiem na entropię:
rem_entropy
Mhmm…tutaj już entropia wygląda ciekawiej, więc z pewnością możemy się spodziewać czegoś więcej niż tylko prostego xor’owania.
Oczywiście, miejsce z istotną dla nas procką znajdujemy analogicznie do poprzedniego przypadku, a naszym oczom ukazuje się taki o to kod:
rem_decryption_routine

Jak widzimy, w tym przypadku klucz xor’ujący nie jest stały. Jego wartość będzie zmieniała się cyklicznie po każdej iteracji, stąd też widoczne na wykresie entropii zmiany w kierunku wyższego zbioru wartości.
Warto zwrócić uwagę na dwie istotne kwestie, które są wykonywane przed wejściem do pętli:

ESI – pointer na zaalokowaną pamięć, która będzie zawierać deszyfrowane dane.
004013CD  |.  C606 4D       MOV BYTE PTR DS:[ESI],4D
004013D3  |.  C646 01 5A    MOV BYTE PTR DS:[ESI+1],5A

4D5A ,czy coś wam to mówi ?:D. Oczywiście jest to magic number, który zawsze powinien znaleźć się na początku pliku PE.
Jak widać autor trojana dodaje magic number dopiero w momencie deszyfrowania. Takie podejście może świadczyć jedynie o tym iż autor chciał utrudnić wykrycie potencjalnie niebezpiecznego zasobu antywirusą czy innym skanerą. Drugą kwestią jest wyliczenie stałej która będzie wykorzystywana do indexowania zaszyfrowanych danych. Jej wyliczenie wygląda następująco:

004013D9  |.  895D FC       MOV [LOCAL.1],EBX ; EBX = encrypted_data
004013DC  |.  2975 FC       SUB [LOCAL.1],ESI     ; ESI   = decrypted_data

następnie w pętli mamy: (stale wartości odpowiednie do pierwszej iteracji)

EDI = 2 ;
004013E5  |.  8D0C37        |LEA ECX,DWORD PTR DS:[EDI+ESI]
…
004013EA  |.  8B45 FC       |MOV EAX,[LOCAL.1]
…
004013EF  |.  321408        |XOR DL,BYTE PTR DS:[EAX+ECX]

widzimy, że w momencie xor’owania :
DL – cyklicznie zmieniający się klucz
a na co wskazuje BYTE PTR DS:[EAX+ECX]?
Prosty zapis matematyczny wszystko wyjaśnia:

LOCAL.1 = encrypted_data - decrypted_data
ECX = decrypted_data + 2
EAX = LOCAL.1
I w momencie xor’owania:
XOR DL,BYTE PTR DS:[LOCAL.1+decrypted_data+2]
podstawiajac za LOCAL.1
XOR DL,BYTE PTR DS:[ encrypted_data - decrypted_data
+decrypted_data+2]
,więc w ostateczności mamy
XOR DL,BYTE PTR DS:[ encrypted_data + 2]

ot taki troszeczkę nie intuicyjny sposób indexowania ;) .
Przykładowy skrypt deszyfrujący:

def decrypt(encrypted):
    decrypted = []
    edi = 2
    decrypted.append('M')# 0x4d
    decrypted.append('Z')# 0x5a

    while edi != len(encrypted):
        edx = edi % 0x78
        edx = (edx << 1) & 0xFF
        decrypted.append(chr( (ord(encrypted[edi])^edx)&0xFF ))
        edi = edi + 1
    return "".join(decrypted)

if __name__ == "__main__":

    f = file(r"c:\evil_dll",'rb')
    fw = file(r"c:\decrypted_evil_dll",'wb')
    fw.write(decrypt(f.read()))
    f.close()
    fw.close()

i rezultat deszyfrowania:
decrypted_dll
Jak widać na screen’e w katalogu zasobów „REM” ukrywała się dll’ka.

Ostatni już katalog zasobów „CAS”. Jako, że danych w każdej pozycji katalogu CAS jest niewiele, trudno tutaj mówić/prezentować wykres rozkładu entropii. Przejdziemy więc od razu do sposobu ich deszyfrowania. Co prawda dane z tego zasobu, są ekstraktowane do systemu , (a dokładnie do rejestru )lecz w formie nie zmienionej. Dopiero dll’ka , która wcześniej mieliśmy przyjemność deszyfrować(a która jest dropowana do C:\WINDOWS\system32\sxmg4.dll i rejestrowana jako BHO)
będzie pobierała te dane i deszyfrowała tylko w momencie zaistniałem potrzeby.

Zaszyfrowane dane w rejestrze prezentują się w następujący sposób(interesują nas tylko wartości Ad i Ad2):
cas_encrypted
HKEY_LOCAL_MACHINE\SOFTWARE\TSoft

Ok, weźmy pod lupę więc dll’ke: Stosując identyczne podejście jak w dwóch poprzednich przypadkach znajdujemy następujący kod:
cas_decryption
Kolejna różna od pozostałych procedura bazująca wciąż na xor’owaniu, lecz tym razem użyto stałego klucza o długości 3 bytów. Warto wspomnieć jakie konsekwencje niesie za sobą takie podejście oraz jak to rozwiązano w niniejszej implementacji:

ECX = ilość odczytanych(zaszyfrowanych) bajtów z wartości rejestru
100053B0  |.  6A 02         PUSH 2
100053B2  |.  33C0          XOR EAX,EAX
100053B4  |.  5A            POP EDX
100053B5  |.  889C0D F0FDFF>MOV BYTE PTR SS:[EBP+ECX-210],BL
100053BC  |.  3BCA          CMP ECX,EDX
100053BE  |.  76 31         JBE SHORT sxmg4.100053F1

Jak widać sprawdzane jest tutaj czy ilość bajtów które mają być odszyfrowane przekracza 2, ponieważ przy mniejszej ilości, w pętli już po pierwszej iteracji dostalibyśmy błędne dane (akurat przy tej implementacji nie wystąpi ,ani BO ani Off-by-One). To jedna kwestia, kolejną jest to, że długość danych do rozszyfrowania może nie być wielokrotnością 3’ki.
Więc należy tutaj zadbać o sprawdzanie czy w kolejnym kroku deszyfrowania mamy przynajmniej 3 bajt do przetworzenia. Jeśli nie, pętla powinna się zakończyć a pozostałe bajty( max 2) należy deszyfrować indywidualnie.
Sprawdźmy jak to zostało tu zaimplementowane:
Przed wejściem do pętli mamy :

EDX = 2
100053C0  |.  8DB5 F1FDFFFF LEA ESI,DWORD PTR SS:[EBP-20F]
100053C6  |.  2BD6                     SUB EDX,ESI
EBP – 210h = encrypted_data
,więc EBP – 20Fh == encrypted_data +1

w pętli:

…
100053E3  |.  8D3402        |LEA ESI,DWORD PTR DS:[EDX+EAX]
100053E6  |.  8DB435 F1FDFF>|LEA ESI,DWORD PTR SS:[EBP+ESI-20F]
100053ED  |.  3BF1          |CMP ESI,ECX
100053EF  |.^ 72 D7         \JB SHORT sxmg4.100053C8

kiedy przyjrzymy się temu kawałkowi kodu mamy:

ECX = encrypted_data_length
EAX = index
EDX = 2 – (encrypted_data+1)
ESI = EDX + EAX
ESI <-  EBP + ESI – 20F == EBP -20F + ESI ==
(encrypted_data+1) + 2 –(encrypted_data+1)+ index
czyli ostatecznie
ESI = 2+index

,więc co iteracje w pętli( a jest to pętla do while) sprawdzane jest czy
index+2 < encrypted_data_length, jeżeli tak to pętla jest kontynuowana.
Po zakończeniu pętli możemy zauważyć to o czym wspominałem, a mianowicie indywidualne xor’owanie bajtów, które pozostały lub w przypadku kiedy długość zaszyfrowanych danych < 3:

100053F1  |> \3BC1          CMP EAX,ECX
100053F3  |.  73 08         JNB SHORT sxmg4.100053FD
100053F5  |.  80B405 F0FDFF>XOR BYTE PTR SS:[EBP+EAX-210],0F
100053FD  |>  8D50 01       LEA EDX,DWORD PTR DS:[EAX+1]
10005400  |.  3BD1          CMP EDX,ECX
10005402  |.  73 0F         JNB SHORT sxmg4.10005413
10005404  |.  80B405 F1FDFF>XOR BYTE PTR SS:[EBP+EAX-20F],10

Prosty kod który powinien działać :D przy dowolnej długości klucza:

def decrypt(buffer,key):
    decrypted = []
    notAligned = len(buffer) % len(key)
    secureLen  = len(buffer) - notAligned
    for i in range(0,secureLen,len(key)):
        for j in range(0,len(key)):
            decrypted.append( chr( ord(buffer[i+j])^key[j] ) )
    #dekrypcja pozostalych NIE odszyfrowanych bajtow o ile takie istnieja
    if notAligned:
        for i in range(secureLen,len(buffer)):
            decrypted.append( chr( ord(buffer[i])^ key[-secureLen+i]) )

    return "".join(decrypted)

if __name__ == "__main__":
    key  = [0xf,0x10,0x11]
    print decrypt(file("c:\\evil_host1").read(),key)
    print decrypt(file("c:\\evil_host2").read(),key)

oto rezultat działania kodu:
(evil_host1 i evil_host2 to oczywiście wartości z rejestru Ad1 i Ad2)
decrypted_hosts_cas
Jak widać zaszyfrowane dane przedstawiają najprawdopodobniej adresy drop hostów, albo hostów z których mają być pobierane dodatkowe moduły, nowe plik konfiguracyjne ,etc.

[=]Epilog[=]
To już wszystko odnośnie tego trojana, jak mieliśmy okazje zobaczyć jego autor „nie ograniczał” swojej fantazji jeżeli chodzi o rożnego typu algorytmy szyfrowania choć bazowały one na prostym xor’owaniu to jednak zobaczyliśmy parę mutacji;]. Wspomnę jeszcze, że trojan ten zawiera jeszcze parę zaszyfrowanych bloków danych jednak ze względu na identyczne metody dekodowania ( zmienia się np. klucz xor’ujacy z 0×13 na 0xc) postanowiłem je pominąć. W następnych postach (o ile czas w najbliższym okresie wakacyjnym pozwoli :D ) zajmiemy się trochę bardziej złożonymi algorytmami, sposobami ustalania formatu pliku konfiguracyjnego ,etc.

TCP/IP packet injection na przykładzie Gadu-Gadu

February 20th, 2009 Icewall 13 comments

Wiele wody w Wiśle upłynęło od ostatniego wpisu, a powodów było wiele :
sesje, represje, recesje ,obsesje, sprawy zawodowe, o których zapewne wspomnę w najbliższym czasie, itd.. ale przejdźmy do meritum…

”””
Marek, Jarek i blond włosa Wiktoria w jednym mieszkali domq. Marek i Jarek na górze, a Wiktoria na dole. Całe zimowe dnie spędzali na oglądaniu filmów, graniu w StarCraft;a po LAN’e oraz rozmowach przez GG. Pewnego dnia kiedy zły Marek zaczął grać na cheatach zbulwersowany Jarek po wypiciu herbatki z prądem postanowił się zemścić. Nic innego nie przychodziło mu do głowy jak zaprzestanie przesyłania wiadomości GG w standardowy sposób(przy udziale serwerów Gadu-Gadu) i nie zwlekając ani chwili dłużej Jarek naklikawszy injector pakietów tcp/ip w pythonie zaczął siać zło i zniszczenie. Pierwsza ofiarą Jarka stał się oczywiście Marek, a dokładniej relacja Marka z Wiktoria albowiem Jarek wykorzystując swój injector przesłał pakiet TCP zawierający strukturę GG_RECV_MSG wskazującą na to iż nadawcą jest Marek do Wiktorii, o treści, o której nawet strach wspominać.

”””

Czy ta historia może mieć odzwierciedlenie w rzeczywistości?
Jak najbardziej!
Zacytuje jeszcze fragment artykułu który będę chciał Wam przedstawić:
„Osoba wysyłająca sfałszowany pakiet wcale nie musi być zalogowany do sieci GG,
ani posiadać tam konta !!!.Jakie wynikają z tego następstwa:
Napastnik może wysłać sfałszowany pakiet zawierający nr GG dowolnego adresata o
dowolnej treści bez znajomości hasła dostępowego do tego konta!!!.”

Jako, że artykuł który przygotowałem jest dość obszerny to zamiast prezentować go w formie postu na blogu postanowiłem, że udostępnię go do pobrania w formie PDF.
Do paczki zawierającej art. dorzuciłem krótki film video prezentujący atak tcp/ip packet injection na którym widać w jaki sposób można przesłać wiadomość o dowolnej treści z dowolnego nr do użytkownika Gadu-Gadu. Dołączyłem także dla zainteresowanych ruch sieciowy zarejestrowany podczas takiego ataku.

Życze miłego czytania i oglądania:
PPM Click -> Art+Video+traffic
(UWAGA!!!:Paczka jest archiwem zip takze po sciagnieciu wystarczy zmienic rozszerzenie i rozpakowac)
Oczywiście czekam na feedback ;) .

Exploitacja w stylu RBN

December 27th, 2008 Icewall 4 comments

W przypadku przeciętnych metod exploitacji browsera jest to jedna strona zawierająca złośliwy kod na wybrana podatność/ci, bez żadnych odwołań do kolejnych serwerów ,itp.
Jako, że RBN dysponuje potężniejszymi zasobami przejętych kont hostingowych niczego nie świadomych użytkowników oraz hostingów typu bullets-proof natrafiwszy na złośliwą stronę tej produkcji nasza przeglądarka jest zabierana wręcz w podróż dookoła świata, a po drodze musi „przełykać” kolejne porcje okrutnego kodu.

[+]Massive Attack[+]

Tak, tak, strony zawierające exploity wymierzone w twoją przeglądarkę ,a tak naprawdę
strony uruchamiające mechanizm rozłożony na paru(nastu) serwerach,testuje ją pod kątem podatności.
Rzućmy okiem na przebieg takiego ataku.
Uwaga: nazwy hostów podane przy analizie ataku, są rzeczywistymi nazwami hostów ,lecz większość z nich jest obecnie offline.

Typowe linki prowadzące do phishing sitów wyglądają tak:
http://evil.com/some_folder/[BANK|SHOP]NAME
, podobnie jest i w naszym przypadku

http://nirvanafan.org/magazin/s/unicaja
http://nirvanafan.org/magazin/s/bbk
http://nirvanafan.org/magazin/s/ebay

etc…no i na tym sprawa się kończy jeżeli konto zostało przejęte przez prawie_grupe_zorganizowaną.
Ale, ten przypadek jest inny…

Kiedy będziemy usiłowali się dostać do katalogu http://nirvanafan.org/magazin/s/ing czeka nas nie mała niespodzianka wykraczająca już poza zasięg działań przeciętnych phisherów. Przyjrzyjmy się działaniu całego mechanizmu przy użyciu sniffera.

1# Request:
GET /magazin/s/ing/ HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: pl
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)
Host: nirvanafan.org
Connection: Keep-Alive

2#Response
HTTP/1.1 200 OK
Date: Fri, 23 Nov 2007 15:15:59 GMT
Server: Apache/1.3.37 (Unix) PHP/5.2.3 mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 FrontPage/5.0.2.2635.SR1.2 mod_ssl/2.8.28 OpenSSL/0.9.7a
X-Powered-By: PHP/5.2.3
Connection: close
Content-Type: text/html; charset=win-1251
Content-Encoding: gzip
Content-Length: 771
Content-encoded entity body (gzip): 771 bytes -> 4894 bytes
Binary Data:

Celowo nie wklejałem zawartości tego pakietu ponieważ dane są pakowane gzip’em.
Na nasze szczęście Wireshark daje możliwość obejrzenia danych z sesji http
po dekompresji. Rzućmy na nie okiem:
decompresed-data

Już lepiej ,lecz dalej nic konkretnego. Interesujące, są dwa js’y, które postaramy się przedstawić w bardziej przejrzystej formie.

[+]Deobfuscated Javascripts[+]

W prosty sposób przy użyciu html’owego tagu textarea otrzymamy zawartość js w postaci plain-text, a sam kod js się nie wykona i tym samy nie będzie miał żadnego wpływu na działanie naszej przeglądarki. A tak wygląda ten zabieg:

jsy

Stronę taką można przygotować w paru linijkach jak widać powyżej, albo skorzystać już z gotowej, zawartej w iDefense [ Malcode Analysis Pack ].Po uruchomieniu tego fragmentu kodu w przeglądarce zawartość textarea przedstawia. się następująco:
_js

Aha!, nareszcie kod wygląda przejrzyście. Jak widzimy tagi iframe ładują strony z obcego serwera, hym, od razu nasuwa, się pytanie czy aby na pewno includowane strony byłyby dla nas bezpieczne; ) ?Przyjrzymy się im bliżej w dalszej analizie. Warto wspomnieć, o tym iż zastosowanie stylu ‘display: none’ dla tagu iframe tworzy ten obiekt nie widzialny dla użytkownika przeglądającego stronę.

[+]Follow the src=[+]

Podczas analizy okazało się ,że obydwa linki przedstawione na screen’e powodują uruchomienie identycznego mechanizmu, także zajmiemy się badaniem rezultatów wywołania jednego z nich.

Request:
GET /traff.php?8429e639e8a91fe HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)
Host: alltraff.cn

Response:
HTTP/1.1 200 OK
Server: Apache/2
Content-Encoding: gzip
X-Pad: avoid browser bug
Content-encoded entity body (gzip): 150 bytes -> 229 bytes
js21

Jak widać ponownie został użyty tag iframe do załadowania kolejnych stron, których zawartość warto będzie prześledzić, bo jak wskazuje jedno z pól nagłówka:
X-Pad: avoid browser Bug
,ich przeznaczenie nie stwarza żadnych wątpliwości.

[+]Fake path[+]

http://winhex.org/tds/in.cgi?5

Request:
GET /tds/in.cgi?5 HTTP/1.1
Referer: http://alltraff.cn/traff.php?18429e639e8a91fe
Host: winhex.org

Response:
HTTP/1.1 302 Found
Location: http://208.72.168.176/e-Z1odey1701/index.php
Set-Cookie: SL_5_0000=_1_; domain=winhex.org; path=/;
expires=Tue, 22-Jan-2008 04:03:16 GMT
Content-Encoding: gzip
Content-Length: 170
Content-encoded entity body (gzip): 170 bytes -> 216 bytes
js3

Meta tag URL, wymusza na przeglądarce odświeżenie strony wraz z przekierowaniem na wskazany przez niego adres, czyli w naszym wypadku http://208.72.168.176/e-Z1odey1701/index.php.

Request:
GET /e-Z1odey1701/index.php HTTP/1.1
Host: 208.72.168.176
Referer: http://alltraff.cn/traff.php?18429e639e8a91fe

Response:
HTTP/1.1 200 OK
Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/4.4.4-8+etch3 mod_perl/2.0.2 Perl/v5.8.8
Line 1 : ai siktir vee? ->translate->’get lose’

Cała ścieżka wskazana przez http://winhex.org/tds/in.cgi?5 okazała się fałszywa, jedynie utrudniająca i wydłużająca analizę.

Przeanalizujmy teraz ścieżkę związaną z wywołaniem:
http://5yearscontract.com/check/versionl.php?t=578

Request:
GET /check/versionl.php?t=578 HTTP/1.1
Referer: http://alltraff.cn/traff.php?18429e639e8a91fe
Host: 5yearscontract.com

Response:
HTTP/1.1 200 OK
Server: Apache/2.2.6 (Unix) PHP/5.2.5

js4

Jak widać wywołanie /check/versionl.php?t=578 kończy się załadowaniem
7 rożnych stron. Uchylając rąbka tajemnicy powiem, że celem każdej z nich jest exploitacja przeglądarki, a w końcowej fazie pobranie malware’u na komputer ofiary. Tak ,tak nie jedna nie dwie, a 7 witryn zawierających złośliwy kod!!!Jako, że różnice w powyższych plikach, są niewielkie(różne język programowania wykorzystany do napisania skryptu oraz odmienna lista kontrolek ,które maja zostać wyexploitowane) to omówię jedynie parę wybranych.

[+]Evil n140xx sites[+]

Przyjrzymy się teraz zawartości następujących plików :
/n14041.htm
/n14042.htm
/n14048.htm

untitled
Jak możemy zauważyć większość kodu jest w postaci nie zdatnej do odczytania. Do uzyskania w miarę przejrzystego kodu użyjemy techniki stosowanej w poprzednich przypadkach.
A oto jej rezultat:

untitled2
To co najbardziej widoczne jest na pierwszy rzut oka ,to różnica w językach programowania wykorzystanych do napisania tych dwóch skryptów(czyżby zapobiegawczo?), poza tym, ktoś postarał się o to żeby kodu nie czytało się zbyt łatwo i przyjemnie. Widać zastosowanie obfuscatora kodu, który utrudnia jego analizę(losowe nazwy funkcji, zmiennych, “łamanie” stringów).
Przyjrzyjmy się teraz bliżej skryptowi n14048.htm napisanemu w js:
n140481
Po wstępnej analizie osoby zorientowane w metodach exploitacji zauważą, że jest tu wykorzystana metoda zwana Heap Spraying, a podatność, którą stara się ten skrypt wykorzystać to:
“CLSID:A09AE68F-B14D-43ED-B713-BA413F034904″);
/* Vulnerabilit: WZFILEVIEW.FileViewCtrl.61
http://www.zerodayinitiative.com/advisories/ZDI-06-040.html
*/

(oczywiście kod został wcześniej przeze mnie poprawiony pod kątem nazw zmiennych, itp.)

Spójrzmy jeszcze na koniec na plik n14041.htm
bezc2a0tytulu2
Jak widzimy lista kontrolek do exploitacji jest spora.
Jeżeli exploitacja zakończy się sukcesem to tak jak wcześniej wspominałem zostanie pobrany plik(ie_updates3r.exe) z lokalizacji zaznaczonej zieloną ramką, po czym zostanie on uruchomiony na komputerze ofiary.
Dalszy przebieg wydarzeń jest już zależny od chwilowej fantazji panów z RBN’u :) .

Dostałem E-Card a ty?

November 28th, 2008 Icewall 2 comments

Uhh chwilę czasu minęło od ostatniego wpisu ,ale niestety nie miałem zbyt wiele czasu oraz tematów ,które mógłbym publikować. No ,ale jednak coś się znalazło, coś co mam nadzieje będzie warte waszej uwagi.Enjoy;).

Jako ,że nadchodzą święta to i twórcy malware’u nie pozostają w tyle. W ostatnim czasie otrzymałem dwa mail’e o charakterze świątecznym zawierające niespodziankę , którą oczywiście nie pozostawiłem bez sprawdzenia;).
allcards
Obu kartką przyjrzymy się z osobna ,chociaż tak naprawdę główny .exe w niespodziance jest identyczny to jednak warto wspomnieć o innych różniących aspektach.
Jako pierwszą weźmy tą otrzymana przeze mnie dnia 19.10.2008r.
card1mail
Jak widać na screen’e nasz e-card ma obiecujące rozszerzenie ;) .
Niestety po ściągnięciu card.exe byłem rozczarowany mało świąteczną ikoną:
icon1
jak i mało nastrojowym rezultatem skanowania z VirusTotal:
Antivirus Version Last Update Result
AntiVir - - HEUR/Malware
Authentium - - W32/Trojan-Gypikon-based.NC!Maximus
Avast - - VBS:Malware-gen
AVG - - IRC/BackDoor.Flood
BitDefender - - Backdoor.Zapchast.PE
ClamAV - - Trojan.IRC-Script-126
eSafe - - Win32.IRC.Zapchast.g
F-Prot - - W32/Trojan-Gypikon-based.NC!Maximus
F-Secure - - Backdoor.IRC.Zapchast.g
Fortinet - - REG/HideMirc!tr.bdr
GData - - Backdoor.Zapchast.PE
Ikarus - - Backdoor.Zapchast.PF
K7AntiVirus - - Trojan.Win32.Malware.1
Kaspersky - - Backdoor.IRC.Zapchast.g
McAfee - - Generic BackDoor
Microsoft - - Backdoor:Win32/IRCFlood
NOD32 - - REG/RunKeys.NAA
Panda - - BAT/Autorun.TA
PCTools - - Trojan.mIRC-Based.AM
SecureWeb-Gateway - - Heuristic.Malware
Sophos - - Mal/Zapchas-C
Sunbelt - - mIRC based
Symantec - - IRC.Backdoor.Trojan
TrendMicro - - REG_ZAPCHAST.ED
VBA32 - - BackDoor.IRC.based
VirusBuster - - Trojan.mIRC-Based.AM

Additional information
MD5: d664b7b6db6f76dd421af5d88cd71579

Nie pozostało mi nie innego jak tylko odpalić tego execka:
card_photo
Huh, znów ktoś się nie postarał ;/ fotografia jak najbardziej znajoma ,ale jak dla mnie klimat bardziej wiosenny niż zimowy, zresztą brak na niej mikołaja ,a tym bardziej blond włosych śnieżynek :D . No trudno. Ale czy to oby na pewno wszystko ?
aftercardrun
Aaa wiedziałem ,że prawdziwa niespodzianka dopiero przed nami;).
Myślę ,że ikona jak najbardziej wszystkim znana tylko nazwa procesu nieco inna niż zwykle.
Czy już domyślacie się jaki jest główny cel tego malware’u?

Troche danych technicznych
PEiD: UPX 0.89.6 – 1.02 / 1.05 – 1.24 -> Markus & Laszlo [RAR SFX]
Jak widać jest to SFX packowany UPX’em ,czyli najprawdopodobnie będzie to tzw
„Multi-Component malware”.
Można ,wiec spokojnie tego sfx rozpakować lub zrobić to tak hardcorowo jak ja, czyli po prostu 2kliknać i niech się dzieje;).
No, ale żeby dokładnie sprawdzić co/gdzie jest wypakowywane i uruchamiane odpalmy tego sfx’a pod winrare’m:
sfx1
Myślę ,że wszystko stało się jasne;)
Tak naprawdę naszą zło wrogą aplikacją jest oskryptowany mirc z odpowiednimi ustawieniami domyślnymi. Tak! tak standardowy mirc bez żadnych modyfikacji, (sprawdzałem binarkę z oryginałem) tworzący z naszej maszyny część botnet’u.
Warto na pewno wspomnieć o paru plikach:
ident.txt zwiera pokaźną listę imion, które są wykorzystywane jako ident oraz nick dla bota.
com.mrc plik zawierający skrypt mIRC’owy do kontroli bot’a (łączenie się z odpowiednim serwerem, dołączanie do kanłów, rozpoznawania bot masterów,itd.)


E-Card z dnia 23.11.2007


card2mail
Od razu można zauważyć ,że serwer hostujący drugą kartkę jest inny
iplocation
jak i sam sposób podania exe jest odmienny. Tym razem ktoś poszedł o krok dalej i nie umieścił linku bezpośrednio do pliku wykonywalnego, a jedynie do strony ,która już zadba ,o to żeby został pobrany odpowiedni plik.
Rzut oka na ruch sieciowy zarejestrowany przez sniffer i wszystko staje się jasne:
card2site

Kolejność wywoływanych stron(serwer jest nie aktywny):
http://211.78.51.26/user/images/index.html
http://211.78.51.26/user/images/step2.php
http://211.78.51.26/user/images/step.php
http://211.78.51.26/user/images/your_e-card.gif.exe

Szczerze powiedziawszy liczyłem na coś więcej:P….exploitacja browser’a, przekierowania na totalnie inny serwer, masę zaciemnionych javascriptów, itd.:P, a tu nic z tych rzeczy .Sam musiałem zezwolić IE na pobranie pliku ponieważ polisy bezpieczeństwa nie pozwoliły na pobranie go automatycznie. Ehh..

icon2

Ikona aplikacji tak samo mało świąteczna jak i poprzednia ,,,hehe ,ale pojawiło się kolejne ulepszenie związane z „podwójnym rozszerzeniem .jpg.exe”:P.
Scan z VT:
Antivirus Version Last Update Result
Avast 4.8.1281.0 2008.11.23 VBS:Malware-gen
AVG 8.0.0.199 2008.11.23 Zapchast.L
BitDefender 7.2 2008.11.24 Dropped:Backdoor.Cloner.BI
DrWeb 4.44.0.09170 2008.11.24 Trojan.Runner.15
eSafe 7.0.17.0 2008.11.23 Win32.Stration
F-Secure 8.0.14332.0 2008.11.24 Trojan.BAT.Runner.i
GData 19 2008.11.24 Dropped:Backdoor.Cloner.BI
Ikarus T3.1.1.45.0 2008.11.24 Backdoor.Cloner.BI
K7AntiVirus 7.10.531 2008.11.22 not-a-virus:RiskTool.Win32.HideWindows
Kaspersky 7.0.0.125 2008.11.24 not-a-virus:Client-IRC.Win32.mIRC.601
McAfee+Artemis 5443 2008.11.23 Generic!Artemis
NOD32 3634 2008.11.24 IRC/Cloner.BI
Rising 21.05.00.00 2008.11.24 Backdoor.mIRC-based.bj
Sophos 4.35.0 2008.11.24 Troj/Zapchas-EH
TrendMicro 8.700.0.1004 2008.11.24 BKDR_ZAPCHAST.AX
VBA32 3.12.8.9 2008.11.23 BackDoor.IRC.based
VirusBuster 4.5.11.0 2008.11.23 Backdoor.Zapchast.EI

Additional information
File size: 855790 bytes
MD5...: 3b381c20042c0a2f7cf6d33edccfac6b

Sprawdźmy czy .exe nie jest packowany.
PEiD: Nullsoft PiMP Stub [Nullsoft PiMP SFX] *.
Tego typu plik można wypakować 7ZIP’em:
listoffile

Paczka przedstawia się podobnie. Jak widać głównym narzędziem zła jest ponownie mIRC.
Nowe pliki jakie się tu pojawiają i są warte uwagi to:
instsrv.exe
sup.exe
svchost.exe

instsrv.exe
To gotowa aplikacja służąca do instalowania/uninstalowania usług:
Installs and removes system services from NT

INSTSRV ( | REMOVE)
[-a ] [-p ]

Install service example:

INSTSRV MyService C:\MyDir\DiskService.Exe
-OR-
INSTSRV MyService C:\mailsrv\mailsrv.exe -a MYDOMAIN\joebob -p foo

Remove service example:

INSTSRV MyService REMOVE

Weźmy pod lupę kolejny plik:
sup.exe
Po załadowaniu go w Olku naszym oczą od razu ukazuje się string:

00418EEC |. BA EC934100 MOV EDX,sup.004193EC ; ASCII “Quick Batch File Compiler”

Ehhh ,, kolejna niesamowita innowacja :D . Bp na CreateFileA:

0012FEB0 00407832 /CALL to CreateFileA from sup.0040782D
0012FEB4 00870FFC |FileName = "C:\DOCUME~1\virtual\LOCALS~1\Temp\bt8622.bat"
0012FEB8 C0000000 |Access = GENERIC_READ|GENERIC_WRITE
0012FEBC 00000000 |ShareMode = 0
0012FEC0 00000000 |pSecurity = NULL
0012FEC4 00000002 |Mode = CREATE_ALWAYS
0012FEC8 00000080 |Attributes = NORMAL
0012FECC 00000000 \hTemplateFile = NULL

plik jest kasowany po uruchomieniu więc warto jeszcze postawić break’a na CloseHandle i po zamknięciu uchwytu sprawdzić jego zawartość.
supcontent
Jak widać są pewne nowości ,ale i niedociągnięcia:
2 linijka:
a_friend.exe ??? nie wiem czemu to miało służyć:P rozumiem ,że plik ten pojawi się w nowszej wersji:P, czyli nie ma co się śmiać , a jedynie potraktować tę linijkę jako:
„Reserved for future use” :D .
Tak jak widać w 3 linijce pozbywamy się firewall’a ,
następnie svchost.exe instalowany jest jako serwis ,
wprowadzenie zmian do rejestru,
uruchomienie serwisu svchost.

Rzućmy jeszcze okiem na plik svchost.exe:
Funkcja main prezentuje się następująco:

C745 F0 F8110 MOV [LOCAL.4],svchost.010011F8 ; |ASCII "MyService"
C745 F4 93140 MOV [LOCAL.3],svchost.01001493 ; |
FF15 10100001 CALL DWORD PTR DS:[] ; \StartServiceCtrlDispatcherA
85C0 TEST EAX,EAX
75 06 JNZ SHORT svchost.01001D5C
FF15 1C100001 CALL DWORD PTR DS:[] ; [GetLastError
6A 00 PUSH 0 ; /ExitCode = 0
FF15 30100001 CALL DWORD PTR DS:[] ; \ExitProcess

Rzućmy okien na informacje o -> StartServiceCtrlDispatcherA:
Ahh czyli tak naprawdę nasz svchost.exe służy jako aplikacja ,która uruchamia usługi.
Jak ,że aplikacja wydawała mi się zbyt schludna to zacząłem googlować: instsrv:
Bodajże drugi rezultat w google:
How To Create a User-Defined Service:

Topic pasuje jak najbardziej do naszej sytuacji: przykład użycia instsrv:
Example:
C:\Program Files\Resource Kit\Instsrv.exe Notepad C:\Program Files\Resource Kit\Srvany.exe

jeżeli porównamy to z wywołaniem z pliku sub.exe:
instsrv.exe svchost C:\RECYCLER\S-1-5-21-606747145-1085031214-725345543-500\svchost.exe
to widać analogie i najprawdopodobniej svchost.exe == Srvany.exe
sprawdźmy:
C:\Documents and Settings\virtual\Desktop\card2>comp svchost.exe srvany.exe
Comparing svchost.exe and srvany.exe…
Files compare OK.


BOTNET


Jak się mają sprawy związane ze stworzonym BotNet’em przez zainfekowane komputery tym malware.
Nie będę zradzać zbyt wiele szczegółów powiem tylko tyle ,że obydwie konfiguracje mIRC’a wymuszały na nim połączenie z tą samą siecią PUBLICZNA irc UnderNet ,ale z róznymi kanałami oraz kto inny był tam bot masterem. Jeżeli chodzi o cyfry to odwiedziłem dwa kanały, na jednym z nich było ponad 100 botów a na drugim ponad 200, także bez rewelacji;).
Specjalnie napisałem „PUBLICZNA” wielkimi literami ,żeby podkreślić fakt ,że kierownie botów na serwer sieci publicznej już dawno przestało być dobrym pomysłem ,widać przy tym , że cała ta akcja nie jest organizowana przez specjalistów w tym fachu :D RBN’s guys.heheh…a jedynie przez grupkę osób chcących małym narzutem pracy przejąć kontrolę nad jakąś liczbą komputerów.

Ustawienie złożoności hasła

October 21st, 2008 Icewall 2 comments

No właśnie ,sprawa na pozór błacha ,ale jak się okazuje jednak nie do końca.
Ostatnio w pewnym małym projekcie zachciało mi się manipulować zasada z polisy lokalnej (OS == Windows XP) ,a mianowicie :
Ustawienia zabezpieczeń lokalnych->Zasady konta->Zasady haseł->Hasło musi spełniać wymagania co do złożoności

Jeżeli ktoś jeszcze dziwi się dlaczego w ogóle poruszam ten temat to już wyjaśniam ,że jak najbardziej nie chodzi o ustawienie tej zasady w sposób „klikany” ;) , tylko software’owy.

Idąc po najmniejsze lini oporu zacząłem od zapytania googli o klucz/wartość w rejestrze systemowym odpowiedzialny/ą za powyższa zasadę. Niestety nic konkretnego nie udało mi się ustalić ;/. Hymm , no trudno , pomyślałem i już pełen nadziei i optymizmu zacząłem szperać w sieci pod kątem WinApi , które dostarczyło by mi możliwości odczytywania jak i modyfikacji bieżącego stanu zasad polis lokalnych. Szukam, szukam i nic!!!o_O.
Trochę nie chciałem na początku dowierzać ,no ale po chwili do mnie dotarło ,że jednak błyskawicznego rozwiązania na swój „problem” nie znajdę;/.
Oczywiście jak mógłbym się poddać wcześniej nie doprowadzając sprawy do końca;).
Niestety żadna defaultowa windows’owa aplikacja nie przychodziła mi do głowy (prócz mmc.exe + przystawka secpol.msc,,,ale było by za dużo zabawy :P , a jakiej? o tym za chwilę),która pozwała by na modyfikacje polis, ale jako ,że w przeszłości zajmowałem się dobrą chwilę platformą serwerową Windows 2003 do głowy przyszedł mi Resorce Kit Tools.
No i bingo!!! Znajdujemy tam aplikację PASSPROP ,która jak najbardziej spełnia stawiane przeze mnie wymagania:

Passprop.exe /?
Displays or modifies domain policies for password complexity and
administrator lockout.
PASSPROP [/complex] [/simple] [/adminlockout] [/noadminlockout]

/complex Force passwords to be complex, requiring passwords
to be a mix of upper and lowercase letters and
numbers or symbols.

/simple Allow passwords to be simple.

/adminlockout Allow the Administrator account to be locked out.
The Administrator account can still log on
interactively on domain controllers.

/noadminlockout Don't allow the administrator account to be locked out.

Jako ,żę aplikacja ta jest „opensource”(no co ?tak mówi OllyDbg:P), to rzućmy okiem na kod i sprawdźmy wywołania jakich WinApi pojawiają się przy użyciu przełącznika
„/complex”.
Lista wygląda następująco:

ADVAPI32.LsaOpenPolicy
ADVAPI32.LsaQueryInformationPolicy
ADVAPI32.LsaClose
SAMLIB.SamConnect
SAMLIB.SamOpenDomain
SAMLIB.SamQueryInformationDomain
SAMLIB.SamSetInformationDomain
SAMLIB.SamCloseHandle
SAMLIB.SamFreeMemory

Ahh, czyli jednak istnieją api do modyfikacji polis,ajjj Icewall,, Icewall,, nie umiesz szukać :P .Odetchnąłem z ulgą ,że mam już swoje upragnione api i natentychmiast udałem się na strone MSDN ,żeby zbadać ich detale. Bez większego problemu można znaleźć dokumentacje dotyczącą trzech pierwszych api ale dla wszystkich importowanych z SAMLIB już nie;/:

No Results Found For: SamOpenDomain.

Dziwne prawda? Nie wiem jakie były intencje MS przy podjęciu decyzji nie udokumentowania tych api ,no ale cóż .
Po moim małym rozczarowaniu na MSDN ,wrzuciłem „SamOpenDomain” w google, ale niestety i google tym razem było mało pomocne. Jedynym kawałkiem kodu wykorzystującym niektóre z powyższych api jaki znalazłem był kod PwDump’a 2.Nie bawiąc się w dalsze poszukiwania brakujących wskazówek czy wrapper’ów na te api (możliwe ,że NETAPI32 dostarcza podobną funkcjonalność) przystąpiłem do tego co tygrysy lubią najbardziej;).
RE Passprop.exe.
Skupie się jedynie na api , których nie wykorzystuje PwDump2,czyli :
SAMLIB.SamQueryInformationDomain
SAMLIB.SamSetInformationDomain


Jak widać na powyższym screen’e SamQueryInformationDomain
przyjmuje 3 parametry:

SamQueryInformationDomain(HANDLE hDomain,DWORD kind, SamInfoStruct**);

,gdzie z dalszych moich obserwacji wynika ,że struktura SamInfoStruct ,najprawdopodobnie wygląda tak:

struct SamInfoStruct
{
DWORD unknow;
DWORD flag;
};

Interesująca nas tutaj polem jest flag:
„Hasło musi spełniać wymagania co do złożoności”
0 – off
1 – on

No to już mamy procke do ustalenia bieżącej wartości tej zasady teraz jeszcze modyfikacja:

Jak można było się domyśleć SamSetInformationDomain przedstawia się podobnie:

SamSetInformationDomain (HANDLE hDomain,DWORD dunno,SamInfoStruct*);

No i na koniec mały kod wyłaczający/włączający zasade złożoności hasła w lokalnej polisie.
(kod jest „troche” nie chlujny na szybkiego wyciąłem go z projektu i wprowadziłem drobne modyfikacje:P)
———————————–CUT———————————————–

#include
#include
#include

//---------------------------------------------------------------------------

struct SamInfoStruct
{
	DWORD unknow;
	DWORD flag;
};

typedef NTSTATUS
(WINAPI *SamConnect_t) (DWORD, HANDLE*, DWORD, LSA_OBJECT_ATTRIBUTES*);
typedef NTSTATUS
(WINAPI *SamOpenDomain_t) (HANDLE,DWORD,PSID,HANDLE*);
typedef NTSTATUS
(WINAPI *SamQueryInformationDomain_t)(HANDLE,DWORD,SamInfoStruct**);
typedef NTSTATUS
(WINAPI *SamSetInformationDomain_t)(HANDLE,DWORD,SamInfoStruct*);
typedef NTSTATUS
(WINAPI *SamCloseHandle_t) (HANDLE);
typedef NTSTATUS
(WINAPI *SamFreeMemory_t) (SamInfoStruct*);

using namespace std;
bool ComplexPassword(string inOperationType,bool inSet);
int main(int argc, char** argv)
{
bool flag;
if(argc<2)
	return 0;

switch(argv[1][0])
{
 case '0':
	flag = false;
	break;
 case '1':
	flag = true;
	break;
 default:
 return 0;
}

cout<<"Haslo musi spelniac wymagania co do zlozonosci: "
<<ComplexPassword("check",0)
<<endl;
//ustawienie flagi przy sprawdzaniu nie ma znaczenia

//set flag
ComplexPassword("set",flag);

cout<<"Haslo musi spelniac wymagania co do zlozonosci: "
<<ComplexPassword("check",0)
<<endl;

return 0;
}
bool ComplexPassword(string inOperationType,bool inSet)
{

LSA_HANDLE hPolicy = NULL;
LSA_OBJECT_ATTRIBUTES objAttrib;
POLICY_ACCOUNT_DOMAIN_INFO* pDomainInfo;
SamInfoStruct *SamInfo = NULL;
HANDLE hSam = 0;
HANDLE hDomain = 0;
SamConnect_t SamConnect;
SamOpenDomain_t SamOpenDomain;
SamQueryInformationDomain_t SamQueryInformationDomain;
SamSetInformationDomain_t SamSetInformationDomain;
SamCloseHandle_t SamCloseHandle;
SamFreeMemory_t  SamFreeMemory;

HMODULE hLib = LoadLibrary("samlib.dll");
SamConnect = (SamConnect_t)
GetProcAddress(hLib,"SamConnect");

SamOpenDomain = (SamOpenDomain_t)
GetProcAddress(hLib,"SamOpenDomain");

SamQueryInformationDomain = (SamQueryInformationDomain_t)
GetProcAddress(hLib,"SamQueryInformationDomain");

SamSetInformationDomain = (SamSetInformationDomain_t)
GetProcAddress(hLib,"SamSetInformationDomain");

SamCloseHandle = (SamCloseHandle_t)
GetProcAddress(hLib,"SamCloseHandle");

SamFreeMemory  = (SamFreeMemory_t)
GetProcAddress(hLib,"SamFreeMemory");
//tak tak tak ...zakładam ,że lib'a i wszystkie adresy usdało sie załadować pomyślnie

memset(&objAttrib,0,sizeof(objAttrib));
objAttrib.Length = sizeof(objAttrib);

if(LsaOpenPolicy(NULL,&objAttrib,POLICY_ALL_ACCESS,&hPolicy)!= 0)
{
	cout<<"Password complexity check error: "<<GetLastError();
	return false;
}

LsaQueryInformationPolicy(hPolicy,
                                   PolicyAccountDomainInformation,
                                   (void**)&pDomainInfo);
LsaClose(hPolicy);

if(SamConnect(0, &hSam, 0x20,&objAttrib)<0)
{
		cout<<"SamConnect error: "<DomainSid,&hDomain)<0)
{
	cout<<"SamOpenDomain error: "<<GetLastError();
	goto bad_boy;
}

if(SamQueryInformationDomain(hDomain,0x1,&SamInfo)<0)
{
	cout<<"SamQueryInformationDomain error: "<flag != 0x1)
		goto bad_boy;

	inSet = true;
}
else
{
	SamInfo->flag = (DWORD)inSet;
	if(SamSetInformationDomain(hDomain,0x1,SamInfo)<0)
	{
		cout<<"SamSetInformationDomain error: "<<GetLastError();
		goto bad_boy;
	}

 }

SamCloseHandle(hDomain);
SamCloseHandle(hSam);
if(SamInfo!=0)
	SamFreeMemory(SamInfo);
FreeLibrary(hLib);
return inSet;

bad_boy:
if(hDomain !=0)
		SamCloseHandle(hDomain);
SamCloseHandle(hSam);
if(SamInfo!=0)
	SamFreeMemory(SamInfo);
FreeLibrary(hLib);
return false;
}

———————————–CUT———————————————–
Przykładowa sesja:
pass.exe 1
Haslo musi spelniac wymagania co do zlozonosci: 0
Haslo musi spelniac wymagania co do zlozonosci: 1

I to by było na tyle:).
Jeżeli ktoś spotkał się z dokumentacją api z SAMLIB lub wrraperami z innego lib’a to będe wdzięczny za link.

Analiza GetCodec

September 27th, 2008 Icewall No comments

W lipcu bieżącego roku (2008) pojawił się w sieci trojan nazwany przez większość firm AV
GetCodec (jedynie Symantec się wyłamał i nazwał go niesamowicie intuicyjną nazwą
„Brisv” ;) ) infekujący wybrane pliki multimedialne.
Wstając „rano” pewnego dnia ,zauważyłem w skrzynce mail od szefa zaczynający się od słów:“volunteer? ;). Oczywiście stałem się tym ochotnikiem ,a ja możecie się domyślać mail zawierał prośbę o szczegółową analizę wyżej wymienionego szkodnika. Nie ociągając się ani chwili, z własnej nie przymuszonej woli sporządziłem taką analizę, której rezultat ,możecie pobrać stąd: GetCodec Analysis.
Muszę przyznać ,że cały proces  począwszy od analizy do stworzenia dezynfektora
(o którym więcej później)  potoczył sie bez  żadnych zgrzytów ze względu na niski stopień zaawansowania trojana jak i brak dodatkowych utrudnień (zaciemnień kodu,detekcji VM ,itp).

[=]Zainteresowanie analizą[=]

Jako ,że informacje o malware’e tego typu zawsze odbijają się „szerokim łukiem”, tak tez było im tym razem  (chociaż muszę przyznać ,żę aż takiego zainteresowani się nie spodziewałem). Google dla wyrazów GetCodec hispasec Marcin wskazuje na około 251 wyników. IMO całkiem sporo ;) .Chyba najbardziej zainteresowany rezultatem analizy był portal SearchSecurity.com ,który poprosił mnie o odpowiedź na pare dodatkowych pytań m.in.:
- stopień zaawansowania trojana
- ilość infekcji jaką zanotowaliśmy
(całość tego newsa znajduje się tutaj:Researcher disinfects multimedia Trojans).

To chyba na tyle ;) .

Miłego czytania pdf’a.