Análisis de “Builder NGR Bot 1.1.0.0”

Hace unos días estuvimos buscando qué era lo que estaban distribuyendo sobre “NGR bot” por la red y vimos que aparecía bastantes veces por los foros la cadena “Builder NGR Bot source code”. Para aprender un poco más sobre esta muestra decidimos pegarle un vistazo y ver qué era exactamente. Después de varios intentos (la mayoría de enlaces no iban) conseguimos descargarnos un fichero zip (MD5 (ngrBot_1.1.0.zip) = 411eb0f5e7e56322f308ceaeae666018) que contiene lo siguiente:

$ ls -lR

total 0
drwxr-xr-x   9 josemi  staff  306 19 jun 23:29 Builder
drwxr-xr-x  12 josemi  staff  408 19 jun 23:44 BuilderFull
drwxr-xr-x   4 josemi  staff  136  9 sep  2011 bin

./Builder:
total 640
-rw-r--r--@ 1 josemi  staff   31167  1 sep  2011 fMain.frm
-rw-r--r--@ 1 josemi  staff   26091  1 sep  2011 fMain.frx
-rw-r--r--@ 1 josemi  staff   25998 31 ago  2011 new copy.jpg
-rw-r--r--@ 1 josemi  staff  223808 31 ago  2011 new.PSD
-rw-r--r--@ 1 josemi  staff     614  1 sep  2011 ngrBotBuilder.vbp
-rw-r--r--@ 1 josemi  staff      52  5 sep  2011 ngrBotBuilder.vbw
-rw-r--r--@ 1 josemi  staff     261  1 sep  2011 ngrdata.inf

./BuilderFull:
total 344
-rw-r--r--@ 1 josemi  staff  33896  5 sep  2011 fMain.frm
-rw-r--r--@ 1 josemi  staff     81  5 sep  2011 fMain.frx
-rw-r--r--@ 1 josemi  staff    242 31 ago  2011 makeit.bat
-rw-r--r--@ 1 josemi  staff  96332 31 ago  2011 ngrBotBuilder.RES
-rw-r--r--@ 1 josemi  staff    676  5 sep  2011 ngrBotBuilder.vbp
-rw-r--r--@ 1 josemi  staff     52  5 sep  2011 ngrBotBuilder.vbw
-rw-r--r--@ 1 josemi  staff    258  1 sep  2011 ngrdata.inf
-rw-r--r--@ 1 josemi  staff   8938 31 ago  2011 ngrdll.asm
-rw-r--r--@ 1 josemi  staff     46 31 ago  2011 ngrdll.def
-rw-r--r--@ 1 josemi  staff   2726 31 ago  2011 ngrdll.lib

./bin:
total 320
-rw-r--r--@ 1 josemi  staff  159744  5 sep  2011 ngrBotBuilder.exe
-rw-r--r--@ 1 josemi  staff    4096 31 ago  2011 ngrdll.dll

Como véis, nos encontramos con tres directorios: uno con el binario, y dos con proyectos de Visual Basic. He destacado algunos ficheros por su importancia como después veremos. Una vez descomprimido cargamos el proyecto del directorio “BuilderFull” para ver qué contiene. Al cargar el proyecto y ejecutarlo, lo primero que se nos presenta es la siguiente interfaz:

Como vemos en la imagen es una interfaz para crear nuestra muestra personalizada. El formulario disponía de dos botones, uno de carga de un fichero de configuración INF y otro que es el construye la muestra (“Build EXE”). Este último botón tenía asociado el método Command1_click() y ahí fue donde nos centramos.

Lo primero que vemos es que se carga en la variable ngrBytes el fichero ngrBotBuilder.RES con la siguiente instrucción:

ngrBytes = LoadResData(101, "CUSTOM")

Tras investigar un poco sobre este tipo de ficheros, lo cargamos con la herramienta “Resource Hacker” y vemos que se trataba de un binario de Windows, como se aprecia en la imagen siguiente:

Con esta misma herramienta, con la opción “Action > Save file as binary file” lo guardamos como binario y en nuestro entorno de laboratorio lo ejecutamos. Lo que vemos es que se trataba del propio bot, pero los valores que nos permite configurar el formulario ya vienen establecidos por el creador de esta muestra.

El siguiente paso que vemos en el código es el procesamiento de los valores que están en los campos de entrada del formulario con la función SaveValue:

SaveValue Text1.Text, Text1.MaxLength, &H14298, &H14614, ngrBytes

Y la función tiene el siguiente código (Le hemos puesto unos comentarios para intentar aclarar un poco):

