mirror of https://github.com/daffainfo/nuclei.git
51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package generators
|
|
|
|
// ClusterbombGenerator Attack - Generate all possible combinations from an input map with all values listed
|
|
// as slices of the same size
|
|
func ClusterbombGenerator(payloads map[string][]string) (out chan map[string]interface{}) {
|
|
out = make(chan map[string]interface{})
|
|
|
|
// generator
|
|
go func() {
|
|
defer close(out)
|
|
var order []string
|
|
var parts [][]string
|
|
for name, wordlist := range payloads {
|
|
order = append(order, name)
|
|
parts = append(parts, wordlist)
|
|
}
|
|
|
|
var n = 1
|
|
for _, ar := range parts {
|
|
n *= len(ar)
|
|
}
|
|
|
|
var at = make([]int, len(parts))
|
|
loop:
|
|
for {
|
|
// increment position counters
|
|
for i := len(parts) - 1; i >= 0; i-- {
|
|
if at[i] > 0 && at[i] >= len(parts[i]) {
|
|
if i == 0 || (i == 1 && at[i-1] == len(parts[0])-1) {
|
|
break loop
|
|
}
|
|
at[i] = 0
|
|
at[i-1]++
|
|
}
|
|
}
|
|
// construct permutation
|
|
item := make(map[string]interface{})
|
|
for i, ar := range parts {
|
|
var p = at[i]
|
|
if p >= 0 && p < len(ar) {
|
|
item[order[i]] = ar[p]
|
|
}
|
|
}
|
|
out <- item
|
|
at[len(parts)-1]++
|
|
}
|
|
}()
|
|
|
|
return out
|
|
}
|