SEC (SEC Is Elastic Controller) 可用於企業對伺服器資源安全進行掃描排查,可控性強、可停止運行中的掃描任務、支持分布式多節點部署,更快的掃描進度 + 節點執行信息動態反饋,快速定位漏洞。
作者開源此應用的目的是為了方便企業管理自身的伺服器資產,提高安全性,以避免不必要的損失;同時也能與大家一起探討學習,請使用者不要用於非法目的,自覺遵守 《中華人民共和國網絡安全法》 ,一起為祖國的網絡安全做貢獻。
流程演示視頻版本更新最初版:目標埠服務發現
目標系統識別
漏洞掃描
用戶管理
自定義掃描插件
字典
2.0:系統組成介紹SEC共分為三個項目
前端WEB系統 使用動靜分離的方式部署, WEB頁面部分使用 Vue + ElementUI 編寫,所有的UI都在這個項目中。
中央控制系統 使用Python3 + Flask編寫,負責錄入資產的埠服務發現、任務執行統計、資產管理、數據字典、漏洞插件管理、用戶管理、掃描任務下發以及同步等後臺實現,添加的IP會立即進行埠服務以及系統探測。
任務執行系統 使用Python3編寫,負責處理執行下發的掃描任務,並回饋處理結果。執行系統以進程為執行單位,可在同一臺機器部署多個進程服務,支持多節點分布式部署。
部署方式(共有三種部署方式)一、 一鍵部署一鍵部署已經將所有服務以及啟動腳本打包成docker鏡像, 可以直接運行,資料庫以及相關公用服務直接打包在容器內部,不支持分布式節點擴展,可作為體驗測試,不建議直接作為生產環境使用。
首先需要安裝Docker服務,Ubuntu可使用以下指令直接安裝(已經安裝Docker服務並啟動的直接調到第 3 步)
Ubuntu:
sudo apt-get -y install docker.ioCentOS:
sudo yum -y install docker.io啟動Docker服務(已經安裝Docker服務並啟動的直接調到第 3 步)
sudo service docker start啟動SEC服務(指令中8793是後臺訪問埠, 可根據需求修改為其他埠,NODE_COUNT 為執行節點啟動的進程數,默認為3)
docker run -d -p 8793:80 --name sec --env NODE_COUNT=3 smallcham/sec:all-in-0.2 && docker logs -f sec --tail 10服務啟動後初始用戶為:root, 初始密碼將會列印在控制臺,可在登錄後修改。
二、使用容器分布式部署(推薦)首先需要安裝Docker服務,Ubuntu可使用以下指令直接安裝(已經安裝Docker服務並啟動的直接調到第 3 步)
Ubuntu:
sudo apt-get -y install docker.ioCentOS:
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.7wget 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 目錄
運行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服務
啟動執行節點
* 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, ''資產錄入執行節點管理資產管理列表
字典管理
插件管理
公眾號回復:sec-admin
即可下載到最新版本的百度雲連結~