Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
herpaderping — Process Herpaderping 개념 증명, 도구, 기술적 심층 분석. Process Herpaderping은 프로세스의 의도를 모호하게 하여 보안 제품을 우회합니다. | Kitploit
도구/GitHubGitHub/jxy-s/herpaderping
Defensive ToolsExploitationPenetration Testing
GitHubjxy-s/herpaderping

herpaderping

Process Herpaderping 개념 증명, 도구, 기술적 심층 분석. Process Herpaderping은 프로세스의 의도를 모호하게 하여 보안 제품을 우회합니다.

저장소 보기
1.2k2243년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Process Herpaderping

Process Herpaderping은 이미지가 매핑된 후 디스크의 콘텐츠를 수정하여 프로세스의 의도를 은폐하는 방법입니다. 이로 인해 보안 제품과 OS 자체에서 의아한 동작이 발생합니다.

요약

일반적으로 보안 제품은 Windows 커널에 콜백을 등록하여(PsSetCreateProcessNotifyRoutineEx) 프로세스 생성 시 조치를 취합니다. 이 시점에서 보안 제품은 실행 파일을 매핑하는 데 사용된 파일을 검사하고 이 프로세스의 실행을 허용할지 결정할 수 있습니다. 이 커널 콜백은 프로세스 객체가 생성될 때가 아니라 초기 스레드가 삽입될 때 호출됩니다.

이 때문에 공격자는 프로세스를 생성하고 매핑한 다음 파일의 콘텐츠를 수정하고 초기 스레드를 생성할 수 있습니다. 생성 콜백에서 검사를 수행하는 제품은 수정된 콘텐츠를 보게 됩니다. 또한 일부 제품은 파일 쓰기를 모니터링하는 쓰기 시 검사 방식을 사용합니다. 여기서 흔히 사용하는 최적화는 파일이 기록되었음을 기록하고 실제 검사를 IRP_MJ_CLEANUP이 발생할 때까지 지연시키는 것입니다(예: 파일 핸들이 닫힐 때). 따라서 write -> map -> modify -> execute -> close 워크플로를 사용하는 공격자는 IRP_MJ_CLEANUP에서의 검사에만 의존하는 쓰기 시 검사를 우회할 수 있습니다.

이러한 관행을 악용하기 위해 먼저 대상 파일에 바이너리를 디스크에 씁니다. 그런 다음 대상 파일의 이미지를 매핑하여 OS에 제공하여 프로세스 생성을 위해 사용합니다. OS는 원래 바이너리를 우리를 위해 정중하게 매핑합니다. 기존 파일 핸들을 사용하여 초기 스레드를 생성하기 전에 대상 파일 콘텐츠를 수정하여 이미지를 뒷받침하는 파일을 모호하게 하거나 위조합니다. 얼마 후 초기 스레드를 생성하여 원래 바이너리의 실행을 시작합니다. 마지막으로 대상 파일 핸들을 닫습니다. 단계별로 살펴보겠습니다:

  1. 대상 바이너리를 디스크에 쓰고 핸들을 열어 둡니다. 이것이 메모리에서 실행될 것입니다.
  2. 파일을 이미지 섹션으로 매핑합니다(NtCreateSection, SEC_IMAGE).
  3. 섹션 핸들을 사용하여 프로세스 객체를 생성합니다(NtCreateProcessEx).
  4. 동일한 대상 파일 핸들을 사용하여 디스크의 파일을 모호하게 만듭니다.
  5. 프로세스에서 초기 스레드를 생성합니다(NtCreateThreadEx).
    • 이 시점에서 커널의 프로세스 생성 콜백이 실행됩니다. 디스크의 콘텐츠는 매핑된 것과 일치하지 않습니다. 이 시점에서 파일을 검사하면 잘못된 귀인이 발생합니다.
  6. 핸들을 닫습니다. IRP_MJ_CLEANUP이 여기서 발생합니다.
    • 실행 중인 콘텐츠를 숨겼으므로 이 시점에서 검사하면 잘못된 귀인이 발생합니다.

plantuml

root@kitploit:~
@startuml
hide empty description