Function SaveValue (lpString As String, lpDataLen As Long, lpDataAddress As Long, 
lpCRCAddress As Long, lpB() As Byte)
	
   ‘ Declaración de variables
   Dim i1 As Long, i2 As Long
   Dim DataCRC As Long, DataOldCRC As Long, TotalCRC As Long
   Dim b() As Byte

   ‘ Guardamos en b la cadena de entrada convertida a Unicode
   b = StrConv(lpString, vbFromUnicode)

   ‘ Redimensionamos b para que tenga el tamaño de la cadena introducida como parámetro
   ReDim Preserve b(0 To lpDataLen) As Byte

   ‘ Calculamos el CRC de los datos llamando a una función de la DLL ngrdll.dll (CRC_Calculate) 
   DataCRC = CRC_Calculate(VarPtr(b(0)), lpDataLen)
   CopyMemory TotalCRC, lpB(&H146C8), 4
   CopyMemory DataOldCRC, lpB(lpCRCAddress), 4
   TotalCRC = Subtract(TotalCRC, DataOldCRC)
   TotalCRC = Add(TotalCRC, DataCRC)

   ‘ Se cifra el contenido de la variable b que contenía lo introducido en el campo de texto 
   ‘ con la función Encrypt que viene en la DLL ngrdll.dll y se copia en memoria los datos 
   ‘ y el CRC calculado mediante la función CopyMemory:
   ‘ CopyMemory: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366535%28v=vs.85%29.aspx
   Call Encrypt(VarPtr(b(0)), UBound(b))
   ‘ arg0: ptr destino, arg1: puntero al inicio del origen de los datos, arg2: tamaño de los 
   ‘ datos a copiar
   Call CopyMemory(lpB(lpDataAddress), b(0), UBound(b) + 1)
   Call CopyMemory(lpB(&H146C8), TotalCRC, 4)
   Call CopyMemory(lpB(lpCRCAddress), DataCRC, 4)

End Function

Al ver el código vemos que la función lo que hace es parchear el binario original con el valor introducido, pero cifrándolo previamente con la función Encrypt. Acto seguido vemos que guarda un nuevo binario con nombre “ngrbin.bin”:

Open "ngrbin.bin" For Binary As #1
Put #1, , ngrBytes
Close #1
MsgBox "Saved as ngrbin.bin", vbInformation
End Sub

Dentro del fichero zip descargado con el “fuente” del bot nos encontramos con un fichero .ASM y .DEF (con los que se construye la ngrdll.dll) que parecen ser los ficheros que implementan la lógica de la función de cifrado de las cadenas que introducimos. Este código está pendiente de análisis :-)

Resumiendo un poco, lo que hemos encontrado ha sido una aplicación para crear nuestra muestra parcheando una muestra del bot ya compilada. No se trata del código fuente como tal del bot, pero sí que nos ofrece cierta información para entender mejor este bicho. Me gustaría destacar la posibilidad de configurar las comunicaciones del bot y C&C por SSL, y que nos hagamos una pregunta: ¿seríamos capaces de detectar en nuestra sondas IDS tráfico de este bot en el caso de que fuera cifrado y a un puerto no habitual de IRC?

Por último, destacar lo sencillo que es para cualquier atacante montar una botnet sin unos conocimientos avanzados y poner en peligro la seguridad de los usuarios de una organización y a la propia organización.

[Sobre el autor]

Comments

  1. GRacias por la información; referente al tema del IDS/IPS, aunque me considero profano en la materia, por lo que llevo viendo en el mercado desde hace poco, todos implementen la posibilidad de escaneo para tráfico por SSL, dando igual el puerto usado -usando el MiTM conun certificado interno o propio de la organización-, y dando igual la categoría (por poner un ejemplo que era práctico, salvando las distancias, son capaces de detectar juegos mediante conexiones que aparantemente son de telnet y cortarlo).
    Salu2!

  2. Magnifico análisis :)
    Anónimo, no todos los ips hacen mitm de ssl, y menos aun en todos los deploys es factible (por rendimiento, arquitectura, temas legales, etc). También hay muchos despliegues de modo ids. El cifrado del troyano en puerto no standard no tiene porque ser ssl, puede ser cualquier cifrado simétrico o no q se invente el atacante.

  3. Gracias, lo del troyano con cifrado por defecto, creo, pero evidentemente aquí sigo diciendo que soy profanos, y hablo en base a los productos que llevo viendo desde hace un tiempo, sería un tráfico que no se corresponde a nada “conocido”, y por tanto, si el IPS es “decente, lo tratará como no legítimo, no permitiendo la conexión; si no fuera un troyano si no una aplicación corporativa, es entonces cuando se puede crear la excepción, per en principio, ese tipo de tráfico no debería poder salir si está bien implementado el IPS. Por temas legales, el MiTM se puede poner sólo para determinados sitios web, y siempre avisando al usuario; nose sule implementar para temas de banca o similares, pero sí es factible, y legal, siguiendo una serie de normas y procedimeintos, para otros sitios.
    El tema de rendimiento/arquitectura, está claro que es necesario hacer, como en todo proyecto, un proceso de de estudio y viabilidad, y si se pued afrontar el gasto o inversión, según se quiera ver ;-), cambiar lo necesario para llegar a lo que se considere necesario.
    Pero como digo, sólo intento aprender de vosotros, que sabéis mucho, más y mejor que aquí un servidor y lector vuestro habitual, sólo quiero aportar mi visión desde el plano de “administrador” de sistemas, no experto en seguridad y que necesita de la ayuda de los que lo son para poder llevar a cabo actuaciones fructíferas :-).
    Gracias una vez más y un saludo!

  4. Hola,

    Como bien apuntáis no es un problema sencillo de abordar por muchas cosas como rendimiento, privacidad y añadir que el proceso de implantación de una solución de este tipo requiere personal con experiencia en detección de intrusos (Intrusion Analyst skills) y mucho esfuerzo.

    @Anonimo1, alguna de las soluciones que has probado, ¿cómo han funcionado?

    @mmonge gracias!!! :D un abrazo amigo ;)

    Un saludo y gracias por los comentarios.