1
1
mirror of https://github.com/OJ/gobuster.git synced 2025-07-28 08:54:46 +02:00
gobuster/cli/dns/dns.go
Christian Mehlmauer 7bbf6f2868 update
2025-06-30 09:43:41 +02:00

84 lines
2.9 KiB
Go

package dns
import (
"errors"
"fmt"
"runtime"
"time"
internalcli "github.com/OJ/gobuster/v3/cli"
"github.com/OJ/gobuster/v3/gobusterdns"
"github.com/OJ/gobuster/v3/libgobuster"
"github.com/urfave/cli/v2"
)
func Command() *cli.Command {
cmd := cli.Command{
Name: "dns",
Usage: "Uses DNS subdomain enumeration mode",
Action: run,
Flags: getFlags(),
}
return &cmd
}
func getFlags() []cli.Flag {
var flags []cli.Flag
flags = append(flags, []cli.Flag{
&cli.StringFlag{Name: "domain", Aliases: []string{"do"}, Usage: "The target domain", Required: true},
&cli.BoolFlag{Name: "check-cname", Aliases: []string{"c"}, Value: false, Usage: "Also check CNAME records"},
&cli.DurationFlag{Name: "timeout", Aliases: []string{"to"}, Value: 1 * time.Second, Usage: "DNS resolver timeout"},
&cli.BoolFlag{Name: "wildcard", Aliases: []string{"wc"}, Value: false, Usage: "Force continued operation when wildcard found"},
&cli.BoolFlag{Name: "no-fqdn", Aliases: []string{"nf"}, Value: false, Usage: "Do not automatically add a trailing dot to the domain, so the resolver uses the DNS search domain"},
&cli.StringFlag{Name: "resolver", Usage: "Use custom DNS server (format server.com or server.com:port)"},
&cli.StringFlag{Name: "protocol", Value: "udp", Usage: "Use either 'udp' or 'tcp' as protocol on the custom resolver"},
}...)
flags = append(flags, internalcli.GlobalOptions()...)
return flags
}
func run(c *cli.Context) error {
pluginOpts := gobusterdns.NewOptions()
pluginOpts.Domain = c.String("domain")
pluginOpts.CheckCNAME = c.Bool("check-cname")
pluginOpts.Timeout = c.Duration("timeout")
pluginOpts.WildcardForced = c.Bool("wildcard")
pluginOpts.NoFQDN = c.Bool("no-fqdn")
pluginOpts.Resolver = c.String("resolver")
pluginOpts.Protocol = c.String("protocol")
if pluginOpts.Resolver != "" && runtime.GOOS == "windows" {
return errors.New("currently can not set custom dns resolver on windows. See https://golang.org/pkg/net/#hdr-Name_Resolution")
}
if pluginOpts.Protocol != "udp" && pluginOpts.Protocol != "tcp" {
return errors.New("protocol must be either 'udp' or 'tcp'")
}
if pluginOpts.Protocol != "udp" && pluginOpts.Resolver == "" {
return errors.New("custom protocol can only be set if a custom resolver is set")
}
globalOpts, err := internalcli.ParseGlobalOptions(c)
if err != nil {
return err
}
plugin, err := gobusterdns.New(&globalOpts, pluginOpts)
if err != nil {
return fmt.Errorf("error on creating gobusterdns: %w", err)
}
log := libgobuster.NewLogger(globalOpts.Debug)
if err := internalcli.Gobuster(c.Context, &globalOpts, plugin, log); err != nil {
var wErr *gobusterdns.WildcardError
if errors.As(err, &wErr) {
return fmt.Errorf("%w. To force processing of Wildcard DNS, specify the '--wildcard' switch", wErr)
}
log.Debugf("%#v", err)
return fmt.Errorf("error on running gobuster on %s: %w", pluginOpts.Domain, err)
}
return nil
}