
Cobalt Strike를 위한 은밀한 C2 전송 수단으로서의 OneDrive
OneDrive를 전송 계층으로 사용하는 Cobalt Strike 사용자 정의 C2 채널입니다.

Files.ReadWrite.All 애플리케이션 권한이 있는 앱 등록.Azure Portal에서 App registrations로 이동하여 새 앱을 만듭니다:
개요 페이지에서 tenant ID와 client ID를 기록해 둡니다.
API permissions에서:
Files.ReadWrite.All 순서로 추가합니다.Certificates & secrets에서 새 암호를 만들고 값을 복사합니다.
사용자의 OneDrive에 받은 편지함용과 보낼 편지함용 폴더 두 개를 만듭니다 (예: c2inbox와 c2outbox).
Graph Explorer를 열고 해당 사용자로 로그인한 후 다음을 실행합니다:
GET https://graph.microsoft.com/v1.0/me/drive/root/children
각 폴더의 id와 JSON 응답의 임의 항목에서 driveId를 가져옵니다.
cp server/config.json.example server/config.json
server/config.json을 채웁니다:
그런 다음 클라이언트를 빌드합니다:
make
릴레이를 시작합니다 (터미널 연결이 끊겨도 유지되도록 screen이나 tmux를 사용하세요):
python3 server/relay.py --config server/config.json --ts-addr <teamserver-ip> --ts-port <udc2-port>
Cobalt Strike에서 같은 포트에 UDC2 리스너를 만들고 client/bof.o를 로드합니다.
릴레이는 재시작 사이에 상태를 추적하기 위해 설정 옆에 몇 개의 파일을 만듭니다:
config.json.state.json) - 처리된 받은 편지함 파일, 대기 중인 업로드, 비콘 세션 정보를 추적합니다. --state로 사용자 지정 경로를 설정할 수 있습니다.config.json.state.json.spool/) - 아직 OneDrive에 업로드되지 않은 응답 데이터를 보관합니다. 업로드 도중 릴레이가 충돌하면 스풀이 데이터를 보존하여 다음 시작 시 재시도할 수 있습니다.config.json.state.json.lock) - 두 릴레이 인스턴스가 같은 상태에 대해 실행되는 것을 방지합니다. Another relay holds the lock이 표시되고 다른 릴레이가 실행 중이 아니라면, 잠금은 충돌로 인한 오래된 것입니다.릴레이의 로컬 상태가 손상되었거나 오래된 잠금이 시작을 막고 있다면, --clean을 사용하여 상태 파일과 스풀 디렉터리를 지우고 릴레이가 새로 시작하도록 합니다:
python3 server/relay.py --config server/config.json --clean
잠금 파일은 유지됩니다. 다른 인스턴스가 실행 중일 때는 릴레이가 정리하지 않습니다. 다음 정상 시작 시 다시 초기화하고 30분보다 오래된 받은 편지함 파일은 건너뜁니다.
상태 파일과 스풀 디렉터리를 직접 삭제하여 수동으로 초기화할 수도 있습니다. 잠금 파일이 오래된 경우(실행 중인 릴레이 없음) 그것도 삭제하세요.

| Field | Value |
|---|
tenant_id | Microsoft Entra ID 테넌트 ID |
client_id | 애플리케이션 클라이언트 ID |
client_secret | 클라이언트 암호 값 |
drive_id | OneDrive 드라이브 ID |
inbox_folder_id | 받은 편지함 폴더 ID |
outbox_folder_id | 보낼 편지함 폴더 ID |
| Flag | Description |
|---|
--config | config.json 경로 (필수) |
--ts-addr | Teamserver IP |
--ts-port | UDC2 리스너 포트 |
--poll | 폴링 간격(초) (기본값 2.0) |
--state | 상태 파일 경로 (기본값: <config>.state.json) |
--debug | 디버그 로깅 활성화 |
--clean | 상태 파일과 스풀 디렉터리를 삭제한 후 종료 |