Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通信协议API可以上线但命令没有回显 #89

Closed
Richard-Tang opened this issue Jun 15, 2021 · 8 comments
Closed

通信协议API可以上线但命令没有回显 #89

Richard-Tang opened this issue Jun 15, 2021 · 8 comments

Comments

@Richard-Tang
Copy link

能正常上线,但是执行命令没有回显,同时执行命令也没有效果。

这里github只能上传txt,我吧profile和通讯用的demo都改成txt了。

jquery-c2.4.0.profile.txt

c2profile.c.txt

image

命令好像并没有执行,在/tmp/目录下没有看到生成文件

image

大佬能帮忙看一下吗?

@gloxec
Copy link
Owner

gloxec commented Jun 15, 2021

代码中的start和end搜索字符串不必定义那么长,保证唯一性即可:

    char *start = "return-1},P=\"\r";
    char *end = "\".(o=t.documentElement";

查看问题是profile中配置的编码算法与rebind库代码无法匹配:

jquery-c2.4.0.profile.txt:

443:   http-get {
462:       server {    ->    对应cc2_rebind_http_get_recv
                  ...
470:           output {
471:               mask;
472:               base64url;


503:   http-post {
508:       client {    ->    对应cc2_rebind_http_post_send
515:           id {
516:               mask;       
517:               base64url;
518:               parameter "__cfduid";            
519:           }
521:           output {
522:               mask;
523:               base64url;
524:               print;

根据文档可以看到定义

void (*cc2_rebind_http_get_recv)(char *resData, long long resData_len, char **outputData, long long *outputData_len);
`*resData` 是server返回的完整HTTP内容,所以在调用find_payload()后获取到的payload数据为profile中定义的base64url(mask(metadata)),
所以这里的操作应为:
payload=find_payload();
payload = de_url(payload);
payload = de_base64(payload);
payload = de_mask(payload);
payload = en_base64(payload); //最终将解码得到真实元数据在base64编码后回传
outputData = payload;

void (*cc2_rebind_http_post_send)(char *reqData, char *beaconID, char **outputData, long long *outputData_len);
和以上同理,先将传入的base64元数据解码再进行c2profile中对应的操作:
id = de_base64(id);
id = en_mask(id);
id = en_base64(id);
id = en_url(id);
reqData = de_base64(reqData);
reqData = en_mask(reqData);
reqData = en_base64(reqData);
reqData = en_url(reqData);
outputData = sprintf(..., ".....", id, ...,reqData); //最终将编码后的元数封装成HTTP包发送

@gloxec
Copy link
Owner

gloxec commented Jun 15, 2021

这里有一个mask编码的算法,它的算法为

//payload[0,3] 为 mask的key
key = payload;
realPayload = &(payload[4]);
for (int i = 0; i < len(realPayload); ++i) {
    res[i] = realPayload[i] ^ key[i % 4];
}
最终res为mask解密后的数据

@Richard-Tang
Copy link
Author

这里有一个mask编码的算法,它的算法为

//payload[0,3] 为 mask的key
key = payload;
realPayload = &(payload[4]);
for (int i = 0; i < len(realPayload); ++i) {
    res[i] = realPayload[i] ^ key[i % 4];
}
最终res为mask解密后的数据

o.o 现在我还在尝试进行修改,但是mask这里遇到了些问题。这里我用wireshark对cobaltstrike传递的数据包进行了抓取,然后使用payload[0,3]的值作为key进行解密,但是没有解密成功。cobaltstrike的这个mask算法我只在官网上找到了一段简单的描述为xor使用random key。

  1. 有对mask编码算法更为详情介绍的链接地址吗?
  2. 当profile配了mask算法那key一定就是payload[0,3]的位置吗?

@Richard-Tang
Copy link
Author

这里有一个mask编码的算法,它的算法为

//payload[0,3] 为 mask的key
key = payload;
realPayload = &(payload[4]);
for (int i = 0; i < len(realPayload); ++i) {
    res[i] = realPayload[i] ^ key[i % 4];
}
最终res为mask解密后的数据

o.o 现在我还在尝试进行修改,但是mask这里遇到了些问题。这里我用wireshark对cobaltstrike传递的数据包进行了抓取,然后使用payload[0,3]的值作为key进行解密,但是没有解密成功。cobaltstrike的这个mask算法我只在官网上找到了一段简单的描述为xor使用random key。

  1. 有对mask编码算法更为详情介绍的链接地址吗?
  2. 当profile配了mask算法那key一定就是payload[0,3]的位置吗?

我在cobaltstrike源码中已经找到mask编码的实现情况了

@Richard-Tang
Copy link
Author

Richard-Tang commented Jun 17, 2021

这里有一个mask编码的算法,它的算法为

//payload[0,3] 为 mask的key
key = payload;
realPayload = &(payload[4]);
for (int i = 0; i < len(realPayload); ++i) {
    res[i] = realPayload[i] ^ key[i % 4];
}
最终res为mask解密后的数据

o.o 现在我还在尝试进行修改,但是mask这里遇到了些问题。这里我用wireshark对cobaltstrike传递的数据包进行了抓取,然后使用payload[0,3]的值作为key进行解密,但是没有解密成功。cobaltstrike的这个mask算法我只在官网上找到了一段简单的描述为xor使用random key。

  1. 有对mask编码算法更为详情介绍的链接地址吗?
  2. 当profile配了mask算法那key一定就是payload[0,3]的位置吗?

看了大佬的分析文章https://www.52pojie.cn/thread-1426936-1-1.html,wireshark抓取到的payload对着profile的编码顺序进行解密,解密到最后也是aes加密过的数据。看来只能直接硬怼c了。 : )

@gloxec
Copy link
Owner

gloxec commented Jun 19, 2021

cobaltstrike的这个mask算法我只在官网上找到了一段简单的描述为xor使用random key。
2. 当profile配了mask算法那key一定就是payload[0,3]的位置吗?
我在cobaltstrike源码中已经找到mask编码的实现情况了

对的,这个mask算法就是使用payload的前4位作为key,然后进行xor,具体算法可见我贴出的以及cobaltstrike中实现

@gloxec
Copy link
Owner

gloxec commented Jun 19, 2021

wireshark抓取到的payload对着profile的编码顺序进行解密,解密到最后也是aes加密过的数据。看来只能直接硬怼c了。 : )

并不用到那一步,这个数据前后传递就是加密后的,只需要按照profile中的编码方式,将隐藏在HTTP包中的加密payload提取出来即可,beacon以及teamserver内部会进行自解密

@gloxec gloxec closed this as completed Jun 29, 2021
@Richard-Tang
Copy link
Author

我已经编写好了,但是目前还存在一个问题,当执行的命令输出的结果比较大同时目标机器又内存比较小,这样情况下程序会奔。

我这里执行了 shell yum list ,回显后的结果处理的数据大概有6w个字符,同时目标机器内存又比较小,就会出现上边的情况。

大佬有什么解决思路吗?

c2profile.txt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants