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/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/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/misc.xml b/.idea/misc.xml
index aab66a4..bfd8bd0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -4,6 +4,7 @@
+
@@ -17,7 +18,7 @@
-
+
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/.idea/workspace.xml b/.idea/workspace.xml
index 340fcc6..59d9145 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -11,11 +11,14 @@
-
+
+
+
+
@@ -35,15 +38,20 @@
+
+
+
+ {
+ "customColor": "",
+ "associatedIndex": 8
+}
@@ -352,31 +360,22 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ {
+ "keyToString": {
+ "ASKED_MARK_IGNORED_FILES_AS_EXCLUDED": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "git-widget-placeholder": "master",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "project.structure.last.edited": "Project",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.2",
+ "vue.rearranger.settings.migration": "true"
+ }
+}
@@ -387,19 +386,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -413,11 +399,20 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -449,6 +444,8 @@
+
+
@@ -464,27 +461,28 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
file://$PROJECT_DIR$/src/main/java/burp/BurpExtender.java
- 75
-
+ 317
+
+
+
+ file://$PROJECT_DIR$/src/main/java/burp/BurpExtender.java
+ 323
+
+
+
+ file://$PROJECT_DIR$/src/main/java/burp/BurpExtender.java
+ 113
+
+
+
+ file://$PROJECT_DIR$/src/main/java/burp/BurpExtender.java
+ 121
+
diff --git a/README.md b/README.md
index 73044da..12bb45d 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,25 @@ Q3: ......

