
C# 어셈블리, PE 파일 또는 셸코드를 암호화된 Nim 바이너리로 패킹하며, AMSI/ETW 우회, 샌드박스 탐지, 다중 인젝션 기법 등 레드팀 운영을 위한 고급 회피 기능을 포함합니다.
이 도구는 x33fcon에서의 발표 이후 공개되었습니다. 2021년부터 2024년까지 제 개인 주요 코딩 프로젝트였으며, 현재는 더 이상 사용되지 않는(deprecated) 상태로 간주되어 더 이상 유지보수되지 않습니다. 제 쪽에서 버그 수정이나 기능 업데이트를 기대하지 마세요. 대신, 검증된 Red Team 및 Pentester를 위한 상용 통제 버전인 RustPack이 현재 유지보수되고 있으며, 기능이 훨씬 더 풍부할 뿐만 아니라 OPSec 측면에서도 훨씬 더 안전합니다.
이 Packer는 모든 C# Assembly, PE-File 또는 Shellcode를 Nim 바이너리로 패킹하는 데 사용할 수 있습니다. 대상 페이로드를 암호화하고, 주어진 인자에 따라 해당 Nim 소스 코드를 빌드한 다음 Nim 바이너리로 컴파일합니다.
동영상을 선호하신다면 여기에서 찾을 수 있습니다: https://youtu.be/0PwIn3Nxmgo
Nim/Nimble이 제대로 작동하려면 Git이 설치되어 있어야 합니다.
Nim 2.2.10 및 Nim Windows 다운로드 페이지에서 링크된 MinGW-w64 GCC 11.1.0 번들로 테스트되었습니다. 최신 Nim 릴리스는 Windows에서 높은 PE 이미지 베이스를 기본값으로 사용하는데, 이로 인해 -static 링크가 relocation truncated to fit: R_X86_64_32S against .bss 오류로 깨집니다. 이제 패커는 정적 빌드가 계속 작동하도록 -Wl,--image-base=0x10000을 강제 적용하므로, MinGW-w64 11.x 빌드는 모두 문제없어야 합니다. 여기서는 x64만 지원됩니다 — x86/--x86/--wow64는 유지보수되지 않습니다.
nim-2.2.10_x64.zipmingw64.7z (Nim Windows 설치 페이지에서 링크됨)Expand-Archive는 사용하지 마세요 — lib\system\ 디렉터리와의 대소문자 충돌로 인해 lib\system.nim을 조용히 누락시킵니다). Nim zip에는 MinGW를 추출하는 데 사용할 수 있는 bin\7zG.exe가 포함되어 있습니다.<nim>\bin 및 <mingw64>\bin을 %PATH%에 추가합니다. 변경 사항을 적용하려면 로그오프/로그온(또는 셸 재시작)을 수행하세요.
Versions known to work (as of Nim 2.2.10): nimcrypto 0.6.0, docopt 0.7.1, ptr_math 0.3.0, winim 3.9.4, nim-strenc (HEAD — the repo has no tagged releases).
Windows에서 LLVM 난독화기를 사용하려면 denim에 포함된 수정된 denim 버전을 사용하세요. denim\denim.exe setup으로 설치합니다.
예: Kali / Debian. 이 패커는 기존에 nim 1.6.8 + mingw-64 8.0.0-1이 필요했습니다. 이제 정적 링크 --image-base=0x10000 우회가 내장되어 있으므로 최신 툴체인에서도 작동해야 합니다. Windows 빌드가 활발히 테스트되는 대상이며 — Linux는 best-effort입니다.```bash
apt-get install nim mingw-w64
nimble install [email protected] docopt ptr_math winim https://github.com/S3cur3Th1sSh1t/nim-strenc/
`--hellsgate`가 최신 mingw-w64에서 어셈블리에 실패하면 `mingw-64=8.0.0-1`로 다운그레이드하세요.
`pip3 install donut-shellcode`로 donut을 설치하세요. `denim`은 Unix에서 사용할 수 없으므로 LLVM을 통한 난독화는 여기서 불가능합니다. Callobfuscator도 마찬가지입니다.
`nim c -d:noRES NimSyscallLoader.nim`으로 Packer를 컴파일하세요. 준비 완료입니다. -d:noRES를 사용하지 않으면 다음과 같은 오류가 발생할 수 있습니다:```
/username/.nimble/pkgs/winim-3.7.1/winim/lib/winim64.res:(.rsrc+0x48): dangerous relocation: collect2: fatal error: ld terminated with signal 11 [Speicherzugriffsfehler]
compilation terminated.
한 번 빌드해야 합니다(처음에는 시간이 걸리며, 이후 빌드는 캐시됩니다).
sudo docker build . -t nimsyscallloader
그런 다음 다음 명령으로 패커를 실행합니다:
sudo docker run -v $(pwd):/shared nimsyscallloader <ARGUMENTS> --output=/shared/packed.exe
여기서 $(pwd)는 호스트 시스템에서 컨테이너와 공유되는 디렉터리, 즉 암호화할 파일이 있어야 하고 출력이 저장될 디렉터리입니다.
LimeLighter를 통해 코드 서명 인증서를 사용하려면 다음 항목도 설치하고 %PATH%에 포함해야 합니다: openssl - (Windows용) 예를 들어 여기에서 osslsigncode - 예를 들어 여기에서
여기서 사용되는 타사 도구의 문제에 대해서는 지원을 제공하지 않습니다. 문제가 발생하면 해당 저장소에 이슈를 열어 주세요. 사용 중인 타사 도구:
제가 미리 컴파일한 바이너리를 사용하거나, 물론 위 링크에서 직접 컴파일할 수도 있습니다.
동영상을 선호하시면 여기에서 확인할 수 있습니다: https://youtu.be/UHaIgdzqHDA
요청이 있어 일부 기능에 대한 짧은 동영상도 추가했습니다:
Caro-Kann:
ThreadlessInject 기능:
Module Stomping 기능:
shellcodeURL 기능:
stegoFile 기능:
shellcodeFile 기능:
로컬 프로세스용 Ruy Lopez
Shellcode 출력 형식
Assembly 출력 기능
그리고 기본 프로세스가 아닌 다른 프로세스에도 ThreadlessInject 기법을 사용자 지정하는 방법을 보여주는 공개 동영상을 만들었습니다:
https://youtu.be/BYuAUYQcI-E``` NimSyscall_Loader v 2.2
Usage: NimSyscall_Loader [--file=file_to_encrypt --key= --keyfile= --dnsKey --dnsdomain=<sub.example.com> --environmentalKey=<domain,username> --output= --large --metadata --shellcodeFile= --shellcodeURL= --dll --dllexportfunc= --dllhijack --noNimMain --clone= --dllProxy --cpl --xll --service --arguments=<Hardcoded_Arguments> --csharp --noAMSI --noETW --noOneShot --PatchAMSI --PatchETW --AMSIProviderPatch --AMSINtCreateSectionHook --sleep=<10> --sleep-in-between=<10> --shellcode --RWX --CallbackExecute --localCreateThread --QueueApc --noWait --COMVARETW --remoteinject --customprocess= --blockDLLs --spoofArgs= --parentProcess= --remoteprocess= --remotepatchAMSI --remotepatchETW --mapSection --unhook=<dllname1,dllname2> --reflective --obfuscate --macPayload --hide --APIhide --noArgs --peinject --peload --hellsgate --syswhispers --jump --sgn --replace --self-delete --sandbox=<check1,check2> --domain= --pump=<words,size> --obfuscatefunctions --debug --verbose --noDInvoke --x86 --wow64 --llvm --sign --signdomain= --noAntidebug --noDefaultSandBox --noAntiEmulate --sleepycrypt --fluctuate --interactivePS --psout --psobfs --pslyrics --csout --scout --sourceonly --jmpEntry --jmpEntryDLL=<example.dll> --jmpEntryFunc= --dripallocate --dripsleep= --stegofile= --ruy-lopez --threadless --threadlessDll=<dllname.dll> --threadlessFunc= --poolparty= --Caro-Kann --Caro-Kann-Thread --stomb --stombDll=<dllname.dll> --stombFunc= --stombFunc2= --restore] NimSyscall_Loader (-h | --help) NimSyscall_Loader --version
Options:
[general]