[*] --> CreateFile
CreateFile --> FileHandle
FileHandle --> Write
FileHandle --> NtCreateSection
Write -[hidden]-> NtCreateSection
NtCreateSection --> SectionHandle
SectionHandle --> NtCreateProcessEx
FileHandle --> Modify
NtCreateProcessEx -[hidden]-> Modify
NtCreateProcessEx --> NtCreateThreadEx
Modify -[hidden]-> NtCreateThreadEx
NtCreateThreadEx --> [*]
FileHandle --> CloseFile
NtCreateThreadEx -[hidden]-> CloseFile
NtCreateThreadEx --> PspCallProcessNotifyRoutines
PspCallProcessNotifyRoutines -[hidden]-> [*]
CloseFile --> IRP_MJ_CLEANUP
IRP_MJ_CLEANUP -[hidden]-> [*]
PspCallProcessNotifyRoutines --> Inspect
PspCallProcessNotifyRoutines -[hidden]-> CloseFile 
IRP_MJ_CLEANUP --> Inspect
Inspect -[hidden]-> [*]

CreateFile : 대상 파일을 생성하고 핸들을 열어 둡니다.
Write : 소스 페이로드를 대상 파일에 씁니다.
Modify : 디스크의 파일을 모호하게 만듭니다.
NtCreateSection : 파일 핸들을 사용하여 섹션을 생성합니다.
NtCreateProcessEx : 이미지 섹션이 매핑되어 파일 객체에 캐시됩니다.
NtCreateThreadEx : 캐시된 섹션이 사용됩니다.
NtCreateThreadEx : 프로세스 알림 루틴이 커널에서 실행됩니다.
Inspect : 디스크의 콘텐츠가 실행된 것과 일치하지 않습니다.
Inspect : 이 시점에서 파일을 검사하면 잘못된 귀인이 발생합니다.
@enduml

동작

아래 데모에서 볼 수 있듯이 CMD.exe가 실행 대상으로 사용됩니다. 첫 번째 실행은 디스크의 바이트를 패턴으로 덮어씁니다. 두 번째 실행은 CMD.exe를 ProcessHacker.exe로 덮어씁니다. Herpaderping 도구는 바이너리를 ProcessHacker.exe에 최대한 가깝게 수정하며 원래 서명까지 유지합니다. 동일한 바이너리가 여러 번 실행되는 방식과 사용자에게 보이는 프로세스가 디스크의 파일과 어떻게 다른지 주목하십시오.

더 깊이 들어가기

동작을 관찰했으며 이 중 일부는 놀라울 수 있습니다. 이 동작을 설명해 보겠습니다.

기술 심층 분석

배경 및 동기

Windows 플랫폼을 보호하기 위한 제품을 설계할 때 이 분야의 많은 엔지니어(저 포함)는 OS가 데이터를 처리하는 방식에 대한 선입견에 빠지곤 했습니다. 이 시나리오에서 일부는 프로세스가 생성될 때 디스크의 파일이 "잠긴" 상태로 유지될 것으로 예상할 수 있습니다. 파일을 삭제할 수 없습니다. 파일에 쓸 수 없습니다. 하지만 이름을 바꿀 수 있습니다. 여기서 볼 수 있듯이 적절한 조건에서 실제로 파일에 쓸 수 있습니다. 가정에 대해 경계를 늦추지 말고 항상 의문을 제기하며 연구를 수행하십시오.

이 연구의 동기는 파일이 기록될 때 분석을 수행하는 방법을 발견하는 데서 비롯되었습니다. Process Hollowing 및 Doppelganging에 대한 이전 연구 배경을 바탕으로 이것이 가능할 것이라고 이론화했습니다. 목표는 더 나은 보안을 제공하는 것입니다. 이전 자물쇠를 깨는 방법을 이해하지 않고서는 더 나은 자물쇠를 만들 수 없습니다.

유사한 기술

Herpaderping은 Hollowing 및 Doppelganging과 유사하지만 몇 가지 주요 차이점이 있습니다.

Process Hollowing

Process Hollowing은 실행이 시작되기 전에 매핑된 섹션을 수정하는 것을 포함하며, 추상적으로는 map -> modify section -> execute와 같습니다. 이 워크플로는 Hollow된 프로세스의 의도된 실행 흐름이 의도하지 않은 코드로 분기되는 결과를 초래합니다. Doppelganging은 Hollowing의 한 형태로 간주될 수 있습니다. 그러나 제 생각에 Hollowing은 일반적으로 이미 매핑된 코드에 대한 명시적 쓰기를 포함한다는 점에서 주입에 더 가깝습니다. 이는 Herpaderping과 다릅니다. Herpaderping에서는 수정된 섹션이 없습니다.

Process Doppelganging

