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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
InlineExecute-Assembly — 인-프로세스 .NET 어셈블리 실행을 위한 Cobalt Strike BOF로, AMSI/ETW 우회, 사용자 정의 AppDomain, 및 네임드 파이프/메일슬롯 출력 리디렉션을 제공합니다. | Kitploit
도구/GitHubGitHub/anthemtotheego/inlineexecute-assembly
Post-ExploitationRed Teaming
GitHubanthemtotheego/inlineexecute-assembly

InlineExecute-Assembly

인-프로세스 .NET 어셈블리 실행을 위한 Cobalt Strike BOF로, AMSI/ETW 우회, 사용자 정의 AppDomain, 및 네임드 파이프/메일슬롯 출력 리디렉션을 제공합니다.

저장소 보기

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
7661405년 전Kitploit 검토 완료

InlineExecute-Assembly

InlineExecute-Assembly는 보안 전문가가 Cobalt Strike의 기존 fork and run execute-assembly 모듈 대신 프로세스 내 .NET 어셈블리 실행을 수행할 수 있도록 하는 개념 증명 Beacon Object File(BOF)입니다. InlineExecute-Assembly는 진입점이 Main(string[] args) 또는 Main()인 모든 어셈블리를 실행합니다. 이를 통해 사전 수정 없이 대부분의 공개된 도구를 실행할 수 있습니다.

BOF는 실행 전에 어셈블리에 필요한 공용 언어 런타임(CLR) 버전(v2.0.50727 또는 v4.0.30319)을 자동으로 결정하며, 대부분의 경우 문제가 발생해도 정상적으로 종료되어야 합니다. 또한 BOF는 .NET 실행 전에 운영자가 여러 동작을 지정할 수 있는 여러 플래그를 지원합니다. 여기에는 메모리 패치를 통한 AMSI 비활성화, 메모리 패치를 통한 ETW 비활성화 및 복원, 생성할 CLR App Domain 이름 사용자 정의, 어셈블리의 콘솔 출력을 named pipe 또는 mailslot으로 생성 및 리디렉션할지 여부, 기본 진입점을 Main(string[] args)에서 Main()으로 전환하는 기능이 포함됩니다. 사용법, 사용 사례 및 가능한 탐지에 대한 자세한 내용은 아래 및 https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ 에서 확인할 수 있습니다.

마지막으로, .NET 어셈블리를 비콘 임플란트와 동일한 프로세스에서 실행할 때의 장점은 Cobalt Strike의 execute-assembly 모듈의 기본 동작(새 프로세스를 생성하여 CLR/.NET 어셈블리를 로드/주입)을 피할 수 있다는 점입니다. 그러나 여전히 다른 opsec 고려 사항이 존재합니다. 예를 들어, 실행 중인 프로세스가 일반적으로 CLR을 로드하는지 또는 실행 중인 .NET 어셈블리에 알려진 시그니처가 있는지 등입니다. 따라서 단점은 AMSI에 의해 탐지되어 종료될 경우 비콘도 함께 종료된다는 점입니다.

주제 참고 자료

