SSH作内网穿透促进Cobalt Strike+Metasploit联动

Cobalt Strike和Metasploit的适用场景

Metasploit算是我最早接触的神器之一了,相对比较熟悉,而Cobalt Strike(以下简称CS)是最近才开始玩的。

尽管之前已经久闻CS的大名,但是以为自己掌握了Metasploit就已经够用了,就一直没怎么去研究它。

而最近用起来才发现,CS着实有许多自己的独到之处。

例如CS的团队协作模式与其使用C/S架构,真的十分方便

例如Beacon的通信方式——异步和交互式,前者隐蔽,后者高效

总体感觉上,CS在控制方面比较稳定,隐蔽,用来做远控管理十分便捷。

而Metasploit在内网中横向移动则是如鱼得水,这一点CS要逊色几分.

尽管CS上一些强大的脚本可以弥补些许,但终究不如Metasploit用得畅快。

基于上面提到的特性,如果能将两者结合使用,自然是最好不过了。

这里我简单记录一下实战中较常用的联动场景

场景描述

假设:

我们在CS中已经获得一台上线机器,现在想把这台机器丢给Metasploit让meterpreter获得一个session。

通常情况下,攻击机和受害机分别处于两个不同的内网,中间通过CS的公网团队服务器进行沟通。

针对这种情况,要想让内网中的受害机能反弹session到同样身处内网的攻击机,我们可以用上端口转发

端口转发

很早前就写过关于端口转发的文章,当时主要用Netcat做的实验,不得不说,小小的Netcat是真的强大,不愧被称为“瑞士军刀”。

当时主要参考了下面的“三部曲”:
http://www.hackingtutorials.org/networking/hacking-with-netcat-part-1-the-basics/
http://www.hackingtutorials.org/networking/hacking-netcat-part-2-bind-reverse-shells/
http://www.hackingtutorials.org/networking/hacking-with-netcat-part-3-advanced-techniques/

中文版:
http://www.freebuf.com/column/135007.html

建议有能力还是看英文原版吧,翻译有些地方不是很准确,当时第一眼看到的是中文版,复现过程卡在了某一点上,最后找到了原版才解决的。

不过今天我打算用SSH来作端口转发,为什么选择SSH呢?

  1. 取材方便,多数Linux系统是不带nc的,但是都会有SSH。

  2. SSH会自动加解密客户端与服务端之间的所有网络数据,安全性高。

  3. SSH的功能更加强大与全面,用来做端口转发十分灵活。

借助SSH,我们可以完成本地端口转发、远程端口转发、动态端口转发、链式端口转发以及X转发,本文主要用到远程端口转发

那什么是远程端口转发呢?

结合命令:

1
ssh -R 远程地址:远程端口:目标地址:目标端口 服务器IP

简单来说,就是将发送到远程端口的请求,转发到目标端口

关于其他类型的转发,建议边画图边理解,吃透了本地和远程端口转发的区别,其他类型就能举一反三了。

基础知识可以参考IBM的一篇文章:实战 SSH 端口转发

结合之前的场景描述,捋一捋这次的转发目的——将内网攻击机的某一端口转发到公网机器上,使得另一内网中的受害机发送的流量经由公网机器能抵达攻击机从而建立连接。

最后我的转发命令就是下面这个样子:

1
ssh -NfR *:7776:localhost:7777 root@ip

解释一下:

  • N参数表示只连接远程主机,不打开shell
  • f参数表示连接成功后转入后台,这样可以保证不中断连接情况下本地执行其他命令

如果仅仅是这样的话,你登入远程主机后会发现:

netstat.png

出入安全考虑,默认远程端口是绑定在本地的,只允许在本机访问,另一内网中的受害机无法访问到该端口

那么怎么让别的主机也能使用这一端口呢?

关于这一点,SSH提供了GatewayPorts关键字

官方描述:

GatewayPorts Specifies whether remote hosts are allowed to connect to ports forwarded for the client. By default, sshd binds remote port forwardings to the loopback address. This prevents other remote hosts from connecting to forwarded ports. GatewayPorts can be used to specify that sshd should allow remote port forwardings to bind to non-loopback addresses, thus allowing other hosts to connect. The argument may be no to force remote port forwardings to be available to the local host only, yes to force remote port forwardings to bind to the wildcard address, or clientspecified to allow the client to select the address to which the forwarding is bound. The default is no.

只需要在SSH服务端的配置文件sshd_config中将该关键字的值改为yes,如果没有该关键字就如下添加一行:

1
GatewayPorts yes

注意:

  • 这一修改需要在ssh server端进行,与client无关!

  • 修改完后记得service ssh reload

测试一下:

test.png

至此我们便成功的将内网端口映射到了公网上

最后在CS中对目标机器右键新建spwan新建一个listener

采用foreign/reverse_http类型的payload并在MSF中开启相应的监听器就好了

讲到这,相信大家也能想到,利用这一方法,任何你能想到的公网应用都可以搭建在内网本地了,最常见的比如web服务等

其他工具

关于内网穿透,其实还有很多常用的工具

比如ngrok,我常用免费版来搭建一些临时的内网服务,不需要用到自己的VPS,适用于特定场景,蛮方便

比如socat,一款高级端口转发工具,也可以建立各种隧道,功能强大

还有许多一键式的工具可以在Github上找到,无需理解原理,操作便捷

总结

这次主要讲了下端口转发的相关内容,关于CS和MSF的技巧反倒没怎么提及。

实际上二者的联动还有多种场景,比如meterpreter中的session想传给CS,或者CS获得上线机器后想在MSF中继续横向渗透而不用获取session等

前者可以用MSF中的inject payload来做,后者可以借助CS的socks4a服务

值得一提的是,MSF中的route add功能远不如CS提供的socks4a协议稳定

说到底都是些工具的使用,用多了自然熟能生巧,真正的大头还是涉及到工具原理

比如payload的免杀,CS的C2通信问题,本地权限提升,持久化方式等等

本来是想先把免杀的文章写出来的,但是尝试了很多方法后发现还是源码级的免杀效果比较好,受水平限制,免杀部分得往后推迟些了。

另外通过最近对一些开源工具的源码分析,学习到了很多优秀的工具思想和编程技巧,后面会陆陆续续放出些源码分析相关的文章(立个FLAG!)

敬请期待吧!