Beholder:一款监控端口变化的系统 – 作者:zj1244

Beholder是一款简洁而小巧的系统,主要作用是通过监控端口变化来发现企业内部的信息孤岛。开发此项目的初衷是:实际工作中会遇到其他部门开通了新机器却未更新到CMDB,造成了IP遗漏,最后导致安全扫描缺失。所以想通过端口比较来监控企业的网络变化。

系统由beholder_scanner、beholder_web两个部分组成。这两个部分可以部署在一台机器上,也可以分开部署在不同的机器上。

  • beholder_scanner:对IP进行端口扫描、比较端口变化,可部署多个beholder_scanner来组成集群加快扫描速度。
  • beholder_web:提供前端界面展示。

支持平台

  • Linux
  • Windows

安装指南

一、 Demo版部署

如果只是测试和尝鲜可以部署Demo版:

优点是部署简单,缺点是不利于扩展和管理。

新建文件夹

# mkdir -p /mongodb/db

构建容器

新建个docker_demo.yml文件,复制粘贴如下内容:

version: '3'
services:
  scanner:
    image: zj1244/beholder_scanner:latest
    container_name: beholder_scanner
    restart: always
    environment:
      REDIS_IP: redis
      REDIS_PORT: 6379
      REDIS_PWD: ""
      MONGO_IP: mongo
      MONGO_PORT: 27017
      MONGO_USER: ""
      MONGO_PWD: ""
      SCAN_TIMEOUT: 300
      VULSCAN_KEY: ""
    depends_on:
      - redis
      - mongo
  web:
    image: zj1244/beholder_web:latest
    container_name: beholder_web
    ports:
      - "8000:8000"
    restart: always
    environment:
      ACCOUNT: "admin"
      PASSWORD: "admin"
      REDIS_IP: redis
      REDIS_PORT: 6379
      REDIS_PWD: ""
      MONGO_IP: mongo
      MONGO_PORT: 27017
      MONGO_USER: ""
      MONGO_PWD: ""
    depends_on:
      - redis
      - mongo
  redis:
    image: redis:5.0.3
    container_name: beholder_redis
    restart: always
    expose:
      - "6379"
  mongo:
    image: mongo:3.6.15-xenial
    container_name: beholder_mongo
    restart: always
    volumes:
      - "/mongodb/db:/data/db"
    expose:
      - "27017"

启动容器

# docker-compose -f docker_demo.yml up -d

检查启动是否成功

如果输出类似信息则启动成功,此时可访问http://ip:8000,输入默认用户名密码admin来登陆

# docker logs beholder_web
[2020-03-18 Wednesday 00:20] [INFO] Scheduler started
[2020-03-18 Wednesday 00:20] [DEBUG] Looking for jobs to run
[2020-03-18 Wednesday 00:20] [INFO]  * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
[2020-03-18 Wednesday 00:20] [DEBUG] Next wakeup is due at 2020-03-18 01:11:13.959033+08:00 (in 3019.861167 seconds)
# docker logs beholder_scanner
[2020-03-18 00:20:52,385] [INFO] 扫描开始

二、常规部署

依赖:项目运行依赖于mongodb和redis,所以需准备好mongodb和redis,关于mongodb和redis的安装这里不再阐述。请参考:

 

mongodb安装redis安装

 

添加mongodb认证

在 mongodb 服务器上新建 db 用户,这里新建了一个用户名为scan密码为123456的用户。

# mongo
> use admin
> db.createUser({user:'scan',pwd:'123456', roles:[{role:'readWriteAnyDatabase', db:'admin'}]})
> exit

导入数据库

把beholder_scanner项目下的db文件夹导入 mongodb 。在 mongodb 服务器上执行如下命令:

# git clone https://github.com/zj1244/beholder_scanner.git
# cd beholder_scanner/db/
# mongorestore -u scan -p 123456 --authenticationDatabase admin -d portscan .

构建镜像

新建个install_web_and_scanner.yml文件,复制粘贴如下内容,并根据实际情况修改redis和mongo配置信息:

