fscan/Common/ParsePort.go

98 lines
1.9 KiB
Go
Raw Normal View History

2024-12-18 22:00:18 +08:00
package Common
2020-12-29 17:17:10 +08:00
import (
"fmt"
"sort"
2020-12-29 17:17:10 +08:00
"strconv"
"strings"
)
// ParsePort 解析端口配置字符串为端口号列表
func ParsePort(ports string) []int {
2024-12-20 14:19:23 +08:00
// 预定义的端口组
portGroups := map[string]string{
"service": ServicePorts,
"db": DbPorts,
"web": WebPorts,
2024-12-23 03:15:14 +08:00
"udp": UDPPorts,
2024-12-20 14:19:23 +08:00
"all": AllPorts,
"main": MainPorts,
}
// 检查是否匹配预定义组
if definedPorts, exists := portGroups[ports]; exists {
ports = definedPorts
}
if ports == "" {
return nil
}
var scanPorts []int
2020-12-29 17:17:10 +08:00
slices := strings.Split(ports, ",")
// 处理每个端口配置
2020-12-29 17:17:10 +08:00
for _, port := range slices {
2022-05-12 17:56:32 +08:00
port = strings.TrimSpace(port)
if port == "" {
continue
}
// 处理端口范围
2020-12-29 17:17:10 +08:00
upper := port
if strings.Contains(port, "-") {
ranges := strings.Split(port, "-")
if len(ranges) < 2 {
2024-12-20 03:46:09 +08:00
fmt.Printf("[-] 无效的端口范围格式: %s\n", port)
2020-12-29 17:17:10 +08:00
continue
}
// 确保起始端口小于结束端口
startPort, _ := strconv.Atoi(ranges[0])
endPort, _ := strconv.Atoi(ranges[1])
if startPort < endPort {
port = ranges[0]
upper = ranges[1]
} else {
port = ranges[1]
upper = ranges[0]
}
2020-12-29 17:17:10 +08:00
}
// 生成端口列表
2020-12-29 17:17:10 +08:00
start, _ := strconv.Atoi(port)
end, _ := strconv.Atoi(upper)
for i := start; i <= end; i++ {
2023-11-13 17:41:54 +08:00
if i > 65535 || i < 1 {
2024-12-20 03:46:09 +08:00
fmt.Printf("[-] 忽略无效端口: %d\n", i)
2023-11-13 17:41:54 +08:00
continue
}
2020-12-29 17:17:10 +08:00
scanPorts = append(scanPorts, i)
}
}
// 去重并排序
scanPorts = removeDuplicate(scanPorts)
sort.Ints(scanPorts)
fmt.Printf("[*] 共解析 %d 个有效端口\n", len(scanPorts))
2020-12-29 17:17:10 +08:00
return scanPorts
}
// removeDuplicate 对整数切片进行去重
func removeDuplicate(old []int) []int {
// 使用map存储不重复的元素
temp := make(map[int]struct{})
var result []int
// 遍历并去重
for _, item := range old {
if _, exists := temp[item]; !exists {
temp[item] = struct{}{}
result = append(result, item)
}
}
return result
}