Go语言(Golang)编写 TCP 端口扫描器

这篇具有很好参考价值的文章主要介绍了Go语言(Golang)编写 TCP 端口扫描器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go 语言编写 TCP 扫描器

TCP

  • TCP,也就是传输控制协议(Transmission Control Protocol)。

TCP握手

  • 建立 TCP连接(或者叫打开端口),需要3次握手

客户端 -> 端口打开 ->服务器

  1. syn (请求建立新连接)
  2. syn-ack (同意创建新连接)
  3. ack (表示响应)
  • 服务端端口关闭 Closed Port
    • client -syn-> Server
    • Server -rst-> Client
  • 如果存在防火墙 Filtered Port
    • Client —syn (Timeout)— Firewall Server

非并发的 TCP 扫描器

创建目录并在该目录创建main.go 文件

~/Code/go via 🐹 v1.20.3 via 🅒 base
➜ mcd tcp-scanner

Code/go/tcp-scanner via 🐹 v1.20.3 via 🅒 base
➜ go mod init
go: cannot determine module path for source directory /Users/qiaopengjun/Code/go/tcp-scanner (outside GOPATH, module path must be specified)

Example usage:
	'go mod init example.com/m' to initialize a v0 or v1 module
	'go mod init example.com/m/v2' to initialize a v2 module

Run 'go help mod init' for more information.

Code/go/tcp-scanner via 🐹 v1.20.3 via 🅒 base
➜ go mod init tcp-scanner
go: creating new go.mod: module tcp-scanner

Code/go/tcp-scanner via 🐹 v1.20.3 via 🅒 base
➜ c

Code/go/tcp-scanner via 🐹 v1.20.3 via 🅒 base
➜

main.go 文件

package main

import (
	"fmt"
	"net"
)

func main() {
	for i := 21; i < 120; i++ {
		address := fmt.Sprintf("20.194.168.28:%d", i)
		conn, err := net.Dial("tcp", address)
		if err != nil {
			fmt.Printf("%s failed 关闭了\n", address)
			continue
		}
		conn.Close()
		fmt.Printf("%s connected 打开了!!!\n", address)
	}
}

并发的 TCP 扫描器

package main

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

func main() {
	start := time.Now()
	var wg sync.WaitGroup
	for i := 21; i < 120; i++ {
		wg.Add(1)
		go func(j int) {
			defer wg.Done()
			address := fmt.Sprintf("20.194.168.28:%d", j)
			conn, err := net.Dial("tcp", address)
			if err != nil {
				fmt.Printf("%s 关闭了\n", address)
				return
			}
			conn.Close()
			fmt.Printf("%s 打开了!!!\n", address)
		}(i)
	}
	wg.Wait()
	elapsed := time.Since(start) / 1e9
	fmt.Printf("\n\n%d seconds", elapsed)
}

// func main() {
// 	for i := 21; i < 120; i++ {
// 		address := fmt.Sprintf("20.194.168.28:%d", i)
// 		conn, err := net.Dial("tcp", address)
// 		if err != nil {
// 			fmt.Printf("%s failed 关闭了\n", address)
// 			continue
// 		}
// 		conn.Close()
// 		fmt.Printf("%s connected 打开了!!!\n", address)
// 	}
// }

并发的 TCP 扫描器 - WORKER 池

package main

import (
	"fmt"
	"sync"
)

func worker(ports chan int, wg *sync.WaitGroup) {
	for p := range ports {
		fmt.Println("p", p)
		wg.Done()
	}
}

func main() {
	ports := make(chan int, 100)
	var wg sync.WaitGroup

	for i := 0; i < cap(ports); i++ {
		go worker(ports, &wg)
	}

	for i := 1; i < 1024; i++ {
		wg.Add(1)
		ports <- i
	}

	wg.Wait()
	close(ports)
}

// func main() {
// 	start := time.Now()
// 	var wg sync.WaitGroup
// 	for i := 21; i < 120; i++ {
// 		wg.Add(1)
// 		go func(j int) {
// 			defer wg.Done()
// 			address := fmt.Sprintf("20.194.168.28:%d", j)
// 			conn, err := net.Dial("tcp", address)
// 			if err != nil {
// 				fmt.Printf("%s 关闭了\n", address)
// 				return
// 			}
// 			conn.Close()
// 			fmt.Printf("%s 打开了!!!\n", address)
// 		}(i)
// 	}
// 	wg.Wait()
// 	elapsed := time.Since(start) / 1e9
// 	fmt.Printf("\n\n%d seconds", elapsed)
// }

// func main() {
// 	for i := 21; i < 120; i++ {
// 		address := fmt.Sprintf("20.194.168.28:%d", i)
// 		conn, err := net.Dial("tcp", address)
// 		if err != nil {
// 			fmt.Printf("%s failed 关闭了\n", address)
// 			continue
// 		}
// 		conn.Close()
// 		fmt.Printf("%s connected 打开了!!!\n", address)
// 	}
// }

优化之后文章来源地址https://www.toymoban.com/news/detail-437189.html

package main

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

func worker(ports chan int, results chan int) {
	for p := range ports {
		address := fmt.Sprintf("20.194.168.28:%d", p)
		conn, err := net.Dial("tcp", address)
		if err != nil {
			results <- 0
			continue
		}
		conn.Close()
		results <- p
	}
}

func main() {
	ports := make(chan int, 100)
	results := make(chan int)
	var openports []int
	var closeports []int

	for i := 0; i < cap(ports); i++ {
		go worker(ports, results)
	}
	go func() {
		for i := 1; i < 1024; i++ {

			ports <- i
		}
	}()

	for i := 1; i < 1024; i++ {
		port := <-results
		if port != 0 {
			openports = append(openports, port)
		} else {
			closeports = append(closeports, port)
		}
	}

	close(ports)
	close(results)

	sort.Ints(openports)
	sort.Ints(closeports)

	for _, port := range closeports {
		fmt.Printf("%d closed\n", port)
	}

	for _, port := range openports {
		fmt.Printf("%d opened\n", port)
	}
}

