当前位置:   article > 正文

Python打造漏洞扫描器 4

Python打造漏洞扫描器 4

基于爬虫开发webshell爆破插件与备份扫描

一、实验介绍

1.1 实验内容

看了上节课的的教程,还不过瘾吗?我们再接着来写两个基于爬虫的插件

一个是webshell爆破插件,一个是基于爬虫的备份扫描。

1.2 实验介绍

  1. 列表项我们可以通过爬虫系统调用webshell爆破对每个页面进行1000+字典的爆破,有时候也会有出其不意的效果。
  2. 列表项另外也可以编写一个基于爬虫的备份扫描,这个插件很有必要,一般站长喜欢用文件的命名后门加上.bak,或者其他来备份文件,我们创造一个基于爬虫的备份文件扫描程序来查看是否存在这些程序。

1.3 实验环境

  • Python2.7
  • Xfce终端
  • Sublime

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉python基础知识加深巩固。

1.5 代码获取

你可以通过下面命令将代码下载到实验楼环境中,作为参照对比进行学习。

  1. $ wget http://labfile.oss.aliyuncs.com/courses/761/shiyanlouscan4.zip
  2. $ unzip shiyanlouscan4.zip

1.6 代码运行

$ python w8ay.py

此处输入图片的描述

二、实验步骤

2.1 webhsell爆破插件编写

2.1.1 前言

这个功能虽然在实战的时候比较鸡肋,但有时候也有出奇不意的效果。

在这里我们参考这篇文章:http://www.myhack58.com/Article/60/61/2016/82250.htm

这篇文章提供一个方法可以快速爆破webshell的1000个密码,由这个思路,我们的webshell爆破插件将可以很快检测,不需要多少时间。

2.1.2 代码编写

如果看懂了那篇文章的思路,这里就直接给出代码吧。

script目录中新建webshell_check.py文件。

  1. #!/usr/bin/env python
  2. # __author__= 'w8ay'
  3. #对每个.php结尾的文件进行一句话爆破
  4. import os
  5. import sys
  6. from lib.core.Download import Downloader
  7. filename = os.path.join(sys.path[0],"data","web_shell.dic")
  8. payload = []
  9. f = open(filename)
  10. a = 0
  11. for i in f:
  12. payload.append(i.strip())
  13. a+=1
  14. if(a==999):
  15. break
  16. class spider:
  17. def run(self,url,html):
  18. if(not url.endswith(".php")):
  19. return False
  20. print '[Webshell check]:',url
  21. post_data = {}
  22. for _payload in payload:
  23. post_data[_payload] = 'echo "password is %s";' % _payload
  24. r = Downloader.post(url,post_data)
  25. if(r):
  26. print("webshell:%s"%r)
  27. return True
  28. return False

字典文件随意找个top1000弱密码放到data目录中,命名为web_shell.dic

可以通过 wget 命令获取。

$ wget http://labfile.oss.aliyuncs.com/courses/761/web_shell.dic

2.2 基于爬虫的备份扫描器

2.2.1 前言

很幸运,已经有前辈大牛们为我们造好了轮子:https://github.com/secfree/bcrpscan。当然,轮子造的太好了,我们只需要其中的生成路径部分,简单修改了一下,使输入一个网站路径就可以得出备份文件地址。

此处输入图片的描述

2.2.2 代码编写

script目录下新建bak_check.py

代码:

  1. #!/usr/bin/env python
  2. # __author__= 'w8ay'
  3. from lib.core.Download import Downloader
  4. import sys
  5. import urlparse
  6. DIR_PROBE_EXTS = ['.tar.gz', '.zip', '.rar', '.tar.bz2']
  7. FILE_PROBE_EXTS = ['.bak', '.swp', '.1']
  8. download = Downloader()
  9. def get_parent_paths(path):
  10. paths = []
  11. if not path or path[0] != '/':
  12. return paths
  13. paths.append(path)
  14. tph = path
  15. if path[-1] == '/':
  16. tph = path[:-1]
  17. while tph:
  18. tph = tph[:tph.rfind('/')+1]
  19. paths.append(tph)
  20. tph = tph[:-1]
  21. return paths
  22. class spider:
  23. def run(self,url,html):
  24. pr = urlparse.urlparse(url)
  25. paths = get_parent_paths(pr.path)
  26. web_paths = []
  27. for p in paths:
  28. if p == "/":
  29. for ext in DIR_PROBE_EXTS:
  30. u = '%s://%s%s%s' % (pr.scheme, pr.netloc, p, pr.netloc+ext)
  31. else:
  32. if p[-1] == '/':
  33. for ext in DIR_PROBE_EXTS:
  34. u = '%s://%s%s%s' % (pr.scheme, pr.netloc, p[:-1], ext)
  35. else:
  36. for ext in FILE_PROBE_EXTS:
  37. u = '%s://%s%s%s' % (pr.scheme, pr.netloc, p, ext)
  38. web_paths.append(u)
  39. for path in web_paths:
  40. print "[web path]:%s"%path
  41. if(download.get(path) is not None):
  42. print "[+] bak file has found :%s"%path
  43. return False

效果图

此处输入图片的描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/672319
推荐阅读
相关标签
  

闽ICP备14008679号