
Cobalt Strike의 External C2 사양 사용을 위한 Python API
Cobalt Strike의 External C2 사양(사양 참조)과 함께 사용하기 위한 Python 프레임워크입니다.
주요 설계 목표는 Cobalt Strike용 C2 채널을 쉽게 구현할 수 있을 만큼 충분한 추상화를 제공하는, 외부 C2 사양의 매우 모듈식 구현체를 만드는 것입니다. 이상적으로, 사용자는 새 채널을 구현하기 위해 transport 모듈, encoder 모듈을 만들고 구성 파일을 채우기만 하면 됩니다.
실행하기 전에 몇 가지 구성 변경을 수행해야 합니다. 다음을 수행해야 합니다:
builds/client/dbox/dbox_client.py에서 token을 2단계에서 생성된 토큰으로 변경합니다.builds/server/utils/transports/transport_dbox.py에서 3단계와 동일하게 변경합니다.cd builds/client/dbox && ./compile_dll.shstart_externalc2.cna 스크립트를 로드합니다.cd builds/server/ && ./dbox_server.py로 서버를 실행합니다.비디오 데모 링크: https://www.youtube.com/watch?v=nTRHSh_uCcA
이 프로젝트는 세 가지 주요 부분으로 구성됩니다:
빌더는 지정된 구성에 따라 클라이언트 및 서버 배포판을 동적으로 빌드합니다. 이상적으로, 클라이언트는 dll이나 exe와 같은 단일 컴파일 파일로 배포될 수 있어야 합니다.
클라이언트는 본질적으로 엔드포인트에서 실행되는 페이로드로, 사양 내에서 third-party client라고 합니다. 클라이언트의 로직은 주로 정적입니다:
transport를 활용하기 위해 필요한 준비 작업을 실행합니다.transport를 통해 비콘의 메타데이터를 C2 서버로 전달합니다.transport에서 새 작업을 확인합니다.transport를 통해 비콘의 응답을 전달합니다.전송 및 인코딩 메커니즘에 필요한 구성은 클라이언트에 정적으로 복사됩니다. 전송 및 인코딩 메커니즘의 함수 로직도 각각의 모듈에서 정적으로 복사됩니다.
프로세스 인젝션 로직은 빌더에 의해 결정됩니다.
서버는 client와 c2 server 간의 통신을 중개하는 애플리케이션으로, 사양 내에서 third-party Client Controller라고 합니다. 서버 로직은 주로 정적이지만, 개발을 돕기 위해 상세 및 디버그 출력을 지원합니다:
encoder 모듈로 스테이저를 인코딩합니다.transport 모듈로 스테이저를 전송합니다.transport를 통해 수신된 클라이언트의 메타데이터 응답을 기다립니다.encoder 모듈로 메타데이터를 디코딩합니다.transport를 통해 새 작업을 클라이언트에 전달합니다.transport를 통해 수신된 클라이언트의 응답을 기다립니다.encoder 모듈로 응답을 디코딩합니다.서버가 가져올 encoder 및 transport 모듈의 결정은 config.py에 저장된 값에서 결정됩니다.
사용되지 않는 transport 또는 encoder 모듈은 가져오지 않습니다.
다음 표는 encoding 및 transport 모듈과 클라이언트 간의 공유 함수를 설명합니다. 공유 함수는 본질적으로 완전히 동일한 코드입니다.
매우 중요한 참고 사항: 클라이언트의 sendData 및 recvData 함수로 전송되는 데이터는 원시 데이터(raw data) 여야 하며, transport 모듈의 sendData 및 retrieveData 함수로 전송되는 데이터는 필요에 따라 이미 인코딩 또는 디코딩된 상태여야 합니다.
| Transport 함수 | Client 함수 | 설명 |
|---|---|---|
| prepTransport | prepTransport | 전송 메커니즘을 활용하는 데 필요한 사전 구성을 수행합니다. |
| Encoder 함수 | Client 함수 | 설명 |
|---|---|---|
| encode | encode | 전송을 준비하기 위해 원시 데이터에 적용되는 수정 사항을 정의합니다. |
| decode | decode | 전송에서 수신된 원시 데이터에 적용되어 목적지로 전달되는 수정 사항을 정의합니다. |
먼저 사용할 transport 및 encoding 모듈을 결정합니다. 다음 예제에서는 transport_gmail과 encoder_b64url을 사용하겠습니다.
그런 다음 필요에 맞게 server/config.py를 수정하고, ENCODER_MODULE 및 TRANSPORT_MODULE이 올바르게 구성되어 원하는 모듈을 가리키도록 합니다:
EXTERNAL_C2_ADDR = "127.0.0.1"
EXTERNAL_C2_PORT = "2222"
C2_PIPE_NAME = "foobar"
C2_BLOCK_TIME = 100
C2_ARCH = "x86"
IDLE_TIME = 5
ENCODER_MODULE = "encoder_b64url"
TRANSPORT_MODULE = "transport_gmail"
verbose = False
debug = False
다음으로, 선택한 transport 및 encoder 모듈의 구성 섹션을 수정합니다.
client/mechanism/$mechanism_client.py의 구성 섹션이 지금까지 정의한 구성과 일치하는지 확인합니다.
서버를 실행하는 머신에서 다음을 실행합니다:
python server.py
더 자세한 출력이 필요하면 다음을 실행할 수 있습니다:
python server.py -v
디버깅에 유용한 추가 출력과 더 자세한 출력이 필요하면 다음을 실행할 수 있습니다:
python server.py -d
다음으로, 대상 엔드포인트에서 클라이언트를 실행합니다.
모든 것이 정상적으로 작동했다면, Cobalt Strike 콘솔에 새 비콘이 등록되어 상호 작용할 수 있습니다.
왜 이것을 작성했나요?: 이 사양의 구현체가 많이 공개되지 않았고, 공개된 것들 중에서도 제가 익숙한 언어로 작성되지 않았거나 제가 찾던 모듈성과 추상화를 갖추지 못한 경우가 많았습니다.
왜 Python 2인가요?: 게으르고 새 transport 및 encoding 채널을 구현하기 쉽기 때문입니다.
코드가 형편없습니다: 그건 질문이 아니네요.
새 transport 및/또는 encoder 모듈을 제출할 수 있나요?: 네, 부탁드립니다! 풀 리퀘스트를 제출해 주시면 기꺼이 검토하겠습니다.
클라이언트 구성 요소에도 유사한 추상화와 모듈성을 구현하여 비콘 페이로드에 대한 다양한 프로세스 인젝션 방법과 로드맵의 다른 기능을 지원할 예정입니다.
현재 빌더 기능이 빠져 있으며, 이는 클라이언트 및 서버 배포판을 동적으로 빌드하도록 계획되어 있지만 로드맵에 있습니다.
| sendData | sendData | 전송 메커니즘을 통해 데이터가 전송되는 방식을 정의합니다. |
| retrieveData | recvData | 전송 메커니즘을 통해 데이터가 수신되는 방식을 정의합니다. |