Awesome
SEC-分布式资产安全扫描(弱口令、系统漏洞、WEB漏洞扫描)
SEC (SEC Is Elastic Controller) 可用于企业对服务器资源安全进行扫描排查,可控性强、可停止运行中的扫描任务、支持分布式多节点部署,更快的扫描进度 + 节点执行信息动态反馈,快速定位漏洞。
作者开源此应用的目的是为了方便企业管理自身的服务器资产,提高安全性,以避免不必要的损失;同时也能与大家一起探讨学习,请使用者不要用于非法目的,自觉遵守 《中华人民共和国网络安全法》 ,一起为祖国的网络安全做贡献。
流程演示视频
版本更新
最初版:
- 目标端口服务发现
- 目标系统识别
- 漏洞扫描
- 用户管理
- 自定义扫描插件
- 字典
2.0:
- 子域名识别自动添加扫描任务
- DNS获取、CDN厂商识别(可在字典追加特征记录)
- 对暴露Web服务目标进行网页标题以及关键字抓取
- 支持对任务的批量处理操作、对结果集操作
- 支持对资产的批量处理操作、对结果集操作
- 优化删除任务速度
系统组成介绍
SEC共分为三个项目
前端WEB系统 使用动静分离的方式部署, WEB页面部分使用 Vue + ElementUI 编写,所有的UI都在这个项目中。
中央控制系统 使用Python3 + Flask编写,负责录入资产的端口服务发现、任务执行统计、资产管理、数据字典、漏洞插件管理、用户管理、扫描任务下发以及同步等后台实现,添加的IP会立即进行端口服务以及系统探测。
任务执行系统 使用Python3编写,负责处理执行下发的扫描任务,并回馈处理结果。 执行系统以进程为执行单位,可在同一台机器部署多个进程服务,支持多节点分布式部署。
部署方式(共有三种部署方式)
一、 一键部署
一键部署已经将所有服务以及启动脚本打包成docker镜像, 可以直接运行,数据库以及相关公用服务直接打包在容器内部,不支持分布式节点扩展,可作为体验测试,不建议直接作为生产环境使用。
- 首先需要安装Docker服务,Ubuntu可使用以下指令直接安装(已经安装Docker服务并启动的直接调到第 3 步)
Ubuntu:
sudo apt-get -y install docker.io
CentOS:
[请根据docker官方文档步骤进行安装] (https://docs.docker.com/engine/install/centos/)
- 启动Docker服务(已经安装Docker服务并启动的直接调到第 3 步)
sudo service docker start
- 启动SEC服务(指令中8000是后台访问端口, 可根据需求修改为其他端口,NODE_COUNT 为执行节点启动的进程数,默认为3)
docker run -d -p 8000:80 --name sec --env NODE_COUNT=3 smallcham/sec:all-in-0.3 && docker logs -f sec --tail 10
- 服务启动后初始用户为:root, 初始密码将会打印在控制台,可在登录后修改。
二、使用容器分布式部署(推荐)
- 首先需要安装Docker服务,Ubuntu可使用以下指令直接安装(已经安装Docker服务并启动的直接调到第 3 步)
Ubuntu:
sudo apt-get -y install docker.io
CentOS:
sudo yum -y install docker.io
- 启动Docker服务(已经安装Docker服务并启动的直接调到第 3 步)
sudo service docker start
- 使用容器启动并初始化MySQL数据库
docker run --name sec-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=secpassword -d mysql:5.7
wget https://raw.githubusercontent.com/smallcham/sec-admin/master/pack/create_db.sql
等待半分钟,mysql启动完毕后执行
注意:如果你从老版本SEC升级安装到新版,也请务必再次执行SQL
docker exec -i sec-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /你下载的目录/create_db.sql
如果你要使用自己现有的数据库可以直接将create_db.sql中的SQL执行进行初始化,注意:如果你从老版本SEC升级安装到新版,也请务必再次执行SQL
- 使用容器启动Redis
docker run -p 6379:6379 --name sec-redis -d redis
你也可以使用自己现有的Redis
- 使用容器启动SEC控制系统
docker run -d -p 启动端口:80 --name sec --env HOST=http://部署机器的IP:启动端口(启动后用这个URL在浏览器访问) --env DB_URL=MySQL用户名:MySQL密码@MySQLIP:数据库端口(一默认是3306)/sec --RDS_URL=Redis库号(默认写0):Redis密码(没有密码可以不写)@RedisIP:Redis端口(默认是6379) -v ~/sec-script:/var/www/html/sec-admin/static/plugin/usr smallcham/sec:core-0.1 && docker logs -f sec --tail 10
例如
docker run -d -p 8793:80 --name sec --env HOST=http://192.168.0.107:8793 --env DB_URL=root:abcd1234@192.168.0.107:3306/sec --env RDS_URL=0:abcd1234@192.168.0.107:6379 -v ~/sec-script:/var/www/html/sec-admin/static/plugin/usr smallcham/sec:core-0.2 && docker logs -f sec --tail 10
- 登录SEC管理系统 使用节点添加功能生成并拷贝到终端执行节点安装指令,节点支持分布式,只要保证部署服务器与控制系统以及Redis之间互通即可,当然也可以直接在同一台服务器部署,详细操作请查看演示视频
三、不使用容器本地部署(以下示例基于Ubuntu)
- 安装MySQL、Redis、Nodejs、npm、Nginx、Python3、pip3 各种类的系统内的安装方法都大同小异, 这里就不作详细介绍。
- 编译Web页面项目
* git clone https://github.com/smallcham/sec-admin-web.git
* cd 你的项目路径/sec-admin-web/
* npm install
* npm run build
* ln -s 你的项目路径/sec-admin-web/dist 你的Nginx网站目录/
编译好的静态文件在项目的 dist 目录 3. 运行SEC核心控制系统
* git clone https://github.com/smallcham/sec-admin.git
* cd 你的项目路径/sec-admin/
* pip install -r requirements.txt // 找不到pip的尝试 pip3 install -r requirements.txt
* git clone https://github.com/aboul3la/Sublist3r
* python setup.py install //进入Sublist3r目录执行
* 打开项目路径下的 src/model/enum.py 修改Env类 默认LOCAL判断内的数据库以及Redis配置为你安装的配置
* nohup gunicorn -w 10 app:flask_app
- 配置Nginx访问
以下配置模板供参考,端口或者目录不一样请自行修改。
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm;
server_name _;
location / {
root /var/www/html/dist;
try_files $uri $uri/ 404;
}
location /api/ {
proxy_pass http://localhost:8000/;
}
location /static/plugin/usr/ {
proxy_pass http://localhost:8000;
}
}
配置好后记得重启nginx服务 5. 启动执行节点
* git clone https://github.com/wanzywang/sec-scannode.git
* cd 你的项目路径/sec-scannode/
* pip install -r requirements.txt // 找不到pip的尝试 pip3 install -r requirements.txt
* 打开项目根目录的 config.py 修改redis配置为你安装的ip以及密码
* python -u scan.py
功能介绍
插件说明
SEC支持添加自定义扫描插件脚本,目前仅支持Python语言,格式如下。
//target参数为扫描目标, 可以是IP也可以是域名,具体取决于资产录入的是ip还是域名
def do(target):
if 发现漏洞:
return True, '发现漏洞,原因***'
else:
return False, ''
可参考以下FTP弱口令扫描脚本 其中 SEC_USER_NAME、SEC_PASSWORD 为字典功能中录入的Key值,扫描节点会自动将数据字典中添加的内容以设置的分隔符或JSON格式转化为数组或字典,可以通过字典Key值直接引入使用。
from ftplib import FTP
def do(target):
port = 21
time_out_flag = 0
for user in SEC_USER_NAME:
print(user)
for pwd in SEC_PASSWORD:
print(pwd)
try:
ftp = FTP(target, timeout=3)
ftp.connect(target, port, 5)
if ftp.login(user, pwd).startswith('2'):
return True, '用户: ' + user + ' 存在弱口令: ' + pwd
except Exception as e:
if not str(e).startswith('530'):
print(e)
if e.args[0] == 113 or e.args[0] == 111 or 'timed out' in str(e):
time_out_flag += 1
if time_out_flag > 2:
print('connection timeout , break the loop .')
return False, ''
else:
print(e)
return False, ''