Polimorfizam za zaštitu malicioznog koda
Temu prijavili:
- Brkić Antonio
- Erdelji Bogdan
Sadržaj |
Sažetak:
Cilj ovog projekta jest napraviti engine koji će skrivati malware pomoću polimorfizma.
Malware:
Malver je zlonamjerni softver koji je napisan prvenstveno da napravi štetu samom korisniku. U globalu, to je računalni program koji se pokreće na računalu bez stvarnog korisnikovog pristanka te ima neku vrstu nepoželjenog učinka, kao što je npr. krađa podataka ili oštećenje programa. U principu, ljudi koji pišu malver imaju tzv. "četiri protivnika" s kojima se suočavaju prilikom pisanja zlonamjernog koda:
Izvor: Github: Ebowla
Samo pisanje malicioznog koda je zahtjevno i istiskuje puno napora i znanja. Potrebno je imati znanja u nekoliko područja i samom radu računala kako bi se implementacija malvera izvela što uspješnije i kvalitetnije. Na slici su prikazani osnovni neprijatelji s kojima se suočavaju osobe koje pišu malver, odnosno prikazani su mogući načini kako se može uočiti malver i samim time se spriječiti njegovo daljnje širenje. Naime, osim organa reda, autori zlonamjernih programa moraju izbjeći antivirusne softvere, reverzni inženjering binarnih datoteka, dinamičku analizu (ali i ostale također), a koja se vrši uz pomoć virtualnih računala tzv. sandboxa te u konačnici autori malwarea moraju se nositi i s dijenjem informacija (crowdsourcing). Od ove 4 kategorije, piscu malwarea najteže je poraziti iskusno reverznog inženjera, a ukoliko se porazi reverzni inženjer umanjuje se i prijetnja od strane crowdsourcinga (manja vjerojatnost da će netko uspjeti reverseati binarnu datoteku). Što se tiče antivirusa, oni nisu naročito efikasni te ih se može izbjeći korištenjem jednostavnih metoda poput konkatenacije stringova i sl. Sandboxi bi predstavljali problem kad ih ne bi bilo lako otkriti, međutim, većina tih virtualnih mašina bazira se na zastarijelim operacijskim sustavima, sadrže lako prepoznatljive vrijednosti okoline (engl. environment), poznate MAC i IP adrese i sl. Ukratko, lako ih je prepoznati što znači da je isto tako prilično jednostavno učiniti da se malware ponaša drukčije (benigno) u takvim sustavima.
O projektu
Izbor tehnologije Prilikom rada na projektu, odlučeno je kako će se kreirati program engine čija će zadaća i način rada biti objašnjeni u daljnjem tekstu. Sam pojam engine predstavlja program koji korisniku omogućava pojednostavljenje izrade ili izvršavanja nekavog složenog procesa ili proizvoda. Cjelokupni projekt osmišljen je od dva dijela koje smo prozvali engine i packer no o tome nešto kasnije.
Nakon kratkih konzultacija s profesorom odlučili smo se za odabir programskog jezika GoLang popularno zvanog go. Pošto je Go programski jezik razvijan od strane Googla, krase ga jako dobra dokumentiranost, brojni službeni primjeri, naputci i sl. Zbog toga što je relativno nov (svega 8 godina), nema toliko puno informacija o raznim problemima na ostalim stranicama interneta (npr. StackOverflow) no ipak to nije predstavljalo velik problem, a Go rado preporučamo svima koje zanimaju programski jezici toga tipa (C, C++, Rust itd.).
S obzirom da je Windows najčešće korišten operacijski sustav, a postoji i velika količina malicioznog softvera namijenjena njemu i mi smo se odlučili okušati u kreiranju enginea za zaštitu malicioznog koda namijenjenog Windows operacijskim sustavima.
Što se tiče razvoja softwarea također je odlučeno da će ovaj software biti razvijan na Windowsima što se nije pokazalo najboljom odlukom, s obzirom na znatno veću količinu potrebnog posla vezanog uz pronazalak alata i zavisnosti (engl. dependencya).
Kao IDE korišten je JetBrains GoLand koji je studentima besplatan tokom studiranja.
Kao metoda enkripcije odabran je AES GCM iz razloga što je prilično siguran, a mogućnost autentificiranja poruke je kao stvorena kod dekripcije gdje program ne zna koji je ključ već ga mora izračunati tj. izabrati jedan od n mogućnosti (nije potrebno pohranjivati poseban podatak o hashu payloada).
Engine Programski kod enginea nalazi se u engine.go datoteci. Svrha ovog programa jest pronaći i učitati traženi payload, kriptirati ga i dodati na program packer.
Da bi to mogao izvršiti potrebne su mu metode za generiranje ključa kriptiranja (ovisno o varijablama okoline), generiranje jednokratnog broja (engl. nonce), kritpiranje sadržaja (payload), nadopisivanje kriptiranog sadržaja na packer na način koji će packer znati prepoznati.
Packer Programski kod packera nalazi se u PolymorphicEngine.go datoteci. Packer je karakterističan po tome što svoj payload sadrži pohranjen na kraju izvršne datoteke. Prilikom pokretanja packer pronalazi i učitava kriptirani payload s kraja datoteke u jedan byte slice, dekriptira ga te pokreće. Nakon što je payload pokrenut potrebno ga je ponovno kriptirati i pohraniti za ponovnu upotrebu.
Da bi sve ovo bilo moguće packer ima nešto više implementiranih metoda. Počevši nekim redom sličnim redu izvođenja funkcionalnosti unutar programa packeru su potrebne sljedeće metode: učitaj payload s kraja datoteke, odredi ključ, dohvati inicijalizacijski vektor, dekriptiraj payload, dohvati sadržaj programa bez payloada, odredi ime para datoteka, kreiraj novu datoteku bez payloada, učitaj payload u memoriju i pokreni, generiraj ključ, generiraj nonce, kriptiraj payload, pohrani sadržaj na kraju druge datoteke.
S obzirom da na modernim operacijskim sustavima nije dozvoljeno mijenjati datoteke koje se koriste, nije moguće niti izmijeniti sadržaj datoteke polymorphicOne.exe (tj. packera) dok je ona pokrenuta. Iz tog razloga datoteka polymorphicOne.exe kreira svoju praznu kopiju (bez payloada) na koju zatim dodaje payload kriptiran novim, nasumično odabranim ključem (naravno iz seta mogućih ključeva). Trenutno u sklopu projekta ne postoji metoda koja briše prvu datoteku (koja je kreirala drugu) no to bi bilo potrebno implementirati kako bi bilo teže zamijetiti program. Samo pokretanje trenutno je implementirano s diska umjesto pokretanja iz memorije no nažalost iz još uvijek nepoznatog razloga MemoryModule ne uspjeva pokrenuti payload. Za eventualne buduće verzije postoji i metoda za izvršavanje shellcode-a, međutim metoda kontrole izbora između malwarea i shellcode-a još nije implementirana. U konačnici kreirana je i skripta koja olakšava korištenje engine-a time što automatizira proces builda svih datoteka te se jednim klikom izgenerira packer koji sadrži payload.
Memory Module
Memory Module je biblioteka napisana u C programskom jeziku koja služi kako bi se DLL i PE datoteke učitale iz memorije, bez spremanja na disk. Sučelje je slično kao i kod standardnih metoda za učitavanje DLL-ova i PE izvršnih datoteka sa diska (LoadLibrary):
Izvor: Github: Memory Module U samoj bibliotici korištena je struktura HMEMORYMODULE koja je kreirana da imitira tj. sadrži zaglavlja koja sadrži i standardna PE datoteka. Metoda MemoryLoadLibrary praktički je istovjetna standardnoj metodi LoadLibrary. Autorova ideja bila je kreirati proizvod koji je jednostavan za korištenje te prethodno poznat korisnicima. Većina windows binarnih datoteka koje u sebi sadrže exe ili dll imaju isti format datoteka koji se sastoji od idućih dijelova:
Izvor: Github: Memory Module
DOS header/sub
Kako bi se osigurala kompatibilnost, Microsoft je razvio nekoliko instrukcija u zaglavlju svakog PE file-a. Ukoliko se npr. Windows 32-bitni file pokrene u 16-bitnom DOS okruženju, ispisat će se poruka: "Program se ne može pokrenuti u DOS modu", te se isti terminira. Na slici je prikazan način na koji je Microsoft definirao DOS:
PE header
PE header sadrži informacije o različitim sekcijama unutar izvršne datoteke koji služi za pohranu podataka i koda ili kako bi se definirali "uvozi" iz drugih biblioteka. Na slici ispod je prikazan način na koji je definiran PE header.
FileHeader sadrži fizički format datoteke, npr. informacije o simbolima. OptionalHeader sadrži informacije o logičkom formatu biblioteke, koje se prvenstveno odnose na traženu verziju operacijskog sustava, zahtjeve memorije i sl.
Section header
Section header se nalazi poslije OptionalHeader-a u PE formatu. Sam section header predstavlja listu informacija za svaki dio u datoteci. Dio (section) može sadržavati kod, informacije, resurse i sl.
Učitavanje biblioteke na Windows operacijskim sustavima
Prilikom samog učitavanja biblioteke, Windows obavlja iduće zadatke:
1.Otvaranje željene datoteke i provjera PE i DOS header-a.
2.Alokacija memorijskog bloka
3.Parsiranje section headersa i kopiranje sekcija (dijelova) i njihovih adresa. Odredišna adresa za svaku sekciju nalazi se u IMAGE_SECTION_HEADER strukturi u atributu VirtualAdress.
4.Ukoliko se alocirani memorijski blok razlikuje od ImageBase, razne reference u kodu i podaci moraju se prilagoditi. Ovo je poznato kao i realokacija baze.
5.Specifiranje biblioteka iz kojih se učitavaju simboli.
6.Dijelovi memorije raznih sekcija moraju se zaštiti ovisno o karakteristikama same sekcije. Neke od sekcija sadržavaju temporalne podatke koji su nužni samo kod "uvoza" biblioteke, kao što su npr. informacije o realokaciji baze.
7.Pozivanje DLL "ulazne točke" i na taj način obavijestiti biblioteku korištenjem zastavice DLL_PROCESS_ATTACH.
Korištenje programa
1. Potrebno je instalirati zavisnosti (engl. dependencies) - konkretno najnoviju verziju gcc-a, g++-a (za pripadajuću arhitekturu) te golang
2. Moguće je samostalno izmijeniti varijable označene komentarima unutar koda (npr. početne vrijednosti varijabli okoline pomoću kojih se može ciljano birati meta napada)
3. Postoje 2 mogućnosti:
- Urediti (prilagoditi) skriptu buildAndRun.bat
- Ručno buildati sve datoteke naredbom go build
4. Ukoliko ste birali skriptu, ona bi trebala pokrenuti attachanje payloada (prema argumentima definiranim u skripti) pa je packer spreman za isporuku. Ukoliko ste ručno buildali sve datoteke potrebno je pokrenuti attacher.exe (tj. output buildanja engine.go datoteke) s argumentima u tekstualnom obliku u sljedećem obliku attacher.exe c:\putanja\Do\Payloada d:\putanja\do\packera. Nakon ovog koraka packer je spreman za isporuku.
Packerom nazivamo rezultat buildanja PolymorphicEngine.go datoteke, a attacher nazivamo program nastao buildom Engine.go datoteke
Literatura
[1] Github: Ebowla, https://github.com/Genetic-Malware/Ebowla
[2] Github: Memory Module, https://github.com/fancycode/MemoryModule/tree/master/doc
[3] Microsoft: PE format, https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85).aspx
[4] Wikipedia: MS-DOS