红队C2数据通信之TLV模型
TLV也即Type-length-value,这种一种具有固定格式的数据通信模型,简称为TLV,我们这里只讲讲在红队C2开发中的使用。
格式
每个TLV数据包结构大概如下图:
第二个字段是一个int类型值,length,指定了数据的长度,当你接收到一个数据包到时候,你要解析获取其中的数据,获取多少呢?这个字段的作用就在这。
第三个字段就是我们的数据本身了,没有额外的标识,这个地方数据一般都是序列化后的数据,比如一个字符串的二进制字节数据。
一般我们如果使用C语言,可以定义一个类似如下的结构体:
structTLV {
uint8_t type; // 1 字节类型
int length; // 长度,int 类型
std::vector<uint8_t> value; // 值,字节数组
TLV(uint8_t t, const std::vector<uint8_t>& v)
: type(t), length(static_cast<int>(v.size())), value(v) {}
}; // by gpt
应用
C2当中一般在进行命令传输以及结果回显获取中,通过tlv可以很好的规范化数据,一般我们获取被控机器的基本信息,比如获取机器用户名,机器名,ip地址,我们就可以把获取到的数据封装成单个的tlv数据包,再结合起来。
使用TLV也同时方便后续的扩展,因为C2开放的本质其实就是开发网络通信,假如你的项目别人接手了,或者说别人想拓展一些功能,但是通信还是沿用你的,使用tlv就很方便易懂,效率也很高,代码可读性啥的都会很好。
使用TLV也完全不会影响通信的加解密,你可以整个数据包加密,也可以对其中的数据字段做加密都是可以的。
rasta-mouse有一个项目,用于提供一种C2通信规范:
https://github.com/rasta-mouse/OST-C2-Spec
这个某种程度上也是TLV的一种应用,将各种任务进行标记独立,并封装在格式化数据包中,这个项目做的比较细化,对每个命令都做了细化单独处理,比如文件的读写删除等等,也可以在此基础上修改,找到符合自己的一种通信规范。
推荐阅读
-
• <a "https:="" href="https://mp.weixin.qq.com/s?__biz=MzkzMDgyMTM1Ng==&mid=2247484968&idx=1&sn=b9ba907250ae13f1fedd2ef2200e9ded&scene=21#wechat_redirect" title="红队研发:编写一个屏幕 Monitor 程序">红队研发:编写一个屏幕 Monitor 程序 -
• <a "https:="" href="https://mp.weixin.qq.com/s?__biz=MzkzMDgyMTM1Ng==&mid=2247484959&idx=1&sn=80aa30e9e097b748ac86ff032e7de6ee&scene=21#wechat_redirect" title="红队开发:让自己的Shellcode实现SMC">红队开发:让自己的Shellcode实现SMC -
• <a "https:="" href="https://mp.weixin.qq.com/s?__biz=MzkzMDgyMTM1Ng==&mid=2247484931&idx=1&sn=de2469fc2b52e70cd19d357281c98d24&scene=21#wechat_redirect" title="外网露出:新版 CobaltStrike 顶级免杀套件Arsenal kit">外网露出:新版 CobaltStrike 顶级免杀套件Arsenal kit -
• <a "https:="" href="https://mp.weixin.qq.com/s?__biz=MzkzMDgyMTM1Ng==&mid=2247484847&idx=1&sn=567bad022144ae165398c9632dcbc030&scene=21#wechat_redirect" title="部署属于自己的EDR对抗环境原创">部署属于自己的EDR对抗环境原创
原文始发于微信公众号(黑晶):红队C2数据通信之TLV模型
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论