Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
external_c2_framework — Cobalt Strike의 External C2 사양과 함께 사용하기 위한 Python API | Kitploit
도구/GitHubGitHub/und3rf10w/external_c2_framework
Penetration Testing FrameworksExploit FrameworksPost-ExploitationCommand and ControlRed TeamingPayload Development
GitHubund3rf10w/external_c2_framework

external_c2_framework

Cobalt Strike의 External C2 사양과 함께 사용하기 위한 Python API

저장소 보기
239964년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

external_c2 프레임워크

프레임워크 간 데이터 전송을 위한 인터페이스를 구축하고 활용하는 Python 프레임워크로, 특히 Command and Control 프레임워크의 확장 기능을 제공하는 것을 목표로 합니다.

현재는 이 사양 문서에 설명된 Cobalt Strike의 External C2 사양 구현만을 대상으로 하지만, 프로젝트가 성숙해짐에 따라 변경될 수 있습니다.

크레딧

xychix님께 큰 감사를 드립니다. 이 프로젝트는 그분의 소중한 기여 없이는 불가능했을 것입니다. 기본적으로 이 프로젝트는 Outflank의 External C2 프로젝트를 재구축하고 확장한 것입니다.

아키텍처

이 프로젝트는 다음과 같은 주요 부분으로 구성됩니다:

  • Builder
  • Skeletons
  • Frameworks
  • Transports
  • Encoders
  • Manager (아직 구현되지 않음)

Builder

Builder는 설정 파일을 읽고, 설정된 옵션을 사용하여 skeletons 내의 markers를 대체함으로써 빌드를 생성합니다.

Builder는 build_files.py와 함께 사용할 수 있습니다. 샘플 빌더 구성은 sample_builder_config.config.sample로 제공됩니다.

Skeletons

skeletons은 builder가 동적으로 채워 완전히 사용 가능한 빌드를 생성하는 다양한 코드 "뼈대"입니다. skeletons에는 builder가 사용 가능한 값으로 대체할 markers가 포함되어 있습니다. 세 가지 유형의 스켈레톤이 있습니다:

Skeleton Markers

마커는 skeleton의 모든 파일 내에 배치될 수 있으며, 빌더 설정에 지정된 값으로 대체됩니다. 모범 사례에 따라 마커는 변수를 직접 작성하는 데 사용되어서는 안 되며, 값을 설정하는 데만 사용되어야 합니다. 마커의 값을 재사용해야 하는 경우, 동일한 마커를 재사용하는 대신 변수에 값을 저장하고 해당 변수를 참조하는 방식을 선택해야 합니다.

마커 형식은 다음과 같습니다: ```[var:::identifier_for_the_marker]```

문자열은 스켈레톤에 직접 작은따옴표로 감싸져 작성되며, 숫자는 그대로 작성됩니다.

설정 파일에서 문자열이 큰따옴표로 감싸져 있는 경우, 문자열은 큰따옴표로 감싸져 파일에 직접 작성되며, 작은따옴표는 제거됩니다.

이 관계는 다음과 같이 설명할 수 있습니다:

root@kitploit:~
#################
# Skeleton Code #
#################

# 스켈레톤에 다음 코드 줄이 포함되어 있습니다:
foo = ```[var:::bar]```

##############
# 최종 결과 #
##############

# 설정에 저장된 경우:
#   foo = bar
# 작성 결과:
foo = 'bar'

# 설정에 저장된 경우:
#   foo = "bar"
# 작성 결과:
foo = "bar"

# 설정에 저장된 경우:
#   foo = 2
# 작성 결과:
foo = 2

# 설정에 저장된 경우:
#  foo = "2"
# 작성 결과:
foo = "2"

Frameworks

Frameworks는 transport와 encoder가 사용하는 데이터와 해당 데이터의 사용 방식을 결정하는 기본 애플리케이션입니다. 특정 framework가 실제로 수행하는 작업은 중요하지 않으며, encoder와 transport를 가져와 사용하는 로직만 존재하면 됩니다. 프레임워크의 필수 부분(주로 client 로직)은 skeleton으로 저장되며, 서버 부분과 상호 작용하는 인터페이스는 기본 framework 객체로 저장됩니다.

