发布时间:2019-12-16 11:30:53

一、简介

Domain Fronting,中文译名 “域前置” 或 “域名前置”,是一种用于隐藏真实C2服务器IP且同时能伪装为与高信誉域名通信的技术,多用于木马受控端和控制端之间的隐蔽通信。

简言之,利用该技术,可以让受控端以为程序是在和一个高信誉域名通信,但实际上却是在和我们的C2服务器进行通信,效果如下:

全球著名的俄罗斯军方黑客组织 APT29 也曾被披露使用这项技术来逃避IDS的审查。

Domain Fronting 的技术原理图如下,在下面的 “原理” 一节中我们会详细解释该技术。

在这篇文章中,我们将基于国内某云来实践该技术,为什么说某云,而不指名道姓说出来?因为该厂商云的 CDN 有一个非常有意思的特性(下面会讲解),可很好的辅助我们进行红队测试,但知道这点的人不多,所以,到底是哪个云厂商,就交由各位凭借自身的信息检索和情报提取能力来判断了,在文章中会出现相关线索。但需要注意的是,除去这一特性后,本篇文章依然在所有云上通用。
 

二、原理

Domain Fronting 的核心技术是 CDN,所以我们先来了解下 CDN 的工作机制。

一般情况下,1台 CDN 会同时负责多个网站的加速服务,那问题来了:如果我访问的两个网站(a.com 和 b.com)都是由同1台 CDN 服务器(1.1.1.1)进行加速服务,那么当我使用浏览器访问这两个域名时,浏览器实际上访问的都是 1.1.1.1 这台 CDN 服务器,但我在浏览器访问的域名有可能是 a.com 也可能是 b.com,所以 1.1.1.1 这台 CDN 服务器必须清楚地知道我访问的是哪个域名,然后才能给我返回对应域名的内容,那 CDN 是如何知道我访问的是哪个域名呢?

答案就是在和 CDN 服务器通信时,在 HTTP 请求包的 Host 头中填入我们要访问的域名。

下面以1个真实例子进行讲解。

这里对两个网站执行 nslookup,可以发现它们使用的都是同样的一批 CDN 服务器。

对 klst.96jm.com 进行请求,返回的状态码为 301,

对 www.shhorse.com.cn 进行请求,返回的状态码为 302,

然后对它们其中共同的一台 CDN 服务器进行请求,并且设置 Host 头为 www.shhorse.com.cn,

可以发现,返回的结果和我们请求 www.shhorse.com.cn 时返回的结果一模一样,这说明我们依然成功请求到了 www.shhorse.com.cn,虽然我们请求的主机是 CDN 服务器。

由此可见,即使直接请求 CDN,只要 Host 头中带有想要访问的域名,CDN 就能知道你想和哪个域名通信,进而就能让你和指定的域名互相传送内容。

又由于我们访问 klst.96jm.com 时实际上访问的也是 125.94.49.222 这台CDN服务器,所以下面这样也是可行的,

可以看到,效果和上面直接请求 CDN 服务器一样,依然成功访问到了 www.shhorse.com.cn 这个域名下,而非表面上访问的 klst.96jm.com。

以上就是技术原理,只不过在 Domain Fronting 实战中,Host 头一般被设置为高信誉的域名(或者我们自己申请的 “形似” 高信誉域名的域名)。

另外,我们也可以知道,因为 CDN 的存在,我们访问网站时访问的实际上只是 CDN,而不是直接和网站的真实服务器进行通信,所以利用 CDN 的同时也可以隐藏我们真实C2服务器的 IP。

三、实践

了解原理后,我们通过 Cobalt Strike 来实践 Domain Fronting,这里笔者使用的 Cobalt Strike 版本为 3.14,服务器系统为 Ubuntu 16.04 x64。

正常情况下,第一步我们要做的是先申请一个域名(这个域名的作用是用来配合 CDN 来隐藏我们的C2服务器),然后再申请一个CDN对我们的所申请的域名进行加速,在这个过程中CDN会要求我们在域名的解析配置中设置相应的 CNAME。

但由于某云有一个有趣的特点:当 CDN 配置中的源 IP 为自己云的服务器时,加速时会跳过对域名的检验,直接与配置中的域名绑定的源服务器IP进行通信。利用该特性,我们不需要真正去申请 CDN 时所填写的域名中配置解析相应的 CNAME 了。换言之,只要我们的C2服务器属于该云的服务器,那么我们就无需申请域名,只需要在申请 CDN 时随便填一个没有人绑定过的域名就好了,而且这个域名我们可以填成任何高信誉的域名,例如 test.microsoft.com、oops.microsoft.com…