Process Doppelganging은 Herpaderping에 더 가깝습니다. Doppelganging은 트랜잭션 파일 작업을 남용하며 일반적으로 다음 단계를 포함합니다: transact -> write -> map -> rollback -> execute. 이 워크플로에서 OS는 이미지 섹션을 생성하고 트랜잭션을 고려하므로 캐시된 이미지 섹션은 트랜잭션에 기록한 내용이 됩니다. OS는 이 기술을 패치했습니다. 글쎄요, 그들이 발생시킨 충돌을 패치했습니다. 아마도 이것을 트랜잭션의 "합법적" 사용으로 간주할 수도 있습니다. 다행히 Windows Defender는 Doppelganging 기술을 탐지합니다. Doppelganging은 Herpaderping과 다릅니다. Herpaderping은 트랜잭션 파일 작업에 의존하지 않습니다. 그리고 Defender는 Herpaderping을 탐지하지 않습니다.

비교

참고로 일반화된 기술은 다음과 같습니다:

유형기술
Hollowingmap -> modify section -> execute
Doppelgangingtransact -> write -> map -> rollback -> execute
Herpaderpingwrite -> map -> modify -> execute -> close

여기서 차이점을 확인할 수 있습니다. Herpaderping은 악성 비트가 디스크에 닿는다는 점에서 Doppelganging보다 확실히 더 시끄럽지만, 보안 제품이 여전히 Herpaderping을 탐지하지 못하는 것을 확인했습니다.

가능한 해결책

여기에는 명확한 수정 사항이 없습니다. 파일에 쓰기 액세스 권한이 있을 때 이미지 섹션이 매핑/캐시되는 것을 방지하는 것이 구멍을 막는 합리적인 방법인 것 같습니다. 그러나 이것이 실용적인 해결책일 수도 있고 아닐 수도 있습니다.

또 다른 옵션은 파일의 변경 사항을 아직 프로세스에 매핑되지 않은 캐시된 이미지 섹션으로 플러시하는 것입니다. 그러나 새 프로세스로의 매핑이 NtCreateProcess에서 발생하므로 이는 실현 가능한 해결책이 아닐 수 있습니다.

탐지 관점에서 실제로 매핑된 비트를 식별할 수 있는 좋은 방법은 없습니다. IRP_MJ_CLEANUP 또는 PsSetCreateProcessNotifyRoutineEx에 등록된 콜백에서의 검사는 디스크의 비트가 변경되었기 때문에 잘못된 귀인이 발생합니다. 생성된 섹션에서 파일을 다시 빌드해야 합니다. 여기서 Windows 10에는 PsSetCreateProcessNotifyRoutineEx2를 등록할 수 있는 새로운 콜백이 있다는 점을 지적할 가치가 있습니다. 그러나 이것은 이전 콜백과 동일한 문제를 겪습니다. 프로세스 객체가 생성될 때가 아니라 초기 스레드가 실행될 때 호출됩니다. Microsoft는 PsCreateThreadNotifyNonSystem으로 등록된 경우 초기 스레드가 삽입될 때 호출되는 PsSetCreateThreadNotifyRoutineEx를 추가했습니다(이전 콜백처럼 실행이 시작되려고 할 때가 아니라). PSCREATEPROCESSNOTIFYTYPE을 확장하여 프로세스 객체가 생성될 때 호출되도록 해도 도움이 되지 않습니다. 더 깊이 들어가기 섹션에서 이미지 섹션 객체가 NtCreateProcess가 아니라 NtCreateSection 호출 시 캐시된다는 것을 확인했습니다.

실행된 것을 쉽게 식별할 수 없습니다. 공격자의 악용 행위를 탐지하려고 시도하는 것 외에는 방법이 없습니다. 행동 지표의 발견은 독자의 몫으로 남겨두겠습니다.

알려진 영향을 받는 플랫폼

아래는 (2020년 8월 31일 기준) 테스트된 제품 및 Windows OS 목록입니다. 테스트는 알려진 악성 바이너리로 수행되었습니다.

책임 있는 공개

이 취약점은 2020년 7월 17일 Microsoft 보안 대응 센터(MSRC)에 공개되었으며, MSRC가 2020년 7월 22일에 사례를 개설했습니다. MSRC는 2020년 8월 25일에 조사를 종료하고 발견 사항이 유효하지만 즉각적인 서비스 기준을 충족하지 않는다고 판단했습니다. 현재로서는 사례가 해결되지 않은 채 종료되었으며, 향후 검토를 위해 표시되었으며 일정은 없습니다.

