同时支持两种扫描方式的端口扫描器

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函数进行扫描。

posted @ 2023-04-13 11:17  MeetA  阅读(78)  评论(0)    收藏  举报