diff --git a/cmd/dirlist.go b/cmd/dirlist.go index 96ecd98..f013dff 100644 --- a/cmd/dirlist.go +++ b/cmd/dirlist.go @@ -5,6 +5,7 @@ import ( "net/http" "os" "strconv" + "time" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" @@ -26,7 +27,7 @@ var directorystyle = lipgloss.NewStyle(). Bold(true). Underline(true) -func Dirlist(size string, url string) { +func Dirlist(size string, url string, timeout time.Duration) { logger := log.NewWithOptions(os.Stderr, log.Options{ Prefix: "Dirlist 📂", @@ -59,7 +60,9 @@ func Dirlist(size string, url string) { } // util.InitProgressBar() - client := &http.Client{} + client := &http.Client{ + Timeout: timeout, + } for _, directory := range directories { log.Debugf("%s", directory) resp, err := client.Get(url + "/" + directory) diff --git a/cmd/dnslist.go b/cmd/dnslist.go new file mode 100644 index 0000000..d5cdc83 --- /dev/null +++ b/cmd/dnslist.go @@ -0,0 +1,81 @@ +package cmd + +import ( + "bufio" + "net/http" + "os" + "strings" + "time" + + "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/log" + // "github.com/pushfs/sif/util" +) + +const ( + dnsURL = "https://raw.githubusercontent.com/pushfs/sif-runtime/main/dnslist/" + dnsSmallFile = "subdomains-100.txt" + dnsMediumFile = "subdomains-1000.txt" + dnsBigFile = "subdomains-10000.txt" +) + +var dnsstyle = lipgloss.NewStyle(). + Bold(true). + Underline(true) + +func Dnslist(size string, url string, timeout time.Duration) { + + logger := log.NewWithOptions(os.Stderr, log.Options{ + Prefix: "Dnslist 📡", + }) + dnslog := logger.With("url", url) + + var list string + + switch size { + case "small": + list = dnsURL + dnsSmallFile + case "medium": + list = dnsURL + dnsMediumFile + case "large": + list = dnsURL + dnsBigFile + } + + dnslog.Infof("Starting %s DNS listing", size) + + resp, err := http.Get(list) + if err != nil { + log.Errorf("Error downloading DNS list: %s", err) + return + } + var dns []string + scanner := bufio.NewScanner(resp.Body) + scanner.Split(bufio.ScanLines) + for scanner.Scan() { + dns = append(dns, scanner.Text()) + } + + // util.InitProgressBar() + + sanitizedURL := strings.Split(url, "://")[1] + + client := &http.Client{ + Timeout: timeout, + } + for _, domain := range dns { + log.Debugf("Looking up: %s", domain) + _, err := client.Get("http://" + domain + "." + sanitizedURL) + if err != nil { + log.Debugf("Error %s: %s", domain, err) + } else { + dnslog.Infof("%s %s.%s", statusstyle.Render("[http]"), dnsstyle.Render(domain), sanitizedURL) + } + + _, err = client.Get("https://" + domain + "." + sanitizedURL) + if err != nil { + log.Debugf("Error %s: %s", domain, err) + } else { + dnslog.Infof("%s %s.%s", statusstyle.Render("[https]"), dnsstyle.Render(domain), sanitizedURL) + } + } +} diff --git a/config.go b/config.go index 45172fc..c0c96df 100644 --- a/config.go +++ b/config.go @@ -3,6 +3,7 @@ package main import ( "bufio" "os" + "time" "github.com/charmbracelet/log" "github.com/spf13/pflag" @@ -11,17 +12,28 @@ import ( type Settings struct { URLs []string Dirlist string + Dnslist string + Debug bool + Timeout time.Duration } func parseURLs() Settings { + var debug = pflag.BoolP("debug", "d", false, "Enable debug logging") + + var timeout = pflag.DurationP("timeout", "t", 10*time.Second, "General http timeout value - Default is 10 seconds") + var url = pflag.StringArrayP("url", "u", []string{}, "URL to check") var file = pflag.StringP("file", "f", "", "File that includes URLs to check") - var dirlist = pflag.String("dirlist", "none", "Dirlist scan size (small, medium, large)") + var dirlist = pflag.String("dirlist", "none", "Directory fuzzing scan size (small, medium, large)") + var dnslist = pflag.String("dnslist", "none", "DNS fuzzing scan size (small, medium, large)") pflag.Parse() if len(*url) > 0 { return Settings{ + Debug: *debug, + Timeout: *timeout, Dirlist: *dirlist, + Dnslist: *dnslist, URLs: *url, } } else if *file != "" { @@ -44,7 +56,10 @@ func parseURLs() Settings { } return Settings{ + Timeout: *timeout, + Debug: *debug, Dirlist: *dirlist, + Dnslist: *dnslist, URLs: urls, } } diff --git a/main.go b/main.go index ca4e73e..3bbc4d2 100644 --- a/main.go +++ b/main.go @@ -26,13 +26,19 @@ func main() { fmt.Println(style.Render(" _____________\n__________(_)__ __/\n__ ___/_ /__ /_ \n_(__ )_ / _ __/ \n/____/ /_/ /_/")) fmt.Println(subline.Render("https://sif.sh - man's best friend")) - log.Info("Hello World!") - settings := parseURLs() + + if settings.Debug { + log.SetLevel(log.DebugLevel) + } + for _, url := range settings.URLs { log.Infof("Looking up %s...", url) if settings.Dirlist != "none" { - cmd.Dirlist(settings.Dirlist, url) + cmd.Dirlist(settings.Dirlist, url, settings.Timeout) + } + if settings.Dnslist != "none" { + cmd.Dnslist(settings.Dnslist, url, settings.Timeout) } } }