kengengping 发表于 2023-11-24 10:53

Go语言实现的一个简单的域名扫描工具

package main

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

// 定义一个全局变量用于存储开放的端口
var openPorts []int

// 定义一个互斥锁用于保护共享资源
var mutex sync.Mutex

// scanPort 函数用于扫描指定IP和端口是否开放
func scanPort(ip string, port int) {
        conn, err := net.DialTimeout("tcp", ip+":"+fmt.Sprint(port), time.Second*5)
        if err == nil {
                mutex.Lock()
                openPorts = append(openPorts, port)
                mutex.Unlock()
                conn.Close()
        }
}

// main 函数用于启动多线程扫描
func main() {
        // 目标域名
        domain := "example.com"
        // 获取所有子域名
        subdomains := getSubdomains(domain)
        // 创建多个goroutine进行并发扫描
        var wg sync.WaitGroup
        for _, subdomain := range subdomains {
                wg.Add(1)
                go func(subdomain string) {
                        defer wg.Done()
                        ip := getIPByDomain(subdomain)
                        if ip != "" {
                                for port := 80; port <= 65535; port++ {
                                        scanPort(ip, port)
                                }
                        }
                }(subdomain)
        }
        wg.Wait()
        // 输出开放的端口
        fmt.Println("Open ports:", openPorts)
}

// getSubdomains 函数用于获取目标域名的所有子域名
func getSubdomains(domain string) []string {
        // 这里仅作示例,实际应用中可以使用第三方库或API获取子域名列表
        return []string{"www", "mail", "ftp"}
}

// getIPByDomain 函数用于根据域名获取对应的IP地址
func getIPByDomain(domain string) string {
        // 这里仅作示例,实际应用中可以使用第三方库或API获取IP地址
        return "192.168.1.1"
}
页: [1]
查看完整版本: Go语言实现的一个简单的域名扫描工具