이 도구는 보안 커뮤니티 구성원들이 이미 발표한 훌륭한 연구, 도구 및 코드를 활용할 수 있었기에 존재할 수 있었습니다. 감사합니다. 마지막으로, 아래에 빠진 사람이 있다고 생각되면 알려주시면 추가하겠습니다.

  • HostingCLR - 여기 - CLR/어셈블리 실행 로직
  • Dotnet-Loader-Shellcode - (@modexpblog 제공) - 여기 - C에서 .NET 실행을 위한 COM 인터페이스 등 전반적으로 훌륭한 연구 -> 진정한 MVP
  • Donut - (@TheRealWover와 @modexpblog 제공) - 여기 - COM 인터페이스 헤더
  • Memory Patching AMSI Bypass - (@_RastaMouse 제공) - 여기 - AMSI 메모리 패치 연구
  • Metasploit-Execute-Assembly - (@b4rtik 제공) - 여기 - 수정된 AMSI 패치 및 .NET 버전 찾기 함수 사용
  • ExecuteAssembly - (@med0x2e 제공) - 여기 - 수정된 aggressor 스크립트
  • Hiding Your .NET ETW - (@xpn 제공) - 여기 - 훌륭한 ETW 연구
  • ETW BOF - (@ajpc500 제공) - 여기 - 수정된 ETW 패치
  • ExecuteAssembly_Mailslot - (@N4k3dTurtl3 제공) - 여기 - 콘솔 리디렉션을 위한 mailslot 사용 (수정됨)
  • @freefirex2 - BOF 내부 작동 및 주의사항에 대한 좋은 정보를 공유해 주셨습니다.

시작하기

  1. inlineExecute-Assembly 폴더와 그 내용물을 Cobalt Strike GUI 애플리케이션을 통해 연결할 시스템에 복사합니다.
  2. inlineExecute-Assembly.cna Aggressor 스크립트를 로드합니다.
  3. 가장 기본적인 실행을 위해 inlineExecute-Assembly --dotnetassembly /path/to/assembly.exe 를 실행합니다 (특정 플래그 예시는 아래 사용 사례 참조).

직접 빌드하기

x64 Native Tools Command Prompt for VS 2019를 사용하여 src 디렉토리에서 아래 명령어를 실행합니다.

root@kitploit:~
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o

x86 Native Tools Command Prompt for VS 2019를 사용하여 src 디렉토리에서 아래 명령어를 실행합니다.

root@kitploit:~
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o

플래그

root@kitploit:~
--dotnetassembly        어셈블리의 디렉토리 경로 **필수**
--assemblyargs          전달할 어셈블리 인수
--appdomain             전송되는 AppDomain의 기본 이름 변경 (기본값은 totesLegit이며 포함된 aggressor 스크립트에서 설정됨) *도메인은 항상 언로드됨*
--amsi                  메모리 패치를 통해 AMSI 비활성화 시도 (성공하면 프로세스 수명 동안 AMSI가 비활성화됨)
--etw                   메모리 패치를 통해 ETW 비활성화 시도 (성공하면 되돌리지 않는 한 프로세스 수명 동안 ETW가 비활성화됨)
--revertetw             메모리 패치를 통해 ETW를 비활성화한 후 다시 원래 상태로 패치 복원
--pipe                  named pipe의 기본 이름 변경 (기본값은 totesLegit이며 포함된 aggressor 스크립트에서 설정됨)
--mailslot              콘솔 출력 리디렉션에 mailslot 사용으로 전환. mailslot의 기본 이름 변경 (비워두면 기본값은 totesLegit이며 포함된 aggressor 스크립트에서 설정됨)
--main                  진입점을 Main()으로 변경 (기본값은 Main(string[] args))

사용 사례

.NET 어셈블리 실행

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe

사용 사례

인수와 함께 .NET 어셈블리 실행

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker

사용 사례

인수와 함께 .NET 어셈블리 실행 및 AMSI 비활성화

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi

사용 사례

인수와 함께 .NET 어셈블리 실행 및 ETW 비활성화

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw

사용 사례

인수와 함께 .NET 어셈블리 실행 및 기본 named pipe 대신 mailslot을 통해 출력 리디렉션

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot

사용 사례

인수와 함께 .NET 어셈블리 실행 및 aggressor 스크립트에 설정된 기본 named pipe 이름 변경

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit

사용 사례

.NET 어셈블리 실행 및 aggressor 스크립트에 설정된 기본 앱 도메인 변경

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit

사용 사례

기본 Main(string[] args) 대신 Main() 진입점으로 .NET 어셈블리 실행

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main

사용 사례

모든 기능 사용

구문

root@kitploit:~
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit

