phoenix

phoenix

老帖子

发现系统后台还有这文章。
不过代码也不见了... 发出记录一下。

0x1前言

为了巩固我的golang基础姿势,决定把扫描器从python改为golang版本。凤凰扫描器的功能就是先扫描指定端口并识别服务类型,最后根据服务类型进行指定的安全扫描(爆破+漏洞检测)

golang的优势比python来的明显,强大的并发能力,跨平台,可用go build 生成文件,完美解决依赖问题。
可惜鉴于安全法:任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助

0x2浅析源代码

one:看一下项目结构

项目结构图

base文件夹为基础类定义,包括了扫描对象核心类和多协程病房队列类
utils文件夹为方法,包括了扫描ip获取,扫描端口获取,ping扫描(命令执行接口),端口扫描,结果保存
conf文件夹密码配置文件
plugins 文件夹密码配置文件,存放各个扫描插件

two:核心类(ScanTargetInfo)

// 端口对象
type ScanTargetInfo struct {
    Target            string             `json:"target"`          //扫描ip段
    Debug          bool             `json:"debug"`         // 是否开启debug
    Lock           sync.Mutex       `json:"lock"`         // 锁
    Thread         int                 `json:"thread"`    // 最大协程数
    ScanIpList     []string        `json:"scan_ip_list"`  // 扫描iplist
    AliveIpList    []string        `json:"alive_ip_list"` // 存活iplist
    CommonPortList []int    `json:"common_port_list"`  // 常见端口列表
    PortList       []PortInfo    `json:"prot_List"`       // 端口信息类别
    VulList       []string    `json:"vul_list"`       // 发现漏洞详情记录
}

// 端口对象
type PortInfo struct {
    Service string  `json:"service"` // 服务类型
    Ip      string  `json:"ip"`      // ip
    Port    int     `json:"port"`    // 端口
}

扫描器的核心就是ScanTargetInfo类,和@用学学习的golang对象编程思路中得到启发,所以我将这个扫描器的看出一个对象,把扫描相关的变量全在这里(包括扫描的ip段,协程数,操作锁,存活ip,开放端口信息,还有发现的漏洞信息),最后各个方法或者是插件都是通过指针直接操作这个扫描对象里面的各个变量数据。

three:多协程并发类

我们都知道,golang的并发很强大,但是扫描是不能瞎并发的,不然可能会把别人扫挂或者网络挂掉。所以扫描需要一个队列来控制一下。对于golang来说就是队列多协程了,找了很久,在github找到一个:https://github.com/rylio/queue

感觉不错,代码有复杂,叫@用学帮忙看一下原理:


1.主程序执行NewQueueAndRun,开启一个协程(main coroutine)为主要协程
2.主程序可以通过push推任务队列
3.main coroutine,监听channel来的消息,并一直消费主机程序推进来的任务,多协程(可控制)的去执行你定义的函数。
每个协程执行完退出是都会把sync.WaitGroup的num减一,这个用于控制下一部的等待
4.主程序可以通过sync.WaitGroup的原理来等待任务结束

注意一下,多协程对map和切片操作都需要加锁。

four:程序大体流程

看phoenix.go文件,就知道,程序大体流程为这样的:

1.新建一个ScanTargetInfo类,从用户这边接受ip端口,扫描协程数,端口等信息,将它们赋值给ScanTargetInfo类。
2.执行命令进行多协程ping扫描,将存活的ip,存到AliveIpList切片中
3.对AliveIpList的ip进行多协程端口扫描和服务探测,将开放端口服务存到PortList
4.对PortList的端口服务进行插件的多协程扫描,将扫描到的漏洞存到PortList
5.最后漏洞信息保存的文件中

0x3包依赖解决

@用学推荐的glide还挺好用的,大家也安装一个,然后在项目目录中glide update 一下就好了。

如果是go get的话:

go get github.com/denisenkom/go-mssqldb
go get github.com/go-ldap/ldap
go get github.com/go-redis/redis
go get github.com/go-sql-driver/mysql
go get github.com/jlaffaye/ftp
go get github.com/mikioh/ipaddr
go get github.com/stacktitan/smb
go get golang.org/x/crypto
go get gopkg.in/mgo.v2

生成二进制文件:

go build -ldflags "-s -w" phoenix.go

完全无依赖,不过文件大小为7M还是比较大。

0x4使用姿势

➜  phoenix git:(master) ✗ ./phoenix -help
Usage of ./phoenix:
  -debug
        debug, default true,you can -debug=false to disable print someting (default true)
  -ip string
        ip like 192.168.1.0/24 or 192.168.0.0/16
  -is_ping
        scan with ping default, you can -is_ping=false to disable it (default true)
  -p string
        scan ports;like 21,80,445 or 22-1000
  -threads int
        Maximum threads, default 50 (default 50)

禁止用于非法测试!谢谢,文明公民,人人守法!

标签: admin

仅有一条评论

  1. wilson

    居然还是17年写的。。。

添加新评论