【go语言安全开发系列】用go语言实现一个tcp端口扫描器(非并发/并发/goroutine池)
2022-10-27 19:28:27 Author: 浪飒sec(查看原文) 阅读量:11 收藏

免责声明

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

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

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

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()
}

运行结果为:

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()
}

运行结果:

高并发 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()
}

历史推荐

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

应急响应指南

内网信息收集

工具推荐——Apt_t00ls

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

骇客怎么赚钱?

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

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

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

工具推荐——GetInfo和FireKylin


文章来源: http://mp.weixin.qq.com/s?__biz=MzI1ODM1MjUxMQ==&mid=2247489469&idx=1&sn=e590cfc1cd4666dde51a7bbf803d91a9&chksm=ea0823addd7faabbc9ae4f05beb648af80fd128454dbe6eb89d6ae295809dc9b9455f9354f90#rd
如有侵权请联系:admin#unsafe.sh