
네이티브 Nim WinRM 셸로, NTLM, Kerberos, 파일 전송, 인메모리 헬퍼 및 AD/OPSEC 보고를 지원합니다.
Nim으로 작성된 네이티브 WinRM 셸 클라이언트
버전 1.2.0 · 저자 Chokri Hammedi (blue0x1) · 라이선스 MIT
nimrm은 귀하가 소유하거나 명시적 접근 권한이 있는 시스템에 대한 합법적인 관리, 보안 테스트 및 연구를 위해 제작되었습니다. 저자는 이 도구로 인한 오용이나 손해에 대해 책임을 지지 않습니다.
nimrm은 실용적인 인증, 명령 실행, 전송 및 보고 헬퍼를 갖춘 컴팩트하고 빠른 WinRM 셸을 제공합니다. Nim 패키지 의존성 없이 네이티브 Nim 바이너리로 빌드됩니다.
| 구성 요소 | 요구 사항 |
|---|
Nimble:
nimble install nimrm
최신 릴리스 다운로드:
curl -L -o nimrm https://github.com/blue0x1/nimrm/releases/latest/download/nimrm
chmod +x nimrm
Windows 릴리스 바이너리:
Invoke-WebRequest -Uri https://github.com/blue0x1/nimrm/releases/latest/download/nimrm.exe -OutFile nimrm.exe
Debian 패키지:
curl -L -o nimrm_1.2.0_amd64.deb https://github.com/blue0x1/nimrm/releases/latest/download/nimrm_1.2.0_amd64.deb
sudo dpkg -i nimrm_1.2.0_amd64.deb
BlackArch:
sudo pacman -S nimrm
BlackArch PKGBUILD는 최신 업스트림 git 커밋을 추적하므로, 새 릴리스는 다음 시스템 업데이트 시 BlackArch 사용자에게 도달합니다. nimrm이 이미 설치된 경우 다음 명령으로 업그레이드하세요:
sudo pacman -Syu nimrm
소스에서 빌드:
git clone https://github.com/blue0x1/nimrm.git
cd nimrm
make linux
make linux
make ssl
make windows
수동 빌드:
nim c -d:release --opt:speed -o:nimrm nimrm.nim
nimrm은 네이티브 Nim 바이너리, 영구 WinRM 런스페이스, 청크 전송 로직, 컴팩트한 진행률 렌더링을 사용하여 빠른 속도를 유지하도록 설계되었습니다.
| 작업 | 구현 |
|---|---|
| 업로드 | 대용량 봉투에 대한 적응형 재시도를 포함한 청크 Base64 쓰기 |
| 다운로드 | 진행률 추적 및 소형 파일 고속 경로를 갖춘 스트리밍 Base64 청크 |
NTLM 비밀번호:
./nimrm -T 192.168.1.10 -A 'CORP\administrator' -P 'Password123'
NTLM 패스더해시:
./nimrm -T 192.168.1.10 -A 'CORP\user' -N aad3b435b51404eeaad3b435b51404ee:0123456789abcdef0123456789abcdef
Kerberos:
KRB5CCNAME=FILE:/tmp/user.ccache ./nimrm -k -T dc01.corp.local -Z CORP.LOCAL
HTTP를 통한 NTLM 메시지 암호화 강제:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --seal
사용자 지정 포트:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -p 5985
일회성 명령:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -c 'whoami'
TLS 인증서 검증 건너뛰기(자체 서명 인증서):
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --tls --insecure
nimrm은 여러 동시 WinRM 세션을 지원합니다. 셸을 떠나지 않고도 서로 다른 호스트와 사용자 간에 전환할 수 있습니다.
기존 세션 내부에서 새 세션 생성:
PS C:\Users\Administrator> session -T 10.0.0.5 -A 'CORP\user2' -P 'Pass123'
PS C:\Users\Administrator> session -T dc02.corp.local -A [email protected] -N aad3b435:0123456789abcdef -n dc02
PS C:\Users\Administrator> session -T dc03.corp.local -k -Z CORP.LOCAL -n dc03
활성 세션 나열:
PS C:\Users\Administrator> sessions
ID Name Target User Auth
-- ---- ------ ---- ----
* 1 session-1 dc01.corp.local:5985 administrator Kerberos
2 session-2 10.0.0.5:5985 user2 NTLM
3 dc02 dc02.corp.local:5985 user NTLM
세션 간 전환:
[session-2] PS C:\Users\user2> use 1
[*] Switched to session: session-1 (dc01.corp.local:5985)
[session-1] PS C:\Users\Administrator> use dc02
[*] Switched to session: dc02 (dc02.corp.local:5985)
세션 종료:
[dc02] PS C:\Users\user> kill 2
[*] Killed session: session-2
활성 세션 간 파일 복사:
[session-1] PS C:\Users\user1> rupload C:\Users\user1\tool.exe session-2 C:\Users\user2\Desktop\tool.exe
[*] Download mode: WinRS binary stream
✔ rupload-read [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━] 100% 442.0 KB/442.0 KB done in 0.7s
[*] Upload mode: WinRS stream
✔ rupload-write [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━] 100% 442.0 KB/442.0 KB done in 0.4s
[+] Remote uploaded 452608 bytes from session-1:C:\Users\user1\tool.exe to session-2:C:\Users\user2\Desktop\tool.exe
[session-1] PS C:\Users\user1> rdownload session-2 C:\Users\user2\Desktop\out.txt C:\Users\user1\out.txt
[+] Remote downloaded 1024 bytes from session-2:C:\Users\user2\Desktop\out.txt to session-1:C:\Users\user1\out.txt
rupload 및 rupload-dir은 활성 세션을 소스로, 지정된 세션을 대상으로 사용합니다. rdownload 및 rdownload-dir은 지정된 세션을 소스로, 활성 세션을 대상으로 사용합니다. 이 명령들은 nimrm 메모리를 통해 바이트를 릴레이하므로 컨트롤러 호스트는 임시 복사본을 디스크에 쓰지 않습니다.
세션 옵션:
PowerShell 및 CMD:
PS> hostname
PS> Get-Process
PS> !ipconfig /all
전송:
PS> upload ./tool.exe C:\Temp\tool.exe
PS> download C:\Temp\out.txt ./out.txt
PS> rupload C:\Temp\tool.exe session-2 C:\Temp\tool.exe
PS> rdownload session-2 C:\Temp\out.txt C:\Temp\out.txt
PS> rupload-dir C:\Temp\logs session-2 C:\Temp\logs
PS> rdownload-dir session-2 C:\Temp\loot C:\Temp\loot
PS> upload-dir ./payloads C:\Temp\payloads
PS> download-dir C:\Temp\logs ./logs
원격 세션 릴레이 방향:
# 활성 세션 -> 다른 세션
PS> rupload C:\Temp\payload.exe session-2 C:\Users\Public\payload.exe
# 다른 세션 -> 활성 세션
PS> rdownload session-2 C:\Users\Public\loot.zip C:\Temp\loot.zip
자동 완성:
PS> upl<Tab>
PS> upload ./pay<Tab>
대화형 프롬프트는 명령 이름과 upload, upload-dir, invoke-script, execute-assembly 같은 로컬 소스 명령의 로컬 파일 시스템 경로를 완성합니다.
인메모리 헬퍼:
PS> invoke-script ./AdminTools.ps1
PS> execute-assembly ./tool.exe arg1 arg2
보고:
PS> ad-info
PS> opsec-check
execute-assembly는 관리형 .NET 어셈블리만 지원합니다.invoke-script는 현재 원격 런스페이스로 임포트합니다.rupload, rdownload, rupload-dir, rdownload-dir은 컨트롤러 호스트에 임시 파일을 쓰지 않지만, 바이트는 여전히 컨트롤러 메모리를 통과하며 두 개의 WinRM 전송 구간을 사용합니다.ad-info 및 opsec-check는 읽기 전용 보고 명령입니다.MIT. LICENSE를 참조하세요.
| 영역 | 지원 |
|---|
| 인증 | NTLM 비밀번호, NTLM 해시, KRB5CCNAME을 통한 Kerberos |
| WinRM 전송 | HTTP, HTTPS/TLS, 사용자 지정 포트 |
| 셸 | 대화형 PowerShell, CMD 접두어, 일회성 명령 모드, 명령 및 로컬 경로 자동 완성 |
| 전송 | 파일 업로드/다운로드, 재귀 디렉터리 전송, 원격 세션 간 파일 및 디렉터리 릴레이 |
| 인메모리 | PowerShell 스크립트 임포트, 관리형 .NET 어셈블리 실행 |
| 보고 | AD/도메인 컨텍스트, 로깅 및 감사 상태 |
| 안정성 | Kerberos 메시지 래핑, 전송 재설정/재시도 처리 |
| 빌드 | Nim >= 1.6.0 |
| Kerberos | Linux의 libgssapi_krb5.so.2 또는 macOS의 libgssapi_krb5.dylib |
| TLS 빌드 | OpenSSL 및 -d:ssl |
| 대상 | 선택한 포트에서 WinRM에 연결 가능 |
| 원격 세션 릴레이 |
| 한 WinRM 세션에서 읽고 컨트롤러 메모리를 통해 다른 세션에 쓰며 로컬 디스크에 파일을 쓰지 않음 |
| 디렉터리 전송 | 동일한 청크 전송 경로를 사용하는 재귀 파일 열거 |
| 명령 실행 | 명령마다 재연결하는 대신 활성 WinRM 셸/런스페이스 재사용 |
| 옵션 | 설명 |
|---|
-T, --target | 대상 IP 또는 호스트명 |
-A, --account | 사용자 이름: user, user@domain 또는 DOMAIN\user |
-P, --secret | NTLM 비밀번호 |
-p, --port | WinRM 포트 |
-N, --nt-proof | NT 해시 또는 LM:NT 해시 |
-Z, --krb-zone | Kerberos 영역 재정의 |
-K, --kerb-spn | Kerberos SPN 재정의 |
-k, --kerb | Kerberos 인증 사용 |
-c, --command | 명령 하나를 실행하고 종료 |
--tls | HTTPS/TLS 사용 |
--insecure | TLS 인증서 검증 건너뛰기 |
-h, --help | 도움말 표시 |
| 명령 | 설명 |
|---|
/help | 도움말 표시 |
exit, quit | 셸 종료 |
!<cmd> | cmd.exe를 통해 실행 |
upload <local> [remote] | 파일 하나 업로드 |
download <remote> [local] | 파일 하나 다운로드 |
rupload <remote> <session> [dest] | 활성 세션의 원격 파일을 메모리를 통해 다른 세션으로 복사 |
rdownload <session> <remote> [dest] | 다른 세션의 원격 파일을 메모리를 통해 활성 세션으로 복사 |
rupload-dir <remote> <session> [dest] | 활성 세션의 원격 디렉터리를 메모리를 통해 다른 세션으로 복사 |
rdownload-dir <session> <remote> [dest] | 다른 세션의 원격 디렉터리를 메모리를 통해 활성 세션으로 복사 |
upload-dir <local> [remote] | 디렉터리 업로드 |
download-dir <remote> [local] | 디렉터리 다운로드 |
invoke-script <ps1> [args] | 로컬 PowerShell을 메모리에서 임포트 |
execute-assembly <exe> [args] | 관리형 .NET을 메모리에서 실행 |
ad-info | AD/도메인 컨텍스트 표시 |
opsec-check | 로깅 및 감사 상태 표시 |
sessions | 모든 활성 세션 나열 |
session <opts> | 새 세션 생성 |
use <name|id> | 세션 전환 |
kill <name|id> | 세션 종료 및 제거 |
| 옵션 | 설명 |
|---|
-T | 대상 호스트 |
-A | 사용자 이름 |
-P | 비밀번호 |
-N | NT 해시 |
-k | Kerberos 인증 |
-Z | Kerberos 영역 |
-K | SPN 재정의 |
-p | 포트 |
--tls | HTTPS 사용 |
-n | 사용자 지정 세션 이름 |