最後
關注公衆號:七夜安全博客
- 回覆【1】:領取 Python數據分析 教程大禮包
- 回覆【2】:領取 Python Flask 全套教程
- 回覆【3】:領取 某學院 機器學習 教程
- 回覆【4】:領取 爬蟲 教程
- 回覆【5】:領取 編譯原理 教程
- 回覆【6】:領取 滲透測試 教程
- 回覆【7】:領取 人工智能數學基礎 教程
最近有個小項目的須要,使用golang寫了個端口掃描工具,不得不說golang的效率確實比python快的太多了。在使用一段時間golang以後,感受有三個方面是優於python的:python
一個方面是性能優越golang
第二方面是兼容性好安全
第三方面是能夠跨平臺編譯成本地二進制文件,發佈項目很方便。服務器
接下來我把這個工具的源代碼,以及使用方式給你們給你們分享一下。markdown
工具名稱:PortScan併發
採用Go語言開發,支持從config.txt文件中讀取目的ip和端口,對指定的目的服務器進行端口掃描app
config.txt支持配置端口列表,默認爲2二、36000、56000、3306機器學習
在服務器上鍊接目的服務器端口,僅作一次TCP三次握手tcp
PortScan參數以下:函數
參數說明:
-c:用來指定config文件路徑
-limit:用來指定掃描端口的併發數,默認爲1000
首先生成一個config.txt文件,內容以下:
ip共有255個,端口有10個,也就是說總共要進行2550次TCP鏈接。
接着使用go build PortScan.go命令,生成一個本地二進制文件PortScan.exe,而後執行命令:
PortScan.exe -c config.txt
最後的結果存儲到result.txt文件中,大體用時是30s。
//首先從命令行中讀取線程數和配置文件路徑 //從配置文件中解析出ip和port //配置文件格式爲 // [ip] // 127.0.0.1 // [port] // 22 // 36000 // 56000 // 3306 //根據開啓的線程數對指定ip和端口進行tcp鏈接 //若是端口開啓,把ip:port按照格式返回 func Scanner(configFile string, functionid string, sendInfoFile string,limit int){ runtime.GOMAXPROCS(runtime.NumCPU()) data, err := ioutil.ReadFile(configFile) portlist := make([]string,0,10) if err != nil{ log.Fatal(err) panic(err) } ip_index := bytes.Index(data,[]byte("[ip]")) port_index := bytes.Index(data,[]byte("[port]")) if ip_index < 0{ Info.Println("文件格式有誤: missing [ip]") return } if port_index <0{ portlist = append(portlist,"22") portlist = append(portlist,"36000") portlist = append(portlist,"56000") portlist = append(portlist,"3306") }else{ reg_port := regexp.MustCompile(`\d+`) var ports [][]byte if ip_index>port_index{ ports = reg_port.FindAll(data[:ip_index],-1) }else{ ports = reg_port.FindAll(data[port_index:],-1) } for _,v := range(ports){ portlist = append(portlist,string(v)) } } reg_ip := regexp.MustCompile(`((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))`) ips := reg_ip.FindAll(data,-1) input := make(chan []byte, len(ips)) result := make(chan string, len(ips)) defer close(input) defer close(result) for _, v := range(ips){ input <- v } //控制多少併發 for i:=0; i<limit;i++{ //這個時候能夠啓動掃描函數 go ScanPort(portlist,input,result) } for i :=0; i< len(ips);i++{ //將掃描的結果輸出 ip_result,ok:= <-result if !ok { break; } } } func ScanPort(portlist []string,intput chan []byte,result chan string ) { for{ task,ok := <-intput if !ok{ return } ip := string(task) Info.Println("scaning ",ip,"port",portlist) port_str :="" for i:=0; i<len(portlist); i++{ _, err := net.DialTimeout("tcp", ip+":"+portlist[i], time.Second*3) if err != nil{ continue } port_str+=portlist[i]+" " } if len(port_str) >0{ //說明有打開的端口 // Info.Println(ip+":"+port_str+"open") result <- ip+"----"+"1"+"----"+"open port:"+port_str }else{ result <- ip+"----"+"0"+"----"+"ok" } } }
關注公衆號:七夜安全博客