接下来我们直接去申请 CDN 即可,这里笔者把域名填为 fuck.microsoft.com。

(红色涂抹处填成你在该云C2服务器的公网IP)

点击下一步申请完成,一开始申请状态为这样:

等几分钟,就可以了,

CDN 申请完成后,就可以开始编辑 Cobalt Strike 要用到的 C2 Profile 文件了,我们直接使用开源项目 Malleable-C2-Profiles 中的 amazon.profile,但需要把其中的 Host 头改成我们自己在 CDN 中绑定的域名,如图:

(文件链接:amazon.profile

修改成自己的域名后,在服务器上启动 teamserver,别忘记加上配置文件的选项,

(注意:这里在命令前加了个 nohup 指令,这是为了在关闭这个 Shell 后,teamserver 依然能继续运行,如果没加上 nohup 的话,在关闭这个 ssh shell 后,本次会话中启动的所有程序都将随着 shell 的关闭一起终止)

然后关闭系统自带的防火墙,让外部能访问进来。笔者使用的是 Ubuntu 16.04,所以执行 ufw disable 就把防火墙关掉了,读者可根据自己的系统来执行相应操作关闭防火墙。

需要注意的是,除了系统自带的防火墙外,部分云服务器的实例中仍带有额外的防火墙规则,如果系统防火墙都关掉了还是访问不到相关端口,那么十有八九就是这玩意在作怪。这里笔者的云服务器就有这功能,我直接添加了本次实践要配置的入站规则(即允许了 50050 和 80 端口),

然后我们打开 Cobalt Strike 的 web日志 视图,在 cmd 中用 curl 执行以下操作(域名换成你自己的,原理在第一节已经讲过):

然后如果在 Cobalt Strike 的 web日志 中能看到对应请求信息,则说明配置成功:

上面都搞好后,就可以在 Cobalt Strike 中开搞了,首先创建一个 Listener,

申请 CDN 时绑定的是 80 端口,所以此处的端口也填 80,主机则填申请 CDN 时所绑定的域名,点击 Save 后会让弹出一个框,让我们填一个 beacon 通信的地址,我们直接填上该云任意一个CDN服务器的地址即可,

创建完成后如图所示:

Listener创建完成后,就可以开始创建 Agent 了,但由于使用了 Domain Fronting 技术,Cobalt Strike 默认生成的 Agent 会崩溃,因此我们需要一个针对 Domain Fronting 技术进行定制化的 Agent Generator,这个已经有人写好了:CACTUSTORCH

把整个项目下载下来,解压到任意目录,然后在 Cobalt Strike 中打开脚本管理器,点击Load,找到刚刚下载的项目中的 cna 文件,点击OK,整个项目的脚本就成功加载到 Cobalt Strike 中了,

加载成功后,我们找到 “攻击” 菜单,可以发现最后多出了1个选项,这就是我们需要的 Agent Generator,

点击该选项,即可生成 Agent,

这里我生成 HTA 类型的 Agent,红色涂抹处填写你的C2服务器公网IP,Listener 选择之前创建的 HTTP-DF-C2,点击开始即可得到 payload的 下载地址,

然后我们在目标主机上执行该 Payload,同时打开 Wireshark 进行抓包,

可以发现,已经成功伪装成我们的高信誉域名。同时,Cobalt Strike 中也可以看到目标主机已经成功上线,

另外,我们在目标主机使用 Wireshark 过滤与真实C2服务器的通信,可以发现没有任何与真实主机的通信,至此,说明我们成功实现了 Domain Fronting 技术。

四、总结

总结下来,实施 Domain Fronting 大致分为以下几步:

1. 申请域名

2. 申请CDN,加速上一步申请的域名

3. 使用 curl 加上 Host 头访问CDN,测试是否成功

4. 编辑好 C2 Profile 文件,作为 teamserver 中的一个选项运行之

5. 使用特制的 Agent Generator 生成 Payload

6. 在目标主机中运行 Payload

可以发现,利用 Domain Fronting 技术,在目标主机上只能看到系统是在和一个高信誉域名通信,并且不会产生任何与我们真实C2服务器的直接通信流量,伪装的同时还极佳地隐藏了我们的C2服务器,利用此技术,我们可以有效地躲避各种IDS,实施红队测试。

基于国内某云的 Domain Fronting 技术实践的更多相关文章

  1. 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践

    对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...

  2. 腾讯云CDB的AI技术实践:CDBTune

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:邢家树,高级工程师,目前就职于腾讯TEG基础架构部数据库团队.腾讯数据库技术团队维护MySQL内核分支TXSQL,100%兼容原生My ...

  3. 【安全研究】Domain fronting域名前置网络攻击技术

    出品|MS08067实验室(www.ms08067.com) 千里百科 Domain Fronting基于HTTPS通用规避技术,也被称为域前端网络攻击技术.这是一种用来隐藏Metasploit,Co ...

  4. 阿里云基于OSS的云上统一数据保护方案2.0技术解析

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源. 阿里云基于 ...

  5. 基于Unity3D云人脸监測技术

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师.CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  6. Android IOS WebRTC 音视频开发总结(六三)-- 2016国内IM云服务行业分析

    本文主要国内IM云服务行业分析,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 谈到IM我们最先想到的是qq和微信 ...

  7. 腾讯云GAME-TECH游戏开发者技术沙龙(深圳)开启报名啦~

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:由腾讯游戏云发表在云+社区 腾讯云GAME-TECH沙龙继1月杭州站后,将于3月30日来到深圳站,与游戏厂商和游戏开发者,畅聊游戏安 ...

  8. 融云技术分享:融云安卓端IM产品的网络链路保活技术实践

    本文来自融云技术团队原创分享,原文发布于“ 融云全球互联网通信云”公众号,原题<IM 即时通讯之链路保活>,即时通讯网收录时有部分改动. 1.引言 众所周知,IM 即时通讯是一项对即时性要 ...

  9. 技术沙龙|京东云DevOps自动化运维技术实践

    自动化测试体系不完善.缺少自助式的持续交付平台.系统间耦合度高服务拆分难度大.成熟的DevOps工程师稀缺,缺少敏捷文化--这些都是DevOps 在落地过程中,或多或少会碰到的问题,DevOps发展任 ...

随机推荐

  1. 【linux】阿里云防火墙相关

    1. 需现在阿里云安全组策略中开启相应端口,80.3306等. 2. 想用外网访问3306需开启权限,进入mysql键入 GRANT ALL PRIVILEGES ON *.* TO 'myuser' ...

  2. Hadoop(五):HDFS的JAVA API基本操作

    HDFS的JAVA API操作 HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 主 ...

  3. 路由与交换,cisco路由器配置,基础知识点(一)

    基础知识点 1.路由器与交换机端口初始化区别 路由器的所有接口默认都是关闭的 交换机的所有接口默认都是打开的 2.路由器 fastEthernet 端口 fastEthernet 0/0 第一个0代表 ...

  4. JAVA debug 调试demo

    1.设置断点,在代码的行号后面鼠标左键即可2.想要看调用方法的执行流程,那么调用方法也要加断点. package day6_debug; /* * 1.设置断点,在代码的行号后面鼠标左键即可 * 2. ...

  5. 几行代码实现cookie的盗取

    前言 上一篇文章中介绍了XSS(跨站脚本攻击)简单原理与几种类型.接下来通过实例用几行代码实现cookie的盗取. 正文 这里测试用的工具是DVWA(可以本地搭建,前面文章有介绍),和phpstudy ...

  6. Linux C++ 网络编程学习系列(3)——多路IO之poll实现

    poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/poll 源码说明: server.cpp: 监听127.1:6666,功能是 ...

  7. Redis学习二:Redis高并发之主从模式

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 前面已经学习了Redis的持久化方式,接下来开始学习Redi ...

  8. 动态规划_基础_最长公共子序列_多种方法_递归/dp

    D: 魔法少女资格面试 题目描述 众所周知,魔法少女是一个低危高薪职业.随着近年来报考魔法少女的孩子们越来越多,魔法少女行业已经出现饱和现象!为了缓和魔法少女界的就业压力,魔法少女考核员丁丁妹决定增加 ...

  9. Python变量详解

    Python变量详解 目录 Python变量详解 一.变量的定义 二.变量组成的三部分 2.1 变量名 2.1.1 变量名的命名规范 2.1.2 变量名的命名风格 2.2 赋值符号 2.3 变量值 三 ...

  10. 【jmeter】JDBC请求循环调用的问题

    今天使用jdbc请求从数据库取数据,多次请求使用了循环控制器,但是结果第一个jdbc请求返回值正确,第二次请求返回值为空. 1.从其他博客中得知,需要在jdbc connection configur ...