우리는 이 버그의 심각성에 대해 동의하지 않습니다. 이는 2020년 8월 27일 MSRC에 전달되었습니다.

  1. 이 클래스에 유사한 취약점(Hollowing 및 Doppelganging)이 있습니다.
  2. 취약점은 OS에 내재된 보안 기능(Windows Defender)을 무력화하는 것으로 나타났습니다.
  3. 취약점을 통해 공격자가 임의 코드를 실행할 수 있습니다.
  4. 사용자는 의도하지 않은 코드의 실행에 대해 알림을 받지 않습니다.
  5. 사용자에게 표시되는 프로세스 정보는 실제 실행 중인 것을 정확히 반영하지 않습니다.
  6. 프로세스를 정확히 식별하는 기능은 직관적이지 않거나 올바르지 않으며, 심지어 커널에서도 마찬가지입니다.

소스

이 저장소에는 Herpaderping 프로세스 난독화 방법을 실행하기 위한 도구가 포함되어 있습니다. 사용법은 다음과 같습니다.

root@kitploit:~
Process Herpaderping Tool - Copyright (c) Johnny Shaw
ProcessHerpaderping.exe SourceFile TargetFile [ReplacedWith] [Options...]
Usage:
  SourceFile               실행할 소스 파일입니다.
  TargetFile               소스를 실행할 대상 파일입니다.
  ReplacedWith             대상을 대체할 파일입니다. 선택 사항이며,
                           기본값은 바이너리를 패턴으로 덮어씁니다.
  -h,--help                도구 사용법을 출력합니다.
  -d,--do-not-wait         생성된 프로세스가 종료될 때까지 기다리지 않으며,
                           기본값은 기다립니다.
  -l,--logging-mask number 로깅 마스크를 지정하며, 기본값은 전체
                           로깅입니다.
                               0x1   성공
                               0x2   정보
                               0x4   경고
                               0x8   오류
                               0x10  컨텍스트
  -q,--quiet               조용히 실행하며, 로깅 마스크를 재정의하고 제목을 표시하지 않습니다.
  -r,--random-obfuscation  파일 난독화 시 패턴 대신 무작위 바이트를 사용합니다.
  -e,--exclusive           대상 파일을 독점 액세스로 생성하며
                           핸들을 가능한 오래 열어 둡니다.
                           이 옵션이 없으면 핸들은 전체 공유 액세스 권한을 가지며 가능한 빨리 닫힙니다.
  -u,--do-not-flush-file   덮어쓰기 후 파일을 플러시하지 않습니다.
  -c,--close-file-early    스레드 생성 전에 파일을 닫습니다(커널에서
                           프로세스 알림 콜백이 실행되기 전).
                           "--exclusive" 옵션과 함께 사용할 수 없습니다.
  -k,--kill                성공 또는 실패에 관계없이 생성된 프로세스를 종료합니다.
                           이는 일부 자동화 환경에서 유용합니다.
                           "--do-not-wait" 옵션을 강제합니다.

클론 및 빌드

저장소는 서브모듈을 사용합니다. 클론 후 서브모듈을 초기화하고 업데이트해야 합니다. 프로젝트 파일은 Visual Studio 2019를 대상으로 합니다.

root@kitploit:~
git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init --recursive
MSBuild .\herpaderping.sln

크레딧

다음은 수정 없이 사용됩니다. 저자에게 크레딧을 제공합니다.

  • Windows Implementation Libraries (WIL) 일반적인 Windows 코딩 패턴에 대한 읽기 쉬운 타입 안전 C++ 인터페이스를 통해 Windows 개발자의 삶을 편하게 하기 위해 만들어진 헤더 전용 C++ 라이브러리입니다.
  • Process Hacker Native API Headers 네이티브 API 헤더 파일 모음입니다. Microsoft 헤더 파일 및 기호 파일에서 수집했으며, 많은 리버스 엔지니어링 및 추측을 통해 얻었습니다.
도구 다운로드
운영 체제버전취약
Windows 7 Enterprise x866.1.7601예
Windows 10 Pro x6410.0.18363.900예
Windows 10 Pro Insider Preview x6410.0.20170.1000예
Windows 10 Pro Insider Preview x6410.0.20201.1000예
보안 제품버전취약
Windows Defender AntiMalware Client4.18.2006.10예
Windows Defender Engine1.1.17200.2예
Windows Defender Antivirus1.319.1127.0예
Windows Defender Antispyware1.319.1127.0예
Windows Defender AntiMalware Client4.18.2007.6예
Windows Defender Engine1.1.17300.2예
Windows Defender Antivirus1.319.1676.0예
Windows Defender Antispyware1.319.1676.0예
Windows Defender AntiMalware Client4.18.2007.8예
Windows Defender Engine1.1.17400.5예
Windows Defender Antivirus1.323.267.0예
Windows Defender Antispyware1.323.267.0예