Golang (Go) es un lenguaje de programación relativamente nuevo, y no es común encontrar malware escrito en él. Sin embargo, las nuevas variantes escritas en Go están emergiendo lentamente, presentando un desafío para los analistas de malware. Las aplicaciones escritas en este idioma son voluminosas y se ven muy diferentes en un depurador de las compiladas en otros idiomas, como C / C ++.

Recientemente, se observó una nueva variante del malware Zebocry  que se escribió en Go (análisis detallado disponible aquí ).

Capturamos otro tipo de malware escrito en Go en nuestro laboratorio. Esta vez, fue un simple ladrón detectado por Malwarebytes como Trojan.CryptoStealer.Go . Esta publicación proporcionará detalles sobre su funcionalidad, pero también mostrará métodos y herramientas que se pueden aplicar para analizar otros programas maliciosos escritos en Go.

Muestra analizada

Malwarebytes detecta a este ladrón como Trojan.CryptoStealer.Go:

Analisis de comportamiento

Bajo el capó, Golang llama a WindowsAPI, y podemos rastrear las llamadas usando herramientas típicas, por ejemplo, marcadores de PIN. Vemos que el malware busca archivos en las siguientes rutas:

"C: \ Users \ tester \ AppData \ Local \ Uran \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Amigo \ User \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Torch \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Chromium \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Nichrome \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Google \ Chrome \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ 360Browser \ Browser \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Maxthon3 \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Comodo \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ CocCoc \ Browser \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Vivaldi \ User Data \"
"C: \ Users \ tester \ AppData \ Roaming \ Opera Software \"
"C: \ Users \ tester \ AppData \ Local \ Kometa \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Comodo \ Dragon \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Sputnik \ Sputnik \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Google (x86) \ Chrome \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Orbitum \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ Yandex \ YandexBrowser \ User Data \"
"C: \ Users \ tester \ AppData \ Local \ K-Melon \ User Data \"

Esos caminos apuntan a los datos almacenados de los navegadores. Un hecho interesante es que uno de los caminos apunta al navegador Yandex, que es popular principalmente en Rusia.

La siguiente ruta buscada es para el escritorio:

"C: \ Users \ tester \ Desktop \ *"

Todos los archivos encontrados allí se copian en una carpeta creada en% APPDATA%:

La carpeta «Escritorio» contiene todos los archivos TXT copiados del Escritorio y sus subcarpetas. Ejemplo de nuestra máquina de prueba:

Una vez completada la búsqueda, los archivos se comprimen:

Podemos ver este paquete enviado a C&C (cu23880.tmweb.ru/landing.php):

Dentro

Los binarios compilados de Golang suelen ser grandes, por lo que no es sorprendente que la muestra se haya empaquetado con UPX para minimizar su tamaño. Podemos descomprimirlo fácilmente con el UPX estándar . Como resultado, obtendremos ir binario. La tabla de exportación revela la ruta de compilación y algunas otras funciones interesantes:

En cuanto a esas exportaciones, podemos tener una idea de las bibliotecas estáticas utilizadas en su interior.

Muchas de esas funciones (relacionadas con el trampolín) se pueden encontrar en el módulo sqlite-3: https://github.com/mattn/go-sqlite3/blob/master/callback.go .

