
Cobalt Strike를 위한 무작위화되고 린트 검증된 C2 유연한 프로파일을 생성하며, HTTP/S, DNS, SMB 및 SSH 비콘 구성을 자동화하고 사용자 정의 가능한 IOC 무작위화를 제공합니다.
C2concealer는 Cobalt Strike에서 사용할 무작위 C2 변형 프로필을 생성하는 명령줄 도구입니다.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Docker 지침을 참조하세요.
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
HTTP 클라이언트 및 서버 측 설정에 사용되는 호스트 이름입니다. 기본값은 None입니다.
--variant
생성할 HTTP 클라이언트/서버 변형의 수를 정의하는 정수입니다.
1에서 5 사이를 권장합니다. 최대 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] 시스템에서 c2lint 도구(Cobalt Strike의 일부)를 검색 중입니다. 10~20초 정도 소요될 수 있습니다.
[i] /opt/cobaltstrike/c2lint 디렉터리에서 c2lint를 찾았습니다.
SSL 옵션을 선택하세요:
1. 자체 서명 SSL 인증서(몇 가지 세부 정보만 입력)
2. LetsEncrypt SSL 인증서(관련 도메인의 임시 A 레코드를 이 머신으로 가리켜야 함)
3. 기존 키스토어
4. SSL 없음
[?] 옵션 [1/2/3/4]:
팁: 항상 SSL 인증서를 사용하세요. 가급적이면 LetsEncrypt 또는 유사한 기관의 인증서를 권장합니다. 팁: HTTP 변형을 사용하면 서로 다른 비콘에서 HTTP 트래픽에 대해 다른 IOC를 선택할 수 있습니다. 최소 1 이상의 값을 권장합니다.
Cobalt Strike 문서를 꼼꼼히 살펴보고 각 프로필 속성에 적합한 값의 범위를 정의했습니다. 때로는 해당 데이터가 단순히 특정 범위 내의 무작위 정수일 수도 있고, Python 딕셔너리에서 무작위 값을 선택해야 하는 경우도 있습니다. 어쨌든, 도구 생성을 시작할 때 유효한 프로필을 만드는 데이터를 정의하는 것부터 시작했습니다.
그런 다음 각 malleable 프로필 섹션(또는 블록)을 별도의 .py 파일로 나누었습니다. 각 파일에는 각 속성에 대해 무작위 적절한 값을 선택한 다음 해당 프로필 블록에 대한 형식화된 문자열을 출력하는 로직이 포함되어 있습니다. 모든 프로필 블록을 연결하고, 몇 가지 간단한 일관성 검사를 수행한 다음, Cobalt Strike 린터(c2lint)를 통해 프로필을 실행합니다. 출력되는 프로필은 사용자의 업무에 작동해야 합니다. 캠페인을 실행하기 전에 항상 프로필(프로세스 인젝션 및 스포닝 포함)을 테스트할 것을 권장합니다.
코드를 살펴보려면 다음 두 파일부터 시작하는 것이 좋습니다: /C2concealer/main.py 및 /C2concealer/profile.py. 주석을 검토한 후 /C2concealer/components 폴더에 있는 개별 프로필 블록 생성기를 확인하세요.
이것은 매우 중요합니다. 이는 오픈 소스 도구입니다. 벤더는 이 도구가 생성하는 프로필에 대한 서명을 쉽게 작성할 수 있습니다. 이 도구를 실행하는 것은 Cobalt Strike malleable 프로필을 구축하기 위한 훌륭한 시작점을 제공하지만, 생성된 프로필을 채우는 데 사용되는 데이터를 커스터마이징하려면 다음 영역을 자세히 살펴보는 것이 좋습니다:
/C2concealer/data/
또한 프로필 생성 프로세스 전반에 걸쳐 다양한 속성을 커스터마이징할 수 있습니다. 예를 들어 /C2concealer/components/stageblock.py 파일에서 PE 이미지 크기 값이 추출되는 범위(73-74행 근처)를 변경할 수 있습니다. components 디렉터리의 모든 파일을 살펴보시기 바랍니다.
여기까지 오셨다면, 이 도구를 유용하게 사용하실 수 있을 것입니다. 이 도구를 보는 권장 방식은 프로필을 자동으로 생성하는 뼈대 코드를 구축했다는 것입니다. 이제 여러분의 캠페인에 각 속성에 적합한 값을 생각하고 데이터 소스를 업데이트하는 것은 여러분의 몫입니다.
Malleable C2 프로필 언어에 대해 가능한 많은 옵션을 다루었지만, 설정하지 않은 옵션도 많이 있습니다. Malleable Command and Control 문서를 참조하여 프로필을 수정할 것을 적극 권장합니다.
다음 옵션은 설정되지 않았거나 C2concealer에 의해 정적으로 설정되었으므로 변경을 고려해야 합니다.
http-config 블록| 누락된 옵션 | 참고 |
|---|---|
set block_useragents | 비콘이 아닌 UA 패턴 차단 |
set allow_useragents | UA 패턴 허용 목록(CS 4.3+) |
stage 블록| 누락된 옵션 | 참고 |
|---|---|
set allocator | 하드코딩된 VirtualAlloc; HeapAlloc, MapViewOfFile 무작위화 누락 |
set magic_mz_x86 / magic_mz_x64 | MZ 헤더 스푸핑 |
set magic_pe | PE 마커 스푸핑 |
set rich_header | 컴파일러 메타데이터 스푸핑 |
set module_x86 / module_x64 | 모듈 스톰핑 |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | EAT 검사 우회 |
set syscall_method | None/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
transform-obfuscate 블록 | base64, lznt1, rc4, xor 옵션이 완전히 없음 |
transform-x86/x64의 append | prepend와 strrep만 사용됨 |
process-inject 블록| 누락된 옵션 | 참고 |
|---|---|
set allocator | 하드코딩된 VirtualAllocEx; NtMapViewOfSection 무작위화 누락 |
set use_driploading | — |
set dripload_delay | — |
transform-x86/x64의 append | prepend만 사용됨 |
Execute: NtQueueApcThread | 실행 블록에 없음 |
Execute: NtQueueApcThread-s | 실행 블록에 없음 |
Execute: ObfSetThreadContext | 실행 블록에 없음 |
Execute: SetThreadContext | 실행 블록에 없음 |
| 실행 함수 스푸핑 | module!function+0x## 구문이 지원되지 않음 |
post-ex 블록| 누락된 옵션 | 참고 |
|---|---|
set pipename | 사후 실행 작업을 위한 명명된 파이프 |
dns-beacon 블록| 누락된 옵션 | 참고 |
|---|---|
set ns_response | drop/idle/zero NS 처리. 설정하지 않으면 기본값은 drop. |
set dns_stager_prepend | 스테이징된 페이로드 앞에 데이터 추가 |
| 누락된 변환 | 참고 |
|---|---|
lznt1 | 압축 - 어떤 인코딩 체인에도 없음 |
rc4 "key" | 암호화 - 어떤 인코딩 체인에도 없음 |
xor "key" | XOR - 어떤 인코딩 체인에도 없음 |
uri-append | 종료 문 - 구현되지 않음 |
Raphael Mudge에게 malleable 프로필 기능 세트와 이를 학습할 수 있는 문서를 지속적으로 개선해 준 것에 대해 큰 감사를 전합니다. 또한, CS 팀 서버를 위한 LetsEncrypt 인증서 생성을 자동화하는 스크립트를 제공한 @killswitch-GUI에게도 큰 감사를 드립니다. 마지막으로, 작업을 훨씬 수월하게 해준 두 블로그 게시물: @bluescreenofjeff의 글(https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/)과 Joe Vest의 글(https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b)에 감사드립니다.
버전 1.0
버전 1.1