
암호화된 명령 및 제어(C2) 연구 프레임워크: 사이버 보안 교육, 레드 팀 실습, 그리고 보안 클라이언트-서버 통신 실험을 위한.
BlackBerryC2는 교육용, 보안 연구 및 통제된 실험실 환경 전용으로 설계된 암호화된 원격 관리 및 C2 프레임워크입니다.

이 프로젝트는 외부 TLS 스택에 의존하지 않고 애플리케이션 계층 암호화, 세션 관리 및 안전한 클라이언트 통신을 갖춘 맞춤형 명령 및 제어 서버를 구축하는 방법을 보여줍니다.
이 프로젝트는 악성코드가 아니며 무단 접근을 위한 것이 아닙니다.
BlackBerryC2:
소유하거나 명시적 테스트 권한이 있는 시스템 및 네트워크에서만 사용하세요.
Python 의존성:
pip install cryptography prompt_toolkit zstandard
zstandard는 선택 사항이지만 1GB 이상 전송 시 권장됩니다.
get -r, put -r)-b 플래그) — 비차단, 취소 가능.partial + .resume 파일)generate-payload)BlackBerryHTTPs_TLSProxyGUI)log 명령)logs/last_start.json에 저장됨BlackBerryC2 v2.0은 다음과 같이 안전한 통신을 설정합니다:
REQUEST_PUBKEY 전송.secp256r1) 전송.HMAC_PRE_SHARED_SECRET)에 대해 HMAC을 확인.각 세션은 다음을 유지:
모든 암호화 키는 런타임에 생성되며 재시작 시 재사용되지 않습니다 (--persistente 설정 시 제외).
python3 BlackBerryC2_server.py
기본 구성:
0.0.0.09949예시:
# 기본 시작 (로그 암호문 입력)
python3 BlackBerryC2_server.py
# 영구 ECDHE 키 + 상세
python3 BlackBerryC2_server.py -p -vv
# 사용자 정의 포트, HMAC 확인 없음
python3 BlackBerryC2_server.py -P 8080 --no-secure
# 사용자 정의 포트로 포트 노킹
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# BerryTransfer 모드 + 자동 승인
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# 서버 시작 없이 로그 보기/복호화
python3 BlackBerryC2_server.py --logs
select <ID> 내부)BerryTransfer는 scp에서 영감을 받은 전용 파일 전송 전용 서버 모드입니다. 활성화되면 서버는 모든 셸 액세스를 거부하고 BT:* 프로토콜 명령만 허용합니다.
시작:
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # GET에 대한 운영자 프롬프트 없음
BerryTransfer 셸 명령:
전송 로그는 logs/bt_transfer.jsonl에 기록됩니다 (선택적으로 AES-256-GCM 암호화).
--spa가 활성화되면 클라이언트는 TCP 연결이 수락되기 전에 UDP를 통해 인증해야 합니다.
SPA 모드 (기본값): 클라이언트가 SPA_UDP_PORT에 32바이트 HMAC-SHA256 토큰을 전송합니다.
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
노크 모드: 클라이언트가 제한 시간 내에 순서대로 UDP 포트 시퀀스를 노크합니다.
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
인증된 IP는 --spa-ttl초 동안 유효합니다 (기본값 60).
내장 뷰어로 로그 보기:
BlackBerry> log
또는 독립 실행 (서버 없음):
python3 BlackBerryC2_server.py --logs
이 프로젝트는 오직 다음 용도로만 사용됩니다:
허가 없이 시스템에 대한 무단 사용은 엄격히 금지됩니다.
전체 라이선스 세부 사항은 LICENSE 파일을 참조하십시오.
이 소프트웨어는 "있는 그대로" 제공되며, 어떠한 종류의 보증도 없습니다. 저자는 이 소프트웨어의 오용 또는 이로 인한 손해에 대해 책임을 지지 않습니다.
| 플래그 | 설명 |
|---|
-p / --persistente | ecdhe-cert/의 영구 ECDHE 키 사용 (암호문 입력) |
-v | 디버그 로깅 |
-vv | 상세 (완화된) 로깅 |
-H <호스트> | 수신 호스트 (기본값: 0.0.0.0) |
-P <포트> | 수신 포트 (기본값: 9949) |
--no-secure | HMAC 확인 없이 모든 ECDHE 클라이언트 허용 |
--hmac <비밀> | 사용자 정의 HMAC 사전 공유 비밀 (16진수 또는 문자열) |
--log-passphrase <암호> | 서버 로그를 AES-256-GCM으로 암호화 (PBKDF2 600k iter) |
--logs | 대화형 로그 뷰어 — 서버 시작 안 함 |
--spa | SPA/포트 노킹 사전 인증 활성화 |
--spa-mode <spa|knock> | spa = 단일 UDP 토큰, knock = 포트 시퀀스 |
--spa-port <포트> | SPA 수신기용 UDP 포트 (기본값: 7331) |
--knock-seq <포트들> | 노크 모드용 포트 시퀀스 (기본값: 7001,7002,7003) |
--knock-timeout <초> | 노크 시퀀스 완료 시간 제한 (기본값: 10) |
--spa-ttl <초> | 인증된 IP가 유효한 시간 (기본값: 60) |
--berrytransfer | BerryTransfer 모드: 파일 전송 전용, 셸 없음 |
--transfer-root <디렉토리> | BerryTransfer 루트 디렉토리 (기본값: ./berry_transfers) |
--auto-confirm | BerryTransfer에서 모든 GET 요청 자동 승인 (연산자 프롬프트 없음) |
| 명령 | 설명 |
|---|
list | 활성 세션 목록 (통계 및 호스트명 포함) |
select <ID> | 클라이언트 세션과 상호 작용 |
all <cmd> | 연결된 모든 클라이언트에 명령 전송 |
report | 전체 서버 상태 보고서 (가동 시간, 세션, 전송) |
set host <HOST> | 수신 호스트 변경 (서버 재바인드) |
set port <PORT> | 수신 포트 변경 (서버 재바인드) |
sVbanner "<텍스트>" | 서비스 배너 변경 |
generate-payload | 클라이언트 페이로드 생성 |
fingerprint | ECDHE 서버 키 지문 표시 (SHA-256) |
ecdhe-keys | 현재 ECDHE 키 쌍 출력 (PEM) |
kill <id|ip> | 세션을 ID 또는 IP로 종료 |
block <IP> | IP를 영구 차단 |
unblock <IP> | IP 차단 해제 (영구 + 임시) |
blocklist | 차단된 IP 표시 (영구 및 임시) |
log | 대화형 로그 뷰어 (암호화된 로그 지원) |
report | 상태 요약: 가동 시간, 세션, 전송 |
banner | 시작 배너 다시 표시 |
clean | 서버 로그 파일 삭제 |
v | DEBUG 로깅 전환 |
vv | VERBOSE 로깅 전환 |
cd <디렉토리> | 서버 로컬 작업 디렉토리 변경 |
E <명령> | os.system을 통해 로컬에서 명령 실행 |
<모든 명령> | 서버에서 로컬로 실행 |
exit | 서버 중지 및 종료 |
| 명령 | 설명 |
|---|
proxy | TLS/HTTP 프록시 데몬 시작 (자동 모드) |
proxy --mode <모드> | 모드: auto, tls, http, https, both, all |
proxy --stats | 프록시 통계 표시 |
proxy gui | 프록시 GUI 실행 (별도 프로세스) |
stop-proxy | 프록시 데몬 중지 |
stop-proxy-gui | 프록시 GUI 중지 |
proxy-help | 전체 프록시 도움말 |
| 명령 | 설명 |
|---|
help | 세션 도움말 표시 |
exit | 메인 셸로 돌아가기 |
!<명령> | 서버에서 로컬로 명령 실행 |
<명령> | 원격 클라이언트에서 명령 실행 |
cmd1 && cmd2 | 체인: cmd1 성공 시에만 cmd2 실행 |
cmd1 || cmd2 | 체인: cmd1 실패 시에만 cmd2 실행 |
cmd1 ; cmd2 | 체인: 항상 cmd2 실행 |
| 명령 | 설명 |
|---|
get <파일> | 클라이언트에서 파일 다운로드 |
get <디렉토리> -r | 재귀적 디렉토리 다운로드 |
get <파일> -b | 백그라운드 다운로드 (비차단) |
get <디렉토리> -r -b | 재귀적 백그라운드 다운로드 |
put <파일> | 클라이언트에 파일 업로드 |
put <파일> -exc | 업로드 후 메모리에서 실행 (스크립트) |
put <디렉토리> -r | 재귀적 디렉토리 업로드 |
put <파일> -b | 백그라운드 업로드 |
transfers | 모든 활성 및 완료된 전송 목록 |
stop <ID> | 백그라운드 전송 취소 (예: stop T1) |
resume <로컬_파일> | 중단된 다운로드 재개 |
screenshot | 클라이언트 화면 캡처 |
| 명령 | 설명 |
|---|
confirm <ID> | 보류 중인 GET 요청 승인 |
deny <ID> | 보류 중인 GET 요청 거부 |
pending | 승인 대기 중인 GET 요청 목록 |
auto [on|off] | 자동 승인 전환/설정 |
clients | 활성 BerryTransfer 세션 표시 |
ls [디렉토리] | 전송 루트의 파일 목록 |
tree [디렉토리] | 전송 루트의 파일 트리 |
find <이름> | 전송 루트에서 파일 검색 |
rm <파일> | 전송 루트에서 파일 삭제 (확인 포함) |
log [N] | 마지막 N개 전송 로그 항목 표시 (기본값 30) |
cd <디렉토리> | 로컬 작업 디렉토리 변경 |
pwd | 현재 로컬 디렉토리 표시 |
!<명령> | 로컬 시스템 명령 실행 |
exit | BerryTransfer 서버 중지 |
| 기능 | 세부 사항 |
|---|
| 키 교환 | ECDHE secp256r1 일시적 또는 영구적 |
| 세션 암호화 | AES-256-GCM, 메시지당 12바이트 랜덤 논스 |
| 클라이언트 인증 | 핸드셰이크 중 공유 비밀에 대한 HMAC-SHA256 |
| 메시지 무결성 | 패킷당 HMAC-SHA256 (seq + 논스 + 암호문 포함) |
| 재전송 방지 | 세션당 시퀀스 번호 윈도우 추적기 |
| 다운그레이드 방지 | 최소 AES 키 크기 적용 (256비트) |
| 하트비트 속도 제한 | 최소 3초 간격; 위반 추적 |
| 명령 플러드 방지 | 속도 제한기; 임계값 초과 시 자동 연결 해제 |
| 스캔 탐지 | 연결 스캔, 배너 그래브, 핸드셰이크 실패 카운터 |
| IP 관리 | 영구 블록리스트 + 임시 차단 (자동 + 수동) |
| 로그 암호화 | AES-256-GCM + PBKDF2-HMAC-SHA256 (600k 반복) |
| 응답 지터 | 타이밍 공격에 저항하기 위한 10–50ms 랜덤 지터 |
| 사전 인증 | TCP 수락 전 SPA 토큰 또는 포트 노킹 |
| 로그 파일 | 내용 |
|---|
logs/BlackBerryC2_Server.log | 평문 순환 서버 로그 (INFO+) |
logs/BlackBerryC2_enc.log | 암호화된 서버 로그 (--log-passphrase 설정 시) |
logs/sessions.jsonl | 세션 이벤트: 연결, 연결 해제, 바이트 |
logs/bt_transfer.jsonl | BerryTransfer 파일 전송 로그 |
logs/last_start.json | 시작 구성 스냅샷 (호스트, 포트, 토큰, pid) |