SOC Prime Bias: Medium

14 4월 2026 18:48

공격의 중심에 있는 난독화된 자바스크립트

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
공격의 중심에 있는 난독화된 자바스크립트
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

피싱 이메일은 악성 JavaScript 파일이 포함된 RAR 아카이브를 전달하여 Formbook 멀웨어 실행으로 끝나는 감염 체인을 시작합니다. 스크립트가 실행되면 여러 파일을 공용 폴더에 기록하고 예약된 작업을 통해 지속성을 설정하며, AES로 암호화된 콘텐츠를 해독하여 악성 .NET DLL을 로드하는 PowerShell 페이로드를 시작합니다. 그 DLL은 이후 MSBuild.exe 프로세스에 주입되어 실행을 계속하고 최종 멀웨어 단계를 배포합니다. 캠페인은 또한 탐지를 줄이기 위해 ETW 및 AMSI 패치를 포함한 여러 방어 회피 방법을 통합합니다.

조사

분석 중에 연구자들은 JavaScript 드로퍼 cbmjlzan.JS와 15분마다 스크립트를 복사하여 실행하도록 설정된 예약 작업을 발견했습니다. 그들은 또한 이미지 파일 내부에 숨겨진 base64로 인코딩된 데이터를 해독하는 PowerShell 명령을 추적했습니다. 해독된 콘텐츠는 MSBuild.exe 에 주입되어 Formbook을 전달하는 데 사용된 .NET DLL로 밝혀졌습니다. 파일 경로, 작업 이름, 암호화 재료를 포함한 추가 지표들이 더 깊은 조사와 탐지 개발을 지원하기 위해 추출되었습니다.

완화

조직은 사용자 접근 가능한 디렉토리에서 실행되는 신뢰할 수 없는 JavaScript 파일과 PowerShell 스크립트의 실행을 차단해야 하며, 비정상적이거나 난해한 이름으로 생성된 예약 작업을 면밀히 모니터링해야 합니다. 악성 코드 체인 남용을 방지하기 위해 MSBuild.exe 에 실행 제어를 적용해야 합니다. 보안 도구는 또한 DLL 주입 동작, ETW 및 AMSI 변조, 그리고 알려진 Formbook 관련 서명을 탐지해야 합니다. 사용자 인식 교육은 피싱 첨부 파일로 인한 위험을 줄이기 위해 여전히 중요합니다.

대응

식별된 JavaScript 파일이나 관련된 예약 작업이 나타날 때 알림을 생성하고, 영향을 받은 엔드포인트를 격리하며, 분석을 위해 휘발성 증거를 수집해야 합니다. 악성 파일은 제거되고, 예약 작업은 삭제되며, 주입된 DLL이 완전히 조사되어 전체 실행 흐름을 이해해야 합니다. 손상된 시스템 구성 요소는 무결성을 보장하기 위해 재구축하거나 복원해야 합니다. 관련된 IOC는 유사한 활동을 탐지할 수 있도록 넓은 보안 커뮤니티와 공유해야 합니다.

