miércoles, 30 de mayo de 2018

Cuando se pesca hay que tener paciencia, y a veces, ni con esas


En relación con el post: Otro malware a la cesta de peces , hoy se comentará el proceso de vigilancia que se ha llevado a cabo durante el período de tiempo entre el mencionado post y este mismo post.

Sigamos los procesos cerebrales ...

Al estudiar el código se vio la variable: AskFmProfile.

Definición de contenido para la variable: AskFmProfile

La variable AskFmProfile contiene un valor en base64 -como se puede apreciar-, que si se decodifica, se corresponde con la cadena: http://ask.fm/GenLorren

Decodificación de la cadena en base64 contenida en la variable AskFmProfile

Pero, ¿cuándo se usa esa dirección web?, ¿qué contiene?

Si se busca por el código dicha variable se puede ver que se encuentra en dos funciones:

1.- En la función: "getCommand"

Uso de la variable AskFmProfile en la función: getCommand

2.- En la función: sendTaskReturnCode

Uso de la variable AskFmProfile en la función: sendTaskReturnCode

En ambos casos, se puede observar que el contenido de la variable es decodificado y pasado a una función de nombre: LoadHosts.

La programación de dicha función, se puede ver a continuación en la siguiente imagen.

Código de la función: loadHosts

En la función se puede apreciar que tras llamar a la función: getpageSource(), que hace una llamada a la URL decodificada para obtener la página solicita (el código de la misma), tal y como se puede ver en la siguiente imagen:

Código de la función: getPageSource()

Se procede a extraer el contenido existente entre las cadenas: "#__h__s__#" y "#__h__e__#".

Dicho contenido, como se aprecia en las siguientes líneas del código, viene en formato base64 que el programa se encarga de decodificar.

En ese momento, se comprueba si en la cadena decodificada existe al menos un carácter "@". Si es así, se reemplaza en mismo por el carácter "." y se procede a trocear la cadena en base al separador: "|".
Por lo tanto, se puede imaginar que el contenido de la cadena codificada en base64 se trata de una o de varias URLs.

Con toda la información obtenida, se puede decir que esté es el medio que sigue nuestro "amigo mal intencionado" para distribuir las urls de sus C2C.

En vista de esto, se ha procedido a realizar un seguimiento de la actividad del contenido de la URL: http://ask.fm/GenLorren. Todo ello, mediante un pequeño script en bash, un servidor de correo y un trigger en cron.

El código es muy simple, consiste al igual que el malware analizado en:
               
                1.- Descargar el contenido de la URL: http://ask.fm/GenLorren.

                2.- Buscar la cadena en base64 entre los patrones: "#__h__s__#" y "#__h__e__#"

                3.- Comparar la cadena en base64 con la cadena/s almacenadas en un archivo que       funciona a modo de base de datos de cadenas en base64 utilizada por nuestro "amigo          mal intencionado"
               
                4.- Si la cadena no se encuentra entre las cadenas almacenadas en el archivo "bbdd",                 se procede a informar mediante un correo electrónico.
               
                                4.1.- Tras la recepción del correo, el analista decodificará la cadena en base64                                 y seguirá con la diversión.
                              
                               4.2.- La nueva cadena se almacena en el archivo "bbdd", para posteriores                                         comprobaciones.
               
                4.- Si la cadena ya se encuentra entre las cadenas almacenadas, entonces no se realizan otras acciones de interés.

Código desarrollado.

Por último añadir que a día de hoy, 30/05/2018, la actividad de nuestro "amigo mal intencionado" ha sido nula, es decir, no se han detectado nuevas C2C.

¡Pero nunca hay que perder la esperanza!

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia

jueves, 10 de mayo de 2018

A quien afecta el CVE-2018-9995????


Me hago eco del aviso lanzado en un grupo de Telegram al cual pertenezco, de hace una semana, en referencia a la publicación del exploit desarrollado por el descubridor de la: CVE-2018-9995.

