Add port scanning

This commit is contained in:
Sol Fisher Romanoff
2023-09-02 16:29:20 +03:00
parent 2d2f29432e
commit 867c3dff52
4 changed files with 93 additions and 3 deletions

View File

@@ -17,3 +17,7 @@ var directorystyle = lipgloss.NewStyle().
var dnsstyle = lipgloss.NewStyle().
Bold(true).
Underline(true)
var portstyle = lipgloss.NewStyle().
Bold(true).
Underline(true)

80
cmd/ports.go Normal file
View File

@@ -0,0 +1,80 @@
package cmd
import (
"bufio"
"fmt"
"net"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/charmbracelet/log"
)
const commonPorts = "https://raw.githubusercontent.com/pushfs/sif-runtime/main/ports/top-ports.txt"
func Ports(scope string, url string, timeout time.Duration, logdir string) {
fmt.Println(separator.Render("🚪 Starting " + statusstyle.Render("port scanning") + "..."))
sanitizedURL := strings.Split(url, "://")[1]
if logdir != "" {
f, err := os.OpenFile(logdir+"/"+sanitizedURL+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Errorf("Error creating log file: %s", err)
return
}
defer f.Close()
f.WriteString(fmt.Sprintf("\n\n--------------\nStarting %s port scanning\n--------------\n", scope))
}
portlog := log.NewWithOptions(os.Stderr, log.Options{
Prefix: "Ports 🚪",
})
portlog.Infof("Starting %s port scanning", scope)
var ports []int
switch scope {
case "common":
resp, err := http.Get(commonPorts)
if err != nil {
log.Errorf("Error downloading ports list: %s", err)
return
}
scanner := bufio.NewScanner(resp.Body)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if port, err := strconv.Atoi(scanner.Text()); err == nil {
ports = append(ports, port)
}
}
case "full":
ports = make([]int, 65536)
for i := range ports {
ports[i] = i
}
default:
log.Errorf("Invalid ports scope %s. Please choose either common or full", portstyle.Render(scope))
return
}
for _, port := range ports {
log.Debugf("Looking up: %d", port)
tcp, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", sanitizedURL, port), timeout)
if err != nil {
log.Debugf("Error %d: %v", port, err)
} else {
portlog.Infof("%s %s:%s", statusstyle.Render("[tcp]"), sanitizedURL, portstyle.Render(strconv.Itoa(port)))
tcp.Close()
}
udp, err := net.DialTimeout("udp", fmt.Sprintf("%s:%d", sanitizedURL, port), timeout)
if err != nil {
log.Debugf("Error %d: %v", port, err)
} else {
portlog.Infof("%s %s:%s", statusstyle.Render("[udp]"), sanitizedURL, portstyle.Render(strconv.Itoa(port)))
defer udp.Close()
}
}
}

View File

@@ -16,20 +16,20 @@ type Settings struct {
Debug bool
LogDir string
NoScan bool
Ports string
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 logdir = pflag.StringP("log", "l", "", "Directory to store logs")
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", "Directory fuzzing scan size (small, medium, large)")
var dnslist = pflag.String("dnslist", "none", "DNS fuzzing scan size (small, medium, large)")
var ports = pflag.StringP("ports", "p", "none", "Scan common ports")
pflag.Lookup("ports").NoOptDefVal = "common"
var noscan = pflag.Bool("noscan", false, "Do not perform base URL (robots.txt, etc) scanning")
pflag.Parse()
@@ -41,6 +41,7 @@ func parseURLs() Settings {
Dnslist: *dnslist,
NoScan: *noscan,
URLs: *url,
Ports: *ports,
LogDir: *logdir,
}
} else if *file != "" {
@@ -68,6 +69,7 @@ func parseURLs() Settings {
Dirlist: *dirlist,
Dnslist: *dnslist,
NoScan: *noscan,
Ports: *ports,
URLs: urls,
LogDir: *logdir,
}

View File

@@ -90,6 +90,10 @@ func main() {
cmd.Dnslist(settings.Dnslist, url, settings.Timeout, settings.LogDir)
}
if settings.Ports != "none" {
cmd.Ports(settings.Ports, url, settings.Timeout, settings.LogDir)
}
// TODO: WHOIS
fmt.Println()