풀 기반 C2 프레임워크로, 10개의 네이티브 전송, 동시 다중 프로필 핸들러, ECDSA 서명 태스킹, RBAC와 Qt/CLI 콘솔을 갖춘 다중 운영자 팀 서버를 제공합니다.
10개의 네이티브 전송, 동시 다중 프로필 핸들러, 그리고 정직한 위협 모델을 갖춘 풀 기반 C2입니다. 에이전트는 모든 행동 속성이 빌드 시점에 내장된 단일 Go 바이너리입니다 — 런타임 구성 파일도, 환경 변수도, 명령줄 인자도 없습니다. 작업과 결과는 종단 간 ECDSA로 서명됩니다. 전송 방식은 HTTPS, QUIC/HTTP/3, WebSocket, DNS TXT, DNS-over-HTTPS, ICMP, WireGuard, SMB-pivot, TCP-bind, TCP-reverse입니다.
이 소프트웨어는 본인이 소유한 시스템 또는 명시적인 서면 승인을 보유한 시스템에서만 사용하십시오. 관련 법률 및 조직 정책 준수에 대한 책임은 전적으로 사용자에게 있습니다. 저자와 기여자는 이 프로젝트의 사용으로 인해 발생하는 오용, 데이터 손실 또는 법적 결과에 대해 어떠한 책임도 지지 않습니다.
TornadoC2는 풀 기반 C2입니다. 에이전트는 라이브 소켓을 유지하지 않습니다. 자체 일정에 따라 깨어나 서버에 체크인하고, 대기 중인 작업을 가져와 실행한 뒤 다시 잠듭니다. 운영자가 명령을 큐에 넣으면, 비콘이 다음 체크인 시 해당 명령을 가져갑니다.
이 설계는 즉시성보다 복원력을 우선한다. 라이브 셸은 네트워크가 흔들리면 죽는다. 비컨은 다음 기상 시점에 재접속하고 이어서 작동한다. 라이브 셸은 네트워크상에 지속적인 흔적을 남긴다. 비컨의 트래픽 패턴은 수면 간격에 의해 제한된다. 이 프레임워크는 임플란트가 재부팅을 견디고, 실패 시 재시도하며, 예정된 시점에 스스로 파괴해야 하는 장기 작전을 위해 만들어졌다.
임플란트는 운영자 머신에서 크로스 컴파일된 단일 Go 바이너리다. 런타임 구성 파일도, 환경 변수도, 레지스트리 키도 없다. 콜백 URL, 수면 간격, 종료 날짜, C2 프로파일, 회피 세트는 모두 빌드 시점에 내장된다. 압수된 바이너리는 실행에 필요한 모든 것을 담고 있으며, 운영자가 넣지 않은 것은 아무것도 들어 있지 않다.
이 프레임워크는 현재 Linux와 Windows용으로, amd64와 arm64에서 컴파일된다. macOS 지원은 추가 네이티브 명령과 추가 회피 프리미티브와 함께 가까운 시일 내 목록에 올라 있다. 아래의 기능 요약은 현재 버전에서 사용 가능한 항목을 나열한다.
PySide6 운영자 콘솔. 상단에 비컨 테이블, 하단에 로그와
채팅, 둘 모두를 위한 하나의 명령 바. 터미널 REPL이
참조 구현이며, GUI는 동일한 Client 메서드 위의
프레젠테이션 계층이다.
나는 1년 동안 Sliver를 사용했다. 좋은 도구다. 무엇보다 먼저 말해야 한다. 이어지는 내용이 그것에 대한 비판이 아니기 때문이다. 문제는 에이전트의 형태를 바꿀 수 없다는 점이었다. Sliver 비컨은 Sliver 비컨처럼 보인다. 하나의 지문, 하나의 폴링 일정, 하나의 프로토콜 계열, 디스크에 놓인 하나의 런타임 구성. 다른 URL을 가리키게 할 수는 있었다. 다른 무엇으로 만들 수는 없었다. 범용적인 형태로 충분한 작전에서는 올바른 트레이드오프다. 내가 작업하던 네트워크에서는 잘못된 트레이드오프였다.
Mythic을 시도했다. 모듈성은 진짜이고 그 뒤의 커뮤니티 작업은 인상적이다. 나는 그 안에서 작업할 수 없었다. 모든 상호작용이 브라우저 탭을 거쳤다. 나는 하루 여덟 시간을 콘솔에서 보내는데, 그 도구는 콘솔에 없었다. 일주일 만에 그만두었다.
Cobalt Strike와 Brute Ratel을 살펴보았다. 둘 다 훌륭하고 둘 다 팀과 기관을 위한 가격이다. 나는 한 사람이다. 팀 예산이 없다.
존재하던 도구들은 내가 필요로 하지 않는 것들에 능했다. 그들이 가진 기능은 내가 찾던 기능이 아니었고, 내가 찾던 기능은 그들 중 어디에도 없었다. 나에게 필요했던 것은 특정 표적을 위한 특정 형태가 될 수 있는 에이전트, 내 손 가까이에 머무는 콘솔, 그리고 작전 도중 프로파일을 교체해도 모든 라이브 세션이 죽지 않는 핸들러였다. 또한 운영자 측이 프레임워크의 진짜 일부로 취급되기를 원했다. 나중에 조정 계층을 덧붙인 에이전트 우선 도구가 아니라, 여러 운영자가 실제로 작전을 수행할 수 있는 팀 서버, 즉 전문적인 작업이 요구하는 역할, 감사 추적, 공유 상태를 갖춘 팀 서버 말이다.
합리적인 대응은 직접 만드는 것이었다.
이 프레임워크의 설계 선택들은 그 결정의 결과이지, 독립적인 선호가 아니다.
컴파일 시점 구성. 모든 속성은 빌드 시점에 바이너리에 내장된다. 구성 파일도, 환경 변수도, 명령줄 인자도 없다. 에이전트를 압수한 방어자가 구성을 읽고 콜백을 싱크홀로 바꿀 수 없다. 바이너리를 놓친 운영자가 구성을 어긋나게 할 수 없다. 새 표적을 위한 새 에이전트는 한 작전만을 위한 산출물이며 다른 어떤 것도 아니다.
시작 시점 핸들러 구성. 프로파일은 핸들러 시작 시 한 번 읽히고 다시는 읽히지 않는다. 핫 리로드도, 런타임 디스패치 상태도, "프로파일 다시 로드" 명령도 없다. 핸들러는 운영자가 선택한 프로파일 세트를 실행 기간 내내 실행한다.
10개의 전송 수단. 송신 경로가 항상 HTTPS인 것은 아니기 때문이다. HTTP/3는 허용하지만 TCP/443을 차단하는 네트워크, 또는 ICMP만 허용하고 그 외에는 아무것도 허용하지 않는 네트워크는 실제로 존재하는 네트워크이며, 범용 도구로는 대응하도록 구성할 수 없는 네트워크다. 10은 내가 여러 시점에서 실제로 필요로 했던 전송 수단의 수다.
동시 다중 프로필 지원. 팀 서버를 작전 중에 재시작하면 모든 활성 세션이 종료된다. 서버를 두 개 운영하면 운영 표면이 두 배가 되고 팀이 혼란스러워진다. 이 프레임워크는 운영자가 기존 에이전트는 예전 프로필로 계속 실행하면서 새 에이전트는 다른 프로필로 구축하기를 원한다고 가정하며, 그 워크플로를 예외가 아닌 기본값으로 만들기 위해 설계되었다.
자체 암호학적 신원을 가진 피어 투 피어 피벗 모델. 부모에서 자식으로의 홉은 태스킹과 결과를 전달한다. 그 홉이 침해되면 작전이 침해된 것이다. 투명 릴레이는 양 끝단 사이에서 발신자를 인증하지 않고 바이트를 전달한다. 그것은 결코 용납될 수 없었고, 피벗 모델이 그 대안이다.
팀을 핵심으로 삼는 팀 서버. 운영자 측은 조정 서버이지, 팀 기능을 덧붙인 단일 사용자 콘솔이 아니다. admin과 구별되는 guardian 역할을 가진 RBAC, 왜냐하면 작전을 종료하는 것은 작전을 수행하는 것과 다른 책임이기 때문이다. 모든 응답에 변경별 상관관계를 부여하는 해시 체인 감사 로그, 왜냐하면 팀이 작전 중에 한 일은 작전이 끝난 후에도 중요하기 때문이다. 검증이 팀 서버가 아니라 비컨에서 실행되는 공유 자격 증명 보관소, 왜냐하면 잘못된 네트워크에서의 바인드 시도는 조용히 실패하거나 작전이 접근 권한을 부여받지 않은 시스템에 대해 성공하기 때문이다. 한 운영자가 다른 운영자의 대기 중인 작업을 조용히 제거할 수 없도록 하는 소유자 제한 작업 취소. 다른 사람이 같은 비컨에 접속했을 때 운영자가 알 수 있도록 하는 세션 뷰어. 작전 전체 및 비컨별 노트, 콘텐츠 주소 지정 방식의 전리품 저장소, 파일 공유와 포렌식 보존 기능을 갖춘 채팅, 웹훅 알림, 그리고 guardian만 무장할 수 있는 데드맨 스위치. 이 중 어느 것도 에이전트를 건드리지 않는다. 이 모두는 운영자가 팀의 일원으로 일하고 있다고 가정하며, 심지어 그렇지 않을 때조차도 그렇다.
두 개의 프런트엔드, 웹 UI 없음. 참조 구현으로서의 터미널 REPL, 그리고 동일한 클라이언트 위의 프레젠테이션 계층으로서의 Qt GUI. 브라우저 탭이 아니다. 두 번째 프로토콜이 아니다. 플러그인 프레임워크가 아니다. 콘솔은 운영자의 손 가까이에 머문다.
정직한 README. 모든 전송 수단 섹션은 그 전송 수단이 무엇을 방어하고 무엇을 방어하지 않는지 명시하는 위협 모델로 끝난다. 구현되지 않은 모든 기능은 그렇게 명시된다. 한계에 관한 섹션들은 얼버무리는 것이 아니다. 그것들은 방어자가 무엇을 찾는지, 그리고 이 프레임워크가 그것에 대해 무엇을 하지 않는지에 대한 기록이다.
이것은 더 나은 Sliver가 아니다. Sliver는 훌륭하며, 그것을 만든 팀과 경쟁할 의향은 없다. 이것은 더 가벼운 Mythic이 아니다. Mythic의 모듈성은 연구 환경에 대한 올바른 답이다. 이것은 더 저렴한 Cobalt Strike가 아니다. Cobalt Strike는 10년에 걸쳐 그 위치를 얻었다.
이것은 내가 도구를 찾기 시작했을 때 존재하기를 바랐던 도구다. 그것은 내가 수행하는 작전의 특정한 형태에 맞는다. 당신의 작전이 같은 형태라면, 그것은 당신에게도 같은 방식으로 맞을 것이다. 그렇지 않다면, 대안 중 하나가 당신에게 더 잘 맞을 것이며, 그것이 올바른 결과다. 이 프레임워크는 그것이 무엇을 위한 것인지에 대해 정직하다.
이 문서의 나머지 부분은 그것이 어떻게 작동하는지 설명한다. 이 섹션은 그것이 왜 존재하는지 설명한다. 둘 다 사실이며, 어느 것도 다른 것 없이는 의미가 없다.
macOS 지원. 현재 크로스 컴파일된다; 플랫폼별 네이티브 동사와 슬립 마스크 구현이 남아 있다.
더 많은 네이티브 명령. 실행과 운영 측면의 깊이. 현재 세트와 같은 원칙: 인프로세스, 표준 라이브러리, 자식 프로세스 없음.