@@ -23,38 +23,52 @@ add www, mx, mail....
2323// structure to store a domain and its edges
2424type DomainNode struct {
2525 Domain string
26- Depth int
26+ Depth uint
2727 Neighbors * []string
2828}
2929
3030// vars
3131var conf = & tls.Config {InsecureSkipVerify : true }
3232var markedDomains = make (map [string ]bool )
3333var domainGraph = make (map [string ]* DomainNode )
34- var timeout time.Duration
34+ var depth uint
35+
36+ // flags
3537var port string
38+ var timeout time.Duration
3639var verbose bool
37- var depth int
38- var maxDepth int
39- var parallel int
40+ var maxDepth uint
41+ var parallel uint
4042
4143func main () {
42- host := flag .String ("host" , "localhost" , "Host to Scan" )
43- flag .StringVar (& port , "port" , "443" , "Port to connect to" )
44- timeoutPtr := flag .Int ("timeout" , 5 , "TCP Timeout in seconds" )
45- flag .BoolVar (& verbose , "verbose" , false , "Verbose logging" )
46- flag .IntVar (& maxDepth , "depth" , 20 , "Maximum BFS depth to go" )
47- flag .IntVar (& parallel , "parallel" , 10 , "Number of certificates to retrieve in parallel" )
44+ flag .StringVar (& port , "port" , "443" , "tcp port to connect to" ) // TODO make uint
45+ timeoutPtr := flag .Uint ("timeout" , 5 , "tcp timeout in seconds" )
46+ flag .BoolVar (& verbose , "verbose" , false , "verbose logging" )
47+ flag .UintVar (& maxDepth , "depth" , 20 , "maximum BFS depth to go" )
48+ flag .UintVar (& parallel , "parallel" , 10 , "number of certificates to retrieve in parallel" )
49+ flag .Usage = func () {
50+ fmt .Fprintf (os .Stderr , "Usage of %s: [OPTION]... HOST...\n " , os .Args [0 ])
51+ flag .PrintDefaults ()
52+ }
4853
4954 flag .Parse ()
55+ if flag .NArg () < 1 {
56+ fmt .Fprintln (os .Stderr , "Pass at least one domain to scan" )
57+ flag .Usage ()
58+ return
59+ }
5060 if parallel < 1 {
5161 fmt .Fprintln (os .Stderr , "Must enter a positive number of parallel threads" )
62+ flag .Usage ()
5263 return
5364 }
5465 timeout = time .Duration (* timeoutPtr ) * time .Second
55- startDomain := strings .ToLower (* host )
66+ startDomains := flag .Args ()
67+ for i := range startDomains {
68+ startDomains [i ] = strings .ToLower (startDomains [i ])
69+ }
5670
57- BFS (startDomain )
71+ BFS (startDomains )
5872
5973 v ("Done..." )
6074
@@ -63,7 +77,7 @@ func main() {
6377 v ("Graph Depth:" , depth )
6478}
6579
66- // Verbose Log
80+ // verbose log
6781func v (a ... interface {}) {
6882 if verbose {
6983 fmt .Fprintln (os .Stderr , a ... )
@@ -120,19 +134,21 @@ func printGraph() {
120134}
121135
122136// perform Breadth-first_search to build the graph
123- func BFS (root string ) {
137+ func BFS (roots [] string ) {
124138 var wg sync.WaitGroup
125139 domainChan := make (chan * DomainNode , 5 )
126140 domainGraphChan := make (chan * DomainNode , 5 )
127141
128142 // thread limit code
129143 threadPass := make (chan bool , parallel )
130- for i := 0 ; i < parallel ; i ++ {
144+ for i := uint ( 0 ) ; i < parallel ; i ++ {
131145 threadPass <- true
132146 }
133147
134- wg .Add (1 )
135- domainChan <- & DomainNode {root , 0 , nil }
148+ for _ , root := range roots { // TODO test
149+ wg .Add (1 )
150+ domainChan <- & DomainNode {root , 0 , nil }
151+ }
136152 go func () {
137153 for {
138154 domainNode := <- domainChan
0 commit comments