El exploit es realmente sencillo, consiste en realizar la siguiente petición al servidor web de la cámara web.


El fallo, por el cual se pueden conseguir todos los usuarios de la cámara web reside en el uso del valor: uid=admin, en la cookie que se pasa el servidor web.

En la web de además se da información sobre los distintos  "modelos" afectados.


A partir de aquí, expongo mi aportación ...

Realicé una petición de búsqueda a través de la API de Shodan, tal y como el propio descubridor comenta en su publicación, extrayendo, básicamente, dos campos:

                1.- IP posiblemente afectada.
                2.- Puerto de servido web.


NOTA: Los datos obtenidos se corresponden, solamente, con 101 resultados, aunque se saben que existen 9664 resultados.

Número total de resultados obtenidos.


Para cada resultado obtenido y almacenado en el fichero: PPPP, se procedío a la lanzar un escaneo sobre la IP y del puerto obtenido, solicitando un descubrimiento del servicio que se encuentra detrás (opción -sV de nmap).

Para lo cual y como se puede ver en la siguiente imagen se creó un pequeño código en bash.

Código bash lanzando para escanear las IPs y puertos obtenidos.

De los datos obtenidos, se buscaron aquellos resultados donde el  puerto estaba abierto. Y de estos, se obtuvieron el/los servicio/s catalogado/s por Nmap.

Procesos "nmap" en pleno funcionamiento
.
Al final, de los datos procesados, se obtuvo un único  servicio catalogado como:

thttpd 2.25b 29dec2003

Resultados obtenidos.

Con esto podemos saber qué servicio buscar con tu "nmap" sin hacer mucho ruido, en cualquier intranet que te encuentres.

En Internet ya sabemos cuántas existen ...

Yo ya he creado mi propia herramienta de búsqueda y explotación, pero eso ya es otra historia.

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia





martes, 20 de marzo de 2018

Otro "malware" a la cesta de peces


A finales de la semana pasada me pasaron un pendrive infectado y me solicitaron encontrar la muestra de infección.

El pendrive montaba dos particiones, en la primera se encontraban multitud de ficheros .html, .pdf y .doc, que tras su revisión, no se podían calificar de maliciosos.

En la segunda partición, denominada: Temporal, había:
               
                1.- Directorio simulado (extensión .lnk) de nombre: Documentación.

                Este enlace contenía la sentencia de ejecución:

C:\windows\system32\wscript.exe //E:vbscript MSShell32 /e "Documentacion" c4bbf69c54 0PQ6UF56EI28DK16Y51OZ06FE
                              
                2.- Directorio simulado (extensión .lnk) de nombre: Private
               
                Este enlace contenía la sentencia de ejecución:

C:\windows\system32\wscript.exe //E:vbscript MSShell32 /e "Private" c4bbf69c54 US1L8U6H

                3.- Archivo con caracteres: SHR (Sistema, oculto y de sólo lectura), de nombre: MSShell32.

Obviamente, la muestra buscada era el archivo oculto a nuestros ojos.

Se  solicito información a VT (VirusTotal), mostrando:


Una vez confirmado que se había encontrado la muestra buscada, se procedió a revisar el código de la muestra.


Parte del código encontrado.

Como se puede apreciar, el texto se encuentra ofuscado de alguna manera, ya que hay texto legible, o más bien, comandos compresibles y otras cosas.

Revisando más profusamente, se puede ver alguno de los métodos de ofuscación seguidos.

Función: MAPqXqZH y uso del comando: SPLIT

La variable EVOIVHHL juega con la función: MAPqXqZH (en sus distintas variantes, que son la misma, al no hacer distinción entre mayúsculas y minúsculas en Visual Basic). Además, se puede ver el uso de la función SPLIT.

NOTA: La base de conocimientos de Microsoft, define dicha función como: Divide una cadena en sub-cadenas basadas en los caracteres de una matriz.

                Personalmente la definiría como: función que divide una cadena en distintas sub-cadenas delimitadas por el carácter pasado como separador.