일반적으로 프레임워크는 server와 client를 포함하며, 이들 간의 데이터를 중계하기 위해 encoders와 transports를 사용합니다.

framework를 구축할 때 고려해야 할 몇 가지 기본 사항은 다음과 같습니다:

  • framework는 encoder가 transport에서 사용될 수 있도록 하는 책임이 있습니다.
  • 프레임워크가 클라이언트-서버 관계를 사용하는 경우, 적절히 구성되어야 합니다.
  • 대부분의 경우 최종 사용자는 프레임워크의 client와 직접 상호 작용하지 않는다는 점을 이해해야 하므로, client에서 구성을 변경할 수 있도록 하려면 런타임 중 직접 상호 작용 없이 이를 수행할 수 있어야 합니다.
  • server skeleton을 만들 필요성은 거의 없습니다. 최종 사용자가 프레임워크의 server와 직접 상호 작용하기 때문입니다. 대신, 구성 파일에서 옵션을 읽고 최종 사용자가 블록 타이머나 상세도와 같은 옵션을 런타임 중에 수정할 수 있는 기능을 제공하는 것이 좋습니다.
  • framework 스켈레톤은 빌더에 의해 처리되며, 그 안의 모든 파일을 반복하므로, 특정 인수를 빌드 시 구성 가능하게 하려면 쉽게 할 수 있습니다.
  • framework server는 공통 framework_manager에 의해 인터페이스될 수 있어야 합니다.

Framework Server

서버는 client와 c2 server 간의 통신을 중개하는 애플리케이션입니다. 서버 로직은 기본적으로 정적입니다. 사양 내에서 third-party Client Controller라고 하는 cobalt_strike 프레임워크의 서버 로직은 다음과 같습니다:

  1. 구성을 파싱합니다.
  2. 지정된 인코딩 모듈을 가져옵니다.
  3. 지정된 전송 모듈을 가져옵니다.
  4. c2 서버에 연결을 설정합니다.
  5. c2 서버로부터 스테이저를 요청합니다.
  6. encoder 모듈로 스테이저를 인코딩합니다.
  7. transport 모듈로 스테이저를 전송합니다.
  8. transport를 통해 클라이언트로부터 메타데이터 응답을 기다립니다.
  9. encoder 모듈로 메타데이터를 디코딩합니다.
  10. 메타데이터를 c2 서버로 전달합니다.
  11. c2 서버로부터 새 작업을 수신합니다.
  12. 새 작업을 인코딩합니다.
  13. transport를 통해 새 작업을 클라이언트로 전달합니다.
  14. transport를 통해 클라이언트로부터 응답을 수신합니다.
  15. encoder 모듈을 통해 응답을 디코딩합니다.
  16. 응답을 c2 서버로 전달합니다.
  17. 11-16단계를 반복합니다.

server는 여러 클라이언트를 처리할 수 있어야 하며(아직 구현되지 않음), framework_manager에 의해 인터페이스되어야 합니다.

Framework Client

클라이언트는 기본적으로 엔드포인트에서 실행되는 페이로드입니다. cobalt_strike 프레임워크의 클라이언트 로직은 기본적으로 정적이며 다음과 같습니다:

  1. transport를 사용하는 데 필요한 준비를 실행합니다.
  2. 스테이저를 수신합니다.
  3. 스테이저를 주입하고 비콘에 대한 핸들을 엽니다.
  4. 비콘으로부터 메타데이터를 얻습니다.
  5. transport를 통해 비콘의 메타데이터를 C2 서버로 전달합니다.
  6. transport에서 새 작업을 모니터링합니다.
  7. 새 작업을 비콘으로 전달합니다.
  8. transport를 통해 비콘의 응답을 전달합니다.
  9. 6-8단계를 반복합니다.

클라이언트는 지정된 encoder와 transport를 사용하여 자신과 해당 server 간의 데이터를 중계합니다.

Encoders

인코더는 데이터를 수신한 후, 전송에 사용하기 위해 데이터를 수정하거나 전송을 통해 수신된 데이터를 원래 형태로 디코딩하여 해당 데이터를 사용하는 framework 구성 요소가 해석할 수 있도록 합니다.

인코더는 전송에 의해 직접 인터페이스될 것으로 예상되며, 프레임워크 및 구성 요소에 독립적인 방식으로 데이터를 처리해야 합니다.

