
versión crackeada de cobaltstrike4.5, eliminación de la firma checksum8, bypass de BeaconEye, corrección de la fuga del stage en rutas de error, adición de verificación de doble factor TOTP, corrección de CVE-2022-39197, etc.
Crack de la versión 4.5 de cobaltstrike, eliminación de la característica checksum8, bypass de BeaconEye, corrección de la fuga de stage por rutas erróneas, adición de verificación de doble factor TOTP, adición de visualización cifrada de nombres de usuario, corrección del bug de derivación foreign en la versión 4.5, modificación del nombre del archivo de configuración del cliente, etc.
Crack de cobalt strike 4.5
Crack de cobaltstrike 4.5
[TOC]
Esta herramienta y el contenido del artículo se limitan exclusivamente a la investigación de seguridad. El usuario asume todas las responsabilidades legales y relacionadas derivadas del uso de esta herramienta y del contenido del artículo. El autor no asume ninguna responsabilidad legal. Si usted incurre en cualquier comportamiento ilegal durante el uso de esta herramienta y del contenido del artículo, deberá asumir las consecuencias correspondientes por su cuenta; no asumiremos ninguna responsabilidad legal ni solidaria. De lo contrario, no instale ni utilice esta herramienta. Su uso de esta herramienta o cualquier otra forma expresa o implícita de aceptación de este acuerdo se considerará como que ha leído y aceptado las condiciones de este acuerdo. Al utilizar esta herramienta para la investigación de seguridad, debe asegurarse de que dicha actividad cumple con las leyes y regulaciones, y de que ha obtenido la autorización suficiente. No la utilice contra objetivos no autorizados.
Sí, he vuelto. Continúo con el original cobaltstrike4.4_cdf: https://github.com/lovechoudoufu/about_cobaltstrike4.4_cdf Esta vez es la versión 4.5. El 4.4 anterior fue eliminado por GitHub; calculo que este proyecto también será eliminado dentro de poco~.
Se recomienda unirse al grupo del avioncito (Telegram); cuando este proyecto y otras actualizaciones sean eliminados, se podrán descargar desde el grupo:

Antes de usarlo, verifique cuidadosamente el hash del archivo jar de la versión correspondiente.
Proceso de autenticación de certificado (tomando 4.3 como ejemplo): la versión 4.5 tiene ligeros cambios al final.
Claves de descifrado oficiales de cada versión:
4.0 1be5be52c6255c33558e8a1cb667cb06
4.1 80e32a742060b884419ba0c171c9aa76
4.2 b20d487addd4713418f2d5a3ae02a7a0
4.3 3a4425490f389aeec312bdd758ad2b99
4.4 5e98194a01c6b48fa582a6a9fcbb92d6
cobaltstrike.auth archivo de clave de autenticación, cifrado RSA, contenido descifrado:
4.3
-54, -2, -64, -45, //文件头
0, 77, //后续长度
1, -55, -61, 127, //证书时间限制29999999(永久)
0, 0, 0, 1, //watermark(水印)
43, //版本
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103
Cada vez que se actualiza una versión, la longitud correspondiente aumenta en 17 y la key aumenta en 17 bytes.
En aggressor/Aggressor.class, License.checkLicenseGUI(new Authorization()); inicia la autenticación de la licencia:

En License.checkLicenseGUI, isValid, isPerpetual, isExpired e isAlmostExpired determinan si la autorización es válida y si ha expirado:

La clase Authorization se encarga del procesamiento del archivo cobaltstrike.auth; lee el contenido del archivo y llama a AuthCrypto().decrypt para procesarlo:

En el constructor de AuthCrypto(), se llama a load(); en la función load() se realiza una comprobación md5 de resources/authkey.pub y luego se obtiene la clave pública RSA:

En decrypt(), se llama a _decrypt para realizar el descifrado RSA del contenido del archivo cobaltstrike.auth con la clave pública y se asigna al array var2; luego se usa DataParser para convertirlo y asignarlo a var3. El método readInt() obtiene los primeros cuatro bytes de var3 para la comprobación del encabezado del archivo (-889274181 para la versión 3.x; -889274157 para la versión 4.x). Después, readShort() de var3 obtiene dos bytes como longitud y los asigna a var5, y luego var6 = var3.readBytes(var5) obtiene el contenido de esa longitud, lo asigna a var6 y lo devuelve:

El array arrayOfByte2 obtenido en la clase Authorization es el contenido tras eliminar los primeros seis bytes. Se continúa procesando el array arrayOfByte2: primero se obtienen cuatro números y se asignan a i, luego se obtienen 4 números y se asignan a watermark, y después se obtiene un número y se asigna a b1, comprobando que b1 sea menor que 43 y que i sea igual a 29999999. En common/ListenerConfig, cuando watermark es 0, se añade la marca de detección antivirus:


