【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)

admin 2022年10月28日00:36:02评论35 views字数 2886阅读9分37秒阅读模式

免责声明

本公众号所发布的文章及工具只限交流学习,本公众号不承担任何责任!如有侵权,请告知我们立即删除。

零、开一个新坑

往后会坚持更新这个系列的文章,写简明扼要的文章聊聊如何使用go语言来开发安全工具,为自己所用。在看这些之前,需要对go语言有一些了解。go语言的语法和python以及其他高级语言的语法有非常相似之处,因此如果有其他语言基础的话将会非常快地就能上手。关于基础语法的学习可以参考runoob上面的教程:

https://www.runoob.com/go/go-tutorial.html

一、非并发版tcp端口扫描器

package main

import (
 "fmt"
 "net"
)

func tcp_scanner() {
 for port := 0; port < 65535; port++ {
  address := fmt.Sprintf("192.168.44.132:%d", port)
  connect, connect_error := net.Dial("tcp", address)
  if connect_error != nil {
   fmt.Printf("[×] %d --> 端口已关闭。n", port)
   continue
  } else {
   connect.Close()
   fmt.Printf("[+] %d --> 端口开启!!!!!!n", port)
  }
 }
}

func main() {
 tcp_scanner()
}

运行结果为:【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)

二、并发版tcp端口扫描器

package main

import (
 "fmt"
 "net"
 "sync"
 "time"
)

func tcp_scanner() {
 var tcp_scanner_wait_group sync.WaitGroup
 time_start := time.Now()
 for port := 1; port < 65535; port++ {
  tcp_scanner_wait_group.Add(1)
  go func(fast_port int) {
   defer tcp_scanner_wait_group.Done()
   address := fmt.Sprintf("192.168.44.132:%d", fast_port)
   connect, connect_error := net.Dial("tcp", address)
   if connect_error != nil {
    //fmt.Printf("[×] %s --> 关闭。n", address)
    return
   } else {
    connect.Close()
    fmt.Printf("[+] %s --> 开启!!!!!!n", address)
   }
  }(port)
 }
 tcp_scanner_wait_group.Wait()
 time_stop := time.Now()
 time_def := time_stop.Sub(time_start)
 fmt.Printf("[*] 1-65535端口扫描完毕,共用时:%v。n", time_def)
}

func main() {
 tcp_scanner()
}

运行结果:

【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)
高并发 tcp端口扫描器

三、goroutine池tcp端口扫描器

简单说就是找100个tcp_worker过来,并为他们分配工作。但是如果我们添加过多的worker,那么运行结果可能就不是那么可靠,因此我们需要寻求一个合理的值。

package main

import (
 "fmt"
 "net"
 "sort"
 "time"
)

func tcp_worker(ports chan int, results chan int) {
 for po := range ports {
  address := fmt.Sprintf("192.168.44.132:%d", po)
  connect, connect_error := net.Dial("tcp", address)
  if connect_error != nil {
   //fmt.Printf("[×] %s --> 关闭。n", address)
   results <- 0
   return
  } else {
   connect.Close()
   results <- po
  }
 }
}

func tcp_scanner() {
 ports := make(chan int100)
 results := make(chan int)

 var open_ports []int
 var close_ports []int
 for worker := 0; worker < cap(ports); worker++ {
  go tcp_worker(ports, results)
 }
 time_start := time.Now()
 go func() {
  //给这100个tcp_worker分配任务
  for port := 1; port < 65535; port++ {
   ports <- port
  }
 }()

 for num := 1; num < 65535; num++ {
  port := <-results
  if port != 0 {
   open_ports = append(open_ports, port)
  } else {
   close_ports = append(close_ports, port)
  }
  ports <- port
 }

 close(ports)
 close(results)

 time_stop := time.Now()
 time_def := time_stop.Sub(time_start)
 fmt.Printf("[*] 1-65535端口扫描完毕,共用时:%v。n", time_def)

 //端口排序
 sort.Ints(open_ports)
 //展示结果
 for _, port := range open_ports {
  fmt.Printf("[-] 192.168.44.132:%d端口开启!!!", port)
 }
}

func main() {
 tcp_scanner()
}


【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)

历史推荐

超全Hack报告/资料/文档/书籍(不关注我你必后悔的好东西)

应急响应指南

内网信息收集

工具推荐——Apt_t00ls

Web攻击与防护技术PPT(经典且好用100多页)

骇客怎么赚钱?

【攻防演练】从钓鱼上线到内网漫游

二十大与网络安全行业的分析

工具推荐篇:红队信息收集快速打点工具

工具推荐——GetInfo和FireKylin



原文始发于微信公众号(浪飒sec):【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月28日00:36:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)https://cn-sec.com/archives/1375927.html

发表评论

匿名网友 填写信息