+配置参数
+- Host、port 指定被动扫描器地址
+- Username、Password、Header 为被动扫描器的 Basic 认证相关
+- Timeout 指流量代理到被动扫描器的访问超时时间
+- Interval Time 指获取的每个流量直接转发给被动扫描器的间隔时间
+- BlackList 不转发的黑名单域名
+- Domain 限制只转发的域名
+- Exclude suffix 限制转发的流量后缀(ps:插件默认设置了 js、css不转发,但对于被动来说这一块还是要进行敏感信息匹配的)
+- Proxy、Repeater、Intruder 要转发流量的模块,默认只转发 Proxy 模块的流量
+
+如果想要转发到多个扫描器,host,port,Username、Pasword、Header 输入中分别以 `,` 分割,并且一一对应
+比如
+ Host 中 输入 127.0.0.1,192.168.1.1
+ Port 中 输入 9081,9082
+这样就会将流量分别转发到 `127.0.0.1:9081` 和 `192.168.1.1:9082`
+
+
+效果图
+
## 0x02 插件编译
```
@@ -26,6 +45,7 @@ mvn package

## 0x04 一些被动式漏洞扫描器
+* [Jie](https://github.com/yhy0/Jie) 一款开源的全面而强大的漏洞扫描和利用工具。
* [GourdScanV2](https://github.com/ysrc/GourdScanV2) 由ysrc出品的基于sqlmapapi的被动式漏洞扫描器
* [xray](https://github.com/chaitin/xray) 由长亭科技出品的一款被动式漏洞扫描器
* [w13scan](https://github.com/boy-hack/w13scan) Passive Security Scanner (被动安全扫描器)
diff --git a/doc/img.png b/doc/img.png
new file mode 100644
index 0000000..2a76d34
Binary files /dev/null and b/doc/img.png differ
diff --git a/passive-scan-client.iml b/passive-scan-client.iml
deleted file mode 100644
index 10104d0..0000000
--- a/passive-scan-client.iml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9473592..d5ed9fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.gv7.tools.burpextend
passive-scan-client
- 0.3.1
+ 0.5
@@ -41,8 +41,8 @@
maven-compiler-plugin
3.1
- 1.7
- 1.7
+ 8
+ 8
utf-8
diff --git a/src/main/java/burp/BurpExtender.java b/src/main/java/burp/BurpExtender.java
index 99321c0..678a65a 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.5.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,234 @@ 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();
+ String[] proxy_hosts = Config.PROXY_HOST.split(",");
+ String[] proxy_ports = Config.PROXY_PORT.split(",");
+ String[] proxy_usernames = Config.PROXY_USERNAME.split(",");
+ String[] proxy_pwds = Config.PROXY_PASSWORD.split(",");
+ String[] proxy_headers = Config.PROXY_BASIC_HEADER.split(",");
+
+ for(int i=0; i < proxy_hosts.length; i++) {
+ String port = "";
+ String name = "";
+ String pwd = "";
+ String header = "";
+ if(proxy_ports.length > i) {
+ port = proxy_ports[i];
+ }
+ if(proxy_usernames.length > i) {
+ name = proxy_usernames[i];
+ }
+ if(proxy_pwds.length > i) {
+ pwd = proxy_pwds[i];
+ }
+ if(proxy_headers.length > i) {
+ header = proxy_headers[i];
+ }
+
+ Map mapResult = null;
+ try {
+ mapResult = HttpAndHttpsProxy.Proxy(resrsp, proxy_hosts[i], port, name, pwd, header);
+ mapResult.put("proxyHost",proxy_hosts[i] + ":" + port);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ log.add(new LogEntry(row+i,
+ 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;
+ }
- log.add(new LogEntry(iInterceptedProxyMessage.getMessageReference(),
- callbacks.saveBuffersToTempFiles(resrsp), helpers.analyzeRequest(resrsp).getUrl(),
- method,
- mapResult)
- );
- GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row);
+ 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();
+
+ String[] proxy_hosts = Config.PROXY_HOST.split(",");
+ String[] proxy_ports = Config.PROXY_PORT.split(",");
+ String[] proxy_usernames = Config.PROXY_USERNAME.split(",");
+ String[] proxy_pwds = Config.PROXY_PASSWORD.split(",");
+ String[] proxy_headers = Config.PROXY_BASIC_HEADER.split(",");
+
+ for(int i=0; i < proxy_hosts.length; i++) {
+ String port = "";
+ String name = "";
+ String pwd = "";
+ String header = "";
+ if(proxy_ports.length > i) {
+ name = proxy_ports[i];
+ }
+ if(proxy_usernames.length > i) {
+ name = proxy_usernames[i];
+ }
+ if(proxy_pwds.length > i) {
+ pwd = proxy_pwds[i];
+ }
+ if(proxy_headers.length > i) {
+ header = proxy_headers[i];
+ }
+
+ Map mapResult = null;
+ try {
+ mapResult = HttpAndHttpsProxy.Proxy(resrsp, proxy_hosts[i], port, name, pwd, header);
+ mapResult.put("proxyHost",proxy_hosts[i] + ":" + port);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ log.add(new LogEntry(row+i,
+ 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();
+
+ String[] proxy_hosts = Config.PROXY_HOST.split(",");
+ String[] proxy_ports = Config.PROXY_PORT.split(",");
+ String[] proxy_usernames = Config.PROXY_USERNAME.split(",");
+ String[] proxy_pwds = Config.PROXY_PASSWORD.split(",");
+ String[] proxy_headers = Config.PROXY_BASIC_HEADER.split(",");
+
+ for(int i=0; i < proxy_hosts.length; i++) {
+ String port = "";
+ String name = "";
+ String pwd = "";
+ String header = "";
+ if(proxy_ports.length > i) {
+ name = proxy_ports[i];
+ }
+ if(proxy_usernames.length > i) {
+ name = proxy_usernames[i];
+ }
+ if(proxy_pwds.length > i) {
+ pwd = proxy_pwds[i];
+ }
+ if(proxy_headers.length > i) {
+ header = proxy_headers[i];
+ }
+
+ Map mapResult = null;
+ try {
+ mapResult = HttpAndHttpsProxy.Proxy(resrsp, proxy_hosts[i], port, name, pwd, header);
+ mapResult.put("proxyHost",proxy_hosts[i] + ":" + port);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ log.add(new LogEntry(row+i,
+ callbacks.saveBuffersToTempFiles(resrsp), helpers.analyzeRequest(resrsp).getUrl(),
+ method,
+ mapResult)
+ );
+ GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row);
+ }
+ }
+ }
+ });
+ }
}
}
-
// 实现右键,需要先注册菜单拓展
public class Send2PSCMenu implements IContextMenuFactory{
@Override
@@ -148,20 +324,46 @@ public void run() {
String method = helpers.analyzeRequest(message).getMethod();
byte[] req = message.getRequest();
- String req_str = new String(req);
- //向代理转发请求
- Map mapResult = null;
- try {
- mapResult = HttpAndHttpsProxy.Proxy(message);
- } catch (InterruptedException ex) {
- ex.printStackTrace();
+ String resrsp = new String(req);
+ String[] proxy_hosts = Config.PROXY_HOST.split(",");
+ String[] proxy_ports = Config.PROXY_PORT.split(",");
+ String[] proxy_usernames = Config.PROXY_USERNAME.split(",");
+ String[] proxy_pwds = Config.PROXY_PASSWORD.split(",");
+ String[] proxy_headers = Config.PROXY_BASIC_HEADER.split(",");
+
+ for(int i=0; i < proxy_hosts.length; i++) {
+ String port = "";
+ String name = "";
+ String pwd = "";
+ String header = "";
+ if(proxy_ports.length > i) {
+ name = proxy_ports[i];
+ }
+ if(proxy_usernames.length > i) {
+ name = proxy_usernames[i];
+ }
+ if(proxy_pwds.length > i) {
+ pwd = proxy_pwds[i];
+ }
+ if(proxy_headers.length > i) {
+ header = proxy_headers[i];
+ }
+
+ Map mapResult = null;
+ try {
+ mapResult = HttpAndHttpsProxy.Proxy(message, proxy_hosts[i], port, name, pwd, header);
+ mapResult.put("proxyHost",proxy_hosts[i] + ":" + port);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ log.add(new LogEntry(row+i,
+ callbacks.saveBuffersToTempFiles(message), helpers.analyzeRequest(message).getUrl(),
+ method,
+ mapResult)
+ );
+ GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row);
}
- log.add(new LogEntry(row + 1,
- callbacks.saveBuffersToTempFiles(message), helpers.analyzeRequest(message).getUrl(),
- method,
- mapResult)
- );
- GUI.logTable.getHttpLogTableModel().fireTableRowsInserted(row, row);
}
}
});
diff --git a/src/main/java/burp/Config.java b/src/main/java/burp/Config.java
index 05bcde7..c17adbd 100644
--- a/src/main/java/burp/Config.java
+++ b/src/main/java/burp/Config.java
@@ -2,13 +2,19 @@
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 String 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";
+ public static String SUFFIX_REGX = "jpeg|gif|jpg|png|pdf|rar|zip|docx|doc|svg|jpeg|ico|woff|woff2|ttf|otf";
// 新增关键字、域名黑名单
public static String BLACKLIST_REGX = "google.com|baidu.com|mozilla.org|mozilla.com|googleapis.com|delete|remove";
@@ -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..99c8bc3 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,15 +199,15 @@ public GUI() {
btnConn.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
boolean isSelected = btnConn.isSelected();
-
if(isSelected){
btnConn.setText("Stop");
Config.IS_RUNNING = true;
Config.PROXY_HOST = tfHost.getText();
- Config.PROXY_PORT = Integer.valueOf(tfPort.getText());
+ Config.PROXY_PORT = tfPort.getText();
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..d34b51a 100644
--- a/src/main/java/burp/HttpAndHttpsProxy.java
+++ b/src/main/java/burp/HttpAndHttpsProxy.java
@@ -1,17 +1,18 @@
package burp;
-import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
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;
import java.util.List;
import java.util.Map;
+import java.util.Base64;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
@@ -21,7 +22,7 @@
//https://blog.csdn.net/sbc1232123321/article/details/79334130,http、https代理设置
public class HttpAndHttpsProxy {
- public static Map Proxy(IHttpRequestResponse requestResponse) throws InterruptedException{
+ public static Map Proxy(IHttpRequestResponse requestResponse, String proxy_host, String proxy_port, String proxy_username,String proxy_pwd,String proxy_header) throws InterruptedException{
byte[] req = requestResponse.getRequest();
String url = null;
byte[] reqbody = null;
@@ -33,25 +34,23 @@ 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, proxy_host, proxy_port, proxy_username, proxy_pwd, proxy_header);
}else {
- return HttpProxy(url, headers, reqbody, Config.PROXY_HOST, Config.PROXY_PORT,Config.PROXY_USERNAME,Config.PROXY_PASSWORD);
+ return HttpProxy(url, headers, reqbody, proxy_host, proxy_port, proxy_username, proxy_pwd, proxy_header);
}
+
}
- 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, String proxy_host, String proxy_port, String proxy_username,String proxy_pwd,String proxy_header){
Map mapResult = new HashMap();
String status = "";
String rspHeader = "";
@@ -60,26 +59,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(proxy_host, Integer.parseInt(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";
- String headerValue = "Basic " + Base64.encode(user_pass.getBytes());
- httpsConn.setRequestProperty(headerKey, headerValue);
+ //设置账号密码 使用 isEmpty() 来判断,
+ if(proxy_username != null && !proxy_username.isEmpty() && proxy_pwd != null && !proxy_pwd.isEmpty()) {
+ String user_pass = String.format("%s:%s", proxy_username, proxy_pwd);
+ String headerValue = "Basic " + Base64.getEncoder().encodeToString(user_pass.getBytes());
+ httpsConn.setRequestProperty(proxy_header, headerValue);
}
httpsConn.setSSLSocketFactory(sc.getSocketFactory());
@@ -91,33 +87,90 @@ 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);
+ }
+ //设置控制请求方法的Flag
+ String methodFlag = "";
+ // 设置通用的请求属性
+ for(String header:headers){
+ if(header.startsWith("GET") ||
+ header.startsWith("POST") ||
+ header.startsWith("PUT")){
+ if(header.startsWith("GET")){
+ methodFlag = "GET";
+ }
+ else if(header.startsWith("POST")||
+ header.startsWith("PUT")){
+ methodFlag = "POST";
+ }//在循环中重复设置了methodFlag,代码非常的丑陋冗余,请见谅
+ continue;
+ }//判断结束后以键值对的方式获取header
+ // 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);
}
- // 发送POST请求必须设置如下两行
- httpsConn.setDoOutput(true);
- httpsConn.setDoInput(true);
+ if (methodFlag.equals("GET")){
+ // 发送GET请求必须设置如下两行
+ httpsConn.setDoOutput(false);
+ httpsConn.setDoInput(true);
- // 获取URLConnection对象对应的输出流
- out = new PrintWriter(httpsConn.getOutputStream());
+ // 获取URLConnection对象的连接
+ httpsConn.connect();
+ }
+ else if(methodFlag.equals("POST")){
+ // 发送POST请求必须设置如下两行
+ httpsConn.setDoOutput(true);
+ httpsConn.setDoInput(true);
- if(body != null) {
- // 发送请求参数
- out.print(new String(body));
+ // 获取URLConnection对象对应的输出流
+ out = new PrintWriter(httpsConn.getOutputStream());
+ if(body != null) {
+ // 发送请求参数
+ out.print(new String(body));
+ }
+ // flush输出流的缓冲
+ out.flush();
}
- // flush输出流的缓冲
- out.flush();
// 定义BufferedReader输入流来读取URL的响应
- in = new BufferedReader(
- new InputStreamReader(httpsConn.getInputStream()));
+ in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
result += "\r\n";
}
+
+
+
+
+ // 发送POST请求必须设置如下两行
+// httpsConn.setDoOutput(true);
+// httpsConn.setDoInput(true);
+//
+//
+// // 获取URLConnection对象对应的输出流
+// out = new PrintWriter(httpsConn.getOutputStream());
+//
+// if(body != null) {
+// // 发送请求参数
+// out.print(new String(body));
+// }
+// // flush输出流的缓冲
+// out.flush();
+// // 定义BufferedReader输入流来读取URL的响应
+// in = new BufferedReader(
+// new InputStreamReader(httpsConn.getInputStream()));
+// String line;
+// while ((line = in.readLine()) != null) {
+// result += line;
+// result += "\r\n";
+// }
// 断开连接
httpsConn.disconnect();
//BurpExtender.stdout.println("====result===="+result);
@@ -180,7 +233,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, String proxy_host, String proxy_port, String proxy_username,String proxy_pwd,String proxy_header){
Map mapResult = new HashMap();
String status = "";
String rspHeader = "";
@@ -198,16 +251,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(proxy_host, Integer.parseInt(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";
- String headerValue = "Basic " + Base64.encode(user_pass.getBytes());
- httpsConn.setRequestProperty(headerKey, headerValue);
+ //设置账号密码 使用 isEmpty() 来判断,
+ if(proxy_username != null && !proxy_username.isEmpty() && proxy_pwd != null && !proxy_pwd.isEmpty()) {
+ String user_pass = String.format("%s:%s", proxy_username, proxy_pwd);
+ String headerValue = "Basic " + Base64.getEncoder().encodeToString(user_pass.getBytes());
+ httpsConn.setRequestProperty(proxy_header, headerValue);
}
@@ -218,13 +270,13 @@ 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());
- //BurpExtender.stdout.println("value: " + h[1].trim());
httpsConn.setRequestProperty(header_key, header_value);
}
+
//设置控制请求方法的Flag
String methodFlag = "";
// 设置通用的请求属性
@@ -241,7 +293,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 +364,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/HttpLogTableModel.java b/src/main/java/burp/HttpLogTableModel.java
index 750ccc6..bd522f9 100644
--- a/src/main/java/burp/HttpLogTableModel.java
+++ b/src/main/java/burp/HttpLogTableModel.java
@@ -8,7 +8,7 @@ public int getRowCount() {
}
public int getColumnCount() {
- return 5;
+ return 6;
}
@Override
@@ -26,6 +26,8 @@ public String getColumnName(int columnIndex) {
return "Status";
case 4:
return "Time";
+ case 5:
+ return "ProxyHost";
default:
return "";
}
@@ -52,6 +54,8 @@ public Object getValueAt(int rowIndex, int columnIndex) {
return logEntry.status;
case 4:
return logEntry.requestTime;
+ case 5:
+ return logEntry.proxyHost;
default:
return "";
}
diff --git a/src/main/java/burp/LogEntry.java b/src/main/java/burp/LogEntry.java
index 55d52fc..2e633a7 100644
--- a/src/main/java/burp/LogEntry.java
+++ b/src/main/java/burp/LogEntry.java
@@ -13,6 +13,7 @@ public class LogEntry {
final String status;
final String proxyResponse;
public String requestTime;
+ public String proxyHost;
LogEntry(int id, IHttpRequestResponsePersisted requestResponse, URL url, String method, Map mapResult) {
this.id = id;
@@ -22,5 +23,6 @@ public class LogEntry {
this.status = mapResult.get("status");
this.proxyResponse = mapResult.get("header") + "\r\n" + mapResult.get("result");
this.requestTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());
+ this.proxyHost = mapResult.get("proxyHost");
}
}
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"