同时支持两种扫描方式的端口扫描器
0x00 全连接与半连接的合并
前面已经开发了TCP全连接与TCP半连接端口扫描器,为了方便使 用,接下来将两种扫描器合并,命令行参数如下:
go run main.go -iplist ip_list -port port_list -mode syn -timeout 2 - concurrency 100
● iplist表示扫描的IP列表。
● port表示扫描的端口列表。
● mode表示扫描模式,全连接或半连接。
● timeout表示每个连接的超时时间。
● concurrency表示扫描器的并发数。
0x01 cmd的使用
使 用 功 能 更 加 强 大 的 第 三 方 包 github.com/urfave/cli,它的用法如下所示
var Scan = cli.Command{
Name: "scan",
Usage: "start to scan port",
Description: "start to scan port",
Action: util.Scan,
Flags: []cli.Flag{
stringFlag("iplist, i", "", "ip list"),
stringFlag("port, p", "", "port list"),
stringFlag("mode, m", "", "scan mode"),
intFlag("timeout, t", 3, "timeout"),
intFlag("concurrency, c", 1000, "concurrency"),
},
}
func stringFlag(name, value, usage string) cli.StringFlag {
return cli.StringFlag{
Name: name,
Value: value,
Usage: usage,
}
}
func boolFlag(name, usage string) cli.BoolFlag {
return cli.BoolFlag{
Name: name,
Usage: usage,
}
}
func intFlag(name string, value int, usage string) cli.IntFlag {
return cli.IntFlag{
Name: name,
Value: value,
Usage: usage,
}
}
以上代码的作用是检查是否在命令行中指定了每个参数的值,如 果有指定的值,就会用新的值替换参数的默认值,然后生成待扫描的 任务列表,并调用RunTask函数进行扫描。
scanner.RunTask(tasks)会根据扫描的类型调用不同的扫描函 数,代码如下所示:
func Scan(ctx *cli.Context) error {
if ctx.IsSet("iplist") {
vars.Host = ctx.String("iplist")
}
if ctx.IsSet("port") {
vars.Port = ctx.String("port")
}
if ctx.IsSet("mode") {
vars.Mode = ctx.String("mode")
}
if ctx.IsSet("timeout") {
vars.Timeout = ctx.Int("timeout")
}
if ctx.IsSet("concurrency") {
vars.ThreadNum = ctx.Int("concurrency")
}
if strings.ToLower(vars.Mode) == "syn" {
CheckRoot()
}
ips, err := GetIpList(vars.Host)
ports, err := GetPorts(vars.Port)
tasks, n := scanner.GenerateTask(ips, ports)
_ = n
scanner.RunTask(tasks)
scanner.PrintResult()
return err
}
以上代码的作用是检查是否在命令行中指定了每个参数的值,如 果有指定的值,就会用新的值替换参数的默认值,然后生成待扫描的 任务列表,并调用RunTask函数进行扫描。