first commit

This commit is contained in:
Romain J. 2024-03-21 14:48:34 +01:00
commit 42b1d9b657
8 changed files with 284 additions and 0 deletions

11
Makefile Normal file
View file

@ -0,0 +1,11 @@
.PHONY all:
all: lint
go build -gcflags="all=-N -l" -o build/domainscanner && chmod +x build/domainscanner
.PHONY clean:
clean:
rm -rfv build/*
.PHONY lint:
lint:
golangci-lint run .

57
app.go Normal file
View file

@ -0,0 +1,57 @@
package main
import (
"DomainScanners/utils"
"fmt"
"github.com/urfave/cli/v2"
"os"
)
func main() {
app := &cli.App{
Flags: []cli.Flag{
&cli.StringFlag{
Name: "tlds",
Aliases: []string{"t"},
Required: true,
Usage: "File containing TLDs to check",
},
&cli.IntFlag{
Name: "threads",
Aliases: []string{"w"},
Usage: "Number of threads to start",
Value: 12,
},
&cli.BoolFlag{
Name: "detailed",
Aliases: []string{"d"},
Usage: "Whether or not to log IP",
Value: false,
},
&cli.PathFlag{
Name: "output",
Aliases: []string{"o"},
Usage: "Where to put the result",
Value: "/dev/stdout",
},
},
Args: true,
Action: func(cCtx *cli.Context) error {
if cCtx.Args().Len() == 0 {
msg := "No domains has been passed, please see help with --help"
utils.Logger.Info().Msg(msg)
fmt.Println(msg)
} else {
return utils.ProcessCli(cCtx)
}
return nil
},
}
if err := app.Run(os.Args); err != nil {
msg := fmt.Sprintf("Failed to parse args: %s", err.Error())
utils.Logger.Fatal().Msg(msg)
fmt.Println(msg)
}
}

BIN
build/domainscanner Executable file

Binary file not shown.

14
go.mod Normal file
View file

@ -0,0 +1,14 @@
module DomainScanners
go 1.22
require (
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/rs/zerolog v1.32.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/urfave/cli/v2 v2.27.1 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
golang.org/x/sys v0.18.0 // indirect
)

46
go.sum Normal file
View file

@ -0,0 +1,46 @@
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

11
utils/logger.go Normal file
View file

@ -0,0 +1,11 @@
package utils
import (
"github.com/rs/zerolog"
"os"
"time"
)
var Logger = zerolog.New(
zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339},
).Level(zerolog.TraceLevel).With().Timestamp().Caller().Logger()

32
utils/reader.go Normal file
View file

@ -0,0 +1,32 @@
package utils
import (
"bufio"
"os"
)
func ReadFileLines(filePath string, array *[]string) error {
file, err := os.Open(filePath)
if err != nil {
Logger.Error().Msg(err.Error())
return err
}
defer func() {
if closeErr := file.Close(); closeErr != nil && err == nil {
err = closeErr
}
}()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
*array = append(*array, scanner.Text())
}
if err := scanner.Err(); err != nil {
Logger.Error().Msg(err.Error())
return err
}
return nil
}

113
utils/worker.go Normal file
View file

@ -0,0 +1,113 @@
package utils
import (
"fmt"
"github.com/urfave/cli/v2"
"net"
"strings"
"sync"
)
func getData(domain string, logIp bool) string {
ips, _ := net.LookupIP(domain)
var filteredIps []string
for _, ip := range ips {
if !ip.IsLoopback() {
filteredIps = append(filteredIps, ip.String())
}
}
if len(filteredIps) > 0 {
if logIp {
return fmt.Sprintf(
"%s\t%s", domain, strings.Join(filteredIps, " "),
)
}
}
return ""
}
func runWorker(
domain string,
tlds chan string,
logIp bool,
) <-chan string {
results := make(chan string)
go func() {
defer close(results)
for tld := range tlds {
if result := getData(domain+tld, logIp); result != "" {
results <- result
}
}
}()
return results
}
func merge(cs ...<-chan string) <-chan string {
var wg sync.WaitGroup
out := make(chan string)
output := func(c <-chan string) {
defer wg.Done()
for n := range c {
out <- n
}
}
wg.Add(len(cs))
for _, c := range cs {
go output(c)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
func ProcessCli(cCtx *cli.Context) error {
tlds := cCtx.String("tlds")
threads := cCtx.Int("threads")
var tldsList []string
if tlds != "" {
if err := ReadFileLines(tlds, &tldsList); err != nil {
return err
}
}
for argsIndex := 0; argsIndex < cCtx.Args().Len(); argsIndex++ {
domain := cCtx.Args().Get(argsIndex)
if tlds != "" {
domain = domain + "."
}
tldsLine := make(chan string, 1)
workers := make([]<-chan string, threads)
for i := 0; i < threads; i++ {
workers[i] = runWorker(domain, tldsLine, true)
}
for _, tld := range tldsList {
tldsLine <- tld
}
close(tldsLine)
for result := range merge(workers...) {
fmt.Println(result)
}
}
return nil
}