La función crosscall2 proviene del tiempo de ejecución de Go y está relacionada con la llamada a las aplicaciones de Go / C ++ ( https://golang.org/src/cmd/cgo/out.go ).

Herramientas

Para el análisis, utilicé IDA Pro junto con los scripts IDAGolangHelper escritos por George Zaytsev. Primero, el ejecutable Go tiene que ser cargado en IDA. Luego, podemos ejecutar el script desde el menú (Archivo -> archivo de script). Luego vemos el siguiente menú, dando acceso a características particulares:

Primero, necesitamos determinar la versión de Golang (el script ofrece algunas heurísticas útiles). En este caso, será Go 1.2. Luego, podemos cambiar el nombre de las funciones y agregar tipos de Go estándar. Después de completar esas operaciones, el código parece mucho más legible. A continuación, puede ver la vista de las funciones antes y después de usar los scripts.

Antes (solo se nombran las funciones exportadas):

Después (la mayoría de las funciones tienen sus nombres resueltos y agregados automáticamente):

Muchas de esas funciones provienen de bibliotecas enlazadas estáticamente. Por lo tanto, debemos enfocarnos principalmente en funciones anotadas como main_*– que son específicas para el ejecutable en particular.

Descripción del código

En la función «main_init», podemos ver los módulos que se utilizarán en la aplicación:

Está enlazado estáticamente con los siguientes módulos:

Analizar esta función puede ayudarnos a predecir la funcionalidad; Es decir, al mirar las bibliotecas anteriores, podemos ver que se comunicarán a través de la red, leerán las bases de datos SQLite3 y generarán excepciones. Otros inicializadores sugieren usar expresiones regulares, formato zip y leer variables ambientales.

Esta función también es responsable de inicializar y mapear cadenas. Podemos ver que algunos de ellos son descodificados primero en base64:

En la inicialización de cadenas, vemos referencias a carteras de criptomonedas.

Ethereum:

Monero

La función principal del binario de Golang está anotada «main_main».

Aquí, podemos ver que la aplicación está creando un nuevo directorio (usando una función os.Mkdir). Este es el directorio donde se copiarán los archivos encontrados.

Después de eso, hay varios Goroutines que han comenzado a usar runtime.newproc. (Los goroutines se pueden usar de manera similar a los hilos, pero se manejan de manera diferente. Se pueden encontrar más detalles  aquí ). Esas rutinas son responsables de buscar los archivos. Mientras tanto, el módulo Sqlite se utiliza para analizar las bases de datos con el fin de robar datos.

Luego, el malware lo guarda todo en un solo paquete y, finalmente, el paquete se carga en el C&C.

¿Qué fue robado?

Para ver exactamente en qué datos está interesado el atacante, podemos ver más de cerca las funciones que realizan consultas SQL y ver las cadenas relacionadas.

Las cadenas en Golang se almacenan de forma masiva, en forma concatenada:

Más tarde, una sola porción de dicho volumen se recupera a pedido. Por lo tanto, ver desde qué lugar en el código se hizo referencia a cada cadena no es tan fácil.

A continuación hay un fragmento en el código donde se abre una base de datos «sqlite3» (se recuperó una cadena de la longitud 7):

Otro ejemplo: esta consulta se recuperó del trozo completo de cadenas, con el desplazamiento y la longitud dados:

Echemos un vistazo a los datos que esas consultas intentaban obtener. Al recuperar las cadenas a las que hacen referencia las llamadas, podemos recuperarlas y listarlas todas:

seleccione name_on_card, expiration_month, expiration_year, card_number_encrypted, billing_address_id FROM credit_cards
seleccione * FROM autofill_profiles
seleccione el correo electrónico DE autofill_profile_emails
seleccione el número de autofill_profile_phone
seleccione first_name, middle_name, last_name, full_name FROM autofill_profile_names

Podemos ver que la base de datos de cookies del navegador se consulta en los datos de búsqueda relacionados con transacciones en línea: números de tarjetas de crédito, fechas de vencimiento, así como datos personales como nombres y direcciones de correo electrónico.

Las rutas a todos los archivos que se buscan se almacenan como cadenas base64. Muchos de ellos están relacionados con carteras de criptomonedas, pero también podemos encontrar referencias al mensajero de Telegram.

Software \\ Classes \\ tdesktop.tg \\ shell \\ open \\ command
\\ AppData \\ Local \\ Yandex \\ YandexBrowser \\ Datos del usuario \\
\\ AppData \\ Roaming \\ Electrum \\ wallets \\ default_wallet
\\ AppData \\ Local \\ Torch \\ Datos del usuario \\
\\ AppData \\ Local \\ Uran \\ Datos del usuario \\
\\ AppData \\ Roaming \\ Opera Software \\
\\ AppData \\ Local \\ Comodo \\ Datos del usuario \\
\\ AppData \\ Local \\ Chromium \\ Datos del usuario \\
\\ AppData \\ Local \\ Chromodo \\ Datos del usuario \\
\\ AppData \\ Local \\ Kometa \\ Datos del usuario \\
\\ AppData \\ Local \\ K-Melon \\ Datos del usuario \\
\\ AppData \\ Local \\ Orbitum \\ Datos del usuario \\
\\ AppData \\ Local \\ Maxthon3 \\ Datos del usuario \\
\\ AppData \\ Local \\ Nichrome \\ Datos del usuario \\
\\ AppData \\ Local \\ Vivaldi \\ Datos del usuario \\
\\ AppData \\ Roaming \\ BBQCoin \\ wallet.dat
\\ AppData \\ Roaming \\ Bitcoin \\ wallet.dat
\\ AppData \\ Roaming \\ Ethereum \\ keystore
\\ AppData \\ Roaming \\ Exodus \\ seed.seco
\\ AppData \\ Roaming \\ Franko \\ wallet.dat
\\ AppData \\ Roaming \\ IOCoin \\ wallet.dat
\\ AppData \\ Roaming \\ Ixcoin \\ wallet.dat
\\ AppData \\ Roaming \\ Mincoin \\ wallet.dat
\\ AppData \\ Roaming \\ YACoin \\ wallet.dat
\\ AppData \\ Roaming \\ Zcash \\ wallet.dat
\\ AppData \\ Roaming \\ devcoin \\ wallet.dat

Malware grande pero poco sofisticado

Algunos de los conceptos utilizados en este malware nos recuerdan a otros ladrones, como Evrial, PredatorTheThief y  Vidar . Tiene objetivos similares y también envía los datos robados como un archivo ZIP a C&C. Sin embargo, no hay pruebas de que el autor de este ladrón esté vinculado de alguna manera con esos casos.

Cuando echamos un vistazo a la implementación, así como a la funcionalidad de este malware, es bastante simple. Su gran tamaño proviene de muchos módulos compilados estáticamente. Posiblemente, este malware se encuentra en las primeras etapas de desarrollo; es posible que su autor haya empezado a aprender Go y esté experimentando. Estaremos atentos a su desarrollo.

Al principio, el análisis de una aplicación compilada por Golang puede parecer abrumador, debido a su enorme base de código y su estructura desconocida. Pero con la ayuda de herramientas adecuadas, los investigadores de seguridad pueden navegar fácilmente por este laberinto, ya que todas las funciones están etiquetadas. Como Golang es un lenguaje de programación relativamente nuevo, podemos esperar que las herramientas para analizarlo maduren con el tiempo.

¿El malware escrito en Go es una tendencia emergente en el desarrollo de amenazas? Es un poco demasiado pronto para decirlo. Pero sí sabemos que el conocimiento del malware escrito en nuevos idiomas es importante para nuestra comunidad.