주의사항

  1. 최대한 안정적으로 만들려고 노력했지만, 충돌이 발생하거나 비콘이 종료되지 않을 것이라는 보장은 없습니다. 우리는 fork and run 방식처럼 무언가 잘못되어도 비콘이 살아 있는 추가적인 이점이 없습니다. 이것이 BOF의 트레이드오프입니다. 따라서 사전에 어셈블리를 테스트하여 도구와 제대로 작동하는지 확인하는 것이 얼마나 중요한지 강조할 수 없습니다.
  2. BOF는 프로세스 내에서 실행되고 실행되는 동안 비콘을 점유하므로, 장시간 실행되는 어셈블리에 사용하기 전에 이를 고려해야 합니다. 결과를 반환하는 데 오래 걸리는 작업을 실행하기로 선택하면, 결과가 반환되고 어셈블리 실행이 완료될 때까지 비콘은 더 많은 명령을 실행할 수 없습니다. 또한 이는 sleep 설정을 따르지 않습니다. 예를 들어, sleep이 10분으로 설정되어 있고 BOF를 실행하면, BOF 실행이 완료되는 즉시 결과를 받게 됩니다.
  3. PE를 메모리에 로드하는 도구(예: SafetyKatz)를 수정하지 않으면, 이들 도구가 비콘을 죽일 가능성이 매우 높습니다. 이러한 도구들은 대부분 execute assembly에서 잘 작동하는데, 이는 종료 전에 희생 프로세스에서 콘솔 출력을 보낼 수 있기 때문입니다. 프로세스 내 BOF를 통해 종료되면 프로세스가 종료되고, 이는 비콘을 죽입니다. 이러한 어셈블리들은 수정하여 작동하게 할 수 있지만, 다른 OPSEC에 좋지 않은 요소가 프로세스에 로드되어 제거되지 않을 수 있으므로 execute assembly를 통해 실행하는 것이 좋습니다.
  4. 어셈블리에서 Environment.Exit를 사용하는 경우, 이를 제거해야 합니다. 그렇지 않으면 프로세스와 비콘이 종료됩니다.
  5. named pipe와 mailslot은 고유해야 합니다. 데이터를 수신하지 못했는데 비콘이 여전히 살아 있다면, 다른 named pipe 또는 mailslot 이름을 선택해야 하는 문제일 가능성이 높습니다.

탐지

사용할 수 있는 몇 가지 탐지 및 완화 전략:

  1. AMSI 및 ETW 메모리 패치 수행 시 PAGE_EXECUTE_READWRITE를 사용합니다. 이는 의도적으로 수행된 것이며, PAGE_EXECUTE_READWRITE 메모리 보호를 가진 메모리 범위가 있는 프로그램은 거의 없으므로 위험 신호가 되어야 합니다.
  2. 생성된 named pipe의 기본 이름은 totesLegit입니다. 이는 의도적으로 설정된 것이며, 시그니처 탐지를 통해 플래그를 지정할 수 있습니다.
  3. 생성된 mailslot의 기본 이름은 totesLegit입니다. 이는 의도적으로 설정된 것이며, 시그니처 탐지를 통해 플래그를 지정할 수 있습니다.
  4. 로드된 AppDomain의 기본 이름은 totesLegit입니다. 이는 의도적으로 설정된 것이며, 시그니처 탐지를 통해 플래그를 지정할 수 있습니다.
  5. .NET의 악성 사용 탐지에 대한 좋은 팁: (@bohops) 여기, (F-Secure) 여기, 그리고 여기
  6. 의심스러운 프로세스(예: CLR이 로드되어서는 안 되는 관리되지 않는 프로세스)에 .NET CLR이 로드되는지 확인합니다.
  7. 이벤트 추적 여기
  8. 다른 알려진 Cobalt Strike 비콘 IOC 또는 C2 egress/통신 IOC를 찾습니다.
도구 다운로드