掌阅iReader某站Python漏洞挖掘

Python作为新一代的web开发语言,不少互联网公司内外网使用其开发站点。Python web周边还存在redis、memcached、mongod、supervisord等等服务,我们结合这些服务的一系列安全问题,将可以做很多有趣的事情。

目标端口开放了 6379、8080~8086、8889、8079

首先,8080~8086、8889都是web服务,而且是一个站,6379是redis、8079是一个web服务但有http基础认证。

逐一击破。

  • 8080~8086、8889:存在弱口令admin – admin1234
  • 6379:存在redis未授权访问
  • 8079:存在弱口令user – 123,登录查看发现是Supervisord管理页面

从易到难,先看redis,也许可以直接通过redis拿下root。

redis已经被人扫过,写过公钥:

自动草稿

写入/root/.ssh/和/root/目录提示如下:

可能是redis被降权了。再试一下写crontab。

p2

可能真是被降权了。

我们看看redis里面放了些什么:

p3

看这个(dp1\nS\'user\'\np2\nI7\ns.,长的就像python里的Pickle。而Pickle是可以执行python代码的。

所以,屡一下思路:

  1. 网站是python开发的
  2. redis可写文件,但权限有限
  3. redis中存着序列化字符串,可能是被用作session
  4. python反序列化过程中可以执行代码

所以,我想到如下两个思路:

  1. 利用redis写一个python的webshell
  2. 利用反序列化直接执行python代码

明显,第一种方法需要 1.知道web路径 2.redis有权限写web目录 3.可能要重启web服务(但因为我们有Supervisord管理权限,所以重启服务也不难)

第二种方法较为实际。所以,我写一个python pickle反序列化利用的脚本:

执行这个脚本,就可以向*.*.*.*:6379的redis中写一个key为e6c36e69a9cf9543243d7921aa1a3d8093b49441,值为序列化字符串的session。

然后我们来到http://*.*.*.*:8080,将cookie设置为session_id=e6c36e69a9cf9543243d7921aa1a3d8093b49441;刷新页面,那边的shell就弹好了:

p4

分析一下它的nginx,可以发现他是将python程序开在8081~8086的端口上,并用nginx监听8889端口反向代理做负载均衡(感觉有点画蛇添足):

supervisord 存在弱口令

p5

基本可以确定这个站和掌阅有关系:

p6

邮箱一枚:

p7

git log可查看提交日志:

p8

然后简单看看代码,就发现一处未授权修改管理密码:

NEED_LOGIN = False,这个类是无需登录就可以访问的类,而修改密码的方法update_password却在这个类里……

只需要传入user_id=xx&password=123456,即可将user_id为xx的用户密码改为123456,试一下(admin的id=7):

p9

登录(admin-123456)OK:

p10

另外,handler/api.py这也是无需登录的类,其中存在多个注入,如:

跟进get_upload_chapter_list:

可见book_id被拼接进where语句了。但前面还需要绕过:md5 = hashlib.md5(client_id SIGN_SECERT book_id).hexdigest()

想必看过这篇文章的同学( https://www.leavesongs.com/PENETRATION/phpwind-hash-length-extension-attack.html )都知道该怎么绕过吧,利用哈希长度扩展攻击。我就不演示绕过了,直接用我读到的key来进行注入:

p11

另外,盲注也有一堆。比如这个盲注:

p12 p13

【via@ph0thon】 注:P牛的博文都不错,推荐关注他的博客。