Go语言实现的一个简单的域名扫描工具
package mainimport (
"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]