1. 程式人生 > >golang高性能端口掃描

golang高性能端口掃描

握手 滲透測試 線程 並發數 Nid 開啟 runtime adding 進行

前言

最近有個小項目的需要,使用golang寫了個端口掃描工具,不得不說golang的效率確實比python快的太多了。在使用一段時間golang之後,感覺有三個方面是優於python的:

  1. 一個方面是性能優越

  2. 第二方面是兼容性好

  3. 第三方面是可以跨平臺編譯成本地二進制文件,發布項目很方便。

接下來我把這個工具的源代碼,以及使用方式給大家給大家分享一下。

PortScan

工具名稱:PortScan

  1. 采用Go語言開發,支持從config.txt文件中讀取目的ip和端口,對指定的目的服務器進行端口掃描

  2. config.txt支持配置端口列表,默認為22、36000、56000、3306

  3. 在服務器上連接目的服務器端口,僅做一次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"
		}

	}

}

 

最後

關註公眾號:七夜安全博客

技術分享圖片

  • 回復【1】:領取 Python數據分析 教程大禮包
  • 回復【2】:領取 Python Flask 全套教程
  • 回復【3】:領取 某學院 機器學習 教程
  • 回復【4】:領取 爬蟲 教程
  • 回復【5】:領取 編譯原理 教程
  • 回復【6】:領取 滲透測試 教程
  • 回復【7】:領取 人工智能數學基礎 教程

golang高性能端口掃描