From 0d5499d52c8609a3820953ae903a06b0035a65bb Mon Sep 17 00:00:00 2001 From: yhy <31311038+yhy0@users.noreply.github.com> Date: Wed, 8 Nov 2023 22:17:39 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + ...burp_extender_burp_extender_api_1_7_22.xml | 13 -- .idea/modules.xml | 8 - README.md | 11 ++ doc/img.png | Bin 0 -> 52894 bytes passive-scan-client.iml | 3 +- pom.xml | 2 +- src/main/java/burp/BurpExtender.java | 186 +++++++++++++----- src/main/java/burp/Config.java | 14 +- src/main/java/burp/GUI.java | 113 +++++++++-- src/main/java/burp/HttpAndHttpsProxy.java | 56 +++--- src/main/java/burp/Utils.java | 2 +- 12 files changed, 296 insertions(+), 113 deletions(-) delete mode 100644 .idea/libraries/Maven__net_portswigger_burp_extender_burp_extender_api_1_7_22.xml delete mode 100644 .idea/modules.xml create mode 100644 doc/img.png diff --git a/.gitignore b/.gitignore index 877682b..f27f747 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ ### Java template # Compiled class file *.class +.idea # Log file *.log diff --git a/.idea/libraries/Maven__net_portswigger_burp_extender_burp_extender_api_1_7_22.xml b/.idea/libraries/Maven__net_portswigger_burp_extender_burp_extender_api_1_7_22.xml deleted file mode 100644 index c3aa7b3..0000000 --- a/.idea/libraries/Maven__net_portswigger_burp_extender_burp_extender_api_1_7_22.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index eef25f8..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 73044da..84ada80 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,17 @@ Q3: ...... ![流程图](./doc/process.png) +配置参数 +- Host、port 指定被动扫描器地址 +- Username、Password、Header 为被动扫描器的 Basic 认证相关 +- Timeout 指流量代理到被动扫描器的访问超时时间 +- Interval Time 指获取的每个流量直接转发给被动扫描器的间隔时间 +- BlackList 不转发的黑名单域名 +- Domain 限制只转发的域名 +- Exclude suffix 限制转发的流量后缀(ps:插件默认设置了 js、css不转发,但对于被动来说这一块还是要进行敏感信息匹配的) +- Proxy、Repeater、Intruder 要转发流量的模块,默认只转发 Proxy 模块的流量 +效果图 +![效果图.png](doc/img.png) ## 0x02 插件编译 ``` diff --git a/doc/img.png b/doc/img.png new file mode 100644 index 0000000000000000000000000000000000000000..2a76d34f96fa9d3cb1fe818b535710371c1635ae GIT binary patch literal 52894 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 - + @@ -7,6 +7,7 @@ + diff --git a/pom.xml b/pom.xml index 9473592..f6db7d3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.gv7.tools.burpextend passive-scan-client - 0.3.1 + 0.4.0 diff --git a/src/main/java/burp/BurpExtender.java b/src/main/java/burp/BurpExtender.java index 99321c0..54f6335 100644 --- a/src/main/java/burp/BurpExtender.java +++ b/src/main/java/burp/BurpExtender.java @@ -12,9 +12,9 @@ import javax.swing.table.TableColumnModel; // 插件入口 -public class BurpExtender implements IBurpExtender,ITab,IProxyListener { +public class BurpExtender implements IBurpExtender,ITab,IHttpListener { public final static String extensionName = "Passive Scan Client"; - public final static String version ="0.3.1"; + public final static String version ="0.4.0"; public static IBurpExtenderCallbacks callbacks; public static IExtensionHelpers helpers; public static PrintWriter stdout; @@ -24,7 +24,7 @@ public class BurpExtender implements IBurpExtender,ITab,IProxyListener { public static BurpExtender burpExtender; private ExecutorService executorService; - // 通过参数 callbacks 可以获得核心基础库,例如日志、请求、返回值修改等 + // 通过参数 callbacks 可以获得核心基础库,例如日志、请求、返回值修改等 @Override public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { this.burpExtender = this; @@ -40,7 +40,7 @@ public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { SwingUtilities.invokeLater(new Runnable() { public void run() { BurpExtender.this.callbacks.addSuiteTab(BurpExtender.this); - BurpExtender.this.callbacks.registerProxyListener(BurpExtender.this); + BurpExtender.this.callbacks.registerHttpListener(BurpExtender.this); stdout.println(Utils.getBanner()); } }); @@ -78,58 +78,154 @@ public Component getUiComponent() { return gui.getComponet(); } -// IHttpRequestResponse 接口包含了每个请求和响应的细节,在 brupsuite 中的每个请求或者响应都是 IHttpRequestResponse 实例。通过 getRequest()可以获取请求和响应的细节信息。 - public void processProxyMessage(boolean messageIsRequest, final IInterceptedProxyMessage iInterceptedProxyMessage) { - if (!messageIsRequest && Config.IS_RUNNING) { - IHttpRequestResponse reprsp = iInterceptedProxyMessage.getMessageInfo(); - IHttpService httpService = reprsp.getHttpService(); - String host = reprsp.getHttpService().getHost(); - //stdout.println(Config.DOMAIN_REGX); - if(Config.DOMAIN_REGX!="" && !Utils.isMathch(Config.DOMAIN_REGX,host)){ - return; - } + @Override + public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) { + // 插件开启 + if (Config.IS_RUNNING && !messageIsRequest) { + // 开启监控 Proxy,并且该消息是 Proxy 模块的 + if(Config.PROXY && toolFlag == IBurpExtenderCallbacks.TOOL_PROXY) { + IHttpService httpService = messageInfo.getHttpService(); + String host = messageInfo.getHttpService().getHost(); + //stdout.println(Config.DOMAIN_REGX); + if(Config.DOMAIN_REGX.isEmpty() && !Utils.isMathch(Config.DOMAIN_REGX,host)){ + return; + } - String url = helpers.analyzeRequest(httpService,reprsp.getRequest()).getUrl().toString(); - String url2 = url; - url = url.indexOf("?") > 0 ? url.substring(0, url.indexOf("?")) : url; - if(Config.SUFFIX_REGX!="" && Utils.isMathch(Config.SUFFIX_REGX,url)){ - return; - } - if(Config.BLACKLIST_REGX!="" && Utils.isMathch(Config.BLACKLIST_REGX,url2)){ - return; - } + String url = helpers.analyzeRequest(httpService,messageInfo.getRequest()).getUrl().toString(); + String url2 = url; + url = url.indexOf("?") > 0 ? url.substring(0, url.indexOf("?")) : url; + if(!Config.SUFFIX_REGX.isEmpty() && Utils.isMathch(Config.SUFFIX_REGX,url)){ + return; + } + if(!Config.BLACKLIST_REGX.isEmpty() && Utils.isMathch(Config.BLACKLIST_REGX,url2)){ + return; + } - final IHttpRequestResponse resrsp = iInterceptedProxyMessage.getMessageInfo(); + final IHttpRequestResponse resrsp = messageInfo; - //final LogEntry logEntry = new LogEntry(1,callbacks.saveBuffersToTempFiles(iInterceptedProxyMessage.getMessageInfo()),helpers.analyzeRequest(resrsp).getUrl()); + //final LogEntry logEntry = new LogEntry(1,callbacks.saveBuffersToTempFiles(iInterceptedProxyMessage.getMessageInfo()),helpers.analyzeRequest(resrsp).getUrl()); - // create a new log entry with the message details - executorService.submit(new Runnable() { - @Override - public void run() { - synchronized(log) { - int row = log.size(); - String method = helpers.analyzeRequest(resrsp).getMethod(); - Map mapResult = null; - try { - mapResult = HttpAndHttpsProxy.Proxy(resrsp); - } catch (InterruptedException e) { - e.printStackTrace(); + // create a new log entry with the message details + executorService.submit(new Runnable() { + @Override + public void run() { + synchronized(log) { + int row = log.size(); + String method = helpers.analyzeRequest(resrsp).getMethod(); + Map mapResult = null; + try { + mapResult = HttpAndHttpsProxy.Proxy(resrsp); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + log.add(new LogEntry(row, + callbacks.saveBuffersToTempFiles(resrsp), helpers.analyzeRequest(resrsp).getUrl(), + method, + mapResult) + ); + GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row); } + } + }); + } + + else if(Config.REPEATER && toolFlag == IBurpExtenderCallbacks.TOOL_REPEATER) { + IHttpService httpService = messageInfo.getHttpService(); + String host = messageInfo.getHttpService().getHost(); + //stdout.println(Config.DOMAIN_REGX); + if(Config.DOMAIN_REGX.isEmpty() && !Utils.isMathch(Config.DOMAIN_REGX,host)){ + return; + } + + String url = helpers.analyzeRequest(httpService,messageInfo.getRequest()).getUrl().toString(); + String url2 = url; + url = url.indexOf("?") > 0 ? url.substring(0, url.indexOf("?")) : url; + if(!Config.SUFFIX_REGX.isEmpty() && Utils.isMathch(Config.SUFFIX_REGX,url)){ + return; + } + if(!Config.BLACKLIST_REGX.isEmpty() && Utils.isMathch(Config.BLACKLIST_REGX,url2)){ + return; + } + + final IHttpRequestResponse resrsp = messageInfo; + + //final LogEntry logEntry = new LogEntry(1,callbacks.saveBuffersToTempFiles(iInterceptedProxyMessage.getMessageInfo()),helpers.analyzeRequest(resrsp).getUrl()); - log.add(new LogEntry(iInterceptedProxyMessage.getMessageReference(), - callbacks.saveBuffersToTempFiles(resrsp), helpers.analyzeRequest(resrsp).getUrl(), - method, - mapResult) - ); - GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row); + // create a new log entry with the message details + executorService.submit(new Runnable() { + @Override + public void run() { + synchronized(log) { + int row = log.size(); + String method = helpers.analyzeRequest(resrsp).getMethod(); + Map mapResult = null; + try { + mapResult = HttpAndHttpsProxy.Proxy(resrsp); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + log.add(new LogEntry(row, + callbacks.saveBuffersToTempFiles(resrsp), helpers.analyzeRequest(resrsp).getUrl(), + method, + mapResult) + ); + GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row); + } } + }); + } + + else if(Config.INTRUDER && toolFlag == IBurpExtenderCallbacks.TOOL_INTRUDER) { + IHttpService httpService = messageInfo.getHttpService(); + String host = messageInfo.getHttpService().getHost(); + //stdout.println(Config.DOMAIN_REGX); + if(Config.DOMAIN_REGX.isEmpty() && !Utils.isMathch(Config.DOMAIN_REGX,host)){ + return; } - }); + + String url = helpers.analyzeRequest(httpService,messageInfo.getRequest()).getUrl().toString(); + String url2 = url; + url = url.indexOf("?") > 0 ? url.substring(0, url.indexOf("?")) : url; + if(!Config.SUFFIX_REGX.isEmpty() && Utils.isMathch(Config.SUFFIX_REGX,url)){ + return; + } + if(!Config.BLACKLIST_REGX.isEmpty() && Utils.isMathch(Config.BLACKLIST_REGX,url2)){ + return; + } + + final IHttpRequestResponse resrsp = messageInfo; + + //final LogEntry logEntry = new LogEntry(1,callbacks.saveBuffersToTempFiles(iInterceptedProxyMessage.getMessageInfo()),helpers.analyzeRequest(resrsp).getUrl()); + + // create a new log entry with the message details + executorService.submit(new Runnable() { + @Override + public void run() { + synchronized(log) { + int row = log.size(); + String method = helpers.analyzeRequest(resrsp).getMethod(); + Map mapResult = null; + try { + mapResult = HttpAndHttpsProxy.Proxy(resrsp); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + log.add(new LogEntry(row, + callbacks.saveBuffersToTempFiles(resrsp), helpers.analyzeRequest(resrsp).getUrl(), + method, + mapResult) + ); + GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row); + } + } + }); + } } } - // 实现右键,需要先注册菜单拓展 public class Send2PSCMenu implements IContextMenuFactory{ @Override diff --git a/src/main/java/burp/Config.java b/src/main/java/burp/Config.java index 05bcde7..a81cffb 100644 --- a/src/main/java/burp/Config.java +++ b/src/main/java/burp/Config.java @@ -2,10 +2,16 @@ public class Config { public static boolean IS_RUNNING = false; + + public static boolean PROXY = true; + public static boolean REPEATER = false; + public static boolean INTRUDER = false; public static String PROXY_HOST = "127.0.0.1"; - public static Integer PROXY_PORT = 1664; - public static String PROXY_USERNAME = null; - public static String PROXY_PASSWORD = null; + public static Integer PROXY_PORT = 9081; + public static String PROXY_USERNAME = ""; + public static String PROXY_PASSWORD = ""; + + public static String PROXY_BASIC_HEADER = "Proxy-Authorization"; public static Integer PROXY_TIMEOUT = 5000; public static String DOMAIN_REGX = ""; public static String SUFFIX_REGX = "js|css|jpeg|gif|jpg|png|pdf|rar|zip|docx|doc|svg|jpeg|ico|woff|woff2|ttf|otf"; @@ -17,5 +23,5 @@ public class Config { public static Integer SUCCESS_TOTAL = 0; public static Integer FAIL_TOTAL = 0; - public static Integer INTERVAL_TIME = 5000; + public static Integer INTERVAL_TIME = 100; } diff --git a/src/main/java/burp/GUI.java b/src/main/java/burp/GUI.java index 1fe9c19..11d6a8d 100644 --- a/src/main/java/burp/GUI.java +++ b/src/main/java/burp/GUI.java @@ -2,6 +2,8 @@ import java.awt.*; import java.awt.event.ActionEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; @@ -21,6 +23,10 @@ public class GUI implements IMessageEditorController { private JTextField tfUsername; private JLabel lbPassword; private JTextField tfPassword; + + private JLabel lbHeader; + private JTextField tfHeader; + private JTextField tfDomain; private JTextField tfExcludeSuffix; private JTextField tfBlackList; @@ -83,7 +89,7 @@ public GUI() { tfHost = new JTextField(); tfHost.setColumns(10); - tfHost.setText("127.0.0.1"); + tfHost.setText(Config.PROXY_HOST); GridBagConstraints gbc_tfHost = new GridBagConstraints(); gbc_tfHost.fill = 2; gbc_tfHost.insets = new Insets(0, 0, 0, 5); @@ -100,7 +106,7 @@ public GUI() { ConfigPanel.add(lbPort, gbc_lbPort); tfPort = new JTextField(); - tfPort.setText("1664"); + tfPort.setText(String.valueOf(Config.PROXY_PORT)); tfPort.setColumns(10); GridBagConstraints gbc_tfPort = new GridBagConstraints(); gbc_tfPort.fill = 2; @@ -118,7 +124,7 @@ public GUI() { ConfigPanel.add(lbUsername, gbc_lbUsername); tfUsername = new JTextField(); - tfUsername.setText(""); + tfUsername.setText(Config.PROXY_USERNAME); tfUsername.setColumns(10); GridBagConstraints gbc_tfUsername = new GridBagConstraints(); gbc_tfUsername.fill = 2; @@ -136,7 +142,7 @@ public GUI() { ConfigPanel.add(lbPassword, gbc_lbPassword); tfPassword = new JTextField(); - tfPassword.setText(""); + tfPassword.setText(Config.PROXY_PASSWORD); tfPassword.setColumns(10); GridBagConstraints gbc_tfPassword = new GridBagConstraints(); gbc_tfPassword.fill = 2; @@ -153,7 +159,7 @@ public GUI() { ConfigPanel.add(lbTimeout, gbc_lbTimeout); tfTimeout = new JTextField(); - tfTimeout.setText("5000"); + tfTimeout.setText(String.valueOf(Config.PROXY_TIMEOUT)); tfTimeout.setColumns(5); GridBagConstraints gbc_tfTimeout = new GridBagConstraints(); gbc_tfTimeout.fill = 2; @@ -163,7 +169,7 @@ public GUI() { ConfigPanel.add(tfTimeout, gbc_tfTimeout); // 增加间隔时间 - lbIntervalTime = new JLabel("Interva lTime:"); + lbIntervalTime = new JLabel("Interval Time:"); GridBagConstraints gbc_lbIntervalTime = new GridBagConstraints(); gbc_lbIntervalTime.fill = 2; gbc_lbIntervalTime.gridx = 10; @@ -171,7 +177,7 @@ public GUI() { ConfigPanel.add(lbIntervalTime, gbc_lbIntervalTime); tfIntervalTime = new JTextField(); - tfIntervalTime.setText("5000"); + tfIntervalTime.setText(String.valueOf(Config.INTERVAL_TIME)); tfIntervalTime.setColumns(5); GridBagConstraints gbc_tfIntervalTime = new GridBagConstraints(); // fill属性用来处理GridBagLayout网格布局时子节点渲染的占位大小,2为撑满父组件 @@ -193,7 +199,6 @@ public GUI() { btnConn.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent arg0) { boolean isSelected = btnConn.isSelected(); - if(isSelected){ btnConn.setText("Stop"); Config.IS_RUNNING = true; @@ -202,6 +207,7 @@ public void stateChanged(ChangeEvent arg0) { Config.PROXY_TIMEOUT = Integer.valueOf(tfTimeout.getText()); Config.PROXY_USERNAME = tfUsername.getText(); Config.PROXY_PASSWORD = tfPassword.getText(); + Config.PROXY_BASIC_HEADER = tfHeader.getText(); Config.DOMAIN_REGX = tfDomain.getText(); Config.SUFFIX_REGX = tfExcludeSuffix.getText(); Config.BLACKLIST_REGX = tfBlackList.getText(); @@ -252,12 +258,93 @@ public void actionPerformed(ActionEvent e) { ConfigPanel.add(btnClear, gbc_btnClear); //////////////////////////////////////////////////////////////////// + JPanel ProxyPanel = new JPanel(); + GridBagConstraints gbc_proxy_panel = new GridBagConstraints(); + gbc_proxy_panel.insets = new Insets(0, 5, 5, 5); + gbc_proxy_panel.fill = 2; + gbc_proxy_panel.gridx = 0; + gbc_proxy_panel.gridy = 1; + topPanel.add(ProxyPanel, gbc_proxy_panel); + GridBagLayout gbl_proxy_panel = new GridBagLayout(); + gbl_proxy_panel.columnWidths = new int[] { 40, 225, 0, 0, 0 }; + gbl_proxy_panel.rowHeights = new int[] { 0, 0 }; + gbl_proxy_panel.columnWeights = new double[] { 0.0D, 0.0D, 0.0D,0.0D,1.0D, 0.0D, 0.0D,0.0D,0.0D,0.0D,0.0D,0.0D,Double.MIN_VALUE }; + gbl_proxy_panel.rowWeights = new double[] { 0.0D, Double.MIN_VALUE }; + ProxyPanel.setLayout(gbl_proxy_panel); + + JLabel lbProxyHeader = new JLabel("Header:"); + GridBagConstraints gbc_lbHeader = new GridBagConstraints(); + gbc_lbHeader.insets = new Insets(0, 0, 0, 5); + gbc_lbHeader.anchor = 13; + gbc_lbHeader.fill = 2; + gbc_lbHeader.gridx = 0; + gbc_lbHeader.gridy = 0; + ProxyPanel.add(lbProxyHeader, gbc_lbHeader); + + tfHeader = new JTextField(); + tfHeader.setText(Config.PROXY_BASIC_HEADER); + tfHeader.setColumns(10); + GridBagConstraints gbc_tfHeader = new GridBagConstraints(); + gbc_tfHeader.fill = 2; + gbc_tfHeader.insets = new Insets(0, 0, 0, 5); + gbc_tfHeader.gridx = 1; + gbc_tfHeader.gridy = 0; + ProxyPanel.add(tfHeader, gbc_tfHeader); + + final JCheckBox proxyCheckBox = new JCheckBox("监控Proxy"); + final JCheckBox repeaterCheckBox = new JCheckBox("监控Repeater"); + final JCheckBox intruderCheckBox = new JCheckBox("监控Intruder"); + + proxyCheckBox.setSelected(Config.PROXY); + repeaterCheckBox.setSelected(Config.REPEATER); + intruderCheckBox.setSelected(Config.INTRUDER); + proxyCheckBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + Config.PROXY = proxyCheckBox.isSelected(); + } + }); + repeaterCheckBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + Config.REPEATER = repeaterCheckBox.isSelected(); + } + }); + intruderCheckBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + Config.INTRUDER = intruderCheckBox.isSelected(); + } + }); + + GridBagConstraints gbc_tfproxy = new GridBagConstraints(); + gbc_tfproxy.fill = 2; + gbc_tfproxy.insets = new Insets(0, 0, 0, 5); + gbc_tfproxy.gridx = 2; + gbc_tfproxy.gridy = 0; + + GridBagConstraints gbc_tfrepeater = new GridBagConstraints(); + gbc_tfrepeater.fill = 2; + gbc_tfrepeater.insets = new Insets(0, 0, 0, 5); + gbc_tfrepeater.gridx = 3; + gbc_tfrepeater.gridy = 0; + + GridBagConstraints gbc_tfintruder = new GridBagConstraints(); + gbc_tfintruder.fill = 2; + gbc_tfintruder.insets = new Insets(0, 0, 0, 5); + gbc_tfintruder.gridx = 4; + gbc_tfintruder.gridy = 0; + + ProxyPanel.add(proxyCheckBox, gbc_tfproxy); + ProxyPanel.add(repeaterCheckBox, gbc_tfrepeater); + ProxyPanel.add(intruderCheckBox, gbc_tfintruder); + JPanel FilterPanel2 = new JPanel(); GridBagConstraints gbc_panel_2 = new GridBagConstraints(); gbc_panel_2.insets = new Insets(0, 5, 5, 5); gbc_panel_2.fill = 2; gbc_panel_2.gridx = 0; - gbc_panel_2.gridy = 1; + gbc_panel_2.gridy = 2; topPanel.add(FilterPanel2, gbc_panel_2); GridBagLayout gbl_panel_2 = new GridBagLayout(); gbl_panel_2.columnWidths = new int[] { 40, 225, 0, 0, 0 }; @@ -277,7 +364,7 @@ public void actionPerformed(ActionEvent e) { FilterPanel2.add(lbBlackList, gbc_lbBlackList); tfBlackList = new JTextField(90); - tfBlackList.setText("google.com|baidu.com|mozilla.org|mozilla.com|googleapis.com|delete|remove"); + tfBlackList.setText(Config.BLACKLIST_REGX); GridBagConstraints gbc_tfBlackList = new GridBagConstraints(); gbc_tfBlackList.insets = new Insets(0, 0, 0, 5); gbc_tfBlackList.fill = 2; @@ -290,7 +377,7 @@ public void actionPerformed(ActionEvent e) { gbc_panel_1.insets = new Insets(0, 5, 5, 5); gbc_panel_1.fill = 2; gbc_panel_1.gridx = 0; - gbc_panel_1.gridy = 2; + gbc_panel_1.gridy = 3; topPanel.add(FilterPanel, gbc_panel_1); GridBagLayout gbl_panel_1 = new GridBagLayout(); gbl_panel_1.columnWidths = new int[] { 40, 225, 0, 0, 0 }; @@ -316,7 +403,6 @@ public void actionPerformed(ActionEvent e) { gbc_tfDomain.gridy = 0; FilterPanel.add(tfDomain, gbc_tfDomain); - JLabel lbExcludeSuffix = new JLabel("Exclude suffix:"); GridBagConstraints gbc_lbExcludeSuffix = new GridBagConstraints(); gbc_lbExcludeSuffix.insets = new Insets(0, 0, 0, 5); @@ -327,7 +413,7 @@ public void actionPerformed(ActionEvent e) { FilterPanel.add(lbExcludeSuffix, gbc_lbExcludeSuffix); tfExcludeSuffix = new JTextField(35); - tfExcludeSuffix.setText("js|css|jpeg|gif|jpg|png|pdf|rar|zip|docx|doc|svg|jpeg|ico|woff|woff2|ttf|otf"); + tfExcludeSuffix.setText(Config.SUFFIX_REGX); GridBagConstraints gbc_tfExcludeSuffix = new GridBagConstraints(); gbc_tfExcludeSuffix.insets = new Insets(0, 0, 0, 5); gbc_tfExcludeSuffix.fill = 2; @@ -469,6 +555,7 @@ public void setAllEnabled(boolean is){ tfPort.setEnabled(is); tfUsername.setEnabled(is); tfPassword.setEnabled(is); + tfHeader.setEnabled(is); tfTimeout.setEnabled(is); tfDomain.setEnabled(is); tfExcludeSuffix.setEnabled(is); diff --git a/src/main/java/burp/HttpAndHttpsProxy.java b/src/main/java/burp/HttpAndHttpsProxy.java index ebe61b7..47221ad 100644 --- a/src/main/java/burp/HttpAndHttpsProxy.java +++ b/src/main/java/burp/HttpAndHttpsProxy.java @@ -7,6 +7,7 @@ import java.net.Proxy; import java.net.URL; import java.net.Proxy.Type; +import java.nio.charset.StandardCharsets; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.HashMap; @@ -33,25 +34,22 @@ public static Map Proxy(IHttpRequestResponse requestResponse) thr if(reqInfo.getMethod().equals("POST")){ int bodyOffset = reqInfo.getBodyOffset(); String body = null; - try { - body = new String(req, bodyOffset, req.length - bodyOffset, "UTF-8"); - reqbody = body.getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + body = new String(req, bodyOffset, req.length - bodyOffset, StandardCharsets.UTF_8); + reqbody = body.getBytes(StandardCharsets.UTF_8); } //BurpExtender.stderr.println("[+] url: " + resInfo.getUrl()); headers = reqInfo.getHeaders(); url = reqInfo.getUrl().toString(); + // 间隔时间默认太长了,修改默认为 100ms Thread.sleep(Config.INTERVAL_TIME); if(httpService.getProtocol().equals("https")){ - return HttpsProxy(url, headers, reqbody, Config.PROXY_HOST, Config.PROXY_PORT,Config.PROXY_USERNAME,Config.PROXY_PASSWORD); + return HttpsProxy(url, headers, reqbody); }else { - return HttpProxy(url, headers, reqbody, Config.PROXY_HOST, Config.PROXY_PORT,Config.PROXY_USERNAME,Config.PROXY_PASSWORD); + return HttpProxy(url, headers, reqbody); } } - public static Map HttpsProxy(String url, List headers,byte[] body, String proxy, int port,String username,String password){ + public static Map HttpsProxy(String url, List headers,byte[] body){ Map mapResult = new HashMap(); String status = ""; String rspHeader = ""; @@ -60,26 +58,23 @@ public static Map HttpsProxy(String url, List headers,byt HttpsURLConnection httpsConn = null; PrintWriter out = null; BufferedReader in = null; - BufferedReader reader = null; try { - URL urlClient = new URL(url); SSLContext sc = SSLContext.getInstance("SSL"); // 指定信任https sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); //创建代理虽然是https也是Type.HTTP - Proxy proxy1=new Proxy(Type.HTTP, new InetSocketAddress(proxy, port)); + Proxy proxy1=new Proxy(Type.HTTP, new InetSocketAddress(Config.PROXY_HOST, Config.PROXY_PORT)); //设置代理 httpsConn = (HttpsURLConnection) urlClient.openConnection(proxy1); - //设置账号密码 - if(username != null && username != "" && password != null && password != "" ) { - String user_pass = String.format("%s:%s", username, password); - String headerKey = "Proxy-Authorization"; + //设置账号密码 使用 isEmpty() 来判断, + if(Config.PROXY_USERNAME != null && !Config.PROXY_USERNAME.isEmpty() && Config.PROXY_PASSWORD != null && !Config.PROXY_PASSWORD.isEmpty() ) { + String user_pass = String.format("%s:%s", Config.PROXY_USERNAME, Config.PROXY_PASSWORD); String headerValue = "Basic " + Base64.encode(user_pass.getBytes()); - httpsConn.setRequestProperty(headerKey, headerValue); + httpsConn.setRequestProperty(Config.PROXY_BASIC_HEADER, headerValue); } httpsConn.setSSLSocketFactory(sc.getSocketFactory()); @@ -91,7 +86,8 @@ public static Map HttpsProxy(String url, List headers,byt header.startsWith("PUT")){ continue; } - String[] h = header.split(":"); + // https://github.com/c0ny1/passive-scan-client/pull/21 + String[] h = header.split(": "); String header_key = h[0].trim(); String header_value = h[1].trim(); httpsConn.setRequestProperty(header_key, header_value); @@ -180,7 +176,7 @@ public static Map HttpsProxy(String url, List headers,byt return mapResult; } - public static Map HttpProxy(String url,List headers,byte[] body, String proxy, int port,String username,String password) { + public static Map HttpProxy(String url,List headers,byte[] body) { Map mapResult = new HashMap(); String status = ""; String rspHeader = ""; @@ -198,16 +194,15 @@ public static Map HttpProxy(String url,List headers,byte[ sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); //创建代理 - Proxy proxy1=new Proxy(Type.HTTP, new InetSocketAddress(proxy, port)); + Proxy proxy1=new Proxy(Type.HTTP, new InetSocketAddress(Config.PROXY_HOST, Config.PROXY_PORT)); //设置代理 httpsConn = (HttpURLConnection) urlClient.openConnection(proxy1); //设置账号密码 - if(username != null && username != "" && password != null && password != "" ) { - String user_pass = String.format("%s:%s", username, password); - String headerKey = "Proxy-Authorization"; + if(Config.PROXY_USERNAME != null && !Config.PROXY_USERNAME.isEmpty() && Config.PROXY_PASSWORD != null && !Config.PROXY_PASSWORD.isEmpty() ) { + String user_pass = String.format("%s:%s", Config.PROXY_USERNAME, Config.PROXY_PASSWORD); String headerValue = "Basic " + Base64.encode(user_pass.getBytes()); - httpsConn.setRequestProperty(headerKey, headerValue); + httpsConn.setRequestProperty(Config.PROXY_BASIC_HEADER, headerValue); } @@ -218,7 +213,8 @@ public static Map HttpProxy(String url,List headers,byte[ header.startsWith("PUT")){ continue; } - String[] h = header.split(":"); + // https://github.com/c0ny1/passive-scan-client/pull/21 + String[] h = header.split(": "); String header_key = h[0].trim(); String header_value = h[1].trim(); //BurpExtender.stdout.println("key: " + h[0].trim()); @@ -241,7 +237,8 @@ else if(header.startsWith("POST")|| }//在循环中重复设置了methodFlag,代码非常的丑陋冗余,请见谅 continue; }//判断结束后以键值对的方式获取header - String[] h = header.split(":"); + // https://github.com/c0ny1/passive-scan-client/pull/21 + String[] h = header.split(": "); String header_key = h[0].trim(); String header_value = h[1].trim(); httpsConn.setRequestProperty(header_key, header_value); @@ -311,13 +308,18 @@ else if(methodFlag.equals("POST")){ reader.close(); } } catch (IOException e) { + BurpExtender.stderr.println("[*] " + e.getMessage()); + result = e.getMessage(); + Utils.updateFailCount(); } try { if (in != null) { in.close(); } } catch (IOException e) { - e.printStackTrace(); + BurpExtender.stderr.println("[*] " + e.getMessage()); + result = e.getMessage(); + Utils.updateFailCount(); } if (out != null) { out.close(); diff --git a/src/main/java/burp/Utils.java b/src/main/java/burp/Utils.java index 2519931..ee303e4 100644 --- a/src/main/java/burp/Utils.java +++ b/src/main/java/burp/Utils.java @@ -11,7 +11,7 @@ public static String getBanner(){ + "[+]\n" + "[+] #####################################\n" + "[+] " + BurpExtender.extensionName + " v" + BurpExtender.version +"\n" - + "[+] anthor: c0ny1\n" + + "[+] anthor: c0ny1 && yhy0\n" + "[+] email: root@gv7.me\n" + "[+] github: http://github.com/c0ny1/passive-scan-client\n" + "[+] ####################################\n" From d03f5523ab836494bed8de632bb7fee23da4826c Mon Sep 17 00:00:00 2001 From: yhy <31311038+yhy0@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:27:27 +0800 Subject: [PATCH 2/4] =?UTF-8?q?base64=201.7=20=E6=9C=89=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E6=9C=80=E4=BD=8E=E6=94=AF=E6=8C=81=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=20java=201.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 4 +- .idea/misc.xml | 3 +- .idea/workspace.xml | 137 ++++++++++++---------- passive-scan-client.iml | 17 --- pom.xml | 4 +- src/main/java/burp/BurpExtender.java | 2 +- src/main/java/burp/HttpAndHttpsProxy.java | 8 +- 7 files changed, 83 insertions(+), 92 deletions(-) delete mode 100644 passive-scan-client.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4ae1040..d73c070 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -9,8 +9,6 @@ - - - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aab66a4..bfd8bd0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,6 +4,7 @@ + - + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 340fcc6..42bf8d9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,12 +10,13 @@ + + - + - - +