// func main() {
// 	start := time.Now()
// 	var wg sync.WaitGroup
// 	for i := 21; i < 120; i++ {
// 		wg.Add(1)
// 		go func(j int) {
// 			defer wg.Done()
// 			address := fmt.Sprintf("20.194.168.28:%d", j)
// 			conn, err := net.Dial("tcp", address)
// 			if err != nil {
// 				fmt.Printf("%s 关闭了\n", address)
// 				return
// 			}
// 			conn.Close()
// 			fmt.Printf("%s 打开了!!!\n", address)
// 		}(i)
// 	}
// 	wg.Wait()
// 	elapsed := time.Since(start) / 1e9
// 	fmt.Printf("\n\n%d seconds", elapsed)
// }

// func main() {
// 	for i := 21; i < 120; i++ {
// 		address := fmt.Sprintf("20.194.168.28:%d", i)
// 		conn, err := net.Dial("tcp", address)
// 		if err != nil {
// 			fmt.Printf("%s failed 关闭了\n", address)
// 			continue
// 		}
// 		conn.Close()
// 		fmt.Printf("%s connected 打开了!!!\n", address)
// 	}
// }

到了这里,关于Go语言(Golang)编写 TCP 端口扫描器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)

    Python-nmap是一个Python库,用于帮助进行网络扫描。它是Nmap网络扫描器的Python接口,允许开发者从Python脚本中直接调用Nmap的功能。这篇文章将详细介绍如何使用python-nmap库来执行各种网络扫描任务。 在开始之前,需要确保安装了Nmap和python-nmap库。可以通过以下命令安装Nmap: 对

    2024年02月21日
    浏览(47)
  • 了解Portscan扫描器

    Portscan端口扫描器程序可以帮助用户寻找到当前网络上正在运行的所有设备。Portscan端口扫描器其拥有200多个线程,是企业用户扫描ip地址的首选扫描程序。 一、使用Portscan扫描器扫描网站 1.1.双击“PortScan.exe”图标。如图1所示 图1 1.2.Portscan扫描器界面。如图2所示 图2 1.3.选择

    2024年02月12日
    浏览(56)
  • 漏洞扫描器-AWVS

    漏洞扫描是指基于漏洞数据库,通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用漏洞的一种安全检测(渗透攻击)行为。 ✓ 针对某类漏洞的:sql注入(sqlmap)、weblogic(weblogicscan) ✓ 针对某类CMS的:wordpress(wpscan)、dedecms(dedecmsscan)

    2024年02月13日
    浏览(66)
  • Nmap网络扫描器实验

    网络入侵的一般流程是确定目标、信息收集、漏洞挖掘、实施攻击、留下后门、清除日志。在信息收集环节又可分为网络踩点、网络扫描和网络查点。在网络扫描部分,按照攻击者的入侵流程又可分为主机扫描、端口扫描、系统类型探测和漏洞扫描。 网络扫描是针对整个目标

    2024年02月03日
    浏览(57)
  • 开源 LLM 安全扫描器

    Vigil 是一款开源安全扫描程序,可检测即时注入、越狱以及对大型语言模型(LLM) 的其他潜在威胁。 当攻击者使用专门设计的输入成功影响 LLM 时,就会出现即时注入。这导致 LLM 无意中实现了攻击者设定的目标。 ​ 我对 LLM 的可能性感到非常兴奋,但也注意到围绕它们构建的

    2024年01月18日
    浏览(65)
  • wordpres漏洞扫描器——wpscan

    使用PHP语言开发的博客平台 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。 WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和

    2023年04月13日
    浏览(49)
  • Nessus: 漏洞扫描器-网络取证工具

    要理解网络漏洞攻击,应该理解攻击者不是单独攻击,而是组合攻击。因此,本文介绍了关于Nessus历史的研究,它是什么以及它如何与插件一起工作。研究了Nessus的特点,使其成为网络取证中非常推荐的网络漏洞扫描工具。本文还介绍了如何下载Nessus以及所涉及的步骤。使用

    2023年04月16日
    浏览(52)
  • 关于漏洞扫描器AWVS的安装和破解

    下载AVWS的压缩包 解压压缩包,解压后会有下面三个文件!acunetix_14.5.211115146_x64.sh license_info.json wa_data.dat 使用下面命令进行安装  按回车同意隐私条款,到末尾输入yes,然后输入用户名和密码以及邮箱。 接下来浏览器输入https://IP:3443/ 用刚才设置的账号和密码登录 接下来开始

    2024年02月12日
    浏览(46)
  • 轻量级网络IP扫描器WatchYourLAN

    什么是 WatchYourLAN ? WatchYourLAN 是一款带有 Web GUI 的轻量级网络 IP 扫描器。支持使用不同的主题和色彩模式进行个性化设置。 扫描网络,首先要找到对应的网络接口,一般常见的包括 eth0 、 lo 、 docker0 等,可以在 SSH 客户端命令行,执行下面的命令 但是目前 WatchYourLAN 还不支

    2024年02月06日
    浏览(71)
  • 青云扫描器(QingScan):智能安全检测的新星

    项目地址:https://gitcode.com/78778443/QingScan 青云扫描器(QingScan)是一个开源的安全扫描工具,旨在帮助开发者和企业发现并修复应用程序中的安全漏洞。该项目由78778443开发并维护,采用先进的自动化技术,可以对Web应用、移动应用以及服务器进行全方位的安全检查。 QingScan的核

    2024年04月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包