mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2025-12-18 12:45:27 +00:00
commit b590de2de14923e4cb35dd19845e12833a4ccbfa
Author: Xavier Stevens <xstevens@users.noreply.github.com>
Date: Wed Mar 23 08:29:37 2022 -0700
Updated rand_ip to use variadic args
commit ea883be8c0aa56174a1301252129289334659f3f
Author: Xavier Stevens <xstevens@users.noreply.github.com>
Date: Tue Mar 22 16:59:19 2022 -0700
Updated rand_ip function to handle multiple CIDRs
77 lines
1.3 KiB
Go
77 lines
1.3 KiB
Go
package randomip
|
|
|
|
import (
|
|
"math/rand"
|
|
"net"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/projectdiscovery/iputil"
|
|
)
|
|
|
|
const (
|
|
maxIterations = 255
|
|
)
|
|
|
|
func GetRandomIPWithCidr(cidrs ...string) (net.IP, error) {
|
|
if len(cidrs) == 0 {
|
|
return nil, errors.Errorf("must specify at least one cidr")
|
|
}
|
|
cidr := cidrs[rand.Intn(len(cidrs))]
|
|
|
|
if !iputil.IsCIDR(cidr) {
|
|
return nil, errors.Errorf("%s is not a valid cidr", cidr)
|
|
}
|
|
|
|
baseIp, ipnet, err := net.ParseCIDR(cidr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch {
|
|
case iputil.IsIPv4(baseIp.String()):
|
|
return getRandomIP(ipnet, 4), nil
|
|
case iputil.IsIPv6(baseIp.String()):
|
|
return getRandomIP(ipnet, 16), nil
|
|
default:
|
|
return nil, errors.New("invalid base ip")
|
|
}
|
|
}
|
|
|
|
func getRandomIP(ipnet *net.IPNet, size int) net.IP {
|
|
ip := ipnet.IP
|
|
var iteration int
|
|
|
|
for iteration < maxIterations {
|
|
iteration++
|
|
ones, _ := ipnet.Mask.Size()
|
|
quotient := ones / 8
|
|
remainder := ones % 8
|
|
var r []byte
|
|
switch size {
|
|
case 4, 16:
|
|
r = make([]byte, size)
|
|
default:
|
|
return ip
|
|
}
|
|
|
|
rand.Read(r)
|
|
|
|
for i := 0; i <= quotient; i++ {
|
|
if i == quotient {
|
|
shifted := byte(r[i]) >> remainder
|
|
r[i] = ^ipnet.IP[i] & shifted
|
|
} else {
|
|
r[i] = ipnet.IP[i]
|
|
}
|
|
}
|
|
|
|
ip = r
|
|
|
|
if !ip.Equal(ipnet.IP) {
|
|
break
|
|
}
|
|
}
|
|
|
|
return ip
|
|
}
|