0%

Breacher-Go高并发管理员后台爆破工具

preface :

Breacher是由python写的多线程管理员后台爆破工具

出于练手的目的,打算用golang重新造个轮子.

github:Breacher-Go

并发:

python里面自然用得多的是多线程.
而go里面自然要用到goroutine

go goroutine

语法:

在Go语言中,每一个并发的执行单元叫作一个goroutine

当一个程序启动时,其主函数即在一个单独的goroutine中运行,我们叫它main goroutine

新的goroutine会用go语句来创建。

在语法上,go语句是一个普通的函数或方法调用前加上关键字go

go语句会使其语句中的函数在一个新创建的goroutine中运行。而go语句本身会迅速地完成。

1
2
f()    // call f(); wait for it to return
go f() // create a new goroutine that calls f(); don't wait

在Go语言中,语言本身就已经实现和支持了并发,所以写起并发来相当方便.

goroutine的优势:

gouroutine其实就是一种协程,类似其他语言中的coroutine, 是在编译器或虚拟机层面上的多任务。

它可以运行在一个或多个线程上,但不同于线程,它是非抢占式的,所以协程很轻量。

简单的并发方案1

简单的做法:

  • 将需要处理的Url分成n等份

  • 开启n个goroutine去消费掉url

  1. 将需要处理的Url分成n等份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func divided(links []string, goroutineNum int) [][]string {
chunkSize := (len(links) + goroutineNum - 1) / goroutineNum

var dividedPath [][]string
for i := 0; i < len(links); i += chunkSize {
end := i + chunkSize

if end > len(links) {
end = len(links)
}

dividedPath = append(dividedPath, links[i:end])
}

return dividedPath

}

2.开启n个goroutine去消费掉url

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dividedLinks := divided(collected_path, 5)

var wg sync.WaitGroup
for _, link := range dividedLinks {
fmt.Printf("%#v\n", len(link))
wg.Add(1) // Increment the WaitGroup counter.
go func(link []string) {
// Launch a goroutine to fetch the link.
scan(start_url, link)
// Fetch the link.
wg.Done()
}(link)
}
wg.Wait() // Wait for all goroutines to finish.

速度比较:

自身速度比较:

go 不用并发消耗的时间:

不同网络环境下的消耗时间:

  1. elapsed time: 1.951978378s (5个goroutine)

  2. elapsed time: 11.353934431s

  3. elapsed time: 35.50535812s (5个goroutine)

  4. elapsed time: 2m32.608078161s

与python的速度比较:

python:
2个线程:74.5581650734s

go:
2个goroutine
elapsed time: 1m10.233281137s

速度几乎是一样的,并非是想象中那样,go会比python快很多.

question: 什么场景下goroutine会比python的thread有优势?


减少误报:

最快的方式:

最快的方式就是用head请求,然后通过response code判断,如果是200则认为存在.

但是这样在实际应用过程中,很有可能会产生大量的误报.

使用御剑爆破网站路径的时候,同理也会产生大量的误报.

例子:

Response code是200

大量误报:

误报结果:

原因:

暂时能想到的原因有:

  • 网站本身会自定义错误或者404页面

  • 网站有防护设备,会自动重定向到别的页面

解决方案:

找到管理员的后台的目的,通常是为了暴力破解,尝试用弱密码进入到管理员的后台.

那么就是有个共同点就是有登录页面

密码框常用到是input标签的 type属性设为password

解决方案:

  • get方法获取登录页面源码

  • Response code 为200的同时,页面源码含有type="password"

结果确实是大大减少了误报

  1. 大字典的情况下,get方法的速度肯定会比head方法慢很多,哎,速度与准确性常常难以并存啊~

  2. 减少误报的同时,则会产生漏报问题…


refs:

question:

  1. 什么场景下goroutine会比python的thread有优势?

  2. 减少误报的同时如何减少漏报?