dns list feature + timeout

This commit is contained in:
pushfs
2023-09-01 20:14:58 +02:00
committed by Sol Fisher Romanoff
parent cbeb66631c
commit 355d8a7f81
4 changed files with 111 additions and 6 deletions

View File

@@ -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)

81
cmd/dnslist.go Normal file
View File

@@ -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)
}
}
}

View File

@@ -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,
}
}

12
main.go
View File

@@ -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)
}
}
}