Tras eliminar los primeros 6 bytes, se eliminan también los 9 bytes de i, watermark y b1; lo que queda son las claves desde 4.0 hasta 4.3, con la estructura: 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20:
byte b2 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte3 = dataParser.readBytes(b2); //获取16位,为4.0的key
byte b3 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte4 = dataParser.readBytes(b3); //获取16位,为4.1的key
byte b4 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte5 = dataParser.readBytes(b4); //获取16位,为4.2的key
byte b5 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte6 = dataParser.readBytes(b5); //获取16位,为4.3的key赋值给arrayOfByte6
En la clase Authorization se llama al método SleevedResource.Setup para procesar arrayOfByte6. En SleevedResource, la key se establece como la clave secreta de descifrado AES y HmacSHA256; en _readResource se realiza la llamada de descifrado this.data.decrypt(arrayOfByte1); el contenido descifrado son los archivos dll de /sleeve/:

En SleeveSecurity se establecen las claves secretas de descifrado AES y HmacSHA256; se usa el valor pasado para calcular un resumen de longitud 256, luego se toman los bytes 0-16 como clave AES y los bytes 16-32 como clave HmacSHA256.

Si no se obtiene la clave correspondiente, no se pueden descifrar los dll de la carpeta sleeve; al conectarse al servidor aparecerá el mensaje de error [Sleeve] Bad HMAC:

Para la parte de descifrado hmac, se puede consultar: Crack de Cobaltstrike 4: me otorgo la licencia a mí mismo
Por lo tanto, la clave para completar el crack es la key correspondiente a la versión de CS.
Según la descripción oficial, la versión 4.5 añade seguridad a la licencia. Efectivamente es así,

Así que necesitamos descifrar el archivo auth filtrado para ver qué se ha añadido:

Después de la posición de la key de 4.5 hay una cadena adicional; lo que se ha añadido es el watermarkHash nuevo de esta versión:

El watermarkHash está relacionado con la generación de beacon y con los dll de la carpeta sleeve; sin él, o si es incorrecto, no se puede establecer la conexión. Probablemente los desarrolladores oficiales puedan rastrear el origen de la filtración mediante este watermarkHash.

Comente el resto del código y fije el valor del parámetro asignado tras el descifrado RSA de AuthCrypto().decrypt:

byte[] var4 = {1, -55, -61, 127, 0, 1, -122, -96, 45, 16, 27, -27, -66, 82, -58, 37, 92, 51, 85, -114, -118, 28, -74, 103, -53, 6, 16, -128, -29, 42, 116, 32, 96, -72, -124, 65, -101, -96, -63, 113, -55, -86, 118, 16, -78, 13, 72, 122, -35, -44, 113, 52, 24, -14, -43, -93, -82, 2, -89, -96, 16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103, 16, 94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42, 16, -13, -114, -77, -47, -93, 53, -78, 82, -75, -117, -62, -84, -34, -127, -75, 66, 0, 0, 0, 24, 66, 101, 117, 100, 116, 75, 103, 113, 110, 108, 109, 48, 82, 117, 118, 102, 43, 86, 89, 120, 117, 119, 61, 61};
Principio de Javaagent: https://www.cnblogs.com/rickiyang/p/11368932.html
Herramienta de crack de referencia: https://github.com/Twi1ight/CSAgent
El núcleo del crack sigue siendo necesitar la key de la versión correspondiente de CS.
En beacon/BeaconData, fije el valor del método shouldPad en false:

Nueva trampa oculta en 4.4
(Anteriormente se analizó la autenticación de licencia con 4.3 como ejemplo; al cambiar a 4.4 se descubrió que el programa salía al ejecutarse; existen nuevas trampas ocultas)
En comparación con el exit de this.shouldPad anterior, también se añadió una comprobación de .class en common/Helper; basta con comentarla:

Se añadió una comprobación de .class en common/Starter; basta con comentarla:

Se añadió una comprobación de .class en common/Starter2; basta con comentarla:

Se añadió una comprobación de .class en beacon/CommandBuilder: (esta trampa oculta es una auténtica perrada; después de 4 horas de conexión continua entre client y teamserver no se pueden ejecutar comandos; como nunca había estado conectado tanto tiempo, no lo había descubierto; ggg)

Nueva trampa oculta en 4.5
La versión 4.5 añadió un montón de trampas ocultas contra javaagent; quienes descompilen el jar para hacer el crack pueden ignorarlas; basta con buscar javaagent y modificarlas una a una:

Al eliminar estos puntos, se puede volver a hacer deporte en equipo.
No entraré en detalle sobre la característica checksum8; para evitar ser detectado por nmap y los motores de búsqueda de ciberespacio, vale la pena modificarla.
En BeaconPayload, modifique el valor de la operación XOR por uno nuevo:
Cualquier número decimal sirve; luego, en los dll, cámbielo al número hexadecimal correspondiente.

Use CrackSleeve para descifrar los dll: https://github.com/ca3tie1/CrackSleeve/
javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java)java -classpath cobaltstrike.jar;./ CrackSleeve decode) # ejecutar en la línea de comandos de WindowsUse Alt+T para buscar la palabra clave: 2Eh


Modifique directamente el valor del XOR; primero use Change byte para encontrar 2E y modificarlo, y luego Apply patches to input file para guardar. (No olvide guardar)

Los dll que deben modificarse: beacon.dll, beacon.x64.dll, dnsb.dll, dnsb.x64.dll, pivot.dll, pivot.x64.dll, extc2.dll, extc2.x64.dll (los nuevos rl100k.dll de 4.5 también deben modificarse)
Luego cifre los dll con CrackSleeve; por último, coloque los dll del directorio encode en el directorio del proyecto de IDEA y vuelva a compilar y empaquetar.
Al probar, aunque la dirección uri todavía se puede solicitar, el contenido ya no puede ser descifrado por los scripts de nmap; de la misma manera, también se puede evitar la identificación de los motores de búsqueda de ciberespacio:

Además de modificar el valor del XOR, también se puede usar https://mp.weixin.qq.com/s?__biz=MzA3MDY2NjMxMA==&mid=2247484641&idx=1&sn=014f6c4ad5343e3f5034c33dffa66f26&chksm=9f3815c8a84f9cde1c7493ff29cfc89c0474fec48ede52be618727e7b9a5ab321c4743e1a44c&mpshare=1&scene=23&srcid=1202NA46yt71CvD3BMGKS10c&sharer_sharetime=1606892728447&sharer_shareid=ff83fe2fe7db7fcd8a1fcbc183d841c4#rd para cambiar el algoritmo checksum8. Sin embargo, solo se podrá acceder con una uri fija, necesita combinarse con un profile para poder usarse, y cada vez que se cambie la uri hay que volver a empaquetar; cada método tiene sus ventajas y desventajas.
La idea para eliminar la característica de BeaconEye proviene del enlace; tomando 4.3 y 4.4 como ejemplo, los bytes que deben modificarse son los siguientes.
Use CrackSleeve para descifrar los dll: https://github.com/ca3tie1/CrackSleeve/
Coloque cobaltstrike.jar y CrackSleeve.java juntos
Compile (javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java)
Descifre el archivo (java -classpath cobaltstrike.jar;./ CrackSleeve decode) # ejecutar en la línea de comandos de Windows
Clave de 4.3: 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103 Clave de 4.4: 94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42
Dirección: 10009FBB
6A 00 cámbielo a 6A 09 (cambie 00 por cualquier valor)

Dirección: 000000001800186C3
La instrucción en beacon.x64.dll es xor edx, edx; cámbiela a mov edx, esi

Dirección: 1000A0B9
6A 00 cámbielo a 6A 09 (cambie 00 por cualquier valor)

Dirección: 000000018001879B
La instrucción en beacon.x64.dll es xor edx, edx; cámbiela a mov edx, esi

Vuelva a cifrar con: java -classpath cobaltstrike.jar;./ CrackSleeve encode


Dirección: 1000A65D

Dirección: 000000018000CA3F

(Los nuevos rl100k.dll de 4.5 también deben modificarse)

El método consiste en añadir una comprobación de "/" en la uri; si no empieza por "/", se responde con 404:
Modificación para 4.4

Modificación para 4.3

Para evitar que se filtre la contraseña TOTP o el nombre de inicio de sesión de CS en el Event Log, se aplica md5 con sal al campo name; después de la modificación queda así:

Se ha añadido la verificación de doble factor TOTP para reforzar el inicio de sesión y evitar que la contraseña sea robada mediante fuerza bruta.
En el lado de teamserver, se ha añadido un enlace de código QR TOTP en la salida de teamserver:

(Antes de eliminar nohup.out, recuerde copiar el QR code; cada vez que se inicia teamserver se genera un nuevo QR code, por lo que cada vez que se inicie teamserver habrá que volver a escanearlo)
Ábralo en el navegador (se necesita VPN) y escanee el código QR con Google Authenticator o un verificador TOTP; también puede copiar la clave que aparece después de secret%3D y configurarla en el verificador:

En el lado de connect, host, port y password son igual que antes; en el campo user, los últimos seis dígitos deben ser el número dinámico TOTP para poder conectar:

Si no se rellena o se rellena incorrectamente el número dinámico TOTP, se mostrará un aviso:

Nota: si en algún momento no se tiene el móvil a mano, se puede usar un plugin de TOTP del navegador o hacer un pequeño script TOTP en Python.
Al usar windows/foreign/reverse_http(s) para hacer spawn, se produce el siguiente error:

Esta versión añadió en ScListener la operación getScalar de Custom correspondiente, pero no tuvo en cuenta el caso de foreign, lo que provoca que var1.customDLL y customFileName estén vacíos y se produzca el error:

La solución temporal consiste en devolver directamente el shellcode cuando se detecta que el payload es foreign; si este método tiene otros bugs, se puede reportar mediante issues:

Después de la corrección, se puede usar con normalidad:

Para evitar que el archivo de configuración sea leído por honeypots de mysql, el nombre del archivo de configuración del cliente de CS ya no es el predeterminado; se genera un nombre de archivo de 11 caracteres (11 de los caracteres del md5 de la dirección MAC).