Transports

트랜스포트는 통신 채널을 통해 데이터를 송수신하고, 인코더와 인터페이스하여 데이터를 필요한 형식으로 변환하는 역할을 합니다. 트랜스포트는 프레임워크 구성 요소 또는 통신 채널로부터 데이터를 수신하고, 통신 채널을 통해 데이터를 중계할 수 있어야 합니다. 트랜스포트는 필요에 따라 인코더를 호출하여 데이터를 인코딩하거나 디코딩할 책임이 있습니다.

트랜스포트는 framework 구성 요소에 의해 직접 인터페이스될 것으로 예상되며, 프레임워크 및 구성 요소에 독립적인 방식으로 데이터를 처리해야 합니다.

사용 방법

  1. 먼저, 사용할 전송 및 인코딩 모듈을 결정합니다. 다음 예제에서는 transport_imgur와 encoder_lsbjpg를 사용합니다.

  2. 그런 다음, 필요에 맞게 builder_config.config를 생성합니다. 제공된 샘플 구성 및 템플릿을 참조하여 방법을 확인하세요.

  3. build_files.py로 빌드를 생성합니다. 예를 들어, Cobalt Strike용으로 encoder_lsbjpg와 transport_imgur를 사용하여 빌드를 builds 디렉토리에 상세하게 생성하려면 다음 명령을 사용합니다:

root@kitploit:~
python build_files.py -b builds -f cobalt_strike -c sample_builder_config.config.sample -e encoder_lsbjpg -t transport_imgur -v
  1. 그런 다음, 빌드한 서버를 실행하고 클라이언트를 배포합니다.

Cobalt Strike

서버를 실행하는 머신에서 다음을 실행합니다:

python server.py

더 상세한 출력을 보려면 다음을 실행할 수 있습니다:

python server.py -v

더 상세한 출력과 디버깅에 유용한 추가 출력을 보려면 다음을 실행할 수 있습니다:

python server.py -d

그런 다음, 대상 엔드포인트에서 클라이언트를 실행합니다.

모든 것이 정상적으로 작동하면 Cobalt Strike 콘솔 내에 새로운 비콘이 등록되어 상호 작용할 수 있습니다.

FAQ

왜 이것을 작성했나요?: Cobalt Strike 사양의 구현이 많이 공개되지 않았고, 공개된 것들 중에는 제가 익숙한 언어로 작성된 것이 없거나 제가 원하는 모듈성과 추상화가 부족했기 때문입니다.

왜 Python 2인가요?: 제가 게을러서 새로운 전송 및 인코딩 채널을 구현하기 쉽기 때문입니다.

당신의 코드는 형편없어요: 그것은 질문이 아닙니다.

새로운 전송 및/또는 인코더 모듈을 제출할 수 있나요?: 네, 부탁드립니다! 풀 리퀘스트를 제출해 주시면 기꺼이 검토하겠습니다.

클라이언트를 배포 가능한 실행 파일로 컴파일하는 방법은?: Kali에서 성공적으로 테스트했습니다. 제 환경을 재현하려면 veil-evasion이 설치되어 있고 설정이 완료되었는지 확인하세요. 필요한 모든 의존성이 설치된 Python이 포함된 wine 환경이 설정되어 있어야 합니다. 또한 이 환경에 pefile 모듈을 설치해야 할 수도 있습니다.

그런 다음, 실행 파일을 생성하려는 클라이언트의 디렉토리로 이동하여 다음을 실행합니다:

root@kitploit:~
chmod +x compile_dll.sh
./compile_dll.sh
wine "C:\\Python27\\python.exe" /usr/share/veil/pyinstaller/pyinstaller.py -F -r c2file.dll -w --key "ayyyyyyylmao" client.py

key 값을 원하는 값으로 바꾸세요. dist/ 디렉토리에서 클라이언트 실행 파일을 확인할 수 있습니다. 디버깅에 사용할 수 있는 콘솔을 제공하는 실행 파일을 생성하려면 wine "C:\\Python27\\python.exe" /usr/share/veil/pyinstaller/pyinstaller.py -F -r c2file.dll -c client.py로 컴파일하세요.

도구 다운로드