跳到主要内容

处理扫描目标与网段(批量/分组)

编写扫描脚本是 yak 最适合的场景,yak 提供了很多中方便处理网段/域名/端口/甚至混合内容的方案。

解析混合网段+域名+IP 的用户输入

hosts = str.ParseStringToHosts("192.168.1.1/24,baidu.com,172.168.12.1/26")
for _, host = range hosts {
println(host)
}

/*
可以解析网段,遇到域名将会原样输入,一般来说都是以逗号分割
Output:
192.168.1.0
192.168.1.1
...
...
...
192.168.1.254
192.168.1.255
baidu.com
172.168.12.0
...
...
172.168.12.62
172.168.12.63
*/
信息
  1. 按逗号分隔
  2. 遇到解析不了的将会原样输出
  3. CIDR 标准支持

解析复杂端口输入

yak 提供了兼容性相当高的端口解析能力

ports = str.ParseStringToPorts("a,22,80,8000-8002,443,8888,abc,af")
for _, port = range ports {
println(port)
}

/*
OUTPUT:
22
80
443
8000
8001
8002
8888
*/
信息
  1. 一般来说都是以逗号分割
  2. 遇到无法解析成端口段/端口的将会自动退出

把 Host 和 Port 组合起来 str.HostPort

最常见的一个需求是说,我们需要把端口和主机通过 : 组合起来。我们可以使用 str.HostPort

println(str.HostPort("baidu.com", 80))
println(str.HostPort("baidu.com", "80"))
println(str.HostPort("127.0.0.1", 80))
println(str.HostPort("127.0.0.1", "80"))

/*
OUTPUT:
baidu.com:80
baidu.com:80
127.0.0.1:80
127.0.0.1:80
*/

主机:端口 组合

一般来说,作为扫描场景,用户经常会输入一堆扫描目标,这些扫描目标同时又对应多个端口。

如何组合?

笛卡尔积是一个有效的方案,谁都能想到的最基础实现方案是:

hosts = str.ParseStringToHosts("192.168.1.1/24")
ports = str.ParseStringToPorts("a,22,80,8000-8002,443,8888,abc,af")
for _, host = range hosts {
for _, port = range ports {
println(str.HostPort(host, port))
}
}

x.Chunk 为扫描进行分组

分组扫描是一个很有用的操作,例如 [1,2,3,4,5,6,7,8,10] 我们可以把他 4 个元素为一组,分成三组,如何操作呢?

dump(x.Chunk([1,2,3,4,5,6,7,8,9,10], 4))

/*
OUTPUT
([][]int) (len=3 cap=4) {
([]int) (len=4 cap=4) {
(int) 1,
(int) 2,
(int) 3,
(int) 4
},
([]int) (len=4 cap=4) {
(int) 5,
(int) 6,
(int) 7,
(int) 8
},
([]int) (len=2 cap=2) {
(int) 9,
(int) 10
}
}
*/
分组在某些时候非常有用,我们可以参考如下案例
dump(x.Chunk(str.ParseStringToHosts("192.168.1.1/24"), 4))

当我们对大任务进行拆分或网段进行拆分的时候,这个就非常有用了!