/
bruteforce.go
76 lines (59 loc) · 2.04 KB
/
bruteforce.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package cmd
import (
"os"
"github.com/d3mondev/puredns/v2/internal/app"
"github.com/d3mondev/puredns/v2/internal/usecase/programbanner"
"github.com/d3mondev/puredns/v2/internal/usecase/resolve"
"github.com/spf13/cobra"
)
func newCmdBruteforce() *cobra.Command {
cmdBruteforce := &cobra.Command{
Use: "bruteforce <wordlist> domain [flags]\n puredns bruteforce <wordlist> -d domains.txt [flags]",
Short: "Bruteforce subdomains using a wordlist",
Long: `Bruteforce takes a file containing words to test as subdomains against the
domain specified. It will invoke massdns using public resolvers for
a quick first pass, then attempt to filter out any wildcard subdomains found.
Finally, it will ensure the results are free of DNS poisoning by resolving
the remaining domains using trusted resolvers.
The <wordlist> argument can be omitted if the wordlist is read from stdin.`,
RunE: runBruteforce,
}
cmdBruteforce.Flags().StringVarP(&resolveOptions.DomainFile, "domains", "d", resolveOptions.DomainFile, "text file containing domains to bruteforce")
cmdBruteforce.Flags().AddFlagSet(resolveFlags)
cmdBruteforce.Flags().SortFlags = false
return cmdBruteforce
}
func runBruteforce(cmd *cobra.Command, args []string) error {
parseBruteforceArgs(args)
if err := resolveOptions.Validate(); err != nil {
return err
}
bannerService := programbanner.NewService(context)
resolveService := resolve.NewService(context, resolveOptions)
err := resolveService.Initialize()
if err != nil {
return err
}
defer resolveService.Close(context.Options.Debug)
bannerService.PrintWithResolveOptions(resolveOptions)
return resolveService.Resolve()
}
func parseBruteforceArgs(args []string) error {
if app.HasStdin() {
context.Stdin = os.Stdin
if len(args) >= 1 {
if resolveOptions.DomainFile == "" {
resolveOptions.Domain = args[0]
}
}
} else {
if len(args) == 1 {
resolveOptions.Wordlist = args[0]
} else if len(args) >= 2 {
resolveOptions.Wordlist = args[0]
resolveOptions.Domain = args[1]
}
}
resolveOptions.Mode = 1
return nil
}