version: '3'
services:
  scanner:
    image: zj1244/beholder_scanner:latest
    restart: always
    network_mode: "host"
    environment:
      # 请修改以下redis和mongodb的配置
      REDIS_IP: 192.168.47.16
      REDIS_PORT: 6379
      REDIS_PWD: pwd
      MONGO_IP: 192.168.47.16
      MONGO_PORT: 27017
      MONGO_USER: scan
      MONGO_PWD: 123456
      SCAN_TIMEOUT: 300
      # 用于后续扫描的队列,保持默认为空即可
      VULSCAN_KEY: ""
  web:
    image: zj1244/beholder_web:latest
    ports:
      - "8000:8000"
    restart: always
    environment:
      # 登陆用户名密码
      ACCOUNT: "admin"
      PASSWORD: "admin"
      # 请修改以下redis和mongodb的配置
      REDIS_IP: 192.168.47.16
      REDIS_PORT: 6379
      REDIS_PWD: pwd
      MONGO_IP: 192.168.47.16
      MONGO_PORT: 27017
      MONGO_USER: scan
      MONGO_PWD: 123456

启动容器

# docker-compose -f install_web_and_scanner.yml up -d

检查启动是否成功

如果输出类似信息则启动成功,此时可访问http://ip:8000,输入install_web_and_scanner.yml里的用户名密码来登陆

# docker logs $(docker ps | grep zj1244/beholder_web | awk '{print $1}')
[2020-03-18 Wednesday 00:20] [INFO] Scheduler started
[2020-03-18 Wednesday 00:20] [DEBUG] Looking for jobs to run
[2020-03-18 Wednesday 00:20] [INFO]  * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
[2020-03-18 Wednesday 00:20] [DEBUG] Next wakeup is due at 2020-03-18 01:11:13.959033+08:00 (in 3019.861167 seconds)
# docker logs $(docker ps | grep zj1244/beholder_scanner | awk '{print $1}')
[2020-03-18 00:20:52,385] [INFO] 扫描开始

至此整套程序部署完毕。

三、部署单个扫描节点(可选)

如果需要提升扫描速度,可以在多台机器上重复部署beholder_scanner来组成集群。步骤如下:

构建镜像

使用 vi 新建一个名为docker-compose.yml的文件,复制粘贴如下内容:

version: '3'
services:
  scanner:
    image: zj1244/beholder_scanner:latest
    restart: always
    network_mode: "host"
    environment:
      # 请修改以下redis和mongodb的配置
      REDIS_IP: 192.168.47.16
      REDIS_PORT: 6379
      REDIS_PWD: pwd
      MONGO_IP: 192.168.47.16
      MONGO_PORT: 27017
      MONGO_USER: scan
      MONGO_PWD: 123456
      SCAN_TIMEOUT: 300
      VULSCAN_KEY: ""

启动容器

# docker-compose up -d

检查scanner是否正常启动

输入如下命令,如果输出扫描开始则表示启动成功

# docker logs $(docker ps | grep zj1244/beholder_scanner | awk '{print $1}')
[2020-02-15 15:48:56,575] [INFO] 扫描开始

使用手册

一、 配置

第一次使用时需要在【配置】中设置扫描并发数。如果需要把比较结果发送邮箱,请配置邮件相关信息。

image.png

二、新增扫描任务

在【添加任务】页面中,添加需要监控的IP段和端口。注意:

  • 任务名称不能重复
  • 如果循环周期选择【不循环】,则添加的是一次性任务
  • 如果一个循环周期内扫描没有完成,下个循环周期开始时不会添加新任务

image.png

三、查看端口变化

当任务循环扫描两次(不含两次)以上时,才会进行端口比较。

点击【任务列表】->【扫描详情】

image.png

在【扫描详情】页面,点击【扫描次数】,可以查看每次扫描的IP变化。

image.png

四、查找端口信息

可以按照如下方法搜索(不区分大小写,支持模糊查询):

1.按端口: port:端口号 eg. port:22

2.按服务名: server:服务名 eg. server:iis

3.按ip: ip:ip地址 eg. ip:192.168.14

4.按软件名: soft:服务名 eg. soft:supervisor

image.png

五、与扫描器联动

项目预留了与扫描器联动的方式。如果yml文件里的VULSCAN_KEY不为空,就会把扫描结果存到redis里,这样扫描器就可以通过读取redis的端口信息来进行扫描。

image.png

总结

Q:为什么不用masscan+nmap的组合?

A:在实际的使用中发现,虽然masscan可以提高扫描速度,但是漏报的情况太严重了,而且很容易造成网络瘫痪。如果把发包频率限制在某个程度可以解决网络瘫痪问题,但是速度还不如只使用nmap快。所以最终只采用nmap进行扫描

Q:端口比较是否准确

A:由于网络波动等问题,可能做不到100%的准确,只能不断的接近100%

最后给出该项目地址,请各位师傅轻拍:

扫描节点:https://github.com/zj1244/beholder_scanner

web端:https://github.com/zj1244/beholder_web

来源:freebuf.com 2020-07-02 21:47:27 by: zj1244

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论