mirror of
https://github.com/sairson/Yasso.git
synced 2026-06-16 15:18:12 +08:00
Yasso更新大改动,更新扫描方式,去除不常用功能,增加指纹和协议识别,修补bug等
This commit is contained in:
42
pkg/netspy/example/ip_test.go
Normal file
42
pkg/netspy/example/ip_test.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package example
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test(t *testing.T) {
|
||||
inters, err := net.Interfaces()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, inter := range inters {
|
||||
// 判断网卡是否开启,过滤本地环回接口
|
||||
if inter.Flags&net.FlagUp != 0 && !strings.HasPrefix(inter.Name, "lo") {
|
||||
// 获取网卡下所有的地址
|
||||
addrs, err := inter.Addrs()
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
for _, addr := range addrs {
|
||||
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
||||
//判断是否存在IPV4 IP 如果没有过滤
|
||||
if strings.ContainsAny(ipnet.String(), ":") {
|
||||
continue
|
||||
} else {
|
||||
//fmt.Println(ipnet)
|
||||
minIp, maxIp := getCidrIpRange(ipnet.String())
|
||||
fmt.Println("CIDR最小IP:", minIp, " CIDR最大IP:", maxIp)
|
||||
mask, _ := ipnet.Mask.Size()
|
||||
fmt.Println("掩码:", getCidrIpMask(mask))
|
||||
fmt.Println("主机数量", getCidrHostNum(mask))
|
||||
fmt.Println("==============================")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
76
pkg/netspy/example/spy_test.go
Normal file
76
pkg/netspy/example/spy_test.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package example
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test1(t *testing.T) {
|
||||
minIp, maxIp := getCidrIpRange("192.168.248.1/22")
|
||||
fmt.Println("CIDR最小IP:", minIp, " CIDR最大IP:", maxIp)
|
||||
fmt.Println("掩码:", getCidrIpMask(24))
|
||||
fmt.Println("主机数量", getCidrHostNum(24))
|
||||
}
|
||||
func getCidrIpRange(cidr string) (string, string) {
|
||||
ip := strings.Split(cidr, "/")[0]
|
||||
ipSegs := strings.Split(ip, ".")
|
||||
maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1])
|
||||
seg3MinIp, seg3MaxIp := getIpSeg3Range(ipSegs, maskLen)
|
||||
seg4MinIp, seg4MaxIp := getIpSeg4Range(ipSegs, maskLen)
|
||||
ipPrefix := ipSegs[0] + "." + ipSegs[1] + "."
|
||||
|
||||
return ipPrefix + strconv.Itoa(seg3MinIp) + "." + strconv.Itoa(seg4MinIp),
|
||||
ipPrefix + strconv.Itoa(seg3MaxIp) + "." + strconv.Itoa(seg4MaxIp)
|
||||
}
|
||||
|
||||
//计算得到CIDR地址范围内可拥有的主机数量
|
||||
func getCidrHostNum(maskLen int) uint {
|
||||
cidrIpNum := uint(0)
|
||||
var i uint = uint(32 - maskLen - 1)
|
||||
for ; i >= 1; i-- {
|
||||
cidrIpNum += 1 << i
|
||||
}
|
||||
return cidrIpNum
|
||||
}
|
||||
|
||||
//获取Cidr的掩码
|
||||
func getCidrIpMask(maskLen int) string {
|
||||
// ^uint32(0)二进制为32个比特1,通过向左位移,得到CIDR掩码的二进制
|
||||
cidrMask := ^uint32(0) << uint(32-maskLen)
|
||||
fmt.Println(fmt.Sprintf("%b \n", cidrMask))
|
||||
//计算CIDR掩码的四个片段,将想要得到的片段移动到内存最低8位后,将其强转为8位整型,从而得到
|
||||
cidrMaskSeg1 := uint8(cidrMask >> 24)
|
||||
cidrMaskSeg2 := uint8(cidrMask >> 16)
|
||||
cidrMaskSeg3 := uint8(cidrMask >> 8)
|
||||
cidrMaskSeg4 := uint8(cidrMask & uint32(255))
|
||||
|
||||
return fmt.Sprint(cidrMaskSeg1) + "." + fmt.Sprint(cidrMaskSeg2) + "." + fmt.Sprint(cidrMaskSeg3) + "." + fmt.Sprint(cidrMaskSeg4)
|
||||
}
|
||||
|
||||
//得到第三段IP的区间(第一片段.第二片段.第三片段.第四片段)
|
||||
func getIpSeg3Range(ipSegs []string, maskLen int) (int, int) {
|
||||
if maskLen > 24 {
|
||||
segIp, _ := strconv.Atoi(ipSegs[2])
|
||||
return segIp, segIp
|
||||
}
|
||||
ipSeg, _ := strconv.Atoi(ipSegs[2])
|
||||
return getIpSegRange(uint8(ipSeg), uint8(24-maskLen))
|
||||
}
|
||||
|
||||
//得到第四段IP的区间(第一片段.第二片段.第三片段.第四片段)
|
||||
func getIpSeg4Range(ipSegs []string, maskLen int) (int, int) {
|
||||
ipSeg, _ := strconv.Atoi(ipSegs[3])
|
||||
segMinIp, segMaxIp := getIpSegRange(uint8(ipSeg), uint8(32-maskLen))
|
||||
return segMinIp + 1, segMaxIp
|
||||
}
|
||||
|
||||
//根据用户输入的基础IP地址和CIDR掩码计算一个IP片段的区间
|
||||
func getIpSegRange(userSegIp, offset uint8) (int, int) {
|
||||
var ipSegMax uint8 = 255
|
||||
netSegIp := ipSegMax << offset
|
||||
segMinIp := netSegIp & userSegIp
|
||||
segMaxIp := userSegIp&(255<<offset) | ^(255 << offset)
|
||||
return int(segMinIp), int(segMaxIp)
|
||||
}
|
||||
28
pkg/netspy/icmp/icmp.go
Normal file
28
pkg/netspy/icmp/icmp.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package icmp
|
||||
|
||||
import (
|
||||
"github.com/go-ping/ping"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Check(ip string) bool {
|
||||
pinger, err := ping.NewPinger(ip)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if runtime.GOOS == "windows" {
|
||||
pinger.SetPrivileged(true)
|
||||
}
|
||||
pinger.Count = 1
|
||||
pinger.Timeout = 100 * time.Millisecond
|
||||
err = pinger.Run()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
stats := pinger.Statistics()
|
||||
if stats.PacketsRecv > 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
48
pkg/netspy/spy/spy.go
Normal file
48
pkg/netspy/spy/spy.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package spy
|
||||
|
||||
import (
|
||||
"Yasso/core/logger"
|
||||
"Yasso/pkg/netspy/icmp"
|
||||
"fmt"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
func GoSpy(ips [][]string, check func(ip string) bool, thread int) []string { // 共有
|
||||
var online []string
|
||||
var wg sync.WaitGroup
|
||||
var ipc = make(chan []string, 10000)
|
||||
var onc = make(chan string, 1000)
|
||||
var count int32
|
||||
if ips == nil {
|
||||
return online
|
||||
}
|
||||
go func() {
|
||||
for _, ipg := range ips {
|
||||
ipc <- ipg
|
||||
}
|
||||
defer close(ipc)
|
||||
}()
|
||||
for i := 0; i < thread; i++ {
|
||||
wg.Add(1)
|
||||
go func(ipc chan []string) {
|
||||
for ipg := range ipc {
|
||||
for _, ip := range ipg {
|
||||
if icmp.Check(ip) {
|
||||
online = append(online, ip) // 此时已经可以证明有一个网段存活了
|
||||
logger.Info(fmt.Sprintf("%s/24 network segment to survive", ip))
|
||||
onc <- fmt.Sprintf("%s/24\n", ip)
|
||||
break // 存在一个主机则证明存活
|
||||
} else {
|
||||
// 不存活
|
||||
continue
|
||||
}
|
||||
}
|
||||
atomic.AddInt32(&count, int32(len(ipg)))
|
||||
}
|
||||
defer wg.Done()
|
||||
}(ipc)
|
||||
}
|
||||
wg.Wait()
|
||||
return online
|
||||
}
|
||||
Reference in New Issue
Block a user