-----------------------------------------------------------------------------------------------------------------

Profundizando un poco más, se puede ver que la función: MAPqXqZH, trabaja con la función: REPLACE.

NOTA: La base de conocimientos de Microsoft, define dicha función como: Devuelve una cadena en la que se ha reemplazado una subcadena especificada con otra subcadena un número especificado de veces.
                Personalmente la definiría como: función que sustituye un carácter indicado por otro carácter también indicado dentro del texto proporcionado.

Función: MAPqXqZH

El código encontrado entonces quedaría de la siguiente manera:

Código encontrado, maquillado para su mejor comprensión.

En este punto, se descubre la función: LMCEXKJ, que al igual que la función: MAPqXqZH, trabaja con la función REPLACE.

En cualquier caso, se procede a transformar el código anterior en algo mas legible, para lo cual se procede a sustituir las funciones: CHR, por lo valores ASCII correspondientes:

Código encontrado, de nuevo, maquillado para su mejor comprensión.

Ya se van viendo cosas más comprensibles, aunque se continua haciendo el código más legible, utilizando la nueva información obtenida. Se obtiene:

Código encontrado, de nuevo, maquillado para su mejor comprensión.

Al final, tras hacer la labor a mano, se obtiene un código  como el siguiente:

Código encontrado. Esta vez, sólo nos quedaría ejecutar la función: LMCEXKJ.

Si ejecutamos las funciones: LMCEXKJ y SPLIT, el texto a descodificar se queda como sigue.

Código a descodificar

Si con el anterior código realizamos su transformación a código ASCII, tal y como nos indica el siguiente código:

Código que solicita la transformación a código ASCII de cada uno de los dígitos encontrados

Obtenemos:
Código ASCII

El código devuelto es legible en parte, por lo tanto ... ¡este es el método!.

Pero, algo no se hizo, por lo que se pasó al método rápido.

Este método consiste en dejar que el bicho se "ejecute", con la intención de descodificarlo correctamente. Pero que en vez de dejarle que se ejecute tal cual, se programará el código para que este se almacene en un archivo y así saciar nuestra curiosidad. Para ello hay que cambiar el comando donde se ejecuta el código decodificado por la llamada a una función que almacena en un archivo el código a ejecutar.

Llamada a la función: VOLCARDATOS()


Tarea que realiza la función: VOLCARDATOS()

Tras realizar los cambios y ejecutar el código, obtenemos el archivo: CodigoMalwar, cuyo inicio se puede ver en la siguiente imagen.

Malware totalmente decodificado.

 Aunque se sigue analizando el código por pura diversión, se pasa a comentar los datos más importantes para poder generar las reglas de mitigación necesarias.

1.- Se trata de algo más que un simple downloader.
2.- Crea un mutex de nombre: c4bbf69c54
3.- Obtiene información del sistema que posteriormente cifra en RC4 mediante la contraseña de cifrado:  B7248B83465C20C086AB3EDF5A6623E0C, envía.

Variables relacionadas con los puntos anteriores.

4.- Genera múltiples entradas en el registro de Windows para su persistencia
  • 4.1.- HKCU\software\MSShell32\d -> almacena la fecha de la primera infección
  • 4.2.- HKCU\software\MSShell32\c -> almacena "true" si el primer parámetro pasado existe dentro del sistema como directorio
  • 4.3.- HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MSShell32 -> persistencia del malware
  • 4.4.- HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Hidden -> obliga al sistema a mantener ocultos los archivos con el atributo de oculto activado
  • 4.5.- HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Advanced\HiddenFileExt  -> obliga al sistema a mantener las extensiones de los archivos ocultas


5.-  Se producen comunicaciones contra:

  • 5.1.- music4you.ddns.net/?hdr=info, por el puerto 37556
  • 5.2.- tinyworld.duckdns.org/?hdr=info, por el puerto 37556
  • 5.3.- scrabble.crabdance.com/?hdr=info, por el puerto 37556


 Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia