
cobaltstrike4.5 버전 크랙, checksum8 특성 제거, BeaconEye 우회, 오류 경로로 인한 stage 유출 수정, totp 2단계 인증 추가, CVE-2022-39197 수정 등
cobaltstrike4.5 버전 크랙, checksum8 특성 제거, BeaconEye 우회, 오류 경로 stage 누출 수정, totp 2단계 인증 추가, 사용자 이름 암호화 표시 추가, 4.5 버전 foreign 파생 오류 버그 수정, 클라이언트 구성 파일 이름 변경 등
cobalt strike4.5 크랙
cobaltstrike4.5 크랙
[TOC]
이 도구와 문서 내용은 보안 연구에만 한정됩니다. 사용자는 이 도구와 문서 내용을 사용함으로써 발생하는 모든 법적 및 관련 책임을 부담합니다! 저자는 어떠한 법적 책임도 지지 않습니다! 이 도구와 문서 내용을 사용하는 과정에서 불법 행위가 있을 경우, 사용자는 그에 따른 결과를 스스로 부담해야 하며, 당사는 어떠한 법적 및 연대 책임도 지지 않습니다. 그렇지 않으면 이 도구를 설치하거나 사용하지 마십시오. 사용자의 사용 행위 또는 다른 명시적·묵시적 방식으로 본 협의를 수락하는 경우, 본 협의의 구속을 읽고 동의한 것으로 간주됩니다. 이 도구를 사용하여 보안 연구를 수행할 때 해당 행위가 법률 및 규정을 준수하고 충분한 승인을 받았는지 확인해야 합니다. 승인되지 않은 대상에 사용하지 마십시오.
네, 다시 돌아왔습니다. 기존 cobaltstrike4.4_cdf를 이어서: https://github.com/lovechoudoufu/about_cobaltstrike4.4_cdf 이번에는 4.5 버전입니다. 이전 4.4는 github에 의해 삭제되었고, 아마 머지않아 이 프로젝트도 삭제될 것입니다~.
텔레그램 그룹에 가입할 것을 권장합니다. 이후 다른 업데이트 및 프로젝트가 삭제된 후 그룹에서 다운로드할 수 있습니다:

사용 전에 해당 버전 jar 패키지의 hash를 반드시 확인하세요.
인증서 인증 절차(4.3 예시): 4.5 버전에서 마지막 부분이 약간 변경되었습니다.
각 버전의 공식 복호화 key:
4.0 1be5be52c6255c33558e8a1cb667cb06
4.1 80e32a742060b884419ba0c171c9aa76
4.2 b20d487addd4713418f2d5a3ae02a7a0
4.3 3a4425490f389aeec312bdd758ad2b99
4.4 5e98194a01c6b48fa582a6a9fcbb92d6
cobaltstrike.auth 인증 키 파일, rsa 암호화, 복호화 내용:
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
버전이 업데이트될 때마다 해당 길이는 +17, key는 17비트 증가합니다.
aggressor/Aggressor.class에서 License.checkLicenseGUI(new Authorization());로 license 인증이 시작됩니다:

License.checkLicenseGUI의 isValid, isPerpetual, isExpired, isAlmostExpired는 인증이 유효한지, 만료되었는지를 판단합니다:

Authorization 클래스는 cobaltstrike.auth 파일을 처리하며, 파일 내용을 읽고 AuthCrypto().decrypt를 호출하여 내용을 처리합니다:

AuthCrypto()의 생성자에서 load()를 호출하며, load() 함수는 resources/authkey.pub에 대해 md5 검증을 수행한 후 RSA 공개 키를 가져옵니다:

decrypt()에서는 _decrypt를 호출하여 cobaltstrike.auth 파일 내용을 공개 키로 RSA 복호화한 뒤 배열 var2에 할당하고, DataParser로 변환하여 var3에 할당합니다. readInt() 메서드로 var3의 앞 4바이트를 가져와 파일 헤더를 판별합니다(-889274181은 3.x 버전, -889274157은 4.x 버전). 그런 다음 var3에서 readShort()로 2바이트를 길이로 가져와 var5에 할당하고, var6 = var3.readBytes(var5)로 해당 길이만큼의 내용을 var6에 할당하여 반환합니다:

Authorization 클래스에서 얻은 arrayOfByte2 배열은 앞 6바이트를 제거한 내용입니다. 계속해서 arrayOfByte2 배열을 처리합니다. 먼저 4바이트를 가져와 i에 할당하고, 다시 4바이트를 가져와 watermark에 할당한 다음, 1바이트를 가져와 b1에 할당합니다. b1이 43보다 작은지, i가 29999999와 같은지 판단합니다. common/ListenerConfig에서는 watermark가 0일 때 백신 탐지 워터마크가 추가됩니다:


앞 6바이트를 제거한 후, 다시 i, watermark, b1 이 9바이트를 제거하면 남는 것은 4.0부터 4.3까지의 key이며, 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
Authorization 클래스에서 SleevedResource.Setup 메서드를 호출하여 arrayOfByte6를 처리합니다. SleevedResource에서는 key를 AES, HmacSHA256 복호화 비밀 키로 설정하고, _readResource의 this.data.decrypt(arrayOfByte1);에서 복호화를 호출합니다. 복호화되는 내용은 /sleeve/ 폴더의 dll 파일입니다:

SleeveSecurity에서는 AES, HmacSHA256 복호화 비밀 키를 설정하고, 전달된 값으로 길이 256의 다이제스트를 계산한 뒤 0-16을 AES 키로, 16-32를 HmacSHA256 키로 사용합니다.

해당 key를 얻지 못하면 sleeve 폴더의 dll을 복호화할 수 없으며, 서버에 연결할 때 [Sleeve] Bad HMAC 오류 메시지가 표시됩니다:

hmac 복호화 부분은 Cobaltstrike 4 크랙: 나 자신에게 license 발급하기를 참고할 수 있습니다.
따라서 크랙을 완료하는 핵심은 해당 cs 버전의 key입니다.
공식 설명에 따르면 4.5 버전에서 license 보안이 추가되었습니다. 실제로 그렇습니다.

그래서 유출된 auth 파일을 복호화하여 무엇이 추가되었는지 확인해야 합니다:

4.5의 key 위치 뒤에 한 줄이 더 추가되었는데, 추가된 것은 이 버전에서 새로 도입된 watermarkHash입니다:

watermarkHash는 beacon 생성과 관련이 있으며 sleeve 폴더의 dll과도 관련이 있습니다. 이것이 없거나 잘못되면 online 연결이 되지 않습니다. 아마도 공식에서는 이 watermarkHash를 통해 유출 원본을 역추적할 수 있을 것입니다.

다른 코드를 주석 처리하고 AuthCrypto().decrypt의 RSA 복호화 후 할당되는 매개변수를 하드코딩합니다:

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};
Javaagent 원리: https://www.cnblogs.com/rickiyang/p/11368932.html
크랙 도구 참고: https://github.com/Twi1ight/CSAgent
크랙의 핵심은 여전히 cs 해당 버전의 key가 필요하다는 것입니다.
beacon/BeaconData에서 shouldPad 메서드 값을 false로 고정합니다:

4.4 새로운 함정
(이전에는 4.3을 예로 들어 License 인증 분석을 했는데, 4.4로 바꾸니 실행이 종료되어 새로운 함정이 존재했습니다)
기존 this.shouldPad의 exit 외에 common/Helper에도 .class 판별이 추가되었으니 주석 처리하면 됩니다:

common/Starter에도 .class 판별이 추가되었으니 주석 처리하면 됩니다:

common/Starter2에도 .class 판별이 추가되었으니 주석 처리하면 됩니다:

beacon/CommandBuilder에도 .class 판별이 추가되었습니다. (이 함정은 정말 악랄합니다. client와 teamserver가 4시간 연속 연결되면 명령을 실행할 수 없게 됩니다. 그렇게 오래 연결해 본 적이 없어서 발견하지 못했습니다, ggg)

4.5 새로운 함정
4.5 버전은 javaagent에 많은 함정을 추가했습니다. jar 패키지를 디컴파일하여 크랙하는 경우 무시해도 되며, 'javaagent'를 검색하여 하나씩 수정하면 됩니다:

이 몇 곳을 제거하면 다시 단체 활동을 할 수 있습니다.
checksum8 특성은 자세히 설명하지 않겠습니다. nmap과 인터넷 공간 검색 엔진에 스캔되어 노출되는 것을 피하려면 변경할 필요가 있습니다.
BeaconPayload에서 XOR 값을 새 값으로 수정합니다:
아무 10진수 숫자나 사용하면 됩니다. 이후 dll에서는 해당 16진수 숫자로 변경합니다.

CrackSleeve를 사용하여 dll을 복호화합니다: https://github.com/ca3tie1/CrackSleeve/
javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java)java -classpath cobaltstrike.jar;./ CrackSleeve decode) # Windows 명령줄에서 실행Alt+T로 키워드 검색: 2Eh


xor 값을 직접 수정합니다. 먼저 Change byte로 2E를 찾아 수정한 다음, Apply pathes to input file로 저장합니다. (저장하는 것을 잊지 마세요)

수정해야 할 dll: beacon.dll, beacon.x64.dll, dnsb.dll, dnsb.x64.dll, pivot.dll, pivot.x64.dll, extc2.dll, extc2.x64.dll (4.5에서 새로 추가된 rl100k.dll 몇 개도 수정해야 합니다)
다시 CrackSleeve로 dll을 암호화하고, 마지막으로 encode 디렉터리의 dll을 idea 프로젝트 디렉터리에 넣어 다시 컴파일하고 패키징합니다.
테스트 결과 uri 주소는 여전히 요청할 수 있지만, 내용은 더 이상 nmap 스크립트로 복호화할 수 없습니다. 마찬가지로 인터넷 공간 검색 엔진의 탐지도 피할 수 있습니다:

XOR 값을 수정하는 방식 외에, 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 링크의 방법으로 checksum8 알고리즘을 변경할 수도 있습니다. 하지만 uri가 고정되어서만 접근할 수 있고 profile과 함께 사용해야 하며, uri를 변경할 때마다 다시 패키징해야 합니다. 각 방법에는 장단점이 있습니다.
BeaconEye 특성을 제거하는 수정 아이디어는 링크에서 나왔으며, 4.3과 4.4를 예로 들어 수정해야 할 바이트는 다음과 같습니다.
CrackSleeve를 사용하여 dll을 복호화합니다: https://github.com/ca3tie1/CrackSleeve/
javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java)java -classpath cobaltstrike.jar;./ CrackSleeve decode) # Windows 명령줄에서 실행4.3 key 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103 4.4 key 94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42
주소: 10009FBB
6A 00을 6A 09로 수정(00을 임의의 값으로 수정)

주소: 000000001800186C3
beacon.x64.dll의 명령어는 xor edx, edx이며, mov edx, esi로 수정합니다.

주소: 1000A0B9
6A 00을 6A 09로 수정(00을 임의의 값으로 수정)

주소: 000000018001879B
beacon.x64.dll의 명령어는 xor edx, edx이며, mov edx, esi로 수정합니다.

다시 암호화: java -classpath cobaltstrike.jar;./ CrackSleeve encode


주소: 1000A65D

주소: 000000018000CA3F

(4.5에서 새로 추가된 rl100k.dll 몇 개도 수정해야 합니다)

방법은 uri에 '/' 판별을 추가하는 것입니다. '/'로 시작하지 않으면 404를 응답합니다:
4.4 수정

4.3 수정

Event Log에서 totp 비밀번호나 cs 로그인 이름이 유출되는 것을 방지하기 위해 name 필드를 md5 솔트 처리하여 표시합니다. 수정 후는 다음과 같습니다:

TOTP 2단계 인증을 추가하여 로그인을 강화하고 비밀번호 무차별 대입으로 탈취당하는 것을 방지합니다.
teamserver 쪽에서는 teamserver 출력에 totp QR 코드 링크가 추가되었습니다:

(nohup.out을 삭제하기 전에 QR code를 복사해 두세요. teamserver를 시작할 때마다 새로운 QR code가 생성되므로 teamserver를 시작할 때마다 다시 스캔해야 합니다)
브라우저로 열고(인터넷 우회 필요) Google Authenticator 또는 TOTP 인증기로 QR 코드를 스캔하거나, secret%3D 뒤의 키를 복사하여 인증기에 구성해도 됩니다:

connect 쪽에서는 host, port, password는 기존과 동일하며, user에서 뒤 6자리를 totp 동적 숫자로 입력하면 연결할 수 있습니다:

totp 동적 숫자를 입력하지 않았거나 잘못 입력하면 다음과 같은 메시지가 표시됩니다:

참고: 휴대폰이 없는 경우 브라우저의 totp 플러그인을 사용하거나 python으로 간단한 totp 코드를 만들어 사용할 수 있습니다.
windows/foreign/reverse_http(s)로 spawn할 때 다음과 같은 오류가 발생합니다:

이 버전은 ScListener에 관련 Custom getScalar 연산을 추가했지만, foreign의 경우를 고려하지 않아 var1.customDLL, customFileName이 비어 오류가 발생합니다:

임시 수정 방법은 payload가 foreign일 때 shellcode를 직접 반환하는 것입니다. 이 방법에 다른 버그가 있으면 issues로 피드백해 주세요:

수정 후 정상적으로 사용할 수 있습니다:

mysql 허니팟이 구성을 읽는 것을 방지하기 위해 cs 클라이언트 구성 파일 이름이 더 이상 기본값이 아니며, 11자리 문자 파일 이름(mac 주소 md5 중 11자리)이 생성됩니다.
