基于Deepseek的安全分析工具設(shè)計實踐
一、分享背景
DeepSeek近日紅的發(fā)紫,春節(jié)前發(fā)現(xiàn)一個叫Deepseek的LLM送 10 RMB的Token!!!,正巧符合生產(chǎn)工作中擁抱大模型的主旋律,又本著有羊毛必薅的原則配合B站ollama本地部署喂飯視頻起了阿里qwen2.5(1.5b)就行Coding輔助。
ollama本地部署Coding模型
step1:下載對應(yīng)的版本https://ollama.com/download,無限next安裝ollama
step2:如果單純coding無其他需求可本地起一個qwen2.5,集成到vscode。復(fù)制粘貼cmd拉即可
step3:在Vscode中下載continue,配置config.json如下圖所示。對應(yīng)ollama list中的name即可
本地格式如下:
{
"title": "Qwen2.5 1.5b",
"model": "qwen2.5-coder:1.5b",
"provider": "ollama"
}
調(diào)用api格式:
{
"title": "DeepSeek Chat",
"model": "deepseek-chat",
"contextLength": 128000,
"apiKey": "",
"provider": "deepseek"
}
step2:
step3:
效果:
二、工具需求分析
- GUI化,免去命令行操作,12-80年齡段各類人群均適用。
- 固定的LLM回復(fù)結(jié)果,使每一次提問都能得到相同格式的回答(區(qū)分在線提問和工具腳本的關(guān)鍵)。
- 結(jié)合LLM特點及DeepSeek(以下簡稱DP)免微調(diào)的強化學(xué)習(xí)優(yōu)勢,規(guī)避了非專業(yè)安全工程師對流量分析、惡意shell分析不清的弱點。
- 可拓展性,后續(xù)可豐富功能模塊。
- 結(jié)合Ollama本地部署特點,在內(nèi)網(wǎng)/無網(wǎng)絡(luò)服務(wù)情況下也可實現(xiàn)工具的功能點。
三、工具設(shè)計與實現(xiàn)
1.框架設(shè)計
首先通過對DP提問獲得主流Python的GUI庫,在DP回復(fù)中選擇了PyQt5庫(其擁有跨平臺特性,方便適配mac、windows系統(tǒng)的ui差異)。
#此處提出的問題為:
“請使用PyQt5為我設(shè)計一個GUI腳本,包含四個模塊為流量分析、JS審計、進(jìn)程分析、webshell檢測?!?/code>
給出的frame.py源碼如下,運行后符合預(yù)期效果。
import sys
import os
import requests
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QTextEdit, QPushButton, QLabel, QHBoxLayout,
QSplitter, QScrollArea, QTabWidget, QLineEdit, QFrame, QCheckBox, QSizePolicy, QComboBox, QFileDialog, QProgressBar)
from PyQt5.QtCore import Qt, QSize, QThread, pyqtSignal
from PyQt5.QtGui import QFont, QColor, QPalette, QLinearGradient
class CyberSecurityApp(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('網(wǎng)絡(luò)安全分析工具')
self.setGeometry(300, 300, 1200, 800)
self.setMinimumSize(QSize(1200, 800))
main_widget = QWidget()
self.setCentralWidget(main_widget)
# 創(chuàng)建主布局
main_layout = QVBoxLayout(main_widget)
# 添加標(biāo)簽頁組件
self.tab_widget = QTabWidget()
main_layout.addWidget(self.tab_widget)
# 創(chuàng)建各個模塊的標(biāo)簽頁
self.create_traffic_analysis_tab()
self.create_js_audit_tab()
self.create_process_analysis_tab()
self.create_webshell_tab()
def create_traffic_analysis_tab(self):
tab = QWidget()
layout = QVBoxLayout(tab)
layout.addWidget(QLabel("流量分析", fnotallow=QFont("Arial", 20, QFont.Bold)))
# 輸入框
self.traffic_input = QTextEdit()
self.traffic_input.setPlaceholderText("粘貼HTTP請求數(shù)據(jù)...")
layout.addWidget(self.traffic_input)
# 分析按鈕
self.analyze_btn = QPushButton("開始分析")
self.analyze_btn.clicked.connect(self.start_traffic_analysis)
layout.addWidget(self.analyze_btn)
# 結(jié)果顯示
self.traffic_result = QTextEdit()
self.traffic_result.setReadOnly(True)
layout.addWidget(self.traffic_result)
self.tab_widget.addTab(tab, "流量分析")
def create_js_audit_tab(self):
tab = QWidget()
layout = QVBoxLayout(tab)
layout.addWidget(QLabel("JS 審計", fnotallow=QFont("Arial", 20, QFont.Bold)))
# 輸入框
self.js_input = QTextEdit()
self.js_input.setPlaceholderText("粘貼JavaScript代碼...")
layout.addWidget(self.js_input)
# 審計按鈕
self.audit_btn = QPushButton("開始審計")
self.audit_btn.clicked.connect(self.start_js_audit)
layout.addWidget(self.audit_btn)
# 結(jié)果顯示
self.js_result = QTextEdit()
self.js_result.setReadOnly(True)
layout.addWidget(self.js_result)
self.tab_widget.addTab(tab, "JS 審計")
def create_process_analysis_tab(self):
tab = QWidget()
layout = QVBoxLayout(tab)
layout.addWidget(QLabel("進(jìn)程分析", fnotallow=QFont("Arial", 20, QFont.Bold)))
# 輸入框
self.process_input = QTextEdit()
self.process_input.setPlaceholderText("粘貼進(jìn)程信息...")
layout.addWidget(self.process_input)
# 分析按鈕
self.process_btn = QPushButton("開始分析")
self.process_btn.clicked.connect(self.start_process_analysis)
layout.addWidget(self.process_btn)
# 結(jié)果顯示
self.process_result = QTextEdit()
self.process_result.setReadOnly(True)
layout.addWidget(self.process_result)
self.tab_widget.addTab(tab, "進(jìn)程分析")
def create_webshell_tab(self):
tab = QWidget()
layout = QVBoxLayout(tab)
layout.addWidget(QLabel("WebShell 檢測", fnotallow=QFont("Arial", 20, QFont.Bold)))
# 輸入框
self.webshell_input = QTextEdit()
self.webshell_input.setPlaceholderText("粘貼文件內(nèi)容...")
layout.addWidget(self.webshell_input)
# 檢測按鈕
self.webshell_btn = QPushButton("開始檢測")
self.webshell_btn.clicked.connect(self.start_webshell_detection)
layout.addWidget(self.webshell_btn)
# 結(jié)果顯示
self.webshell_result = QTextEdit()
self.webshell_result.setReadOnly(True)
layout.addWidget(self.webshell_result)
self.tab_widget.addTab(tab, "WebShell 檢測")
def start_traffic_analysis(self):
# 這里可以添加流量分析的邏輯
self.traffic_result.setText("流量分析結(jié)果將顯示在這里...")
def start_js_audit(self):
# 這里可以添加 JS 審計的邏輯
self.js_result.setText("JS 審計結(jié)果將顯示在這里...")
def start_process_analysis(self):
# 這里可以添加進(jìn)程分析的邏輯
self.process_result.setText("進(jìn)程分析結(jié)果將顯示在這里...")
def start_webshell_detection(self):
# 這里可以添加 WebShell 檢測的邏輯
self.webshell_result.setText("WebShell 檢測結(jié)果將顯示在這里...")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = CyberSecurityApp()
window.show()
sys.exit(app.exec_())
2.模塊功能設(shè)計
設(shè)計滿足需求分析中的固定回復(fù)結(jié)果。
通過反復(fù)提問,固定向DP的提問方式。僅需在文本框中添加文本內(nèi)容即可。
(1)webshell檢測模塊的設(shè)計
class WebShellAnalysisThread(QThread):
analysis_complete = pyqtSignal(str, bool)
def __init__(self, file_content, parent=None):
super().__init__(parent)
self.file_content = file_content
self.api = APIAdapter()
def run(self):
try:
prompt = f"""請站在網(wǎng)絡(luò)安全專家角度分析以下文件內(nèi)容是否為WebShell或內(nèi)存馬。要求:
1. 檢查PHP/JSP/ASP等WebShell特征(如加密函數(shù)、執(zhí)行系統(tǒng)命令、文件操作)
2. 識別內(nèi)存馬特征(如無文件落地、進(jìn)程注入、異常網(wǎng)絡(luò)連接)
3. 分析代碼中的可疑功能(如命令執(zhí)行、文件上傳、信息收集)
4. 檢查混淆編碼、加密手段等規(guī)避技術(shù)
5. 最終結(jié)論:是否為惡意軟件(是/否)
請用中文按以下格式回答:
【分析結(jié)果】是/否
【惡意類型】WebShell/內(nèi)存馬/其他
【通信特征】列出檢測到的技術(shù)指標(biāo)
【風(fēng)險等級】高/中/低
文件內(nèi)容:
{self.file_content}"""
result = self.api.chat_completion(prompt)
is_malicious = "【分析結(jié)果】是" in result
self.analysis_complete.emit(result, is_malicious)
except Exception as e:
self.analysis_complete.emit(f"錯誤發(fā)生: {str(e)}", False)
(2)進(jìn)程分析模塊
class ProcessAnalysisThread(QThread):
process_complete = pyqtSignal(str)
def __init__(self, process_data, parent=None):
super().__init__(parent)
self.process_data = process_data
self.api = APIAdapter()
def run(self):
try:
prompt = f"""你是一個Windows/Linux進(jìn)程分析工程師,要求:
1. 用戶將輸出tasklist或者ps aux的結(jié)果
2. 幫助用戶分析輸出你所有認(rèn)識的進(jìn)程信息
3. 識別可能的惡意進(jìn)程
4. 識別殺毒軟件進(jìn)程
5. 識別其他軟件進(jìn)程
tasklist或者ps aux的結(jié)果:{self.process_data}
按優(yōu)先級列出需要關(guān)注的進(jìn)程
【可疑進(jìn)程】
【殺軟進(jìn)程】
【第三方軟件進(jìn)程】
給出具體操作建議:
? 安全進(jìn)程的可終止性評估
"""
result = self.api.chat_completion(prompt)
self.process_complete.emit(result)
except Exception as e:
self.process_complete.emit(f"進(jìn)程分析錯誤: {str(e)}")
(3)編解碼模塊
class DecodingThread(QThread):
decoding_complete = pyqtSignal(str)
def __init__(self, encoded_str, parent=None):
super().__init__(parent)
self.encoded_str = encoded_str
self.api = APIAdapter()
def run(self):
try:
prompt = f"""請站在網(wǎng)絡(luò)安全專家角度完整分析并解碼以下字符串,要求:
1. 識別所有可能的編碼方式(包括嵌套編碼)
2. 通過自己重新編碼,確認(rèn)自己解碼正確
3. 展示完整的解碼過程
4. 輸出最終解碼結(jié)果
原始字符串:{self.encoded_str}
請用中文按以下格式響應(yīng):
【編碼分析】列出檢測到的編碼類型及層級
【解碼過程】逐步展示解碼步驟
【最終結(jié)果】解碼后的明文內(nèi)容"""
result = self.api.chat_completion(prompt)
self.decoding_complete.emit(result)
except Exception as e:
self.decoding_complete.emit(f"解碼錯誤: {str(e)}")
(4)JS代碼審計模塊
class JsAuditThread(QThread):
audit_complete = pyqtSignal(str)
def __init__(self, js_code, parent=None):
super().__init__(parent)
self.js_code = js_code
self.api = APIAdapter()
def run(self):
try:
prompt = f"""請站在網(wǎng)絡(luò)安全專家角度對以下JavaScript代碼進(jìn)行完整的安全審計,要求:
1. 識別XSS、CSRF、不安全的DOM操作、敏感信息泄露、eval、assert使用等安全問題
2. 檢查第三方庫的安全性和版本漏洞
3. 分析代碼邏輯漏洞
4. 提供修復(fù)建議
請用中文按以下格式響應(yīng):
【高危漏洞】列出高危安全問題及位置
【中低危問題】列出中低風(fēng)險問題
【修復(fù)建議】提供具體修復(fù)方案
JavaScript代碼:
{self.js_code}"""
result = self.api.chat_completion(prompt)
self.audit_complete.emit(result)
except Exception as e:
self.audit_complete.emit(f"審計錯誤: {str(e)}")
(5)HTTP流量分析
class AnalysisThread(QThread):
analysis_complete = pyqtSignal(str, bool)
def __init__(self, http_data, parent=None):
super().__init__(parent)
self.http_data = http_data
self.api = APIAdapter()
def run(self):
try:
prompt = f"""站在網(wǎng)絡(luò)安全專家角度進(jìn)行網(wǎng)絡(luò)安全分析。請嚴(yán)格按照以下步驟執(zhí)行:
1. 分析以下HTTP請求的各個組成部分
2. 檢查User-Agent等頭部信息是否可疑
3. 識別是否存在SQL注入、XSS、CSRF、反序列化、文件上傳、路徑遍歷、OWASPTop10、等常見攻擊特征
4. 最終結(jié)論:是否為攻擊流量(是/否)
請用中文按以下格式響應(yīng):
【分析結(jié)果】是/否
【依據(jù)】簡明扼要列出技術(shù)依據(jù)
HTTP請求數(shù)據(jù):
{self.http_data}"""
result = self.api.chat_completion(prompt)
is_attack = "【分析結(jié)果】是" in result
self.analysis_complete.emit(result, is_attack)
except Exception as e:
self.analysis_complete.emit(f"錯誤: {str(e)}", False)
3.config文件配置
# API配置(可選值: "deepseek" 或 "ollama")
API_TYPE="deepseek"
# DeepSeek API:
DEEPSEEK_API_URL="https://api.deepseek.com/v1/chat/completions"
DEEPSEEK_API_KEY=" "
# DeepSeek模型名稱
#通過指定 model='deepseek-chat' 即可調(diào)用 DeepSeek-V3。指定 model='deepseek-reasoner',即可調(diào)用 DeepSeek-R1。
DEEPSEEK_MODEL="deepseek-chat"
# Ollama 本地API配置
OLLAMA_API_URL="http://localhost:11434/api/chat" # Ollama API地址
OLLAMA_MODEL="qwen2.5-coder:1.5b" # Ollama模型名稱
四、總結(jié)
本文詳細(xì)介紹了基于DeepSeek的安全分析工具的設(shè)計與實踐過程。通過結(jié)合DeepSeek的強化學(xué)習(xí)能力和Ollama的本地部署優(yōu)勢,設(shè)計并實現(xiàn)了一個功能豐富的安全分析工具。該工具不僅具備流量分析、JS審計、進(jìn)程分析、WebShell檢測等核心功能,還通過GUI化設(shè)計提升了用戶體驗,使得不同年齡段和技術(shù)背景的用戶都能輕松上手。此外,工具的可拓展性和離線使用能力進(jìn)一步增強了其實用性。
在實現(xiàn)過程中,通過反復(fù)提問和優(yōu)化,確保了DeepSeek的回復(fù)結(jié)果具有固定格式,提升了工具的穩(wěn)定性和可靠性。未來,隨著功能的不斷豐富和優(yōu)化,該工具有望在網(wǎng)絡(luò)安全領(lǐng)域發(fā)揮更大的作用,幫助更多非專業(yè)安全工程師快速識別和分析潛在的安全威脅。
總的來說,本文的實踐展示了如何利用大模型和本地部署技術(shù),構(gòu)建一個高效、易用的安全分析工具,為網(wǎng)絡(luò)安全領(lǐng)域提供了新的思路和解決方案。