最近在一次授权渗透测试中遇到了一个棘手的场景,万能的队友已经找到了后台上传点,并传了小马然后开心地用antsword进行连接,但是由于明文传输很快被waf感知,并引起了管理员的注意,很快我们的马被清了,真是偷鸡不成蚀把米。
痛定思痛,我们判断对方并不能尽快修复漏洞,于是临阵抱佛脚,希望于通过加密算法提高攻击的质量。首先要做三件事
第一,迅速在本地复现对方环境
第二,配置多种加密组合成攻击载荷
第三,用开源安全模块modsecurity测试攻击载荷加密后的效果。
本地环境组建
从保留的截图来看,对方的php版本是5.6.40,所以我要搭一个apache+php5.6.40的测试环境。打开virtualbox,链接复制出来一份centos镜像系统,按照以下流程配置一遍。
- 安装apache
1 | yum install -y httpd |
- 安装php5.6
1 | yum -y install epel-release |
做一个index.php用以显示phpinfo(),本机访问时为了测试方便关闭firewalld
1 | systemctl stop firewalld //当然也可以通过firewall-cmd去开放端口 |
- 为了后面查看攻击流量,再装一个wireshark,包含wireshark-gnome等等,直接用*替代了。
1 | yum install wireshark* |
\4. 配置apache-modsecurity手边没有waf设备,没法对流量进行测试,于是用mode-security,以及OWASP(开放Web应用程序安全性项目)核心规则集-CRS进行测试,纵然效果不如实际场景来的直观,但足以说明问题。
1 | yum -y install mod_security |
modsecurity的默认配置是检测到攻击会阻断,我们将它改为只记录。
1 | vim /etc/httpd/conf.d/mod_security.conf |
测试一些攻击向量会在log里看到记录,证明配置完成。环境搭建完成。
攻击流量配置、分析、检测
明文php-webshell配置
首先写个一句话看看明文webshell流量传输。
1 | vim test1.php |
配置蚁剑进行连接
明文流量分析
用wireshark查看测试连接的流量
1 | POST /test1.php HTTP/1.1 |
为了更加清楚antsword发出的流量包,我认真看了一下发的包,并查了一些相关函数,做注释的同时感叹了PHP函数的牛逼,并勾起了我的好奇心,对这几个函数做了本地测试。
1 | <?php |
果然牛逼!和返回包现象保持了一致。同时也说明了如果明文直接进行探测,这种流量在waf面前无异于自投罗网!
明文流量检测
waf测试结果如下:
1 | Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/etc/httpd/modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "708"] [id "920350"] [msg "Host header is a numeric IP address"] [data "192.168.1.13"] [severity "WARNING"] [ver "OWASP_CRS/3.2.0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] |
统计数据如下,匹配规则数按照grep line|wc -l计算
Apache-Error | Message | 匹配规则数 | level |
---|---|---|---|
11 | 11 | 22 | 3 |
接下来我们先测对称密码。
Base64&&rot13 webshell配置
Antsword自带几个可供测试的shell,给我们提供了非常大的方便。
我顺便贴一下代码。先来看看base64的代码
1 | <?php |
Base64&&rot13 流量分析
1 | POST /php_assert_script.php HTTP/1.1 |
base64加密之后的流量除了eval之外至少不会包含那么多的高危函数,加密之后我们再来测试。
Base64&&rot13 webshell流量检测
waf测试结果如下:
1 | Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file |
统计数据如下
Apache-Error | Message | 匹配规则数 | level |
---|---|---|---|
7 | 7 | 14 | 3 |
通过Antsword界面配置rot13加密及解密,抓包看了下流量,仅仅是将base64的加密函数变成了str_rot13
1 | ant=%40eval(%40base64_decode -> ant=%40eval(%40str_rot13( |
拦截数据和base差不多,waf统计数据如下
Apache-Error | Message | 匹配规则数 | level |
---|---|---|---|
10 | 7 | 14 | 3 |
由此可见,对称加密算法下eval、base64,rot13这些函数也是可以触发较高告警等级的。但是相比于明文传输,触发的告警会少一半,于是笔者进一步尝试一下antsword提供的非对称加密算法。
RSA加密流量配置
版本>=2.1.0开始,Antsword作者新增了RSA模式。蚁剑默认下仅支持PHP。另外需要Server开启php_openssl拓展。
1 | 修改php.ini,去掉extension=php_openssl.dll前的注释,重启Apache |
使用方法:
1 | Antsword->系统设置->编码管理->新建编码器->PHP RSA->命名为rsa_php->点击RSA配置->生成 |
1、将下方的php代码copy到虚拟机里,命名为rsa.php
2、配置antsword连接类型选择rsa_php
3、测试连接
RSA加密流量分析
贴上wireshark抓的流量
1 | POST /rsa.php HTTP/1.1 |
经历非对称加密算法之后,整个流量传输的数据除了length之外,肉眼已经分别不出来, 这个效果笔者比较满意.
RSA加密流量检测
1 | Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/etc/httpd/modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "708"] [id "920350"] [msg "Host header is a numeric IP address"] [data "192.168.1.13"] [severity "WARNING"] [ver "OWASP_CRS/3.2.0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] |
waf也只能检测到Host header is a numeric IP address,这基本是说waf对于RSA加密的webshell流量基本没什么防护能力,往后的安全设备检测只能依赖于杀毒软件。
这样的加密程度对笔者本次实验来说已经够用了。但是同样还存在着很多很多的问题,比如绕杀软,混淆代码等等,每一个方向都需要专注、细心、长久的投入。
PS:
隐藏攻击流量也可以通过改UA,设置multi发包,花样过狗过盾甚至过人等等。
过狗千万条,安全第一条,连马不谨慎,队友两行泪。
参考链接: http://www.test666.me/archives/289/ https://www.cnblogs.com/jianmingyuan/p/5900064.html