Skip to content

Commit

Permalink
Merge pull request #1856 from yaklang/song/feat/mitmdownStreamAgentTo…
Browse files Browse the repository at this point in the history
…WebFuzzer

Song/feat/mitmdown stream agent to web fuzzer
  • Loading branch information
youngster-yj authored Jul 26, 2024
2 parents c7ed419 + 01c9dea commit 9c11720
Show file tree
Hide file tree
Showing 11 changed files with 112 additions and 40 deletions.
5 changes: 4 additions & 1 deletion app/renderer/src/main/src/components/HTTPFlowDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ export interface HTTPFlowDetailProp extends HTTPPacketFuzzable {
defaultFold?: boolean

historyId?: string
downstreamProxyStr?: string
}

const {Text} = Typography
Expand Down Expand Up @@ -882,7 +883,8 @@ export const HTTPFlowDetailRequestAndResponse: React.FC<HTTPFlowDetailRequestAnd
flowRequestLoad,
flowResponseLoad,
historyId,
pageType
pageType,
downstreamProxyStr
} = props

const copyRequestBase64BodyMenuItem: OtherMenuListProps | {} = useMemo(() => {
Expand Down Expand Up @@ -1295,6 +1297,7 @@ export const HTTPFlowDetailRequestAndResponse: React.FC<HTTPFlowDetailRequestAnd
readOnly={true}
noLineNumber={true}
sendToWebFuzzer={sendToWebFuzzer}
downstreamProxyStr={downstreamProxyStr}
defaultHeight={defaultHeight}
loading={flowRequestLoad}
defaultHttps={defaultHttps}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,18 @@ import {IconSolidAIIcon, IconSolidAIWhiteIcon} from "@/assets/icon/colors"
import {YakitRoute} from "@/enums/yakitRoute"
import {PluginSwitchToTag} from "@/pages/pluginEditor/defaultconstants"
import {Uint8ArrayToString} from "@/utils/str"
import {WEB_FUZZ_PROXY} from "@/defaultConstants/HTTPFuzzerPage"
import {onSetRemoteValuesBase} from "../yakitUI/utils"
import {CacheDropDownGV} from "@/yakitGV"

const {ipcRenderer} = window.require("electron")

const {Option} = Select

export interface codecHistoryPluginProps {
key:string
key: string
label: string
isAiPlugin:boolean
isAiPlugin: boolean
}

export interface HTTPHeaderItem {
Expand Down Expand Up @@ -343,6 +346,8 @@ export interface HTTPFlowTableProp {
toWebFuzzer?: boolean
/** 是否显示批量操作 */
showBatchActions?: boolean
/** 下游代理地址 */
downstreamProxyStr?: string
}

export const StatusCodeToColor = (code: number) => {
Expand Down Expand Up @@ -643,7 +648,8 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
toPlugin = false,
runTimeId,
toWebFuzzer = false,
showBatchActions = true
showBatchActions = true,
downstreamProxyStr = ""
} = props
const [data, setData, getData] = useGetState<HTTPFlow[]>([])
const [color, setColor] = useState<string[]>([])
Expand Down Expand Up @@ -724,7 +730,9 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
(e) => {
const selected = getSelected()
if (selected) {
selected.IsWebsocket ? newWebsocketFuzzerTab(selected.IsHTTPS, selected.Request) : onSendToTab(selected)
selected.IsWebsocket
? newWebsocketFuzzerTab(selected.IsHTTPS, selected.Request)
: onSendToTab(selected, true, downstreamProxyStr)
}
},
{
Expand All @@ -741,7 +749,7 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
if (selected) {
selected.IsWebsocket
? newWebsocketFuzzerTab(selected.IsHTTPS, selected.Request, false)
: onSendToTab(selected, false)
: onSendToTab(selected, false, downstreamProxyStr)
}
},
{
Expand Down Expand Up @@ -2341,7 +2349,7 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
exportKey={toWebFuzzer ? "WEBFUZZER-HISTORY-EXPORT-KEY" : "MITM-HTTP-HISTORY-EXPORT-KEY"}
fileName={!toWebFuzzer ? "History" : "WebFuzzer"}
getData={(pagination) => getExcelData(pagination, list)}
onClose={()=>m.destroy()}
onClose={() => m.destroy()}
/>
),
onCancel: () => {
Expand Down Expand Up @@ -2422,18 +2430,20 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
)
})

const addIconLabel = useMemoizedFn((data:codecHistoryPluginProps[])=>{
return data.map((item)=>({
const addIconLabel = useMemoizedFn((data: codecHistoryPluginProps[]) => {
return data.map((item) => ({
...item,
label:<>
{item.isAiPlugin && (
label: (
<>
<IconSolidAIIcon className={"ai-plugin-menu-icon-default"} />
<IconSolidAIWhiteIcon className={"ai-plugin-menu-icon-hover"} />
{item.isAiPlugin && (
<>
<IconSolidAIIcon className={"ai-plugin-menu-icon-default"} />
<IconSolidAIWhiteIcon className={"ai-plugin-menu-icon-hover"} />
</>
)}
{item.key}
</>
)}
{item.key}
</>
)
}))
})
const getCodecHistoryPlugin = useMemoizedFn(() => {
Expand All @@ -2443,7 +2453,12 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
: [
{
key: "Get*plug-in",
label: <><CloudDownloadIcon style={{marginRight:4}}/>获取插件</>
label: (
<>
<CloudDownloadIcon style={{marginRight: 4}} />
获取插件
</>
)
}
]
} else {
Expand All @@ -2452,7 +2467,12 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
: [
{
key: "Get*plug-in",
label: <><CloudDownloadIcon style={{marginRight:4}}/>获取插件</>
label: (
<>
<CloudDownloadIcon style={{marginRight: 4}} />
获取插件
</>
)
}
]
}
Expand All @@ -2474,7 +2494,12 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
: [
{
key: "Get*ai-plug-in",
label: <><CloudDownloadIcon style={{marginRight:4}}/>获取插件</>
label: (
<>
<CloudDownloadIcon style={{marginRight: 4}} />
获取插件
</>
)
}
]
} else {
Expand All @@ -2492,7 +2517,12 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
: [
{
key: "Get*ai-plug-in",
label: <><CloudDownloadIcon style={{marginRight:4}}/>获取插件</>
label: (
<>
<CloudDownloadIcon style={{marginRight: 4}} />
获取插件
</>
)
}
]
}
Expand Down Expand Up @@ -2953,10 +2983,10 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
})
break
case "sendAndJumpToWebFuzzer":
onSendToTab(rowData)
onSendToTab(rowData, true, downstreamProxyStr)
break
case "sendToWebFuzzer":
onSendToTab(rowData, false)
onSendToTab(rowData, false, downstreamProxyStr)
break
case "sendAndJumpToWS":
newWebsocketFuzzerTab(rowData.IsHTTPS, rowData.Request)
Expand Down Expand Up @@ -3246,14 +3276,18 @@ export const HTTPFlowTable = React.memo<HTTPFlowTableProp>((props) => {
case "sendAndJumpToWebFuzzer":
const currentItemJumpToFuzzer = menuData.find((f) => f.onClickBatch && f.key === "发送到 Web Fuzzer")
if (!currentItemJumpToFuzzer) return
onBatch(onSendToTab, currentItemJumpToFuzzer?.number || 0, selectedRowKeys.length === total)
onBatch(
(el) => onSendToTab(el, true, downstreamProxyStr),
currentItemJumpToFuzzer?.number || 0,
selectedRowKeys.length === total
)

break
case "sendToWebFuzzer":
const currentItemToFuzzer = menuData.find((f) => f.onClickBatch && f.key === "发送到 Web Fuzzer")
if (!currentItemToFuzzer) return
onBatch(
(el) => onSendToTab(el, false),
(el) => onSendToTab(el, false, downstreamProxyStr),
currentItemToFuzzer?.number || 0,
selectedRowKeys.length === total
)
Expand Down Expand Up @@ -3996,13 +4030,14 @@ export const RangeInputNumberTable: React.FC<RangeInputNumberProps> = React.memo
})

// 发送web fuzzer const
export const onSendToTab = (rowData, openFlag?: boolean) => {
export const onSendToTab = async (rowData, openFlag?: boolean, downstreamProxyStr?: string) => {
ipcRenderer
.invoke("send-to-tab", {
type: "fuzzer",
data: {
openFlag,
isHttps: rowData.IsHTTPS,
downstreamProxyStr,
request: rowData.InvalidForUTF8Request
? rowData.SafeHTTPRequest!
: new Buffer(rowData.Request).toString("utf8")
Expand Down
3 changes: 3 additions & 0 deletions app/renderer/src/main/src/components/HTTPHistory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export interface HTTPPacketFuzzable {
defaultHttps?: boolean
sendToWebFuzzer?: boolean | (() => any) | ((isHttps: boolean, request: string) => any)
defaultPacket?: string
downstreamProxyStr?: string
}

// 使用 HTTPHistory 控件的来源页面
Expand Down Expand Up @@ -280,6 +281,7 @@ export const HTTPHistory: React.FC<HTTPHistoryProp> = (props) => {
historyId={historyId}
onQueryParams={onQueryParams}
inViewport={inViewport}
downstreamProxyStr={props.downstreamProxyStr}
/>
</div>
)}
Expand Down Expand Up @@ -307,6 +309,7 @@ export const HTTPHistory: React.FC<HTTPHistoryProp> = (props) => {
refresh={refresh}
defaultFold={defaultFold}
historyId={historyId}
downstreamProxyStr={props.downstreamProxyStr}
// defaultHeight={detailHeight}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ interface HTTPPacketYakitEditor extends Omit<YakitEditorProps, "menuType"> {
webFuzzerValue?: string
webSocketToServer?: string
webFuzzerCallBack?: () => void
downstreamProxyStr?: string
}

export const HTTPPacketYakitEditor: React.FC<HTTPPacketYakitEditor> = React.memo((props) => {
Expand All @@ -46,6 +47,7 @@ export const HTTPPacketYakitEditor: React.FC<HTTPPacketYakitEditor> = React.memo
webFuzzerValue,
webSocketToServer,
webFuzzerCallBack,
downstreamProxyStr = "",
...restProps
} = props

Expand Down Expand Up @@ -259,11 +261,11 @@ export const HTTPPacketYakitEditor: React.FC<HTTPPacketYakitEditor> = React.memo
return
}
if (key === "发送并跳转") {
newWebFuzzerTab(defaultHttps || false, text).finally(() => {
newWebFuzzerTab(defaultHttps || false, text, true, downstreamProxyStr).finally(() => {
webFuzzerCallBack && webFuzzerCallBack()
})
} else if (key === "仅发送") {
newWebFuzzerTab(defaultHttps || false, text, false).finally(() => {
newWebFuzzerTab(defaultHttps || false, text, false, downstreamProxyStr).finally(() => {
webFuzzerCallBack && webFuzzerCallBack()
})
}
Expand All @@ -283,7 +285,8 @@ export const HTTPPacketYakitEditor: React.FC<HTTPPacketYakitEditor> = React.memo
isWebSocket,
webSocketValue,
webFuzzerValue,
webSocketToServer
webSocketToServer,
downstreamProxyStr
])

return (
Expand Down
4 changes: 2 additions & 2 deletions app/renderer/src/main/src/pages/fuzzer/HTTPFuzzerPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -459,11 +459,11 @@ export const advancedConfigValueToFuzzerRequests = (value: AdvancedConfigValuePr
return fuzzerRequests
}

export const newWebFuzzerTab = (isHttps: boolean, request: string, openFlag?: boolean) => {
export const newWebFuzzerTab = (isHttps: boolean, request: string, openFlag?: boolean, downstreamProxyStr?: string) => {
return ipcRenderer
.invoke("send-to-tab", {
type: "fuzzer",
data: {isHttps: isHttps, request: request, openFlag}
data: {isHttps: isHttps, request: request, openFlag, downstreamProxyStr}
})
.then(() => {
openFlag === false && info("发送成功")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ export const HttpQueryAdvancedConfig: React.FC<HttpQueryAdvancedConfigProps> = R
return value.replace(/\D/g, "")
}}
>
<YakitInput suffix='M' size='small' className={styles['fuzzer-maxBodySize-input']} />
<YakitInput suffix='M' size='small' className={styles["fuzzer-maxBodySize-input"]} />
</Form.Item>
</div>
<YakitCollapse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -864,7 +864,15 @@ export const MainOperatorContent: React.FC<MainOperatorContentProps> = React.mem
/** ---------- 增加tab页面 start ---------- */
/** Global Sending Function(全局发送功能|通过发送新增功能页面)*/
const addFuzzer = useMemoizedFn(async (res: any) => {
const {isHttps, isGmTLS, request, advancedConfigValue, openFlag = true, isCache = true} = res || {}
const {
isHttps,
isGmTLS,
request,
advancedConfigValue,
openFlag = true,
isCache = true,
downstreamProxyStr = ""
} = res || {}
const cacheData: FuzzerCacheDataProps = (await getFuzzerCacheData()) || {
proxy: [],
dnsServers: [],
Expand Down Expand Up @@ -904,6 +912,9 @@ export const MainOperatorContent: React.FC<MainOperatorContentProps> = React.mem
}
} catch (error) {}
}
if (downstreamProxyStr) {
newAdvancedConfigValue.proxy = [downstreamProxyStr]
}
openMenuPage(
{route: YakitRoute.HTTPFuzzer},
{
Expand Down
9 changes: 8 additions & 1 deletion app/renderer/src/main/src/pages/mitm/MITMPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ export const MITMPage: React.FC<MITMPageProp> = (props) => {
const latestLogs = useLatest<ExecResultLog[]>(logs)
const [_, setLatestStatusHash, getLatestStatusHash] = useGetState("")
const [statusCards, setStatusCards] = useState<StatusCardProps[]>([])
const [downstreamProxyStr, setDownstreamProxyStr] = useState<string>("")
// 检测当前劫持状态
useEffect(() => {
// 用于启动 MITM 开始之后,接受开始成功之后的第一个消息,如果收到,则认为说 MITM 启动成功了
Expand Down Expand Up @@ -278,6 +279,7 @@ export const MITMPage: React.FC<MITMPageProp> = (props) => {
if (downstreamProxy) {
tip += `下游代理:${downstreamProxy}`
}
setDownstreamProxyStr(downstreamProxy || "")
if (extra) {
if (extra.onlyEnableGMTLS) {
tip += "|仅国密 TLS"
Expand Down Expand Up @@ -307,6 +309,7 @@ export const MITMPage: React.FC<MITMPageProp> = (props) => {
setStatus={setStatus}
logs={[]}
statusCards={[]}
downstreamProxyStr={downstreamProxyStr}
/>
)

Expand All @@ -325,6 +328,8 @@ export const MITMPage: React.FC<MITMPageProp> = (props) => {
statusCards={statusCards}
tip={tip}
onSetTip={setTip}
downstreamProxyStr={downstreamProxyStr}
setDownstreamProxyStr={setDownstreamProxyStr}
/>
)
}
Expand Down Expand Up @@ -430,9 +435,10 @@ interface MITMServerProps {
setStatus: (status: MITMStatus) => any
logs: ExecResultLog[]
statusCards: StatusCardProps[]
downstreamProxyStr: string
}
export const MITMServer: React.FC<MITMServerProps> = React.memo((props) => {
const {visible, setVisible, status, setStatus, logs, statusCards} = props
const {visible, setVisible, status, setStatus, logs, statusCards, downstreamProxyStr} = props

const [openTabsFlag, setOpenTabsFlag] = useState<boolean>(true)
/**
Expand Down Expand Up @@ -737,6 +743,7 @@ export const MITMServer: React.FC<MITMServerProps> = React.memo((props) => {
setIsFullScreen={setIsFullScreenSecondNode}
logs={logs}
statusCards={statusCards}
downstreamProxyStr={downstreamProxyStr}
/>
)
}
Expand Down
Loading

0 comments on commit 9c11720

Please sign in to comment.