处理扫描目标与网段(批量/分组)
编写扫描脚本是 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*/
info
- 按逗号分隔
- 遇到解析不了的将会原样输出
- 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*/
info
- 一般来说都是以逗号分割
- 遇到无法解析成端口段/端口的将会自动退出
str.HostPort
#
把 Host 和 Port 组合起来 最常见的一个需求是说,我们需要把端口和主机通过 :
组合起来。我们可以使用 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))
当我们对大任务进行拆分或网段进行拆分的时候,这个就非常有用了!