graph TB %% Class definitions classDef action fill:#ffcccc classDef tool fill:#99ccff classDef process fill:#ffff99 classDef file fill:#ccffcc classDef malware fill:#ffcc99 %% Nodes email_phishing[“<b>액션</b> – <b>T1566.001 피싱 첨부파일</b><br/>악성 RAR 첨부파일이 이메일로 전달됨”] class email_phishing action tool_wsh[“<b>도구</b> – <b>이름</b>: Windows Script Host (JavaScript)<br/><b>기술</b>: T1559.001 Component Object Model”] class tool_wsh tool action_copy[“<b>액션</b> – <b>T1559.001 Component Object Model</b><br/>스크립트를 C:\\Users\\Public\\Libraries로 복사”] class action_copy action action_sched[“<b>액션</b> – <b>T1053 예약 작업</b><br/>지속성을 위해 예약 작업 생성”] class action_sched action tool_ps[“<b>도구</b> – <b>이름</b>: PowerShell<br/><b>기술</b>: T1059.001 명령 인터프리터”] class tool_ps tool action_decode[“<b>액션</b> – <b>T1027.004 실행 후 컴파일</b> & <b>T1140 디코딩/복호화</b><br/>Base64 디코딩 및 AES 복호화”] class action_decode action action_patch[“<b>액션</b> – <b>T1027.005 지표 제거</b><br/>ETW 및 AMSI 패치 적용”] class action_patch action file_dll[“<b>파일</b> – <b>이름</b>: Orio.png (.NET DLL 암호화 포함)<br/><b>기술</b>: 숨겨진 페이로드”] class file_dll file process_msbuild[“<b>프로세스</b> – <b>이름</b>: msbuild.exe<br/><b>기술</b>: T1127.001 개발 도구 프록시 실행”] class process_msbuild process action_inject[“<b>액션</b> – <b>T1055.001 프로세스 인젝션</b><br/>msbuild.exe에 DLL 주입”] class action_inject action malware_formbook[“<b>멀웨어</b> – <b>이름</b>: Formbook<br/><b>출처</b>: Brio.png 내장 페이로드”] class malware_formbook malware %% Edges / Flow email_phishing –>|delivers| tool_wsh tool_wsh –>|uses COM to| action_copy action_copy –>|leads to| action_sched tool_wsh –>|launches| tool_ps tool_ps –>|executes| action_decode tool_ps –>|applies| action_patch action_decode –>|produces| file_dll action_patch –>|prepares environment for| file_dll file_dll –>|loaded by| process_msbuild process_msbuild –>|receives| action_inject action_inject –>|extracts final payload from| malware_formbook

공격 흐름

시뮬레이션 실행

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

이유: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적의 기술(TTP)의 정확한 실행을 설명합니다. 명령과 설명은 식별된 TTP를 직접 반영하고 탐지 논리에 의해 예상되는 정확한 텔레메트리를 생성해야 합니다.

  • 공격 서사 및 명령:
    낮은 권한의 계정을 침해한 공격자는 손상된 스크립트 리포지토리에 Base64 문자열로 저장된 악성 페이로드를 다운로드하고 싶어 합니다. 탐지를 피하기 위해 공격자는 단일 PowerShell 원라이너를 제작하여 (1) Base64 문자열을 디코딩하고, (2) 이를 통해 iex호출하고, (3) 추가로 내장된 데이터를 해독할 AES 객체를 생성합니다. 정확한 명령줄은 규칙의 리터럴과 일치하도록 작성됩니다.

    powershell
    C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -Noexit -nop -c iex([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String(('REPLACED_STRING'.Replace('VFHDVXDJCF',''))))) ; $aes_var = [System.Security.Cryptography.Aes]::Create()
    
    • 공격자는 REPLACED_STRING 를 알려진 마커(VFHDVXDJCF).
    • The -Noexit -nop -c 옵션이 프롬프트와 실행 정책을 우회하여 탐지 조건과 일치합니다.
    • The $aes_var 변수 이름은 두 번째 선택 절을 만족시키기 위해 리터럴로 유지됩니다.
  • 회귀 테스트 스크립트: 다음 PowerShell 스크립트는 동일한 명령줄을 제어된 방식으로 재현하여 SIEM이 동일한 텔레메트리를 수신하도록 합니다.

    # 회귀 테스트 스크립트 - 탐지 트리거
    $payload = "U2FtcGxlIEJhc2U2NCBTdHJpbmc="   # "Sample Base64 String"
    $marker  = "VFHDVXDJCF"
    $obfuscated = $payload.Replace($marker, "")   # 탐지에서 사용된 .Replace를 시뮬레이트
    $command = @"
    C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -Noexit -nop -c iex([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String(('${obfuscated}'.Replace('VFHDVXDJCF',''))))) ; $aes_var = [System.Security.Cryptography.Aes]::Create()
    "@
    
    # 제작된 명령줄 실행
    Invoke-Expression $command
  • 정리 명령: 남아 있는 AES 객체를 제거하고 생성된 PowerShell 세션을 중지합니다.

    # 정리 - 아직 실행 중인 자식 PowerShell 프로세스 종료
    Get-Process -Name powershell -ErrorAction SilentlyContinue | Where-Object { $_.Path -like "*WindowsPowerShellv1.0powershell.exe" } | Stop-Process -Force
    
    # 임시 변수를 삭제할 수 있습니다
    Remove-Variable -Name payload, marker, obfuscated, command -ErrorAction SilentlyContinue