mirror of
https://github.com/sairson/Yasso.git
synced 2026-02-07 20:44:21 +08:00
168 lines
4.2 KiB
Go
168 lines
4.2 KiB
Go
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"os"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func ResolveIPS(ip string) ([]string, error) {
|
|
if strings.Contains(ip, ".") && strings.Contains(ip, ".txt") {
|
|
// 此时传入的是文件txt
|
|
file, err := os.Open(ip)
|
|
if err != nil {
|
|
return []string{}, err
|
|
}
|
|
ips := Readiness(file)
|
|
return ips, err
|
|
}
|
|
reg := regexp.MustCompile(`[a-zA-Z]+`)
|
|
switch {
|
|
case strings.Contains(ip, "/"):
|
|
return resolveIP(ip)
|
|
case strings.Count(ip, "-") == 1:
|
|
return resolveIPC(ip)
|
|
case reg.MatchString(ip):
|
|
_, err := net.LookupHost(ip)
|
|
if err != nil {
|
|
return []string{}, err
|
|
}
|
|
return []string{ip}, nil
|
|
default:
|
|
var isip = net.ParseIP(ip)
|
|
if isip == nil {
|
|
return []string{}, errors.New("input format is not ccorrect")
|
|
}
|
|
return []string{ip}, nil
|
|
}
|
|
}
|
|
|
|
// 解析192.168.1.1/*的格式
|
|
|
|
func resolveIP(ip string) ([]string, error) {
|
|
var ip4 = net.ParseIP(strings.Split(ip, "/")[0]) // [192.168.1.1 *]
|
|
if ip4 == nil {
|
|
return []string{}, errors.New("not an ipv4 address")
|
|
}
|
|
var footmark = strings.Split(ip, "/")[1] // *
|
|
var temp []string
|
|
var err error
|
|
switch footmark {
|
|
case "24":
|
|
var ip3 = strings.Join(strings.Split(ip[:], ".")[0:3], ".")
|
|
for i := 0; i <= 255; i++ {
|
|
temp = append(temp, ip3+"."+strconv.Itoa(i))
|
|
}
|
|
err = nil
|
|
case "16":
|
|
var ip2 = strings.Join(strings.Split(ip[:], ".")[0:2], ".")
|
|
for i := 0; i <= 255; i++ {
|
|
for j := 0; j <= 255; j++ {
|
|
temp = append(temp, ip2+"."+strconv.Itoa(i)+"."+strconv.Itoa(j))
|
|
}
|
|
}
|
|
err = nil
|
|
default:
|
|
temp = []string{}
|
|
err = errors.New("not currently supported")
|
|
}
|
|
return temp, err
|
|
}
|
|
|
|
// 解析192.168.1.1-*格式
|
|
|
|
func resolveIPC(ip string) ([]string, error) {
|
|
var ip4 = strings.Split(ip, "-")
|
|
var ipA = net.ParseIP(ip4[0])
|
|
if ip4 == nil {
|
|
return []string{}, errors.New("not an ipv4 address")
|
|
}
|
|
var temp []string
|
|
if len(ip4[1]) < 4 {
|
|
iprange, err := strconv.Atoi(ip4[1])
|
|
if ipA == nil || iprange > 255 || err != nil {
|
|
return []string{}, errors.New("input format is not ccorrect")
|
|
}
|
|
var splitip = strings.Split(ip4[0], ".")
|
|
ip1, err1 := strconv.Atoi(splitip[3])
|
|
ip2, err2 := strconv.Atoi(ip4[1])
|
|
prefixip := strings.Join(splitip[0:3], ".")
|
|
if ip1 > ip2 || err1 != nil || err2 != nil {
|
|
return []string{}, errors.New("input format is not ccorrect")
|
|
}
|
|
for i := ip1; i <= ip2; i++ {
|
|
temp = append(temp, prefixip+"."+strconv.Itoa(i))
|
|
}
|
|
} else {
|
|
var splitip1 = strings.Split(ip4[0], ".")
|
|
var splitip2 = strings.Split(ip4[1], ".")
|
|
if len(splitip1) != 4 || len(splitip2) != 4 {
|
|
return []string{}, errors.New("input format is not ccorrect")
|
|
}
|
|
start, end := [4]int{}, [4]int{}
|
|
for i := 0; i < 4; i++ {
|
|
ip1, err1 := strconv.Atoi(splitip1[i])
|
|
ip2, err2 := strconv.Atoi(splitip2[i])
|
|
if ip1 > ip2 || err1 != nil || err2 != nil {
|
|
return []string{}, errors.New("input format is not ccorrect")
|
|
}
|
|
start[i], end[i] = ip1, ip2
|
|
}
|
|
startNum := start[0]<<24 | start[1]<<16 | start[2]<<8 | start[3]
|
|
endNum := end[0]<<24 | end[1]<<16 | end[2]<<8 | end[3]
|
|
for num := startNum; num <= endNum; num++ {
|
|
ip := strconv.Itoa((num>>24)&0xff) + "." + strconv.Itoa((num>>16)&0xff) + "." + strconv.Itoa((num>>8)&0xff) + "." + strconv.Itoa((num)&0xff)
|
|
temp = append(temp, ip)
|
|
}
|
|
}
|
|
return temp, nil
|
|
}
|
|
|
|
func RemoveDuplicate(old []int) []int {
|
|
result := make([]int, 0, len(old))
|
|
temp := map[int]struct{}{}
|
|
for _, item := range old {
|
|
if _, ok := temp[item]; !ok {
|
|
temp[item] = struct{}{}
|
|
result = append(result, item)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// 解析为445,69,72-15这种以逗号隔开的端口
|
|
|
|
func ResolvePORTS(ports string) ([]int, error) {
|
|
var scanPorts []int
|
|
slices := strings.Split(ports, ",")
|
|
for _, port := range slices {
|
|
port = strings.Trim(port, " ")
|
|
upper := port
|
|
if strings.Contains(port, "-") {
|
|
ranges := strings.Split(port, "-")
|
|
if len(ranges) < 2 {
|
|
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]
|
|
}
|
|
}
|
|
start, _ := strconv.Atoi(port)
|
|
end, _ := strconv.Atoi(upper)
|
|
for i := start; i <= end; i++ {
|
|
scanPorts = append(scanPorts, i)
|
|
}
|
|
}
|
|
scanPorts = RemoveDuplicate(scanPorts)
|
|
return scanPorts, nil
|
|
}
|