From 5259e512ed53cd7de5a424f79a52af502877a41a Mon Sep 17 00:00:00 2001 From: song_xiao_lin Date: Tue, 11 Jun 2024 15:24:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/src/assets/icon/outline.tsx | 39 + .../src/main/src/assets/icon/solid.tsx | 7 +- app/renderer/src/main/src/assets/mitm-bg.png | Bin 0 -> 167633 bytes .../src/components/HTTPHistory.module.scss | 1 + .../main/src/components/layout/FuncDomain.tsx | 2 +- .../main/src/components/layout/UILayout.tsx | 43 +- .../components/layout/uiLayout.module.scss | 2 +- .../EnterpriseReportViewer.module.scss | 2 +- .../fuzzer/FuzzerSequence/FuzzerSequence.tsx | 2 +- .../pages/fuzzer/HTTPFuzzerPage.module.scss | 2 +- .../main/src/pages/fuzzer/HTTPFuzzerPage.tsx | 56 +- .../WebFuzzerPage/WebFuzzerPage.module.scss | 1 + app/renderer/src/main/src/pages/home/Home.tsx | 1296 ++++++++++++++ .../src/main/src/pages/home/home.module.scss | 1531 +++++++++++++++++ .../pages/layout/publicMenu/PublicMenu.tsx | 4 + .../src/main/src/pages/mitm/MITMPage.tsx | 11 + .../MITMServerHijacking.module.scss | 1 + .../MITMServerHijacking.tsx | 42 +- .../MITMServerStartForm.tsx | 16 + .../src/main/src/pages/newHome/NewHome.tsx | 989 ----------- .../src/pages/newHome/newHome.module.scss | 317 ---- .../pluginHub/pluginHubList/HubListLocal.tsx | 2 +- app/renderer/src/main/src/routes/newRoute.tsx | 4 +- .../src/main/src/routes/publicIcon.tsx | 837 +++++++++ .../src/main/src/store/publicMenu.tsx | 28 + .../main/src/utils/eventBus/events/mitm.ts | 3 + app/renderer/src/main/src/yakitGV.ts | 5 +- 27 files changed, 3871 insertions(+), 1372 deletions(-) create mode 100644 app/renderer/src/main/src/assets/mitm-bg.png create mode 100644 app/renderer/src/main/src/pages/home/Home.tsx create mode 100644 app/renderer/src/main/src/pages/home/home.module.scss delete mode 100644 app/renderer/src/main/src/pages/newHome/NewHome.tsx delete mode 100644 app/renderer/src/main/src/pages/newHome/newHome.module.scss create mode 100644 app/renderer/src/main/src/store/publicMenu.tsx diff --git a/app/renderer/src/main/src/assets/icon/outline.tsx b/app/renderer/src/main/src/assets/icon/outline.tsx index abe5cbdc91..20a49c0cf2 100644 --- a/app/renderer/src/main/src/assets/icon/outline.tsx +++ b/app/renderer/src/main/src/assets/icon/outline.tsx @@ -5332,3 +5332,42 @@ const OutlineTrashSecond = () => ( export const OutlineTrashSecondIcon = (props: Partial) => { return } + +/** + * @description UI Kit/Icon/Outline/端口资产 + */ +const OutlineModScanPortData = () => ( + + + + + + + + + + + + + + + +) +export const OutlineModScanPortDataIcon = (props: Partial) => { + return +} diff --git a/app/renderer/src/main/src/assets/icon/solid.tsx b/app/renderer/src/main/src/assets/icon/solid.tsx index c011af0914..cff3990ded 100644 --- a/app/renderer/src/main/src/assets/icon/solid.tsx +++ b/app/renderer/src/main/src/assets/icon/solid.tsx @@ -1715,13 +1715,16 @@ export const SolidDocumentsearchIcon = (props: Partial) => { } const SolidDocumenttext = () => ( - + + + ) /** diff --git a/app/renderer/src/main/src/assets/mitm-bg.png b/app/renderer/src/main/src/assets/mitm-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7bdc174447d7d69911d471a47754765f045131 GIT binary patch literal 167633 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

#P+o<`n?Gz^P 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 = React.memo((props) => {

- +
{/* 等使用更新内容时,下面"当前版本"-div需要被删除 */}
diff --git a/app/renderer/src/main/src/components/layout/UILayout.tsx b/app/renderer/src/main/src/components/layout/UILayout.tsx index ed0bc2cfd0..cf4866b147 100644 --- a/app/renderer/src/main/src/components/layout/UILayout.tsx +++ b/app/renderer/src/main/src/components/layout/UILayout.tsx @@ -1233,11 +1233,13 @@ const UILayout: React.FC = (props) => { > {performanceSamplingInfo.log.map((item, index) => (
- + { ipcRenderer .invoke("is-file-exists", item.path) @@ -1251,7 +1253,12 @@ const UILayout: React.FC = (props) => { .catch(() => {}) }} > - {item.path.substring(item.path.lastIndexOf("\\") + 1)} + {item.path.substring( + Math.max( + item.path.lastIndexOf("/"), + item.path.lastIndexOf("\\") + ) + 1 + )} @@ -1288,18 +1295,20 @@ const UILayout: React.FC = (props) => { if (!visible) setIsShowSamplingInfo(false) }} > - setIsShowSamplingInfo(true)} - > -
- -
- 采样完成 -
+ + setIsShowSamplingInfo(true)} + > +
+ +
+ 采样完成 +
+
) : ( <> diff --git a/app/renderer/src/main/src/components/layout/uiLayout.module.scss b/app/renderer/src/main/src/components/layout/uiLayout.module.scss index 8d0eeb77f8..f3c5332740 100644 --- a/app/renderer/src/main/src/components/layout/uiLayout.module.scss +++ b/app/renderer/src/main/src/components/layout/uiLayout.module.scss @@ -247,7 +247,7 @@ .sampling-popover { width: 272px; - padding-top: 3px; + padding-top: 10px; border-radius: 4px; overflow: hidden; border: 1px solid var(--yakit-border-color); diff --git a/app/renderer/src/main/src/pages/assetViewer/EnterpriseReportViewer.module.scss b/app/renderer/src/main/src/pages/assetViewer/EnterpriseReportViewer.module.scss index 85c011421c..d24ccc3e65 100644 --- a/app/renderer/src/main/src/pages/assetViewer/EnterpriseReportViewer.module.scss +++ b/app/renderer/src/main/src/pages/assetViewer/EnterpriseReportViewer.module.scss @@ -1,3 +1,3 @@ -.enterprise-report-viewer{ +.enterprise-report-viewer { height: 100%; } \ No newline at end of file diff --git a/app/renderer/src/main/src/pages/fuzzer/FuzzerSequence/FuzzerSequence.tsx b/app/renderer/src/main/src/pages/fuzzer/FuzzerSequence/FuzzerSequence.tsx index fe540f7255..9716468235 100644 --- a/app/renderer/src/main/src/pages/fuzzer/FuzzerSequence/FuzzerSequence.tsx +++ b/app/renderer/src/main/src/pages/fuzzer/FuzzerSequence/FuzzerSequence.tsx @@ -2079,7 +2079,7 @@ const SequenceResponse: React.FC = React.memo( // 序列动画演示 interface SequenceAnimationAemonstrationProps {} -const SequenceAnimationAemonstration: React.FC = React.memo((props) => { +export const SequenceAnimationAemonstration: React.FC = React.memo((props) => { return (
diff --git a/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.module.scss b/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.module.scss index 9fc4729ca0..64c753b276 100644 --- a/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.module.scss +++ b/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.module.scss @@ -363,10 +363,10 @@ .blasting-animation-aemonstration { padding: 16px; + padding-top: 0; .animation-cont-wrap { margin-top: 16px; width: 100%; - height: 310px; border-radius: 10px; border: 1px solid var(--yakit-border-color); overflow: hidden; diff --git a/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.tsx b/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.tsx index ec8059893a..7afaa61313 100644 --- a/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.tsx +++ b/app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useMemo, useRef, useState} from "react" +import React, {CSSProperties, useEffect, useMemo, useRef, useState} from "react" import {Form, Modal, Result, Space, Popover, Tooltip, Divider, Descriptions} from "antd" import { IMonacoEditor, @@ -3128,9 +3128,12 @@ const ResponseViewerSecondNode: React.FC = React. }) // 爆破动画演示 -interface BlastingAnimationAemonstrationProps {} -const BlastingAnimationAemonstration: React.FC = React.memo((props) => { - const [animationType, setAnimationType] = useState("id") +interface BlastingAnimationAemonstrationProps { + animationType?: string + videoStyle?: CSSProperties +} +export const BlastingAnimationAemonstration: React.FC = React.memo((props) => { + const [animationType, setAnimationType] = useState(props.animationType || "id") const [animationResources, setAnimationResources] = useState(blastingIdmp4) @@ -3146,28 +3149,31 @@ const BlastingAnimationAemonstration: React.FC - setAnimationType(e.target.value)} - /> + {!props.animationType && ( + setAnimationType(e.target.value)} + /> + )} +
- +
) diff --git a/app/renderer/src/main/src/pages/fuzzer/WebFuzzerPage/WebFuzzerPage.module.scss b/app/renderer/src/main/src/pages/fuzzer/WebFuzzerPage/WebFuzzerPage.module.scss index d9c978856b..2b4c5b89cb 100644 --- a/app/renderer/src/main/src/pages/fuzzer/WebFuzzerPage/WebFuzzerPage.module.scss +++ b/app/renderer/src/main/src/pages/fuzzer/WebFuzzerPage/WebFuzzerPage.module.scss @@ -22,6 +22,7 @@ color: var(--yakit-header-color); cursor: pointer; background-color: #f0f1f3; + border-bottom: 1px solid #fff; &:hover { background-color: rgba(204, 210, 222, 0.5); } diff --git a/app/renderer/src/main/src/pages/home/Home.tsx b/app/renderer/src/main/src/pages/home/Home.tsx new file mode 100644 index 0000000000..6cea6b0c4f --- /dev/null +++ b/app/renderer/src/main/src/pages/home/Home.tsx @@ -0,0 +1,1296 @@ +import React, {useEffect, useMemo, useRef, useState, ReactElement, CSSProperties} from "react" +import classNames from "classnames" +import styles from "./home.module.scss" +import { + PublicBlastingIcon, + PublicBruteIcon, + PublicCodecIcon, + PublicDNSLogIcon, + PublicDirectoryScanningIcon, + PublicMitmIcon, + PublicPayloadGeneraterIcon, + PublicPublicToolLightbulbIcon, + PublicScanPortIcon, + PublicSequenceAnimationIcon, + PublicToolBasicCrawlerIcon, + PublicToolCVEIcon, + PublicToolDBDomainIcon, + PublicToolDBHTTPHistoryIcon, + PublicToolDBReportIcon, + PublicToolDBRiskIcon, + PublicToolDataCompareIcon, + PublicToolICMPSizeLogIcon, + PublicToolModScanPortIcon, + PublicToolPayloadIcon, + PublicToolPluginHubIcon, + PublicToolReverseServerIcon, + PublicToolScreenRecorderPageIcon, + PublicToolScreenRecordingIcon, + PublicToolScreenshotIcon, + PublicToolShellReceiverIcon, + PublicToolSpaceEngineIcon, + PublicToolSubDomainCollectionIcon, + PublicToolTCPPortLogIcon, + PublicToolVulinboxIcon, + PublicToolWebsocketFuzzerIcon, + PublicToolYakScriptIcon, + PublicWebFuzzerIcon +} from "@/routes/publicIcon" +import {YakitButton} from "@/components/yakitUI/YakitButton/YakitButton" +import {SolidCheckIcon, SolidDocumenttextIcon, SolidExclamationIcon, SolidPlayIcon} from "@/assets/icon/solid" +import {showYakitModal} from "@/components/yakitUI/YakitModal/YakitModalConfirm" +import {BlastingAnimationAemonstration} from "../fuzzer/HTTPFuzzerPage" +import { + OutlineArrowrightIcon, + OutlineBugIcon, + OutlineChartbarIcon, + OutlineChevronupIcon, + OutlineDatabaseIcon, + OutlineDesktopcomputerIcon, + OutlineModScanPortDataIcon, + OutlineQuestionmarkcircleIcon +} from "@/assets/icon/outline" +import {SequenceAnimationAemonstration} from "../fuzzer/FuzzerSequence/FuzzerSequence" +import {YakitRoute} from "@/enums/yakitRoute" +import emiter from "@/utils/eventBus/eventBus" +import {RouteToPageProps} from "../layout/publicMenu/PublicMenu" +import {usePluginToId} from "@/store/publicMenu" +import {ResidentPluginName} from "@/routes/newRoute" +import {Form, Tooltip} from "antd" +import {useDebounceEffect, useDebounceFn, useGetState, useInViewport, useMemoizedFn, useThrottleFn} from "ahooks" +import {YakitInput} from "@/components/yakitUI/YakitInput/YakitInput" +import {YakitSwitch} from "@/components/yakitUI/YakitSwitch/YakitSwitch" +import {getRemoteValue, setRemoteValue} from "@/utils/kv" +import {MITMConsts} from "../mitm/MITMConsts" +import {CacheDropDownGV, RemoteGV} from "@/yakitGV" +import {openABSFileLocated} from "@/utils/openWebsite" +import {yakitNotify} from "@/utils/notification" +import {YakitSystem} from "@/yakitGVDefine" +import {YakitHint} from "@/components/yakitUI/YakitHint/YakitHint" +import {ShieldCheckIcon as AllShieldCheckIcon} from "@/components/layout/globalStateIcon" +import {useScreenRecorder} from "@/store/screenRecorder" +import numeral from "numeral" +import {CloudDownloadIcon} from "@/assets/newIcon" +import {ProjectDescription} from "../softwareSettings/ProjectManage" +import {YakQueryHTTPFlowResponse} from "@/components/HTTPFlowTable/HTTPFlowTable" +import {FieldName, Fields} from "../risks/RiskTable" +import {apiQueryYakScriptTotal} from "../plugins/utils" +import {YakitGetOnlinePlugin} from "../mitm/MITMServerHijacking/MITMPluginLocalList" +import {apiQueryPortsBase} from "../assetViewer/PortTable/utils" +import {QueryPortsRequest} from "../assetViewer/PortAssetPage" +import mitmBg from "../../assets/mitm-bg.png" +import {getReleaseEditionName, isEnpriTraceAgent} from "@/utils/envfile" +import {YakitEmpty} from "@/components/yakitUI/YakitEmpty/YakitEmpty" +import {YakitResizeBox} from "@/components/yakitUI/YakitResizeBox/YakitResizeBox" +import ReactResizeDetector from "react-resize-detector" +const {ipcRenderer} = window.require("electron") + +interface ToolInfo { + label: string + icon: ReactElement + iconStyle?: CSSProperties + desc: string + rightIcon: ReactElement + onClick: () => void +} + +export interface HomeProp {} +const Home: React.FC = (props) => { + const homeRef = useRef(null) + const [inViewport] = useInViewport(homeRef) + const {pluginToId} = usePluginToId() + const isRunRef = useRef(false) + const [timeInterval, setTimeInterval, getTimeInterval] = useGetState(5) + const timeRef = useRef(null) + const [showMitmDropdown, setShowMitmDropdown] = useState(false) + const showMitmDropdownRef = useRef(showMitmDropdown) + const mitmDropdownRef = useRef(null) + const [showMITMCertWarn, setShowMITMCertWarn] = useState(false) + const [form] = Form.useForm() + const hostWatch = Form.useWatch("host", form) + const portWatch = Form.useWatch("port", form) + const [scanningCheck, setScanningCheck] = useState("specialVulnerabilityDetection") + const [showScanningDropdown, setShowScanningDropdown] = useState(false) + const scanningdropdownRef = useRef(null) + const [pcap, setPcap] = useState<{ + IsPrivileged: boolean + Advice: string + AdviceVerbose: string + }>({Advice: "unknown", AdviceVerbose: "无法获取 PCAP 支持信息", IsPrivileged: false}) + const [system, setSystem] = useState("Darwin") + const [pcapHintShow, setPcapHintShow] = useState(false) + const [pcapResult, setPcapResult] = useState(false) + const [pcapHintLoading, setPcapHintLoading] = useState(false) + const {screenRecorderInfo} = useScreenRecorder() + const [searchToolVal, setSearchToolVal] = useState("") + const toolsList = useMemo(() => { + return [ + { + label: "YakRunner", + icon: , + iconStyle: {backgroundColor: "#8863f7", padding: 1}, + desc: "Yak语言编辑器", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.YakScript}) + }, + { + label: "靶场 Vulinbox", + icon: , + desc: "Yak自带靶场", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.Beta_VulinboxManager}) + }, + { + label: "Payload", + icon: , + desc: "Payload字典管理", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.PayloadManager}) + }, + { + label: "数据对比", + icon: , + desc: "快速识别不同数据", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.DataCompare}) + }, + { + label: "CVE 管理", + icon: , + desc: "搜索查询CVE数据", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.DB_CVE}) + }, + { + label: "插件仓库", + icon: , + iconStyle: {backgroundColor: "#F4736B", padding: 1}, + desc: "海量Yakit插件一键下载", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.Plugin_Hub}) + }, + { + label: "端口监听器", + icon: , + desc: "监听端口并进行交互", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.ShellReceiver}) + }, + { + label: "Websocket Fuzzer", + icon: , + desc: "对Websocket数据包进行模糊测试", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.WebsocketFuzzer}) + }, + { + label: "子域名收集", + icon: , + desc: "收集目标资产关联的子域名", + rightIcon: , + onClick: () => + onMenu({ + route: YakitRoute.Plugin_OP, + pluginId: pluginToId[ResidentPluginName.SubDomainCollection], + pluginName: ResidentPluginName.SubDomainCollection + }) + }, + { + label: "基础爬虫", + icon: , + desc: "收集目标资产的所有页面信息", + rightIcon: , + onClick: () => + onMenu({ + route: YakitRoute.Plugin_OP, + pluginId: pluginToId[ResidentPluginName.BasicCrawler], + pluginName: ResidentPluginName.BasicCrawler + }) + }, + { + label: "空间引擎", + icon: , + desc: "集合多种引擎,一键收集资产信息", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.Space_Engine}) + }, + { + label: "ICMP-SizeLog", + icon: , + desc: "使用 ping 携带特定长度数据包判定 ICMP反连", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.ICMPSizeLog}) + }, + { + label: "TCP-PortLog", + icon: , + desc: "使用未开放的随机端口来判定 TCP 反连", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.TCPPortLog}) + }, + { + label: "反连服务器", + icon: , + desc: "同时在一个端口同时实现 HTTP / RMI / HTTPS 等协议的反连", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.ReverseServer_New}) + }, + { + label: "History", + icon: , + desc: "查看并操作所有劫持、插件、Fuzz发出的所有历史流量", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.DB_HTTPHistory}) + }, + { + label: "报告", + icon: , + desc: "查看并管理扫描时生成的报告", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.DB_Report}) + }, + { + label: "漏洞与风险统计", + icon: , + desc: "管理扫描出的所有漏洞和风险信息", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.DB_Risk}) + }, + { + label: "端口资产", + icon: , + desc: "管理扫描出的所有端口资产", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.Mod_ScanPort}) + }, + { + label: "域名资产", + icon: , + desc: "管理扫描出的所有域名资产", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.DB_Domain}) + }, + { + label: "录屏", + icon: , + desc: "录制屏幕操作", + rightIcon: , + onClick: () => !screenRecorderInfo.isRecording && ipcRenderer.invoke("send-open-screenCap-modal") + }, + { + label: "截屏", + icon: , + desc: "截取屏幕信息形成图片", + rightIcon: , + onClick: () => ipcRenderer.invoke("activate-screenshot") + }, + { + label: "录屏管理", + icon: , + desc: "管理录屏形成的所有视频文件", + rightIcon: , + onClick: () => onMenu({route: YakitRoute.ScreenRecorderPage}) + } + ] as ToolInfo[] + }, [screenRecorderInfo]) + const [curProjectInfo, setCurProjectInfo] = useState() + const [historyData, setHistoryData] = useState(0) + const [riskLevelData, setRiskLevelData] = useState([]) + const [portTotal, setPortTotal] = useState(0) + const [localPluginTotal, setLocalPluginTotal] = useState(0) + const [visibleOnline, setVisibleOnline] = useState(false) + + useEffect(() => { + showMitmDropdownRef.current = showMitmDropdown + }, [showMitmDropdown]) + + useEffect(() => { + let timer: any = null + getRemoteValue(RemoteGV.GlobalStateTimeInterval).then((time: any) => { + setTimeInterval(+time || 5) + if ((+time || 5) > 5) updateAllInfo() + if (timer) clearInterval(timer) + timer = setInterval(() => { + setRemoteValue(RemoteGV.GlobalStateTimeInterval, `${getTimeInterval()}`) + }, 20000) + }) + + getRemoteValue(MITMConsts.MITMDefaultPort).then((e) => { + if (!!e) { + form.setFieldsValue({port: e}) + } else { + form.setFieldsValue({port: "8083"}) + } + }) + + getRemoteValue(CacheDropDownGV.MITMDefaultHostHistoryList).then((e) => { + if (!!e) { + try { + const obj = JSON.parse(e) || {} + form.setFieldsValue({host: obj.defaultValue}) + } catch (error) { + form.setFieldsValue({host: "127.0.0.1"}) + } + } else { + form.setFieldsValue({port: "127.0.0.1"}) + } + }) + + getRemoteValue(RemoteGV.HomeStartScanning).then((e) => { + if (!!e) { + setScanningCheck(e) + } else { + setScanningCheck("specialVulnerabilityDetection") + } + }) + + // 获取系统 + ipcRenderer.invoke("fetch-system-name").then((systemName) => { + setSystem(systemName) + }) + + // dropdown 点击外部关闭 + const handleClickOutside = (event) => { + if (scanningdropdownRef.current && !scanningdropdownRef.current.contains(event.target)) { + setShowScanningDropdown(false) + } + if (mitmDropdownRef.current && !mitmDropdownRef.current.contains(event.target)) { + setTimeout(() => { + setShowMitmDropdown(false) + }, 150) + } + } + document.addEventListener("mousedown", handleClickOutside) + return () => { + document.removeEventListener("mousedown", handleClickOutside) + } + }, []) + + useDebounceEffect( + () => { + getRemoteValue(CacheDropDownGV.MITMDefaultHostHistoryList).then((e) => { + if (!!e) { + try { + const obj = JSON.parse(e) || {} + form.setFieldsValue({host: obj.defaultValue}) + } catch (error) { + form.setFieldsValue({host: "127.0.0.1"}) + } + } else { + form.setFieldsValue({port: "127.0.0.1"}) + } + }) + updateProjectDbSize() + undateHistoryData() + undateRiskLevel() + updatePortTotal() + updateLocalPluginTotal() + }, + [inViewport], + {wait: 200} + ) + + // 修改查询间隔时间后 + useDebounceEffect( + () => { + if (timeRef.current) clearInterval(timeRef.current) + timeRef.current = setInterval(updateAllInfo, timeInterval * 1000) + + return () => { + isRunRef.current = false + if (timeRef.current) clearInterval(timeRef.current) + timeRef.current = null + } + }, + [timeInterval], + {wait: 300} + ) + + const updateAllInfo = useMemoizedFn(() => { + if (isRunRef.current) return + isRunRef.current = true + Promise.allSettled([updateMITMCert(), updatePcap()]) + .then((values) => { + isRunRef.current = false + }) + .catch(() => {}) + }) + + // 打开页面 + const onMenu = (info: RouteToPageProps) => { + if (!info.route) return + emiter.emit("menuOpenPage", JSON.stringify(info)) + } + + // 获取是否安装MITM证书 + const updateMITMCert = useMemoizedFn(() => { + return new Promise((resolve, reject) => { + ipcRenderer + .invoke("VerifySystemCertificate") + .then((res) => { + if (res.valid) { + setShowMITMCertWarn(false) + } else { + setShowMITMCertWarn(true) + } + if (res.Reason != "") { + reject(`error-mitm-cert ${res.Reason}`) + } + }) + .catch((e) => reject(`error-mitm-cert ${e}`)) + .finally(() => { + resolve("mitm-cert") + }) + }) + }) + + // 下载安装MITM证书 + const handleDownMitmCert = (e) => { + e.stopPropagation() + const m = showYakitModal({ + title: "生成自动安装脚本", + width: "600px", + centered: true, + content: ( +
+ 请按照以下步骤进行操作: +
+
+ 1. 点击确定后将会打开脚本存放的目录。 +
+ 2. 双击打开 "auto-install-cert.bat/auto-install-cert.sh" 的文件执行安装。 +
+ 3. 如果安装成功,您将看到“Certificate successfully installed.”的提示。 +
+
+ 请确保在运行脚本之前关闭任何可能会阻止安装的应用程序。 +
+ 安装完成后,您将能够顺利使用 MITM。 +
+
+ 如有任何疑问或需要进一步帮助,请随时联系我们。 +
+ ), + onOk: () => { + ipcRenderer + .invoke("generate-install-script", {}) + .then((p: string) => { + if (p) { + openABSFileLocated(p) + } else { + yakitNotify("error", "生成失败") + } + }) + .catch(() => {}) + m.destroy() + } + }) + } + + // 爆破示例 + const handleBlastingExample = (animationType: string) => { + const m = showYakitModal({ + type: "white", + title: "WebFuzzer 爆破动画演示", + width: 650, + content: ( + + ), + footer: null, + centered: true, + destroyOnClose: true, + maskClosable: false + }) + } + + // 演示动画 + const handleSequenceAnimation = (e) => { + e.stopPropagation() + const m = showYakitModal({ + type: "white", + title: ( +
+ WebFuzzer 序列动画演示 +
+ ipcRenderer.invoke( + "open-url", + "https://www.yaklang.com/products/Web%20Fuzzer/fuzz-sequence" + ) + } + > + 官方帮助文档 + +
+
+ ), + width: 650, + content: , + footer: null, + centered: true, + destroyOnClose: true, + maskClosable: false + }) + } + + // 获取网卡操作权限 + const updatePcap = useMemoizedFn(() => { + return new Promise((resolve, reject) => { + ipcRenderer + .invoke("IsPrivilegedForNetRaw", {}) + .then((res) => { + setPcap(res) + resolve("pcap") + }) + .catch((e) => reject(`error-pcap ${e}`)) + }) + }) + + // 开启PCAP权限 + const openPcapPower = useMemoizedFn(() => { + setPcapHintLoading(true) + ipcRenderer + .invoke(`PromotePermissionForUserPcap`, {}) + .then(() => { + setPcapResult(true) + }) + .catch((e) => { + yakitNotify("error", `提升 Pcap 用户权限失败:${e}`) + }) + .finally(() => setPcapHintLoading(false)) + }) + + // 开始扫描 + const handleOpenScanning = useMemoizedFn(() => { + if (scanningCheck === "specialVulnerabilityDetection") { + onMenu({route: YakitRoute.PoC}) + } else if (scanningCheck === "customDetection") { + onMenu({route: YakitRoute.BatchExecutorPage}) + } + setRemoteValue(RemoteGV.HomeStartScanning, scanningCheck) + }) + + // 工具箱渲染列表 + const renderToolsList = useMemo(() => { + return searchToolVal + ? toolsList.filter((v) => v.label.toLocaleLowerCase().includes(searchToolVal.toLocaleLowerCase())) + : toolsList + }, [searchToolVal, toolsList]) + + // 项目名称 + const projectName = useMemo(() => { + if (isEnpriTraceAgent()) return getReleaseEditionName() + if (curProjectInfo?.ProjectName === "[temporary]") { + return "临时项目" + } else { + return curProjectInfo?.ProjectName + ? curProjectInfo?.ProjectName.substring(1, curProjectInfo?.ProjectName.length - 1) + : getReleaseEditionName() + } + }, [curProjectInfo]) + + // 更新项目数据库大小 + const updateProjectDbSize = async () => { + ipcRenderer.invoke("GetCurrentProject").then((res: ProjectDescription) => { + setCurProjectInfo(res) + }) + } + const convertToBytes = (size: number, unit: string) => { + const units = { + B: 1, + KB: 1024, + MB: 1024 ** 2, + GB: 1024 ** 3, + TB: 1024 ** 4 + } + return size * (units[unit.toUpperCase()] || 1) + } + const judgeMoreTenGB = useMemo(() => { + const arr: string[] = curProjectInfo?.FileSize.split(" ") || [] + if (arr[0] && arr[1]) { + return convertToBytes(+arr[0], arr[1]) > convertToBytes(10, "GB") + } else { + return false + } + }, [curProjectInfo?.FileSize]) + + // 更新流量数据 + const undateHistoryData = () => { + const params = { + SourceType: "mitm,scan,basic-crawler", + WithPayload: false, + Pagination: { + Page: 1, + Limit: 10, + Order: "desc", + OrderBy: "Id" + } + } + ipcRenderer.invoke("QueryHTTPFlows", params).then((rsp: YakQueryHTTPFlowResponse) => { + setHistoryData(rsp.Total) + }) + } + + // 更新漏洞数据 + const undateRiskLevel = () => { + ipcRenderer.invoke("QueryAvailableRiskLevel", {}).then((i: Fields) => { + setRiskLevelData(i.Values) + }) + } + const riskLevelTotal = (verbose: string) => { + return riskLevelData.find((item) => item.Verbose === verbose)?.Total || 0 + } + + // 更新端口数据 + const updatePortTotal = () => { + const params: QueryPortsRequest = { + Hosts: "", + Ports: "", + State: "open", + Service: "", + Title: "", + TitleEffective: false, + Keywords: "", + ComplexSelect: "", + RuntimeId: "", + Pagination: { + Limit: 20, + Page: 1, + OrderBy: "id", + Order: "desc" + }, + All: true, + Order: "desc", + OrderBy: "id" + } + apiQueryPortsBase(params).then((allRes) => { + setPortTotal(Number(allRes.Total)) + }) + } + + // 更新本地插件 + const updateLocalPluginTotal = () => { + apiQueryYakScriptTotal().then((res) => { + setLocalPluginTotal(+res.Total) + }) + } + + // 计算各个块的高度 + const mitmRef = useRef(null) + const webFuzzerRef = useRef(null) + const signlejumpRef = useRef(null) + const vulnerabilityRef = useRef(null) + const [watchWidth, setWatchWidth] = useState(0) + const adjustHeight = (container, wRadio: number, hRadio: number, minHeight: number, maxHeight: number) => { + if (!container) return + const width = container.clientWidth + const height = (width * hRadio) / wRadio + if (height > maxHeight) { + container.style.height = maxHeight + "px" + return + } + if (height < minHeight) { + container.style.height = minHeight + "px" + return + } + container.style.height = height + "px" + } + const calcMitmAndwebFuzzerMinWidth = () => { + const screenWidth = window.innerWidth + if (screenWidth <= 1220) return 320 + if (screenWidth > 1221 && screenWidth <= 1920) return 400 + return 450 + } + const calcSignlejumpAndVulnerabilityMinWidth = () => { + const screenWidth = window.innerWidth + if (screenWidth <= 1220) return 250 + if (screenWidth > 1221 && screenWidth <= 1920) return 300 + return 320 + } + const resizeAdjustHeight = useThrottleFn( + () => { + adjustHeight(mitmRef.current, 16, 9, calcMitmAndwebFuzzerMinWidth(), 650) + adjustHeight(webFuzzerRef.current, 16, 9, calcMitmAndwebFuzzerMinWidth(), 650) + adjustHeight(signlejumpRef.current, 16, 9, calcSignlejumpAndVulnerabilityMinWidth(), 450) + adjustHeight(vulnerabilityRef.current, 16, 9, calcSignlejumpAndVulnerabilityMinWidth(), 450) + }, + {wait: 300} + ).run + useEffect(() => { + resizeAdjustHeight() + }, [watchWidth]) + + return ( +
+ + { + if (!w || !h) { + return + } + setWatchWidth(w) + }} + handleHeight={true} + /> +
+
{ + if (showMitmDropdown) return + onMenu({route: YakitRoute.HTTPHacker}) + }} + > +
+
+ + MITM 交互式劫持 +
+
+ 安装 SSL/TLS + 证书,劫持浏览器所有流量请求、响应数据包,提供手动劫持与被动扫描两种模式 +
+
+ {showMITMCertWarn && ( +
+
+ + 检测到证书未配置 +
+ + 下载安装 + +
+ )} +
+
+
+
+
+
+
+
{ + e.stopPropagation() + onMenu({route: YakitRoute.HTTPHacker}) + setTimeout(() => { + emiter.emit( + "onHomeExecStartMITM", + JSON.stringify({ + host: hostWatch, + port: portWatch, + enableInitialPlugin: + form.getFieldValue( + "enableInitialPlugin" + ) === true + }) + ) + }, 500) + }} + > + + 启动劫持 +
+
{ + e.stopPropagation() + setShowMitmDropdown(!showMitmDropdown) + }} + > + +
+
e.stopPropagation()} + > +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
onMenu({route: YakitRoute.HTTPFuzzer})} + > +
+
+ + WebFuzzer +
+
+ 通过核心模糊测试标签语法,实现了对 Burpsuite 的 Repeater 和 Intruder 的完美整合 +
+
+
+
+ + 爆破示例 +
+
+
{ + e.stopPropagation() + handleBlastingExample("id") + }} + > + 爆破 ID +
+
{ + e.stopPropagation() + handleBlastingExample("pwd") + }} + > + 爆破密码 +
+
{ + e.stopPropagation() + handleBlastingExample("count") + }} + > + 爆破账户 +
+
+
+
+
+ + Fuzz 序列动画演示 +
+
+ 将多个 Web Fuzzer 节点串联起来,实现更复杂的逻辑与功能 +
+
+ } + className={styles["animation-btn"]} + type='outline1' + onClick={handleSequenceAnimation} + > + 演示动画 + +
+
+
+
+
+
+
onMenu({route: YakitRoute.PayloadGenerater_New})} + > +
+ +
+
Yso-Java Hack
+
+ 配置序列化 Payload 或恶意类,测试反序列化、类加载、JNDI 漏洞利用等 +
+
+
+
+
onMenu({route: YakitRoute.DNSLog})} + > +
+ +
+
DNSLog
+
+ 自动生成一个子域名,任何查询到这个子域名的 IP 被集合展示在列表中 +
+
+
+
+
onMenu({route: YakitRoute.Codec})} + > +
+ +
+
Codec
+
+ 加解密与编码,可通过插件自定义数据处理方法 +
+
+
+
+
+
+
+
+ + 漏洞扫描 +
+
+ 可自由选择需要的 POC 进行批量漏洞检测,或选择设置好的分组进行专项漏洞扫描 +
+
+
+
+
+ + 开始扫描 +
+
setShowScanningDropdown(!showScanningDropdown)} + > + +
+
+ {[ + {label: "专项漏洞检测", key: "specialVulnerabilityDetection"}, + {label: "自定义检测", key: "customDetection"} + ].map((item) => ( +
{ + setScanningCheck(item.key) + setShowScanningDropdown(!showScanningDropdown) + }} + key={item.key} + > + {item.label} + {scanningCheck === item.key && ( + + )} +
+ ))} +
+
+
+ {!pcap.IsPrivileged && system !== "Windows_NT" && ( +
+
+ + 检测到网卡权限未修复 +
+ { + if (pcapHintShow) return + setPcapHintShow(true) + }} + > + 去修复 + +
+ )} + : undefined} + title={pcapResult ? "已有网卡操作权限" : "当前引擎不具有网卡操作权限"} + content={ + pcapResult + ? "网卡修复需要时间,请耐心等待" + : "Linux 与 MacOS 可通过设置权限与组为用户态赋予网卡完全权限" + } + okButtonText='开启 PCAP 权限' + cancelButtonText={pcapResult ? "知道了~" : "稍后再说"} + okButtonProps={{ + loading: pcapHintLoading, + style: pcapResult ? {display: "none"} : undefined + }} + cancelButtonProps={{loading: !pcapResult && pcapHintLoading}} + onOk={openPcapPower} + onCancel={() => { + setPcapResult(false) + setPcapHintShow(false) + }} + footerExtra={ + pcapResult ? undefined : ( + + + 手动修复 + + + ) + } + > +
+
onMenu({route: YakitRoute.Mod_ScanPort})} + > + + 端口扫描 +
+
onMenu({route: YakitRoute.Mod_Brute})} + > + + 弱口令检测 +
+
+ onMenu({ + route: YakitRoute.Plugin_OP, + pluginId: pluginToId[ResidentPluginName.DirectoryScanning], + pluginName: ResidentPluginName.DirectoryScanning + }) + } + > + + 目录爆破 +
+
+
+
+
+ } + firstRatio='50%' + firstMinSize='800px' + firstNodeStyle={{padding: 0}} + secondNode={ +
+
+
+ + 工具箱 + 可通过搜索快速查找软件功能 +
+
+ setSearchToolVal(value)} /> +
+
+ {renderToolsList.length ? ( + <> + {renderToolsList.map((item) => ( +
+
+
+ {item.icon} +
+ {item.label} +
+
{item.desc}
+
{item.rightIcon}
+
+ ))} + + ) : ( + + )} +
+
+
+
+ + {projectName} +
+
+ + 项目数据库 +
+ {!judgeMoreTenGB ? ( + + {curProjectInfo?.FileSize} + + ) : ( + <> + + {curProjectInfo?.FileSize} + + + + + + )} +
+
+
+ + 流量数据 +
+ + {numeral(historyData).format("0,0")} + +
+
+ {(riskLevelTotal("严重") || + riskLevelTotal("高危") || + riskLevelTotal("中危") || + riskLevelTotal("低危")) > 0 ? ( +
+ + 漏洞数据 +
+ {riskLevelTotal("严重") ? ( +
+
严重
+
{riskLevelTotal("严重")}
+
+ ) : null} + {riskLevelTotal("高危") ? ( +
+
高危
+
{riskLevelTotal("高危")}
+
+ ) : null} + {riskLevelTotal("中危") ? ( +
+
中危
+
{riskLevelTotal("中危")}
+
+ ) : null} + {riskLevelTotal("低危") ? ( +
+
低危
+
{riskLevelTotal("低危")}
+
+ ) : null} +
+
+ ) : null} +
+ + 端口数据 +
+ {portTotal} +
+
+
+ + 本地插件 +
+ {localPluginTotal < 30 ? ( + } + onClick={() => setVisibleOnline(true)} + style={{padding: 0}} + className={styles["download-btn"]} + > + 一键下载 + + ) : ( + {localPluginTotal} + )} +
+ {visibleOnline && ( + { + setVisibleOnline(v) + updateLocalPluginTotal() + }} + /> + )} +
+
+
+ } + secondRatio='10%' + secondMinSize='350px' + > +
+ ) +} + +export default Home diff --git a/app/renderer/src/main/src/pages/home/home.module.scss b/app/renderer/src/main/src/pages/home/home.module.scss new file mode 100644 index 0000000000..980411cbdc --- /dev/null +++ b/app/renderer/src/main/src/pages/home/home.module.scss @@ -0,0 +1,1531 @@ +// 这里的样式 字体大小 icon大小 gap大小和设备宽度大于等于1921px的样式一致 +.home-page-wrapper { + height: 100%; + padding: 14px 18px; + &-left { + display: flex; + flex-direction: column; + height: 100%; + overflow: auto; + .left-row-wrapper { + display: flex; + margin-bottom: 10px; + &:last-of-type { + margin-bottom: 0; + } + } + } + &-right { + display: flex; + overflow: hidden; + flex-direction: column; + height: 100%; + } + .home-card { + display: flex; + justify-content: space-between; + overflow: hidden; + flex-direction: column; + border-radius: 8px; + + gap: 10px; + &-header { + &-title { + display: flex; + align-items: center; + .title-icon { + svg { + width: 36px; + height: 36px; + } + } + .title-text { + margin-left: 8px; + font-size: 20px; + font-weight: 600; + } + } + &-desc { + color: #85899e; + font-size: 16px; + } + } + &-operation-btn-wrapper { + display: flex; + justify-content: center; + } + &-config-detection { + display: flex; + justify-content: space-between; + align-items: center; + height: 38px; + padding-left: 8px; + border-radius: 4px; + background-color: #eee9f1; + .exclamation-icon { + svg { + width: 18px; + height: 18px; + } + } + .config-detection-left { + display: flex; + align-items: center; + margin-right: 4px; + color: #f6544a; + font-size: 14px; + } + .config-detection-btn { + height: 38px; + font-size: 14px; + } + } + .operation-btn-wrapper { + position: relative; + display: flex; + color: #ffffff; + border-radius: 40px; + .operation-btn-left { + display: flex; + justify-content: center; + align-items: center; + padding: 8px 12px; + cursor: pointer; + border-right: 1px solid #ffffff; + background-color: var(--yakit-primary-5); + font-size: 18px; + font-weight: 600; + .open-icon { + margin-right: 4px; + svg { + width: 28px; + height: 28px; + } + } + &:hover { + background-color: var(--yakit-primary-4); + } + &:active { + background-color: var(--yakit-primary-6); + } + } + .operation-btn-right { + display: flex; + justify-content: center; + align-items: center; + padding: 8px; + cursor: pointer; + transition: transform 0.5s; + background-color: var(--yakit-primary-6); + .title-icon { + transition: transform 0.5s; + &.rotate-180 { + transform: rotate(180deg); + } + } + &:hover { + background-color: var(--yakit-primary-5); + } + } + } + } + .mitm-card { + overflow: visible; + flex: 1; + margin-right: 10px; + padding: 22px; + padding-bottom: 0px; + cursor: pointer; + border: 1px solid #b5f2f9; + background-color: #ebfcfe; + &:hover { + border: 1px solid rgba(53, 216, 238, 1); + background-color: rgba(53, 216, 238, 0.2); + } + .mitm-cont-wrapper { + flex: 1; + border-radius: 8px 8px 0 0; + background-size: cover; + .mitm-glass-effect { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + border-radius: 8px 8px 0 0; + background: rgba(255, 255, 255, 0.3); /* 半透明背景 */ + + backdrop-filter: blur(2px); + .mitm-operation { + &-border { + width: 100%; + border-radius: 40px; + } + } + } + .mitm-operation { + .operation-dropdown-wrapper { + position: absolute; + bottom: -154px; + left: 50%; + width: 300px; + margin-left: -150px; + padding: 20px 20px 10px 10px; + transition: all 0.5 ease; + border: 1px solid var(--yakit-border-color); + border-radius: 4px; + background-color: #ffffff; + :global { + .ant-form-item { + margin-bottom: 8px; + } + } + } + } + } + } + .webFuzzer-card { + flex: 1; + padding: 22px; + cursor: pointer; + border: 1px solid #c2ebd6; + background-color: #effaf4; + &:hover { + border: 1px solid #56c991; + background-color: rgba(86, 201, 145, 0.2); + } + .example-blasting-wrapper { + display: flex; + flex-direction: column; + flex: 1; + padding: 18px 22px; + border-radius: 8px; + background-color: #ffffff; + .example-blasting-title { + display: flex; + align-items: center; + margin-bottom: 8px; + span.title-text { + margin-left: 8px; + font-size: 16px; + font-weight: 600; + } + } + .example-blasting-video-wrapper { + display: flex; + justify-content: space-between; + flex: 1; + + gap: 10px; + .example-blasting-video { + display: flex; + justify-content: center; + align-items: center; + flex: 1; + cursor: pointer; + text-align: center; + color: var(--yakit-primary-5); + border-radius: 8px; + background-color: #fff8f4; + font-size: 16px; + font-weight: 600; + &:hover { + border: 1px solid var(--yakit-primary-5); + } + } + .example-blasting-title { + .example-blasting-icon { + svg { + width: 28px; + height: 28px; + } + } + span.title-text { + font-size: 16px; + } + } + } + } + .sequence-animation-wrapper { + position: relative; + flex: 1; + padding: 18px 22px; + border-radius: 8px; + background-color: #ffffff; + .sequence-animation-title { + display: flex; + align-items: center; + margin-bottom: 8px; + span.title-text { + margin-left: 8px; + font-size: 16px; + font-weight: 600; + } + .sequence-animation-icon { + svg { + width: 28px; + height: 28px; + } + } + } + .sequence-animation-desc { + margin-bottom: 10px; + color: #85899e; + font-size: 16px; + } + .sequence-animation-btn-wrapper { + text-align: center; + .animation-play-icon { + svg { + width: 24px; + height: 24px; + } + } + .animation-btn { + height: 32px; + padding: 0 14px; + font-size: 16px; + } + } + } + } + .signle-jump-wrapper { + display: flex; + flex-direction: column; + width: 50%; + height: 100%; + margin-right: 10px; + + gap: 10px; + .signle-jump-item { + display: flex; + align-items: center; + flex: 1; + padding: 0 14px; + cursor: pointer; + border: 1px solid #eaecf3; + border-radius: 8px; + &:last-of-type { + margin-bottom: 0; + } + &-cont { + display: flex; + align-items: center; + .signle-jump-item-icon { + svg { + width: 36px; + height: 36px; + } + } + &-right { + margin-left: 8px; + .single-jump-cont-title { + font-size: 18px; + font-weight: 600; + } + .single-jump-cont-desc { + color: #85899e; + font-size: 16px; + } + } + } + &:hover { + background-color: #f8f8f8; + } + } + } + .vulnerability-scanning-card { + width: 50%; + padding: 22px; + padding-bottom: 14px; + border: 1px solid #bcd8fd; + background-color: #edf5ff; + .operation-dropdown-wrapper { + position: absolute; + right: 0; + bottom: -85px; + left: 0; + padding: 8px; + transition: all 0.5 ease; + border: 1px solid var(--yakit-border-color); + border-radius: 4px; + background-color: #ffffff; + .operation-dropdown-list-item { + display: flex; + justify-content: space-between; + padding: 6px 8px; + cursor: pointer; + color: #000000; + font-size: 14px; + line-height: 20px; + &:hover { + background-color: var(--yakit-primary-1); + } + &.active { + color: var(--yakit-primary-5); + } + .check-icon { + svg { + color: var(--yakit-primary-5); + } + } + } + } + .security-tools { + display: flex; + justify-content: space-between; + flex: 1; + + gap: 10px; + &-item { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + flex: 1; + cursor: pointer; + border-radius: 8px; + background-color: #ffffff; + + gap: 6px; + &:hover { + border: 1px solid var(--yakit-primary-5); + } + .tools-icon { + svg { + width: 36px; + height: 36px; + } + } + .tools-text { + font-size: 16px; + font-weight: 600; + } + } + } + } + .tools-wrapper { + display: flex; + overflow: hidden; + flex-direction: column; + flex: 1; + height: 70%; + margin-bottom: 10px; + padding: 18px 14px; + border: 1px solid var(--yakit-border-color); + border-radius: 8px; + + gap: 10px; + .tools-title-wrapper { + display: flex; + align-items: center; + + gap: 10px; + .tools-title-icon { + svg { + width: 28px; + height: 28px; + } + } + .tools-title-text { + justify-content: center; + align-items: center; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-size: 20px; + font-weight: 600; + } + .tools-title-desc { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: #85899e; + font-size: 14px; + } + } + .tools-search-wrapper { + // height: 28px; + // :global { + // .search-icon { + // svg { + // width: 16px; + // height: 16px; + // } + // } + // } + } + .tools-list-wrapper { + overflow-y: overlay; + flex: 1; + .tools-list-item { + display: flex; + align-items: center; + width: 100%; + padding: 12px; + cursor: pointer; + &:not(:first-child) { + border-top: 1px solid var(--yakit-border-color); + } + &:last-child { + border-bottom: 1px solid var(--yakit-border-color); + } + .tools-item-left-wrapper { + display: flex; + align-items: center; + + gap: 8px; + .tools-item-icon { + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; + margin-right: 4px; + border-radius: 6px; + svg { + width: 22px; + height: 22px; + } + } + .tools-item-label { + white-space: nowrap; + font-size: 16px; + font-weight: 600; + } + } + .tools-item-desc { + visibility: hidden; + overflow: hidden; + margin: 0 8px; + padding: 0 6px; + white-space: nowrap; + text-overflow: ellipsis; + border-radius: 4px; + background-color: #eaecf3; + font-size: 15px; + } + .tools-item-right-icon { + visibility: hidden; + flex: 1; + text-align: right; + svg { + width: 18px; + height: 18px; + color: var(--yakit-primary-5); + } + } + &:hover { + border-color: transparent; + border-radius: 8px; + background-color: #f8f8f8; + & + .tools-list-item { + border-top-color: transparent; + } + .tools-item-desc { + visibility: visible; + } + .tools-item-right-icon { + visibility: visible; + } + } + } + } + } + .data-preview-wrapper { + display: flex; + justify-content: space-between; + overflow-y: auto; + flex-direction: column; + max-height: 500px; + padding: 18px 14px; + border: 1px solid var(--yakit-border-color); + border-radius: 8px; + .data-preview-title { + display: flex; + align-items: center; + + gap: 12px; + .data-preview-title-icon { + svg { + width: 28px; + height: 28px; + color: #56c991; + path { + stroke: #31343f; + } + } + } + .data-preview-title-text { + font-size: 16px; + font-weight: 600; + } + } + .data-preview-item { + display: flex; + align-items: center; + .data-preview-item-icon { + margin-right: 10px; + svg { + width: 22px; + height: 22px; + color: #85899e; + path { + stroke-width: 1.5; + } + } + } + .data-preview-item-text { + display: inline-block; + width: 100px; + color: #85899e; + font-size: 16px; + } + .data-preview-item-cont { + display: flex; + align-items: center; + .download-btn-icon { + svg { + width: 20px; + height: 20px; + } + } + .download-btn { + font-size: 16px; + } + .data-preview-item-number { + display: inline-block; + margin-right: 4px; + color: #31343f; + } + .database-warning-icon { + svg { + width: 22px; + height: 22px; + color: #f6544a; + } + } + } + .risk-tag-wrapper { + display: flex; + align-items: center; + flex-wrap: wrap; + flex: 1; + flex: 0 0 50%; + width: 200px; + .risk-tag { + display: flex; + margin-right: 4px; + margin-bottom: 4px; + border-radius: 4px; + font-size: 14px; + + flex-shrink: 0; + .risk-text { + padding: 2px 6px; + } + .risk-num { + padding: 2px 6px; + color: #85899e; + } + } + .seriousRisk-tag { + border: 1px solid #e99a95; + .risk-text { + color: #cb2318; + border-right: 1px solid #e99a95; + background-color: rgba(203, 35, 24, 0.2); + } + } + .highRisk-tag { + border: 1px solid #f3c2bf; + .risk-text { + color: #f6544a; + border-right: 1px solid #f3c2bf; + background-color: rgba(246, 84, 74, 0.2); + } + } + .mediumRisk-tag { + border: 1px solid #fbc6a1; + .risk-text { + color: #f28b44; + border-right: 1px solid #fbc6a1; + background-color: #fbe7d9; + } + } + .lowRisk-tag { + border: 1px solid #ffe5c6; + .risk-text { + color: #ffb660; + border-right: 1px solid #ffe5c6; + background-color: rgba(255, 213, 131, 0.1); + } + } + } + } + } +} +.sequence-animation-pop-title { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + .subtitle-help-wrapper { + display: flex; + align-items: center; + cursor: pointer; + color: #b4bbca; + font-size: 14px; + font-weight: 400; + line-height: 20px; + .text-style { + text-decoration-line: underline; + } + svg { + width: 16px; + height: 16px; + } + } + .subtitle-help-wrapper:hover { + color: var(--yakit-primary-5); + } +} + +/* 适用于设备宽度小于1220px的样式 */ +@media (max-width: 1220px) { + .home-page-wrapper { + padding: 10px 14px; + &-left { + margin-right: 6px; + &-top { + margin-bottom: 6px; + } + } + .home-card { + gap: 4px; + &-header { + &-title { + .title-icon { + svg { + width: 28px; + height: 28px; + } + } + .title-text { + font-size: 16px; + } + } + &-desc { + font-size: 12px; + } + } + &-config-detection { + height: 34px; + .exclamation-icon { + svg { + width: 12px; + height: 12px; + } + } + .config-detection-left { + font-size: 10px; + } + .config-detection-btn { + height: 34px; + font-size: 10px; + } + } + .operation-btn-wrapper { + .operation-btn-left { + font-size: 14px; + .open-icon { + svg { + width: 20px; + height: 20px; + } + } + } + } + } + .mitm-card { + margin-right: 6px; + padding: 18px; + padding-bottom: 0px; + .mitm-cont-wrapper { + .mitm-operation { + .operation-dropdown-wrapper { + bottom: -145px; + padding: 18px 18px 8px 8px; + :global { + .ant-form-item { + margin-bottom: 5px; + } + } + } + } + } + } + .webFuzzer-card { + padding: 18px; + .example-blasting-wrapper { + padding: 14px 18px; + .example-blasting-title { + margin-bottom: 6px; + } + .example-blasting-video-wrapper { + gap: 4px; + .example-blasting-video { + font-size: 12px; + } + } + .example-blasting-title { + .example-blasting-icon { + svg { + width: 20px; + height: 20px; + } + } + span.title-text { + font-size: 12px; + } + } + } + .sequence-animation-wrapper { + padding: 14px 18px; + .sequence-animation-title { + margin-bottom: 4px; + .sequence-animation-icon { + svg { + width: 20px; + height: 20px; + } + } + span.title-text { + font-size: 12px; + } + } + .sequence-animation-desc { + margin-bottom: 6px; + font-size: 12px; + } + .sequence-animation-btn-wrapper { + .animation-play-icon { + svg { + width: 16px; + height: 16px; + } + } + .animation-btn { + height: 28px; + padding: 0 10px; + font-size: 12px; + } + } + } + } + .signle-jump-wrapper { + margin-right: 6px; + + gap: 4px; + .signle-jump-item { + padding: 0 10px; + &-cont { + .signle-jump-item-icon { + svg { + width: 28px; + height: 28px; + } + } + &-right { + .single-jump-cont-title { + font-size: 14px; + } + .single-jump-cont-desc { + font-size: 12px; + } + } + } + } + } + .vulnerability-scanning-card { + padding: 18px; + padding-bottom: 10px; + .security-tools { + gap: 4px; + &-item { + gap: 4px; + .tools-icon { + svg { + width: 28px; + height: 28px; + } + } + .tools-text { + font-size: 12px; + } + } + } + } + .tools-wrapper { + height: 75%; + margin-bottom: 6px; + padding: 12px 14px; + + gap: 4px; + .tools-title-wrapper { + gap: 4px; + .tools-title-icon { + svg { + width: 20px; + height: 20px; + } + } + .tools-title-text { + font-size: 16px; + } + .tools-title-desc { + font-size: 10px; + } + } + .tools-list-wrapper { + .tools-list-item { + padding: 8px; + .tools-item-left-wrapper { + gap: 2px; + .tools-item-icon { + svg { + width: 14px; + height: 14px; + } + } + .tools-item-label { + font-size: 12px; + } + } + .tools-item-desc { + margin: 0 4px; + font-size: 11px; + } + .tools-item-right-icon { + svg { + width: 10px; + height: 10px; + } + } + } + } + } + .data-preview-wrapper { + padding: 14px 10px; + .data-preview-title { + gap: 4px; + .data-preview-title-icon { + svg { + width: 20px; + height: 20px; + } + } + .data-preview-title-text { + font-size: 12px; + } + } + .data-preview-item { + .data-preview-item-icon { + margin-right: 6px; + svg { + width: 14px; + height: 14px; + } + } + .data-preview-item-text { + width: 100px; + font-size: 12px; + } + .data-preview-item-cont { + .download-btn-icon { + svg { + width: 12px; + height: 12px; + } + } + .download-btn { + font-size: 12px; + } + .data-preview-item-number { + font-size: 14px; + } + .database-warning-icon { + svg { + width: 14px; + height: 14px; + } + } + } + .risk-tag-wrapper { + width: 200px; + .risk-tag { + font-size: 10px; + } + } + } + } + } +} +/* 适用于设备宽度介于1221px和1440px之间的样式 */ +@media (min-width: 1221px) and (max-width: 1920px) { + .home-page-wrapper { + padding: 12px 16px; + &-left { + margin-right: 8px; + &-top { + margin-bottom: 8px; + } + } + .home-card { + gap: 8px; + &-header { + &-title { + .title-icon { + svg { + width: 32px; + height: 32px; + } + } + .title-text { + font-size: 18px; + } + } + &-desc { + font-size: 14px; + } + } + &-config-detection { + height: 36px; + .exclamation-icon { + svg { + width: 14px; + height: 14px; + } + } + .config-detection-left { + font-size: 12px; + } + .config-detection-btn { + height: 36px; + font-size: 12px; + } + } + .operation-btn-wrapper { + .operation-btn-left { + font-size: 16px; + .open-icon { + svg { + width: 24px; + height: 24px; + } + } + } + } + } + .mitm-card { + margin-right: 8px; + padding: 20px; + padding-bottom: 0px; + .mitm-cont-wrapper { + .mitm-operation { + .operation-dropdown-wrapper { + bottom: -154px; + padding: 20px 20px 10px 10px; + :global { + .ant-form-item { + margin-bottom: 7px; + } + } + } + } + } + } + .webFuzzer-card { + padding: 20px; + .example-blasting-wrapper { + padding: 16px 20px; + .example-blasting-title { + margin-bottom: 8px; + } + .example-blasting-video-wrapper { + gap: 8px; + .example-blasting-video { + font-size: 14px; + } + } + .example-blasting-title { + .example-blasting-icon { + svg { + width: 24px; + height: 24px; + } + } + span.title-text { + font-size: 14px; + } + } + } + .sequence-animation-wrapper { + padding: 16px 20px; + .sequence-animation-title { + margin-bottom: 6px; + .sequence-animation-icon { + svg { + width: 24px; + height: 24px; + } + } + span.title-text { + font-size: 14px; + } + } + .sequence-animation-desc { + margin-bottom: 8px; + font-size: 14px; + } + .sequence-animation-btn-wrapper { + .animation-play-icon { + svg { + width: 20px; + height: 20px; + } + } + .animation-btn { + height: 30px; + padding: 0 12px; + font-size: 14px; + } + } + } + } + .signle-jump-wrapper { + margin-right: 8px; + + gap: 8px; + .signle-jump-item { + padding: 0 12px; + &-cont { + .signle-jump-item-icon { + svg { + width: 32px; + height: 32px; + } + } + &-right { + .single-jump-cont-title { + font-size: 16px; + } + .single-jump-cont-desc { + font-size: 14px; + } + } + } + } + } + .vulnerability-scanning-card { + padding: 20px; + padding-bottom: 12px; + .security-tools { + gap: 8px; + &-item { + gap: 4px; + .tools-icon { + svg { + width: 32px; + height: 32px; + } + } + .tools-text { + font-size: 14px; + } + } + } + } + .tools-wrapper { + height: 70%; + margin-bottom: 8px; + padding: 16px 12px; + + gap: 8px; + .tools-title-wrapper { + gap: 8px; + .tools-title-icon { + svg { + width: 24px; + height: 24px; + } + } + .tools-title-text { + font-size: 18px; + } + .tools-title-desc { + font-size: 12px; + } + } + .tools-list-wrapper { + .tools-list-item { + padding: 10px; + .tools-item-left-wrapper { + gap: 4px; + .tools-item-icon { + svg { + width: 18px; + height: 18px; + } + } + .tools-item-label { + font-size: 14px; + } + } + .tools-item-desc { + margin: 0 6px; + font-size: 13px; + } + .tools-item-right-icon { + svg { + width: 14px; + height: 14px; + } + } + } + } + } + .data-preview-wrapper { + padding: 16px 12px; + .data-preview-title { + gap: 8px; + .data-preview-title-icon { + svg { + width: 24px; + height: 24px; + } + } + .data-preview-title-text { + font-size: 14px; + } + } + .data-preview-item { + .data-preview-item-icon { + margin-right: 8px; + svg { + width: 18px; + height: 18px; + } + } + .data-preview-item-text { + width: 100px; + font-size: 14px; + } + .data-preview-item-cont { + .download-btn-icon { + svg { + width: 16px; + height: 16px; + } + } + .download-btn { + font-size: 14px; + } + .data-preview-item-number { + font-size: 16px; + } + .database-warning-icon { + svg { + width: 18px; + height: 18px; + } + } + } + .risk-tag-wrapper { + width: 200px; + .risk-tag { + font-size: 12px; + } + } + } + } + } +} +/* 适用于设备宽度大于等于1921px的样式 */ +@media (min-width: 1921px) { + .home-page-wrapper { + padding: 14px 18px; + &-left { + margin-right: 10px; + &-top { + margin-bottom: 10px; + } + } + .home-card { + gap: 10px; + &-header { + &-title { + .title-icon { + svg { + width: 36px; + height: 36px; + } + } + .title-text { + font-size: 20px; + } + } + &-desc { + font-size: 16px; + } + } + &-config-detection { + height: 38px; + .exclamation-icon { + svg { + width: 18px; + height: 18px; + } + } + .config-detection-left { + font-size: 14px; + } + .config-detection-btn { + height: 38px; + font-size: 14px; + } + } + .operation-btn-wrapper { + .operation-btn-left { + font-size: 18px; + .open-icon { + svg { + width: 28px; + height: 28px; + } + } + } + } + } + .mitm-card { + margin-right: 10px; + padding: 22px; + padding-bottom: 0px; + .mitm-cont-wrapper { + .mitm-operation { + .operation-dropdown-wrapper { + bottom: -154px; + padding: 20px 20px 10px 10px; + :global { + .ant-form-item { + margin-bottom: 8px; + } + } + } + } + } + } + .webFuzzer-card { + padding: 22px; + .example-blasting-wrapper { + padding: 18px 22px; + .example-blasting-title { + margin-bottom: 8px; + } + .example-blasting-video-wrapper { + gap: 10px; + .example-blasting-video { + font-size: 16px; + } + } + .example-blasting-title { + .example-blasting-icon { + svg { + width: 28px; + height: 28px; + } + } + span.title-text { + font-size: 16px; + } + } + } + .sequence-animation-wrapper { + padding: 18px 22px; + .sequence-animation-title { + margin-bottom: 8px; + .sequence-animation-icon { + svg { + width: 28px; + height: 28px; + } + } + span.title-text { + font-size: 16px; + } + } + .sequence-animation-desc { + margin-bottom: 10px; + font-size: 16px; + } + .sequence-animation-btn-wrapper { + .animation-play-icon { + svg { + width: 24px; + height: 24px; + } + } + .animation-btn { + height: 32px; + padding: 0 14px; + font-size: 16px; + } + } + } + } + .signle-jump-wrapper { + margin-right: 10px; + + gap: 10px; + .signle-jump-item { + padding: 0 14px; + &-cont { + .signle-jump-item-icon { + svg { + width: 36px; + height: 36px; + } + } + &-right { + .single-jump-cont-title { + font-size: 18px; + } + .single-jump-cont-desc { + font-size: 16px; + } + } + } + } + } + .vulnerability-scanning-card { + padding: 22px; + padding-bottom: 14px; + .security-tools { + gap: 10px; + &-item { + gap: 6px; + .tools-icon { + svg { + width: 36px; + height: 36px; + } + } + .tools-text { + font-size: 16px; + } + } + } + } + .tools-wrapper { + height: 70%; + margin-bottom: 10px; + padding: 18px 14px; + + gap: 10px; + .tools-title-wrapper { + gap: 10px; + .tools-title-icon { + svg { + width: 28px; + height: 28px; + } + } + .tools-title-text { + font-size: 20px; + } + .tools-title-desc { + font-size: 14px; + } + } + .tools-list-wrapper { + .tools-list-item { + padding: 12px; + .tools-item-left-wrapper { + gap: 8px; + .tools-item-icon { + svg { + width: 22px; + height: 22px; + } + } + .tools-item-label { + font-size: 16px; + } + } + .tools-item-desc { + margin: 0 8px; + font-size: 15px; + } + .tools-item-right-icon { + svg { + width: 18px; + height: 18px; + } + } + } + } + } + .data-preview-wrapper { + padding: 18px 14px; + .data-preview-title { + gap: 12px; + .data-preview-title-icon { + svg { + width: 28px; + height: 28px; + } + } + .data-preview-title-text { + font-size: 16px; + } + } + .data-preview-item { + .data-preview-item-icon { + margin-right: 10px; + svg { + width: 22px; + height: 22px; + } + } + .data-preview-item-text { + width: 100px; + font-size: 16px; + } + .data-preview-item-cont { + .download-btn-icon { + svg { + width: 20px; + height: 20px; + } + } + .download-btn { + font-size: 16px; + } + .data-preview-item-number { + font-size: 18px; + } + .database-warning-icon { + svg { + width: 22px; + height: 22px; + } + } + } + .risk-tag-wrapper { + width: 200px; + .risk-tag { + font-size: 14px; + } + } + } + } + } +} diff --git a/app/renderer/src/main/src/pages/layout/publicMenu/PublicMenu.tsx b/app/renderer/src/main/src/pages/layout/publicMenu/PublicMenu.tsx index c2a617a2a6..b7ec3b08c1 100644 --- a/app/renderer/src/main/src/pages/layout/publicMenu/PublicMenu.tsx +++ b/app/renderer/src/main/src/pages/layout/publicMenu/PublicMenu.tsx @@ -41,6 +41,7 @@ import classNames from "classnames" import styles from "./PublicMenu.module.scss" import emiter from "@/utils/eventBus/eventBus" import {YakitRoute} from "@/enums/yakitRoute" +import { usePluginToId } from "@/store/publicMenu" const {ipcRenderer} = window.require("electron") @@ -79,6 +80,7 @@ const PublicMenu: React.FC = React.memo((props) => { [ResidentPluginName.BasicCrawler]: 0, [ResidentPluginName.DirectoryScanning]: 0 }) + const {setNewPluginToId} = usePluginToId() const [loading, setLoading] = useState(false) // 常用插件菜单 @@ -128,6 +130,7 @@ const PublicMenu: React.FC = React.memo((props) => { const pluginToIds: Record = {} for (let name of pluginTool) pluginToIds[name] = info[name] || 0 setPluginToId(pluginToIds) + setNewPluginToId(pluginToIds) }) .catch((err) => {}) }) @@ -325,6 +328,7 @@ const PublicMenu: React.FC = React.memo((props) => { const data = {...pluginToId} data[info.pluginName as any] = info.pluginId setPluginToId(data) + setNewPluginToId(data) } else { const menus = [...pluginMenu] menus.forEach((item) => { diff --git a/app/renderer/src/main/src/pages/mitm/MITMPage.tsx b/app/renderer/src/main/src/pages/mitm/MITMPage.tsx index 4da813e7c4..4d282cc7bc 100644 --- a/app/renderer/src/main/src/pages/mitm/MITMPage.tsx +++ b/app/renderer/src/main/src/pages/mitm/MITMPage.tsx @@ -285,6 +285,17 @@ export const MITMPage: React.FC = (props) => { setTip(tip) } ) + const beforeOnHomeExecStartMITM = (values: string) => { + if (status === "idle") { + emiter.emit("onExecStartMITM", values) + } + } + useEffect(() => { + emiter.on("onHomeExecStartMITM", beforeOnHomeExecStartMITM) + return () => { + emiter.off("onHomeExecStartMITM", beforeOnHomeExecStartMITM) + } + }, []) const [visible, setVisible] = useState(false) const mitmPageRef = useRef() diff --git a/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.module.scss b/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.module.scss index c66cbcc867..05a13be711 100644 --- a/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.module.scss +++ b/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.module.scss @@ -311,6 +311,7 @@ text-orientation: sideways-right; writing-mode: vertical-rl; + border-top: 1px solid #fff; &:hover { background: rgba(204, 210, 222, 0.5); } diff --git a/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.tsx b/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.tsx index d91e8f4358..7e9d09fef1 100644 --- a/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.tsx +++ b/app/renderer/src/main/src/pages/mitm/MITMServerHijacking/MITMServerHijacking.tsx @@ -1,4 +1,4 @@ -import React, {Ref, useEffect, useRef, useState} from "react" +import React, {Ref, useEffect, useImperativeHandle, useRef, useState} from "react" import {Divider, Form, Modal, notification, Typography} from "antd" import emiter from "@/utils/eventBus/eventBus" import ChromeLauncherButton from "@/pages/mitm/MITMChromeLauncher" @@ -69,19 +69,37 @@ export const MITMServerHijacking: React.FC = (props) => } }, [props.enableInitialMITMPlugin, props.defaultPlugins]) + const beforeOnHomeExecStartMITM = (values) => { + stop().then(() => { + setTimeout(() => { + emiter.emit("onExecStartMITM", values) + }, 500) + }) + } + useEffect(() => { + emiter.on("onHomeExecStartMITM", beforeOnHomeExecStartMITM) + return () => { + emiter.off("onHomeExecStartMITM", beforeOnHomeExecStartMITM) + } + }, []) + const stop = useMemoizedFn(() => { // setLoading(true) - ipcRenderer - .invoke("mitm-stop-call") - .then(() => { - setStatus("idle") - }) - .catch((e: any) => { - notification["error"]({message: `停止中间人劫持失败:${e}`}) - }) - .finally(() => { - // setLoading(false) - }) + return new Promise((resolve, reject) => { + ipcRenderer + .invoke("mitm-stop-call") + .then(() => { + setStatus("idle") + resolve("ok") + }) + .catch((e: any) => { + reject(e) + notification["error"]({message: `停止中间人劫持失败:${e}`}) + }) + .finally(() => { + // setLoading(false) + }) + }) }) useEffect(() => { diff --git a/app/renderer/src/main/src/pages/mitm/MITMServerStartForm/MITMServerStartForm.tsx b/app/renderer/src/main/src/pages/mitm/MITMServerStartForm/MITMServerStartForm.tsx index 51a6ae9677..b4286729d2 100644 --- a/app/renderer/src/main/src/pages/mitm/MITMServerStartForm/MITMServerStartForm.tsx +++ b/app/renderer/src/main/src/pages/mitm/MITMServerStartForm/MITMServerStartForm.tsx @@ -25,6 +25,7 @@ import {YakitModal} from "@/components/yakitUI/YakitModal/YakitModal" import {YakitInput} from "@/components/yakitUI/YakitInput/YakitInput" import {YakitAutoCompleteRefProps} from "@/components/yakitUI/YakitAutoComplete/YakitAutoCompleteType" import {CacheDropDownGV} from "@/yakitGV" +import emiter from "@/utils/eventBus/eventBus" const MITMFormAdvancedConfiguration = React.lazy(() => import("./MITMFormAdvancedConfiguration")) const ChromeLauncherButton = React.lazy(() => import("../MITMChromeLauncher")) @@ -199,6 +200,21 @@ export const MITMServerStartForm: React.FC = React.memo const nowTime: string = Math.floor(new Date().getTime() / 1000).toString() setRemoteValue(MITMConsts.MITMStartTimeStamp, nowTime) }) + const beforeExecStartMITM = (values) => { + if (props.status !== "idle") return + try { + const valObj = JSON.parse(values) || {} + form.setFieldsValue({...valObj}) + } catch (error) {} + execStartMITM(form.getFieldsValue()) + } + useEffect(() => { + emiter.on("onExecStartMITM", beforeExecStartMITM) + return () => { + emiter.off("onExecStartMITM", beforeExecStartMITM) + } + }, []) + const [width, setWidth] = useState(0) const [agentConfigModalVisible, setAgentConfigModalVisible] = useState(false) diff --git a/app/renderer/src/main/src/pages/newHome/NewHome.tsx b/app/renderer/src/main/src/pages/newHome/NewHome.tsx deleted file mode 100644 index 652457cc54..0000000000 --- a/app/renderer/src/main/src/pages/newHome/NewHome.tsx +++ /dev/null @@ -1,989 +0,0 @@ -import React, {ForwardedRef, useEffect, useRef, useState} from "react" -import {Row, Col} from "antd" -import {ArrowRightOutlined} from "@ant-design/icons" -import {genDefaultPagination, QueryYakScriptRequest, QueryYakScriptsResponse} from "@/pages/invoker/schema" -import {NetWorkApi} from "@/services/fetch" -import {useStore} from "@/store" -import {API} from "@/services/swagger/resposeType" -import {useGetState, useMemoizedFn, useSize, useInViewport} from "ahooks" -import cloneDeep from "lodash/cloneDeep" -import {failed, success} from "@/utils/notification" -import {PluginType} from "@/pages/yakitStore/YakitStorePage" -import {ReduceCountIcon, AddCountIcon} from "@/pages/customizeMenu/icon/homeIcon" -import CountUp from "react-countup" -import {isCommunityEdition, isEnterpriseEdition} from "@/utils/envfile" -import * as echarts from "echarts" -import {YakitSpin} from "@/components/yakitUI/YakitSpin/YakitSpin" -import {ResidentPluginName, YakitRouteToPageInfo} from "@/routes/newRoute" -import { - PrivateSolidBasicCrawlerIcon, - PrivateSolidBatchPluginIcon, - PrivateSolidBruteIcon, - PrivateSolidCodecIcon, - PrivateSolidDNSLogIcon, - PrivateSolidDataCompareIcon, - PrivateSolidDirectoryScanningIcon, - PrivateSolidICMPSizeLogIcon, - PrivateSolidMitmIcon, - PrivateSolidPayloadGeneraterIcon, - PrivateSolidPayloadManagerIcon, - PrivateSolidPluginStoreIcon, - PrivateSolidPocIcon, - PrivateSolidReverseServerIcon, - PrivateSolidScanPortIcon, - PrivateSolidShellReceiverIcon, - PrivateSolidTCPPortLogIcon, - PrivateSolidWebFuzzerIcon, - PrivateSolidYakRunnerIcon -} from "@/routes/privateIcon" -import {RouteToPageProps} from "../layout/publicMenu/PublicMenu" -import {DownloadOnlinePluginByScriptNamesResponse} from "../layout/publicMenu/utils" -import emiter from "@/utils/eventBus/eventBus" -import styles from "./newHome.module.scss" -import classNames from "classnames" -import {apiFetchGroupStatistics} from "../plugins/utils" -import {YakitButton} from "@/components/yakitUI/YakitButton/YakitButton" -import {OutlineRefreshIcon} from "@/assets/icon/outline" -import {YakitRoute} from "@/enums/yakitRoute" - -const {ipcRenderer} = window.require("electron") - -interface RouteTitleProps { - title: string - echartsError?: boolean - increLoading?: boolean - echartsLoading?: boolean - onRefresh?: () => void -} - -const RouteTitle: React.FC = (props) => { - const {title, echartsError, increLoading, echartsLoading, onRefresh} = props - return ( -
- {title} - {(echartsLoading || increLoading) && ( -
- 加载中... -
- -
-
- )} - {echartsError && ( -
- 加载失败 -
- } - onClick={() => { - onRefresh && onRefresh() - }} - /> -
-
- )} -
- ) -} - -interface RouteItemProps { - dataSource: DataItem - setOpenPage: (param: RouteToPageProps) => void - load: boolean - getCustomizeMenus?: () => void -} - -const RouteItem: React.FC = (props) => { - const {dataSource, setOpenPage, load, getCustomizeMenus} = props - - // 全局登录状态 - const {userInfo} = useStore() - const goRoute = () => { - const info: RouteToPageProps = {route: dataSource.key} - if (dataSource.key === YakitRoute.Plugin_OP && dataSource.pluginId && dataSource.pluginName) { - info.pluginId = +dataSource.pluginId || 0 - info.pluginName = dataSource.pluginName - } - - setOpenPage(info) - } - - const addMenuLab = (name: string) => { - ipcRenderer - .invoke("DownloadOnlinePluginByPluginName", { - ScriptNames: [name], - Token: userInfo.token - }) - .then((rsp: DownloadOnlinePluginByScriptNamesResponse) => { - if (rsp.Data.length > 0) { - success("添加菜单成功") - if (isCommunityEdition()) ipcRenderer.invoke("refresh-public-menu") - else ipcRenderer.invoke("change-main-menu") - } - }) - .catch((e) => { - failed(`添加菜单失败:${e}`) - }) - .finally(() => { - getCustomizeMenus && getCustomizeMenus() - }) - } - const addMenu = (name: string) => { - if ( - [ResidentPluginName.BasicCrawler, ResidentPluginName.DirectoryScanning].includes(name as ResidentPluginName) - ) { - addMenuLab(name) - } - } - return ( - <> - {load && ( -
-
-
- {dataSource.icon} -
-
- {dataSource.isShow ? ( - - ) : ( -
{ - e.stopPropagation() - addMenu(dataSource.pluginName || dataSource.label) - }} - > - 获取菜单 -
- )} -
-
- {dataSource.label} -
-
- {dataSource?.describe || ""} -
-
- )} - - ) -} -interface DataItem { - id: string - key: YakitRoute - icon: JSX.Element - describe?: string - label: string - pluginName?: string - pluginId?: string - isShow: boolean -} - -interface newHomeListData { - id: string - label: string - subMenuData: DataItem[] -} - -interface RouteListProps { - load?: boolean - colLimit?: 1 | 2 | 3 - data: newHomeListData - setOpenPage: (param: RouteToPageProps) => void - getCustomizeMenus?: () => void -} - -const RouteList: React.FC = (props) => { - const {colLimit = 1, data, setOpenPage, load = true, getCustomizeMenus} = props - const [span, setSpan] = useState(24 / colLimit) - const rowCount = Math.ceil(data.subMenuData.length / colLimit) - return ( -
- - - {data.subMenuData.map((item) => ( - - - - ))} - -
- ) -} -interface PieChartProps { - goStoreRoute: (v: any) => void - inViewport?: boolean - echartsError: boolean - setEchartsError: (flag: boolean) => void - echartsLoading: boolean - setEchartsLoading: (v: boolean) => void - ref: ForwardedRef -} -interface echartListProps { - name: string - value: number -} - -const PieEcharts: React.FC = React.forwardRef((props, ref) => { - const {goStoreRoute, inViewport, echartsError, setEchartsError, echartsLoading, setEchartsLoading} = props - const {width} = useSize(document.querySelector("body")) || {width: 0, height: 0} - // 全局登录状态 - const {userInfo} = useStore() - const [_, setChartList, getChartList] = useGetState([]) - const colorList = ["#FFB660", "#4A94F8", "#5F69DD", "#56C991", "#8863F7", "#35D8EE"] - const optionRef = useRef({ - color: colorList, - title: { - show: false, - text: 0, - subtext: "插件总数", - top: "38%", - left: "23%", - textAlign: "center", - itemGap: 0, - triggerEvent: true, - textStyle: { - fontSize: 20, - color: "#31343F", - lineHeight: 32, - fontWeight: 600, - fontFamily: "PingFang HK" - }, - subtextStyle: { - color: "#85899E", - fontSize: 12, - lineHeight: 16 - } - }, - tooltip: { - trigger: "item" - }, - legend: { - show: false, - top: "middle", - right: "2%", - type: "scroll", - orient: "vertical", - icon: "circle", - padding: [0, 0, 0, 0], - // 点的大小位置 - itemWidth: 13, - itemHeight: 7, - itemStyle: { - borderWidth: 0 - // borderColor:"#0ba5ff" - }, - formatter: (name) => { - try { - const itemValue = getChartList().filter((item) => item.name === name)[0].value - return "{name|" + name + "} " + "{value|" + itemValue + "}" - } catch (error) { - return "" - } - }, - textStyle: { - rich: { - name: { - color: "#85899E", - fontSize: 12, - width: 100 - }, - value: { - color: "#31343F", - fontSize: 14, - fontWeight: 500, - width: 40, - align: "right" - } - } - } - }, - - series: [ - { - // 空心饼图内外径 - radius: ["60%", "77%"], - // 饼图上下左右位置 - center: ["24%", "50%"], - itemStyle: { - borderColor: "#F0F1F3", - borderWidth: 4 - }, - avoidLabelOverlap: false, - type: "pie", - label: { - show: false, - color: "#eeeeee", - fontSize: 14 - }, - labelLine: { - show: false - }, - data: [] - } - ] - }) - const echartsRef = useRef() - useEffect(() => { - if (width >= 1380) { - optionRef.current.legend.show = true - optionRef.current.series[0].center = ["24%", "50%"] - optionRef.current.title.left = "23%" - setEcharts(optionRef.current) - } else { - optionRef.current.legend.show = false - optionRef.current.series[0].center = ["50%", "50%"] - optionRef.current.title.left = "48%" - setEcharts(optionRef.current) - } - echartsRef.current && echartsRef.current.resize() - }, [width]) - - useEffect(() => { - if (inViewport) { - echartsRef.current && echartsRef.current.resize() - setEchartsError(false) - getPluginSearch() - } - }, [inViewport]) - - useEffect(() => { - setEchartsError(false) - getPluginSearch() - //先解绑事件,防止事件重复触发 - echartsRef.current.off("click") - echartsRef.current.off("legendselectchanged") - echartsRef.current.on("click", function (params) { - // console.log("点击", params) - onSendToTab(params.name ?? "") - }) - echartsRef.current.on("legendselectchanged", (e) => { - // console.log("点击了", e) // 如果不加off事件,就会叠加触发 - onSendToTab(e.name ?? "") - echartsRef.current.setOption({ - legend: {selected: {[e.name]: true}} - }) - }) - }, []) - - const getPluginSearch = useMemoizedFn(() => { - setEchartsError(false) - setEchartsLoading(true) - const newQuery: API.PluginsSearchRequest = {} - if (userInfo.token && userInfo.token.length > 0) { - newQuery.token = userInfo.token - } - apiFetchGroupStatistics(newQuery) - .then((res: API.PluginsSearchResponse) => { - const list = (res?.data || []).filter((item) => ["plugin_type"].includes(item.groupKey)) - if (list.length > 0) { - const data = list[0].data - const chartListCache = data.map((item) => ({ - name: PluginType[item.value] ?? "未识别", - value: item.count - })) - // @ts-ignore - optionRef.current.series[0].data = chartListCache - optionRef.current.title.text = chartListCache.map((item) => item.value).reduce((a, b) => a + b, 0) - optionRef.current.title.show = true - setChartList(chartListCache) - setEcharts(optionRef.current) - } - }) - .catch((err) => { - // failed("失败getPluginSearch:" + err) - setEchartsError(true) - }) - .finally(() => { - setEchartsLoading(false) - }) - }) - - React.useImperativeHandle(ref, () => ({ - getPluginSearch: () => getPluginSearch() - })) - - const onSendToTab = useMemoizedFn((pluginType: string) => { - let plugin_type: string = "" - for (let key in PluginType) { - if (PluginType[key] === pluginType) { - plugin_type = key - } - } - goStoreRoute({plugin_type}) - }) - - const setEcharts = (options) => { - const chartDom = document.getElementById("main-home-pie")! - if (chartDom) { - echartsRef.current = echarts.init(chartDom) - options && echartsRef.current.setOption(options) - } - } - return ( -
- ) -}) - -interface PlugInShopProps { - setOpenPage: (param: RouteToPageProps) => void - inViewport?: boolean -} - -export interface DataParams { - min?: string - max?: string - offset?: number - count?: number -} -export interface PlugInShopHotProps { - Data: DataParams -} -interface countAddObjProps { - day_incre: string - week_incre: string - day_incre_num: number - week_incre_num: number -} -interface PlugInShopNewIncreProps {} -const PlugInShop: React.FC = (props) => { - const {setOpenPage, inViewport} = props - const [countAddObj, setCountAddObj] = useState() - const [hotArr, setHotArr] = useState([]) - const [hotError, setHotError] = useState(false) - const [hotLoading, setHotLoading] = useState(false) - const [increLoading, setIncreLoading] = useState(false) - /** 判断插件图标接口是否请求成功 */ - const [echartsLoading, setEchartsLoading] = useState(false) - const [echartsError, setEchartsError] = useState(false) - const childRef = useRef(null) - const listHeightRef = useRef() - - useEffect(() => { - if (inViewport) { - setHotError(false) - getPlugInShopHot() - onRefresh() - } - }, [inViewport]) - - useEffect(() => { - ipcRenderer.on("refresh-new-home", (e, res: any) => { - setHotError(false) - getPlugInShopHot() - onRefresh() - }) - return () => { - ipcRenderer.removeAllListeners("refresh-new-home") - } - }, []) - const getPlugInShopHot = () => { - setHotLoading(true) - setHotError(false) - NetWorkApi({ - method: "get", - url: "plugin/topSearch" - }) - .then((res: API.PluginTopSearchResponse) => { - if (res) { - if (Array.isArray(res.data)) { - const newArr = res.data.map((item) => item.member).filter((item) => !!item) - setHotArr(newArr || []) - } - } - }) - .catch((err) => { - setHotError(true) - setHotArr([]) - // failed("失败getPlugInShopHot:" + err) - }) - .finally(() => { - setHotLoading(false) - }) - } - - const judgeStatus = (v: number, v1: number) => { - if (v > v1) return ">" - else if (v < v1) return "<" - else return "=" - } - - const getPlugInShopNewIncre = () => { - setIncreLoading(true) - NetWorkApi({ - method: "get", - url: "plugin/newIncre" - }) - .then((res: API.PluginIncreResponse) => { - if (res) { - const {day_incre_num, yesterday_incre_num, week_incre_num, lastWeek_incre_num} = res - const day_incre = judgeStatus(day_incre_num, yesterday_incre_num) - const week_incre = judgeStatus(week_incre_num, lastWeek_incre_num) - setCountAddObj({ - day_incre, - week_incre, - day_incre_num, - week_incre_num - }) - } - }) - .catch((err) => { - setCountAddObj(undefined) - // failed("失败plugin/newIncre:" + err) - }) - .finally(() => { - setIncreLoading(false) - }) - } - /** - * 首页点击今日新增、本周新增不做筛选,只是跳转,点击类型需要筛选 - * @description 带参数的页面跳转 - */ - const goStoreRoute = (params) => { - // emiter.emit("openPage", JSON.stringify({route: YakitRoute.Plugin_Store, params: {...params}})) - } - - const selectIconShow = (v: string) => { - if (v === ">") return - // else if (v === "=") return - else if (v === "<") return - else return <> - } - /**切换至插件商店页面,不带参数 */ - const openStoreRoute = useMemoizedFn(() => { - // setOpenPage({route: YakitRoute.Plugin_Store}) - }) - - const onRefresh = useMemoizedFn(() => { - isCommunityEdition() && getPlugInShopNewIncre() - if (childRef && childRef.current) { - childRef.current.getPluginSearch() - } - }) - return ( - <> - -
-
-
-
- {countAddObj && ( - <> -
", - [styles["reduce-border-left"]]: countAddObj?.day_incre === "<" - })} - style={{cursor: "pointer"}} - onClick={() => openStoreRoute()} - > -
今日新增数
-
- - - - {selectIconShow(countAddObj.day_incre)} -
-
-
", - [styles["reduce-border-left"]]: countAddObj?.week_incre === "<" - })} - style={{cursor: "pointer"}} - onClick={() => openStoreRoute()} - > -
本周新增数
-
- - - - {selectIconShow(countAddObj.week_incre)} -
-
- - )} -
-
-
- {/* 放大窗口图表宽度确实会自适应,但是缩小就挂掉了(并不自适应),原因:如果Chart组件的父组件Father采用flex布局 就会出现上述的问题 建议采用百分比*/} - -
-
-
-
- 热搜词 - {hotLoading && ( -
- 加载中... -
- -
-
- )} - {hotError && ( -
- 加载失败 -
- } - onClick={() => { - getPlugInShopHot() - }} - /> -
-
- )} -
- {!hotLoading && ( -
- {hotArr.length > 0 ? ( - hotArr.slice(0, 10).map((item) => { - return ( -
goStoreRoute({keyword: item})} - > - {item} -
- ) - }) - ) : ( -
暂无数据
- )} -
- )} -
-
- - ) -} - -export const newHomeList: newHomeListData[] = [ - { - id: "1", - label: "资产搜集", - subMenuData: [ - { - id: "1-1", - key: YakitRoute.Mod_ScanPort, - ...YakitRouteToPageInfo[YakitRoute.Mod_ScanPort], - icon: , - isShow: true - }, - { - id: "1-2", - key: YakitRoute.Plugin_OP, - label: "基础爬虫", - icon: , - describe: "通过爬虫可快速了解网站的整体架构", - pluginName: ResidentPluginName.BasicCrawler, - isShow: false - }, - { - id: "1-3", - key: YakitRoute.Plugin_OP, - label: "目录扫描", - icon: , - describe: "带有内置字典的综合目录扫描与爆破", - pluginName: ResidentPluginName.DirectoryScanning, - isShow: false - } - ] - }, - { - id: "2", - label: "漏洞检测", - subMenuData: [ - { - id: "2-1", - key: YakitRoute.PoC, - ...YakitRouteToPageInfo[YakitRoute.PoC], - icon: , - isShow: true - }, - { - id: "2-2", - key: YakitRoute.BatchExecutorPage, - ...YakitRouteToPageInfo[YakitRoute.BatchExecutorPage], - icon: , - isShow: true - } - ] - }, - { - id: "3", - label: "进阶功能", - subMenuData: [ - { - id: "3-1", - key: YakitRoute.Plugin_Hub, - ...YakitRouteToPageInfo[YakitRoute.Plugin_Hub], - icon: , - isShow: true - }, - { - id: "3-2", - key: YakitRoute.YakScript, - ...YakitRouteToPageInfo[YakitRoute.YakScript], - icon: , - isShow: true - } - ] - }, - { - id: "4", - label: "渗透测试工具", - subMenuData: [ - { - id: "4-1", - key: YakitRoute.HTTPHacker, - ...YakitRouteToPageInfo[YakitRoute.HTTPHacker], - icon: , - isShow: true - }, - { - id: "4-2", - key: YakitRoute.HTTPFuzzer, - ...YakitRouteToPageInfo[YakitRoute.HTTPFuzzer], - icon: , - isShow: true - }, - { - id: "4-3", - key: YakitRoute.Mod_Brute, - ...YakitRouteToPageInfo[YakitRoute.Mod_Brute], - icon: , - isShow: true - } - ] - }, - { - id: "5", - label: "小工具", - subMenuData: [ - { - id: "5-1", - key: YakitRoute.Codec, - ...YakitRouteToPageInfo[YakitRoute.Codec], - icon: , - isShow: true - }, - { - id: "5-2", - key: YakitRoute.DataCompare, - ...YakitRouteToPageInfo[YakitRoute.DataCompare], - icon: , - isShow: true - }, - { - id: "5-3", - key: YakitRoute.PayloadManager, - ...YakitRouteToPageInfo[YakitRoute.PayloadManager], - icon: , - isShow: true - } - ] - }, - { - id: "6", - label: "反连管理", - subMenuData: [ - { - id: "6-1", - key: YakitRoute.ShellReceiver, - ...YakitRouteToPageInfo[YakitRoute.ShellReceiver], - icon: , - isShow: true - }, - { - id: "6-2", - key: YakitRoute.ReverseServer_New, - ...YakitRouteToPageInfo[YakitRoute.ReverseServer_New], - icon: , - isShow: true - }, - { - id: "6-3", - key: YakitRoute.DNSLog, - ...YakitRouteToPageInfo[YakitRoute.DNSLog], - icon: , - isShow: true - }, - { - id: "6-4", - key: YakitRoute.ICMPSizeLog, - ...YakitRouteToPageInfo[YakitRoute.ICMPSizeLog], - icon: , - isShow: true - }, - { - id: "6-5", - key: YakitRoute.TCPPortLog, - ...YakitRouteToPageInfo[YakitRoute.TCPPortLog], - icon: , - isShow: true - }, - { - id: "6-6", - key: YakitRoute.PayloadGenerater_New, - ...YakitRouteToPageInfo[YakitRoute.PayloadGenerater_New], - icon: , - isShow: true - } - ] - } -] - -export interface NewHomeProps {} - -const NewHome: React.FC = (props) => { - const ref = useRef(null) - const [inViewport] = useInViewport(ref) - const [newHomeData, setNewHomeData, getNewHomeData] = useGetState(newHomeList) - // 加载是否完成 - const [load, setLoad] = useState(false) - useEffect(() => { - getCustomizeMenus() - }, [inViewport]) - - const setOpenPage = (param: RouteToPageProps) => { - ipcRenderer.invoke("open-route-page", param) - } - - // 获取自定义菜单 - const getCustomizeMenus = () => { - ipcRenderer - .invoke("QueryYakScript", { - Pagination: genDefaultPagination(1000), - IsGeneralModule: true, - Type: "yak" - } as QueryYakScriptRequest) - .then((data: QueryYakScriptsResponse) => { - const deepList: newHomeListData[] = cloneDeep(newHomeList) - data.Data.map((i) => { - if (i.ScriptName === ResidentPluginName.BasicCrawler) { - deepList[0].subMenuData[1].pluginId = `${i.Id}` - deepList[0].subMenuData[1].isShow = true - deepList[0].subMenuData[1].key = YakitRoute.Plugin_OP - } - if (i.ScriptName === ResidentPluginName.DirectoryScanning) { - deepList[0].subMenuData[2].pluginId = `${i.Id}` - deepList[0].subMenuData[2].isShow = true - deepList[0].subMenuData[2].key = YakitRoute.Plugin_OP - } - }) - setNewHomeData(deepList) - }) - .finally(() => { - setLoad(true) - }) - } - - return ( -
-
-
- -
-
-
- -
-
- -
-
-
- -
-
- -
-
-
-
- -
-
- -
-
-
- ) -} - -export default NewHome diff --git a/app/renderer/src/main/src/pages/newHome/newHome.module.scss b/app/renderer/src/main/src/pages/newHome/newHome.module.scss deleted file mode 100644 index e23a6f8fff..0000000000 --- a/app/renderer/src/main/src/pages/newHome/newHome.module.scss +++ /dev/null @@ -1,317 +0,0 @@ -.new-home-page { - display: flex; - flex-direction: column; - height: 100%; - // overflow: auto; - min-height: 700px; -} -.home-top-block { - flex: 4; - display: flex; - flex-direction: row; - height: 100%; -} -.home-bottom-block { - flex: 3; - display: flex; - flex-direction: row; - height: 100%; -} -.top-small-block { - flex: 1; - padding: 16px; -} -.top-big-block { - flex: 1.27; - display: flex; - flex-direction: column; - height: 100%; -} -.top-in { - flex: 1; - padding: 16px; -} -.bottom-in { - flex: 1; - padding: 16px; -} -.bottom-big-block { - flex: 3; - padding: 16px; -} -.bottom-small-block { - flex: 2; - padding: 16px; -} -.home-page-title { - height: 24px; - display: flex; - gap: 8px; - font-style: normal; - font-weight: 600; - font-size: 16px; - line-height: 24px; - color: #31343f; - - .spin-wrapper { - height: 24px; - padding: 5px 0; - display: flex; - gap: 4px; - - font-size: 12px; - line-height: 14px; - color: var(--yakit-primary-5); - .spin-style { - width: 14px; - height: 14px; - display: flex; - align-items: center; - } - } -} -.border-right-box { - border-right: 1px solid #eaecf3; -} -.border-bottom-box { - border-bottom: 1px solid #eaecf3; -} -.icon-box { - display: flex; - justify-content: space-between; - height: 32px; -} -.route-item { - padding: 16px; - border-radius: 4px; - height: 100%; -} -.route-item-active { - cursor: pointer; -} -.route-item-active:hover { - background: rgba(242, 139, 68, 0.06); - .right-arrow { - color: #f28b44; - } -} -.control-opacity { - opacity: 0.3; -} -.right-arrow { - font-size: 12px; - color: #b4bbca; - position: relative; - top: 8px; -} -.right-arrow-text { - font-size: 12px; - color: #f28b44; - cursor: pointer; -} -.item-label { - margin-top: 8px; - - font-style: normal; - font-weight: 400; - font-size: 14px; - line-height: 20px; - color: #31343f; -} -.item-describe { - margin-top: 8px; - font-style: normal; - font-weight: 400; - font-size: 12px; - line-height: 16px; - text-align: justify; - color: #85899e; -} -.list-box { - height: 100%; - display: flex; - flex-direction: column; -} -.list-content { - flex: 1; - position: relative; -} -.set-ant-row { - flex-flow: column; -} -.list-content-col2 { - height: 50%; -} -.list-content-col3 { - height: 33.33%; -} -.menu-icon { - position: relative; - width: 38px; - height: 34px; - svg { - position: absolute; - top: 2px; - left: 0; - width: 32px; - height: 32px; - z-index: 3; - } - .menu-icon-filter { - position: absolute; - top: -2px; - left: 10px; - border-radius: 50%; - width: 28px; - height: 28px; - background: rgba(255, 182, 96, 0.2); - backdrop-filter: blur(2px); - } -} -.plug-in-main { - height: 100%; - display: flex; - flex-direction: column; -} -.plug-in-shop { - display: flex; - flex-direction: column; - flex: 1; - padding: 0 16px; -} -.show-top-box { - flex: 2; - border-bottom: 1px solid rgb(234, 236, 243); - position: relative; -} -.add-count-box { - display: flex; - flex-direction: column; - justify-content: space-evenly; - height: 100%; -} -.common-count { - padding-left: 15px; - border-radius: 2px; -} -.common-count:hover { - background: #f0f1f3; -} -.keep-border-left { - border-left: 2px solid #b4bbca; -} -.add-border-left { - border-left: 2px solid #f4736b; -} -.reduce-border-left { - border-left: 2px solid rgb(86, 201, 145); -} -.add-title { - font-weight: 400; - font-size: 14px; - line-height: 20px; - color: #31343f; -} -.add-content { - font-weight: 600; - font-size: 20px; - line-height: 32px; - color: #31343f; -} -.add-box-show { - width: 30%; - height: 100%; - display: inline-block; - position: absolute; - left: 0px; -} -.add-box-hidden { - width: 0%; - display: none; -} -.chart-box-show { - width: 70%; - height: 100%; - display: inline-block; - position: absolute; - right: 0px; -} -.chart-box-hidden { - width: 100%; - height: 100%; - display: inline-block; - position: absolute; - right: 0px; -} -.show-bottom-box { - flex: 1; - display: flex; - flex-direction: column; - overflow-y: auto; -} -.label-item { - display: inline-block; - margin-top: 8px; - margin-right: 8px; - padding: 4px 8px; - font-weight: 400; - font-size: 12px; - line-height: 16px; - color: #85899e; - background: #f8f8f8; - border: 1px solid #eaecf3; - border-radius: 4px; - cursor: pointer; -} -.label-item:hover { - background: rgba(242, 139, 68, 0.06); - border: 1px solid #fbc6a1; - border-radius: 4px; - color: #f28b44; -} -.hot-no-data { - font-style: normal; - font-weight: 400; - font-size: 12px; - line-height: 16px; - text-align: center; - color: #85899e; - margin-top: 8px; -} -.bottom-box-title { - margin-top: 16px; - height: 20px; - display: flex; - gap: 8px; - font-weight: 400; - font-size: 14px; - line-height: 20px; - color: #31343f; - - .spin-wrapper { - height: 20px; - padding: 3px 0; - display: flex; - gap: 4px; - font-size: 12px; - line-height: 14px; - color: var(--yakit-primary-5); - .spin-style { - width: 14px; - height: 14px; - display: flex; - align-items: center; - } - } -} -.label-box { - flex: 1; -} -.echarts-box { - height: 100%; - width: 100%; - opacity: 0; -} -.echarts-box-show { - opacity: 1; -} diff --git a/app/renderer/src/main/src/pages/pluginHub/pluginHubList/HubListLocal.tsx b/app/renderer/src/main/src/pages/pluginHub/pluginHubList/HubListLocal.tsx index 3378a72d6d..9490a5c212 100644 --- a/app/renderer/src/main/src/pages/pluginHub/pluginHubList/HubListLocal.tsx +++ b/app/renderer/src/main/src/pages/pluginHub/pluginHubList/HubListLocal.tsx @@ -782,7 +782,7 @@ export const HubListLocal: React.FC = memo((props) => { return ( <> - 管理分组 + 管理
diff --git a/app/renderer/src/main/src/routes/newRoute.tsx b/app/renderer/src/main/src/routes/newRoute.tsx index 0df037c100..3472eab5da 100644 --- a/app/renderer/src/main/src/routes/newRoute.tsx +++ b/app/renderer/src/main/src/routes/newRoute.tsx @@ -133,7 +133,7 @@ import {SimpleDetect} from "@/pages/simpleDetect/SimpleDetect" import {YakitRoute} from "../enums/yakitRoute" const HTTPHacker = React.lazy(() => import("../pages/hacker/httpHacker")) -const NewHome = React.lazy(() => import("@/pages/newHome/NewHome")) +const Home = React.lazy(() => import("@/pages/home/Home")) const WebFuzzerPage = React.lazy(() => import("@/pages/fuzzer/WebFuzzerPage/WebFuzzerPage")) const PluginHub = React.lazy(() => import("@/pages/pluginHub/pluginHub/PluginHub")) @@ -409,7 +409,7 @@ export const RouteToPage: (props: PageItemProps) => ReactNode = (props) => { const {routeKey, yakScriptId, params} = props switch (routeKey) { case YakitRoute.NewHome: - return + return case YakitRoute.HTTPHacker: return ( }> diff --git a/app/renderer/src/main/src/routes/publicIcon.tsx b/app/renderer/src/main/src/routes/publicIcon.tsx index 273ef96516..8bddbdae3a 100644 --- a/app/renderer/src/main/src/routes/publicIcon.tsx +++ b/app/renderer/src/main/src/routes/publicIcon.tsx @@ -1735,3 +1735,840 @@ const PublicDefaultPlugin = () => ( export const PublicDefaultPluginIcon = (props: Partial) => { return } + +const PublicBlasting = () => ( + + + + + + +) +export const PublicBlastingIcon = (props: Partial) => { + return +} + +const PublicSequenceAnimation = () => ( + + + + + + + + + + + + + + + + + + + + +) +export const PublicSequenceAnimationIcon = (props: Partial) => { + return +} + +const PublicToolLightbulb = () => ( + + + + + + + + + + + + +) +export const PublicPublicToolLightbulbIcon = (props: Partial) => { + return +} + +const PublicToolYakScript = () => ( + + + +) +export const PublicToolYakScriptIcon = (props: Partial) => { + return +} + +const PublicToolVulinbox = () => ( + + + + + + + + + + +) +export const PublicToolVulinboxIcon = (props: Partial) => { + return +} + +const PublicToolPayload = () => ( + + + + + + + + + + + +) +export const PublicToolPayloadIcon = (props: Partial) => { + return +} + +const PublicToolDataCompare = () => ( + + + + + + + + + + +) +export const PublicToolDataCompareIcon = (props: Partial) => { + return +} + +const PublicToolPluginHub = () => ( + + + + + + + + + + + + +) +export const PublicToolPluginHubIcon = (props: Partial) => { + return +} + +const PublicToolCVE = () => ( + + + + + + + + +) +export const PublicToolCVEIcon = (props: Partial) => { + return +} + +const PublicToolShellReceiver = () => ( + + + + + + + + + + + + + +) +export const PublicToolShellReceiverIcon = (props: Partial) => { + return +} + +const PublicToolWebsocketFuzzer = () => ( + + + + + + + + + + + + + + + +) +export const PublicToolWebsocketFuzzerIcon = (props: Partial) => { + return +} + +const PublicToolSubDomainCollection = () => ( + + + + + + + + + + + +) +export const PublicToolSubDomainCollectionIcon = (props: Partial) => { + return +} + +const PublicToolBasicCrawler = () => ( + + + + + + + + + + + +) +export const PublicToolBasicCrawlerIcon = (props: Partial) => { + return +} + +const PublicToolSpaceEngine = () => ( + + + + + + + + + + +) +export const PublicToolSpaceEngineIcon = (props: Partial) => { + return +} + +const PublicToolICMPSizeLog = () => ( + + + + + + + + + + + + + +) +export const PublicToolICMPSizeLogIcon = (props: Partial) => { + return +} + +const PublicToolTCPPortLog = () => ( + + + + + + + + + + + + + + + +) +export const PublicToolTCPPortLogIcon = (props: Partial) => { + return +} + +const PublicToolReverseServer = () => ( + + + + + + + + + + + + + + + + +) +export const PublicToolReverseServerIcon = (props: Partial) => { + return +} + +const PublicToolDBHTTPHistory = () => ( + + + + + + + + + + + + + + + + +) +export const PublicToolDBHTTPHistoryIcon = (props: Partial) => { + return +} + +const PublicToolDBReport = () => ( + + + + + + + + + + + +) +export const PublicToolDBReportIcon = (props: Partial) => { + return +} + +const PublicToolDBRisk = () => ( + + + + + + +) +export const PublicToolDBRiskIcon = (props: Partial) => { + return +} + +const PublicToolModScanPort = () => ( + + + + + + + + + + + + + + + +) +export const PublicToolModScanPortIcon = (props: Partial) => { + return +} + +const PublicToolDBDomain = () => ( + + + + + + + + + + + + + + + + + + + + +) +export const PublicToolDBDomainIcon = (props: Partial) => { + return +} + +const PublicToolScreenRecording = () => ( + + + + + +) +export const PublicToolScreenRecordingIcon = (props: Partial) => { + return +} + +const PublicToolScreenshot = () => ( + + + + + + + + + + + + +) +export const PublicToolScreenshotIcon = (props: Partial) => { + return +} + +const PublicToolScreenRecorderPage = () => ( + + + + +) +export const PublicToolScreenRecorderPageIcon = (props: Partial) => { + return +} diff --git a/app/renderer/src/main/src/store/publicMenu.tsx b/app/renderer/src/main/src/store/publicMenu.tsx new file mode 100644 index 0000000000..6d6715c614 --- /dev/null +++ b/app/renderer/src/main/src/store/publicMenu.tsx @@ -0,0 +1,28 @@ +/** + * @description PublicMenu + */ + +import {ResidentPluginName} from "@/routes/newRoute" +import {create} from "zustand" + +interface ScreenRecorderProps { + pluginToId: Record + setNewPluginToId: (newPluginToId: Record) => void +} + +export const usePluginToId = create((set, get) => ({ + pluginToId: { + [ResidentPluginName.SubDomainCollection]: 0, + [ResidentPluginName.BasicCrawler]: 0, + [ResidentPluginName.DirectoryScanning]: 0 + }, + setNewPluginToId: (newPluginToId: Record) => { + const s: Record = get().pluginToId + set({ + pluginToId: { + ...s, + ...newPluginToId + } + }) + } +})) diff --git a/app/renderer/src/main/src/utils/eventBus/events/mitm.ts b/app/renderer/src/main/src/utils/eventBus/events/mitm.ts index c038a8f586..64e92f657d 100644 --- a/app/renderer/src/main/src/utils/eventBus/events/mitm.ts +++ b/app/renderer/src/main/src/utils/eventBus/events/mitm.ts @@ -6,4 +6,7 @@ export type MitmEventProps = { onSetFilterWhiteListEvent: string /** 是否开启替换规则 */ onOpenRepRuleEvent: string + /** 首页启动劫持 */ + onHomeExecStartMITM: string + onExecStartMITM: string } diff --git a/app/renderer/src/main/src/yakitGV.ts b/app/renderer/src/main/src/yakitGV.ts index d8066407ed..56da4be8b8 100644 --- a/app/renderer/src/main/src/yakitGV.ts +++ b/app/renderer/src/main/src/yakitGV.ts @@ -1,4 +1,3 @@ -import {MITMConsts} from "@/pages/mitm/MITMConsts" /** 本地文件缓存数据-键值变量 */ export enum LocalGV { /** @name 获取缓存数据里引擎的启动模式("local"|"remote") */ @@ -100,7 +99,9 @@ export enum RemoteGV { /**@name 漏洞风险导出字段缓存 */ RiskExportFields = "risk-export-fields", /**@name RiskPage页面中,高级查询内容的显/隐 */ - RiskQueryShow = "risk-query-show" + RiskQueryShow = "risk-query-show", + /**@name Home开始扫描 */ + HomeStartScanning="home_start_scanning", } /** 项目逻辑全局变量 */