| skipped 15 lines |
16 | 16 | | "github.com/logrusorgru/aurora" |
17 | 17 | | "github.com/projectdiscovery/iputil" |
18 | 18 | | "github.com/projectdiscovery/mapcidr" |
| 19 | + | "github.com/Ullaakut/nmap/v2" |
19 | 20 | | ) |
20 | 21 | | |
21 | 22 | | type Response struct { |
| skipped 6 lines |
28 | 29 | | } |
29 | 30 | | |
30 | 31 | | var ( |
| 32 | + | nmapScan bool |
31 | 33 | | urls bool |
32 | 34 | | noCPEs bool |
33 | 35 | | noTags bool |
| skipped 18 lines |
52 | 54 | | flag.StringVar(&compareFile, "compare", "", "Compare new results with a JSON file") |
53 | 55 | | flag.BoolVar(&urls, "url", false, "Show only IP and Port") |
54 | 56 | | flag.IntVar(&concurrency, "c", 5, "Concurrency") |
| 57 | + | flag.BoolVar(&nmapScan, "nmap", false, "Run Nmap Service Detection") |
55 | 58 | | flag.Parse() |
56 | 59 | | |
57 | 60 | | var inputs, targets []string |
| skipped 50 lines |
108 | 111 | | if jsonFile == "" && compareFile == "" { |
109 | 112 | | for i := 0; i < len(validData); i++ { |
110 | 113 | | printResult(validData[i]) |
| 114 | + | } |
| 115 | + | if nmapScan { |
| 116 | + | fmt.Println() |
| 117 | + | for i := 0; i < len(validData); i++ { |
| 118 | + | runNmap(validData[i].IP, validData[i].Ports) |
| 119 | + | } |
111 | 120 | | } |
112 | 121 | | } |
113 | 122 | | |
114 | 123 | | if jsonFile != "" { |
115 | 124 | | saveJson(validData, jsonFile) |
| 125 | + | if nmapScan { |
| 126 | + | for i := 0; i < len(validData); i++ { |
| 127 | + | runNmap(validData[i].IP, validData[i].Ports) |
| 128 | + | } |
| 129 | + | } |
116 | 130 | | return |
117 | 131 | | } |
118 | 132 | | |
| skipped 14 lines |
133 | 147 | | |
134 | 148 | | var jsonDatas []Response |
135 | 149 | | oldData := make(map[string]Response) |
| 150 | + | newIpPorts := make(map[string][]int32) |
136 | 151 | | |
137 | 152 | | theFile, err := os.Open(compareFile) |
138 | 153 | | if err != nil { |
| skipped 11 lines |
150 | 165 | | for _, nData := range newData { |
151 | 166 | | oData, isInOld := oldData[nData.IP] |
152 | 167 | | if isInOld { |
153 | | - | compareData(oData, nData) |
| 168 | + | newPorts := compareData(oData, nData) |
| 169 | + | if len(newPorts) != 0 { |
| 170 | + | newIpPorts[nData.IP] = newPorts |
| 171 | + | } |
154 | 172 | | } else { |
155 | 173 | | newPorts := nData.Ports |
| 174 | + | newIpPorts[nData.IP] = newPorts |
156 | 175 | | if urls { |
157 | 176 | | for _, port := range newPorts { |
158 | 177 | | fmt.Println(nData.IP + ":" + fmt.Sprint(port)) |
| skipped 5 lines |
164 | 183 | | } |
165 | 184 | | } |
166 | 185 | | } |
| 186 | + | if len(newIpPorts) != 0 { |
| 187 | + | fmt.Println() |
| 188 | + | } |
| 189 | + | if nmapScan { |
| 190 | + | for ip, ports := range newIpPorts { |
| 191 | + | runNmap(ip, ports) |
| 192 | + | } |
| 193 | + | } |
167 | 194 | | return |
168 | 195 | | } |
169 | 196 | | |
170 | 197 | | |
171 | | - | func compareData(oldData Response, newData Response) { |
| 198 | + | func compareData(oldData Response, newData Response) []int32 { |
| 199 | + | var newPorts []int32 |
172 | 200 | | if !reflect.DeepEqual(oldData.Ports, newData.Ports) { |
173 | 201 | | for _, nP := range newData.Ports { |
174 | 202 | | isNew := true |
| skipped 9 lines |
184 | 212 | | fmt.Println(newData.IP) |
185 | 213 | | fmt.Println(fmt.Sprint(nP) + "\n") |
186 | 214 | | } |
| 215 | + | newPorts = append(newPorts, nP) |
187 | 216 | | } |
188 | 217 | | } |
189 | 218 | | } |
| skipped 15 lines |
205 | 234 | | } |
206 | 235 | | } |
207 | 236 | | } |
208 | | - | return |
| 237 | + | return newPorts |
209 | 238 | | } |
210 | 239 | | |
211 | 240 | | |
| skipped 137 lines |
349 | 378 | | |
350 | 379 | | fmt.Println(builder.String()) |
351 | 380 | | } |
| 381 | + | |
| 382 | + | func runNmap(target string, intPorts []int32) { |
| 383 | + | |
| 384 | + | ports := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(intPorts)), ", "), "[]") |
| 385 | + | |
| 386 | + | scanner, err := nmap.NewScanner( |
| 387 | + | nmap.WithTargets(target), |
| 388 | + | nmap.WithPorts(ports), |
| 389 | + | nmap.WithServiceInfo(), |
| 390 | + | nmap.WithSkipHostDiscovery(), |
| 391 | + | ) |
| 392 | + | if err != nil { |
| 393 | + | log.Fatalf("unable to create nmap scanner: %v", err) |
| 394 | + | } |
| 395 | + | |
| 396 | + | result, warnings, err := scanner.Run() |
| 397 | + | if err != nil { |
| 398 | + | log.Fatalf("unable to run nmap scan: %v", err) |
| 399 | + | } |
| 400 | + | |
| 401 | + | if warnings != nil { |
| 402 | + | if verbose { |
| 403 | + | log.Printf("Warnings: \n %v", warnings) |
| 404 | + | } |
| 405 | + | } |
| 406 | + | |
| 407 | + | for _, host := range result.Hosts { |
| 408 | + | if len(host.Ports) == 0 || len(host.Addresses) == 0 { |
| 409 | + | continue |
| 410 | + | } |
| 411 | + | for _, port := range host.Ports { |
| 412 | + | fmt.Printf("%s:%d/%s %s %s %s %s %s\n", host.Addresses[0], port.ID, port.Protocol, port.State, port.Service.Name, port.Service.Product, port.Service.ExtraInfo, port.Service.Version) |
| 413 | + | } |
| 414 | + | } |
| 415 | + | } |