28

Beholder:一款监控端口变化的系统

 3 years ago
source link: https://www.freebuf.com/sectool/239311.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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] 扫描开始

使用手册

一、 配置

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

IFjU3yn.jpg!mobile

二、新增扫描任务

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

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

riqye2m.jpg!mobile

三、查看端口变化

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

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

bAj2Mzq.jpg!mobile

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

EvmaUfI.jpg!mobile

四、查找端口信息

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

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

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

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

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

Z3yIRzQ.jpg!mobile

五、与扫描器联动

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

jIJnmaQ.jpg!mobile

总结

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

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

Q:端口比较是否准确

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK