From 2ce57f8ee1665c0774caeafb11bd665494ce37ca Mon Sep 17 00:00:00 2001 From: AnonymousUser Date: Fri, 27 Nov 2020 03:48:28 +0800 Subject: [PATCH] Rebuild code and add default filter. --- burp/BurpExtender.java | 371 +++++++++----------------------- burp/Config.java | 11 + burp/action/DoAction.java | 34 +++ burp/action/ExtractContent.java | 67 ++++++ burp/action/MatchHTTP.java | 36 ++++ burp/color/GetColorKey.java | 23 ++ burp/color/UpgradeColor.java | 53 +++++ burp/file/FileExists.java | 18 ++ burp/file/ReadFile.java | 36 ++++ burp/file/RemoveContent.java | 22 ++ burp/file/WriteFile.java | 21 ++ burp/ui/FillTable.java | 44 ++++ 12 files changed, 464 insertions(+), 272 deletions(-) create mode 100644 burp/Config.java create mode 100644 burp/action/DoAction.java create mode 100644 burp/action/ExtractContent.java create mode 100644 burp/action/MatchHTTP.java create mode 100644 burp/color/GetColorKey.java create mode 100644 burp/color/UpgradeColor.java create mode 100644 burp/file/FileExists.java create mode 100644 burp/file/ReadFile.java create mode 100644 burp/file/RemoveContent.java create mode 100644 burp/file/WriteFile.java create mode 100644 burp/ui/FillTable.java diff --git a/burp/BurpExtender.java b/burp/BurpExtender.java index 2c5c57e..4d22b72 100644 --- a/burp/BurpExtender.java +++ b/burp/BurpExtender.java @@ -7,8 +7,16 @@ import org.json.*; -import jregex.Matcher; -import jregex.Pattern; +import burp.action.DoAction; +import burp.action.ExtractContent; +import burp.action.MatchHTTP; +import burp.color.GetColorKey; +import burp.color.UpgradeColor; +import burp.file.FileExists; +import burp.file.ReadFile; +import burp.file.RemoveContent; +import burp.file.WriteFile; +import burp.ui.FillTable; import javax.swing.JFrame; import javax.swing.JOptionPane; @@ -20,12 +28,7 @@ import javax.swing.JPanel; import javax.swing.JButton; import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.awt.event.ActionEvent; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -48,28 +51,37 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito private JTable table; private JTextField textField; private IBurpExtenderCallbacks callbacks; + private static IExtensionHelpers helpers; private static String configFilePath = "config.json"; private static String initFilePath = "init.hae"; - private static String initConfigContent = "{\"Email\":{\"loaded\":true,\"scope\":\"response\",\"regex\":\"([\\\\w-]+(?:\\\\.[\\\\w-]+)*@(?:[\\\\w](?:[\\\\w-]*[\\\\w])?\\\\.)+[\\\\w](?:[\\\\w-]*[\\\\w])?)\",\"action\":\"any\",\"color\":\"yellow\"}}"; - private static String endColor = ""; - private static String[] colorArray = new String[] {"red", "orange", "yellow", "green", "cyan", "blue", "pink", "magenta", "gray"}; - private static String[] scopeArray = new String[] {"any", "response", "request"}; - private static String[] actionArray = new String[] {"any", "extract", "highight"}; private static IMessageEditorTab HaETab; private static PrintWriter stdout; + ReadFile rf = new ReadFile(); + WriteFile wfc = new WriteFile(); + FileExists fe = new FileExists(); + RemoveContent rc = new RemoveContent(); + GetColorKey gck = new GetColorKey(); + UpgradeColor uc = new UpgradeColor(); + ExtractContent ec = new ExtractContent(); + MatchHTTP mh = new MatchHTTP(); + FillTable ft = new FillTable(); + DoAction da = new DoAction(); + @Override public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; + this.helpers = callbacks.getHelpers(); // 设置插件名字和版本 - String version = "1.4.2"; + String version = "1.5"; callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); // 定义输出 stdout = new PrintWriter(callbacks.getStdout(), true); stdout.println("@Author: EvilChen"); + stdout.println("@Blog: cn.gh0st.cn"); // UI SwingUtilities.invokeLater(new Runnable() { @@ -77,20 +89,20 @@ public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) public void run() { // 判断"config.json"文件是否具备内容,如若不具备则进行初始化 if (configFilePath.equals("config.json")) { - if (readFileContent(configFilePath).equals("")) { - writeFileContent(configFilePath, initConfigContent); - writeFileContent(initFilePath, configFilePath); + if (rf.readFileContent(configFilePath).equals("")) { + wfc.writeFileContent(configFilePath, Config.initConfigContent); + wfc.writeFileContent(initFilePath, configFilePath); } } // 判断配置文件是否存在 - if (fileExists(configFilePath)) { - configFilePath = readFileContent(initFilePath); + if (fe.fileExists(configFilePath)) { + configFilePath = rf.readFileContent(initFilePath); } else { JOptionPane.showMessageDialog(null, "Config File Not Found!", "Error", JOptionPane.ERROR_MESSAGE); } initialize(); - fillTable(); + ft.fillTable(configFilePath, table); } }); @@ -129,8 +141,8 @@ public void actionPerformed(ActionEvent e) { File file = jfc.getSelectedFile(); textField.setText(file.getAbsolutePath()); configFilePath = textField.getText(); - writeFileContent(initFilePath, configFilePath); - fillTable(); + wfc.writeFileContent(initFilePath, configFilePath); + ft.fillTable(configFilePath, table); } }); panel_3.add(btnNewButton); @@ -146,7 +158,7 @@ public void actionPerformed(ActionEvent e) { JButton btnReloadRule = new JButton("Reload"); btnReloadRule.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - fillTable(); + ft.fillTable(configFilePath, table); } }); panel_1.add(btnReloadRule); @@ -177,7 +189,7 @@ public void actionPerformed(ActionEvent e) { // 在配置文件中删除数据 String cellValue = (String) dtm.getValueAt(selectedRowIndex, 1); // System.out.println(cellValue); - removeConfig(cellValue); + rc.removeFileContent(cellValue, configFilePath); // 在表格中删除数据 dtm.removeRow(selectedRowIndex); @@ -200,10 +212,10 @@ public void actionPerformed(ActionEvent e) { scrollPane.setViewportView(table); table.getColumnModel().getColumn(2).setPreferredWidth(172); - table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(new JComboBox(colorArray))); + table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(new JComboBox(Config.colorArray))); table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox())); - table.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(new JComboBox(scopeArray))); - table.getColumnModel().getColumn(5).setCellEditor(new DefaultCellEditor(new JComboBox(actionArray))); + table.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(new JComboBox(Config.scopeArray))); + table.getColumnModel().getColumn(5).setCellEditor(new DefaultCellEditor(new JComboBox(Config.actionArray))); JLabel lblNewLabel = new JLabel("@EvilChen Love YuChen."); lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); @@ -229,20 +241,20 @@ public void tableChanged(TableModelEvent e) { jsonObj.put((String) dtm.getValueAt(i, 1), jsonObj1); } - writeFileContent(configFilePath, jsonObj.toString()); + wfc.writeFileContent(configFilePath, jsonObj.toString()); } } } ); + callbacks.customizeUiComponent(panel); callbacks.customizeUiComponent(panel_1); callbacks.customizeUiComponent(panel_2); callbacks.customizeUiComponent(panel_3); callbacks.customizeUiComponent(scrollPane); callbacks.addSuiteTab(BurpExtender.this); - } @Override @@ -269,28 +281,40 @@ public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequ // 判断是否是响应,且该代码作用域为:REPEATER、INTRUDER、PROXY(分别对应toolFlag 64、32、4) if (toolFlag == 64 || toolFlag == 32 || toolFlag == 4) { JSONObject jsonObj = new JSONObject(); + byte[] content = messageInfo.getRequest(); + // 流量清洗 + String urlString = helpers.analyzeRequest(messageInfo.getHttpService(), content).getUrl().toString(); + urlString = urlString.indexOf("?") > 0 ? urlString.substring(0, urlString.indexOf("?")) : urlString; + // 正则判断 + if (mh.matchSuffix(urlString)) { + return; + } if (messageIsRequest) { - byte[] content = messageInfo.getRequest(); try { String c = new String(content, "UTF-8").intern(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - jsonObj = matchRegex(content, "request", "highlight"); + jsonObj = ec.matchRegex(content, "request", "highlight", configFilePath); } else { - byte[] content = messageInfo.getResponse(); + content = messageInfo.getResponse(); + // 流量清洗 + List mimeList = helpers.analyzeResponse(content).getHeaders(); + // 正则判断 + if (mh.matchMIME(mimeList)) { + return; + } try { String c = new String(content, "UTF-8").intern(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - jsonObj = matchRegex(content, "response", "highlight"); + jsonObj = ec.matchRegex(content, "response", "highlight", configFilePath); } - List colorList = highlightList(jsonObj); + List colorList = da.highlightList(jsonObj); if (colorList.size() != 0) { - colorUpgrade(getColorKeys(colorList)); - String color = endColor; + String color = uc.getEndColor(gck.getColorKeys(colorList, Config.colorArray), Config.colorArray);; messageInfo.setHighlight(color); } } @@ -300,8 +324,12 @@ public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequ class MarkInfoTab implements IMessageEditorTab { private ITextEditor markInfoText; private byte[] currentMessage; - + private final IMessageEditorController controller; + private byte[] extractRequestContent; + private byte[] extractResponseContent; + public MarkInfoTab(IMessageEditorController controller, boolean editable) { + this.controller = controller; markInfoText = callbacks.createTextEditor(); markInfoText.setEditable(editable); } @@ -318,10 +346,39 @@ public Component getUiComponent() { @Override public boolean isEnabled(byte[] content, boolean isRequest) { - if (isRequest && matchRegex(content, "request", "extract").length() != 0) { - return true; - } else if (!isRequest && matchRegex(content, "response", "extract").length() != 0) { - return true; + try { + // 流量清洗 + String urlString = helpers.analyzeRequest(controller.getHttpService(), controller.getRequest()).getUrl().toString(); + urlString = urlString.indexOf("?") > 0 ? urlString.substring(0, urlString.indexOf("?")) : urlString; + // 正则判断 + if (mh.matchSuffix(urlString)) { + return false; + } + } catch (Exception e) { + return false; + } + + + if (isRequest) { + JSONObject jsonObj = ec.matchRegex(content, "request", "extract", configFilePath); + if (jsonObj.length() != 0) { + String result = da.extractString(jsonObj); + extractRequestContent = result.getBytes(); + return true; + } + } else { + // 流量清洗 + List mimeList = helpers.analyzeResponse(controller.getResponse()).getHeaders(); + // 正则判断 + if (mh.matchMIME(mimeList)) { + return false; + } + JSONObject jsonObj = ec.matchRegex(content, "response", "extract", configFilePath); + if (jsonObj.length() != 0) { + String result = da.extractString(jsonObj); + extractResponseContent = result.getBytes(); + return true; + } } return false; } @@ -353,246 +410,16 @@ public void setMessage(byte[] content, boolean isRequest) { } if (content.length > 0) { if (isRequest) { - JSONObject jsonObj = matchRegex(content, "request", "extract"); - if (jsonObj.length() != 0) { - String result = extractString(jsonObj); - markInfoText.setText(result.getBytes()); - } + markInfoText.setText(extractRequestContent); } else { - JSONObject jsonObj = matchRegex(content, "response", "extract"); - if (jsonObj.length() != 0) { - String result = extractString(jsonObj); - markInfoText.setText(result.getBytes()); - } + markInfoText.setText(extractResponseContent); } } currentMessage = content; } } - private String extractString(JSONObject jsonObj) { - String result = ""; - Iterator k = jsonObj.keys(); - while (k.hasNext()) { - String name = k.next(); - JSONObject jsonObj1 = new JSONObject(jsonObj.get(name).toString()); - String tmpStr = String.format("[%s]\n%s\n\n", name, jsonObj1.getString("data")).intern(); - result += tmpStr; - } - return result; - } - - private List highlightList(JSONObject jsonObj) { - List colorList = new ArrayList(); - Iterator k = jsonObj.keys(); - while (k.hasNext()) { - String name = k.next(); - JSONObject jsonObj2 = new JSONObject(jsonObj.get(name).toString()); - colorList.add(jsonObj2.getString("color")); - } - return colorList; - } - - private JSONObject matchRegex(byte[] content, String scopeString, String actionString) { - JSONObject tabContent = new JSONObject(); - // 正则匹配提取内容 - try { - String jsonStr = readFileContent(configFilePath); - JSONObject jsonObj = new JSONObject(jsonStr); - Iterator k = jsonObj.keys(); - // 遍历json数组 - while (k.hasNext()) { - String contentString = new String(content, "UTF-8").intern(); - String name = k.next(); - JSONObject jsonObj1 = new JSONObject(jsonObj.get(name).toString()); - JSONObject jsonData = new JSONObject(); - String regex = jsonObj1.getString("regex"); - boolean isLoaded = jsonObj1.getBoolean("loaded"); - String scope = jsonObj1.getString("scope"); - String action = jsonObj1.getString("action"); - String color = jsonObj1.getString("color"); - List result = new ArrayList(); - - if(isLoaded && (scope.equals(scopeString) || scope.equals("any")) && (action.equals(actionString) || action.equals("any"))) { - Pattern pattern = new Pattern(regex); - Matcher matcher = pattern.matcher(contentString); - while (matcher.find()) { - // 添加匹配数据至list - // 强制用户使用()包裹正则 - result.add(matcher.group(1)); - } - - // 去除重复内容 - HashSet tmpList = new HashSet(result); - result.clear(); - result.addAll(tmpList); - - if (!result.isEmpty()) { - jsonData.put("color", color); - jsonData.put("data", String.join("\n", result)); - jsonData.put("loaded", isLoaded); - // 初始化格式 - tabContent.put(name, jsonData); - } - } - - } - - - } catch (Exception e) {} - - return tabContent; - } - - /* - * 颜色下标获取 - */ - private List getColorKeys(List keys){ - List result = new ArrayList(); - int size = colorArray.length; - // 根据颜色获取下标 - for (int x = 0; x < keys.size(); x++) { - for (int v = 0; v < size; v++) { - if (colorArray[v].equals(keys.get(x))) { - result.add(v); - } - } - } - return result; - } - - /* - * 颜色升级递归算法 - */ - private static String colorUpgrade(List colorList) { - int colorSize = colorList.size(); - colorList.sort(Comparator.comparingInt(Integer::intValue)); - int i = 0; - List stack = new ArrayList(); - while (i < colorSize) { - if (stack.isEmpty()) { - stack.add(colorList.get(i)); - i++; - } else { - if (colorList.get(i) != stack.stream().reduce((first, second) -> second).orElse(99999999)) { - stack.add(colorList.get(i)); - i++; - } else { - stack.set(stack.size() - 1, stack.get(stack.size() - 1) - 1); - i++; - } - } - - } - // 利用HashSet删除重复元素 - HashSet tmpList = new HashSet(stack); - if (stack.size() == tmpList.size()) { - stack.sort(Comparator.comparingInt(Integer::intValue)); - if(stack.get(0).equals(-1)) { - endColor = colorArray[0]; - } else { - endColor = colorArray[stack.get(0)]; - } - } else { - colorUpgrade(stack); - } - return ""; - } - - /* - * 判断文件是否存在 - */ - private Boolean fileExists(String fileName) { - File file = new File(fileName); - if(file.exists()){ - return true; - } - return false; - } - /* - * 获取文件内容 - */ - private String readFileContent(String fileName) { - File file = new File(fileName); - BufferedReader reader = null; - StringBuffer sbf = new StringBuffer(); - try { - reader = new BufferedReader(new FileReader(file)); - String tempStr; - while ((tempStr = reader.readLine()) != null) { - sbf.append(tempStr); - } - reader.close(); - return sbf.toString(); - } catch (IOException e) { - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException err) { - err.printStackTrace(); - } - } - } - return sbf.toString(); - } - - /* - * 写入文件内容 - */ - private boolean writeFileContent(String fileName, String fileContent) { - try { - BufferedWriter out = new BufferedWriter(new FileWriter(fileName)); - out.write(fileContent); - out.close(); - return true; - } catch (IOException e) { - stdout.println(e); - return false; - } - } - - /* - * 删除单条配置内容 - */ - private void removeConfig(String key) { - String jsonStr = readFileContent(configFilePath); - JSONObject jsonObj = new JSONObject(jsonStr); - jsonObj.remove(key); - if (writeFileContent(configFilePath, jsonObj.toString())) { - JOptionPane.showMessageDialog(null, "Delete Successfully!", "Info", JOptionPane.INFORMATION_MESSAGE); - } - } - /* - * 初始化表格内容 - */ - private void fillTable() { - DefaultTableModel dtm=(DefaultTableModel) table.getModel(); - dtm.setRowCount(0); - String jsonStr = readFileContent(configFilePath); - JSONObject jsonObj = new JSONObject(jsonStr); - Iterator k = jsonObj.keys(); - // 遍历json数组 - while (k.hasNext()) { - String name = k.next(); - JSONObject jsonObj1 = new JSONObject(jsonObj.get(name).toString()); - boolean loaded = jsonObj1.getBoolean("loaded"); - String regex = jsonObj1.getString("regex"); - String color = jsonObj1.getString("color"); - String scope = jsonObj1.getString("scope"); - String action = jsonObj1.getString("action"); - // 填充数据 - Vector rules = new Vector(); - rules.add(loaded); - rules.add(name); - rules.add(regex); - rules.add(color); - rules.add(scope); - rules.add(action); - dtm.addRow(rules); - } - } public static void main(String[] args) { } diff --git a/burp/Config.java b/burp/Config.java new file mode 100644 index 0000000..5610284 --- /dev/null +++ b/burp/Config.java @@ -0,0 +1,11 @@ +package burp; + +public class Config { + public static String initConfigContent = "{\"Email\":{\"loaded\":true,\"scope\":\"response\",\"regex\":\"([\\\\w-]+(?:\\\\.[\\\\w-]+)*@(?:[\\\\w](?:[\\\\w-]*[\\\\w])?\\\\.)+[\\\\w](?:[\\\\w-]*[\\\\w])?)\",\"action\":\"any\",\"color\":\"yellow\"}}"; + public static String[] colorArray = new String[] {"red", "orange", "yellow", "green", "cyan", "blue", "pink", "magenta", "gray"}; + public static String[] scopeArray = new String[] {"any", "response", "request"}; + public static String[] actionArray = new String[] {"any", "extract", "highight"}; + public static String excludeSuffix = "7z|aif|aifc|aiff|au|bmp|cmx|cod|css|doc|docx|gif|gz|ico|ief|jfif|jpe|jpeg|jpg|m3u|mid|mp2|mp3|mpa|mpe|mpeg|mpg|mpp|mpv2|otf|pbm|pdf|pgm|png|pnm|ppm|ra|ram|rar|ras|rgb|rmi|snd|svg|tar|tif|tiff|ttf|wav|woff|woff2|xbm|xpm|xwd|zip"; + public static String[] excludeMIME = new String[] {"application/msword", "application/vnd.ms-project", "application/x-gzip", "application/x-tar", "application/zip", "audio/basic", "audio/mid", "audio/mpeg", "audio/x-aiff", "audio/x-mpegurl", "audio/x-pn-realaudio", "audio/x-wav", "image/bmp", "image/cis-cod", "image/gif", "image/ief", "image/jpeg", "image/png", "image/pipeg", "image/svg+xml", "image/tiff", "image/x-cmu-raster", "image/x-cmx", "image/x-icon", "image/x-portable-anymap", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap", "image/x-rgb", "image/x-xbitmap", "image/x-xpixmap", "image/x-xwindowdump", "text/css", "video/mpeg", "video/mpeg", "application/font-woff"}; + public static String outputTplString = "[%s]\n%s\n\n"; +} diff --git a/burp/action/DoAction.java b/burp/action/DoAction.java new file mode 100644 index 0000000..7ba9194 --- /dev/null +++ b/burp/action/DoAction.java @@ -0,0 +1,34 @@ +package burp.action; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.json.JSONObject; + +import burp.Config; + +public class DoAction { + public String extractString(JSONObject jsonObj) { + String result = ""; + Iterator k = jsonObj.keys(); + while (k.hasNext()) { + String name = k.next(); + JSONObject jsonObj1 = new JSONObject(jsonObj.get(name).toString()); + String tmpStr = String.format(Config.outputTplString, name, jsonObj1.getString("data")).intern(); + result += tmpStr; + } + return result; + } + + public List highlightList(JSONObject jsonObj) { + List colorList = new ArrayList(); + Iterator k = jsonObj.keys(); + while (k.hasNext()) { + String name = k.next(); + JSONObject jsonObj2 = new JSONObject(jsonObj.get(name).toString()); + colorList.add(jsonObj2.getString("color")); + } + return colorList; + } +} diff --git a/burp/action/ExtractContent.java b/burp/action/ExtractContent.java new file mode 100644 index 0000000..7efe8d7 --- /dev/null +++ b/burp/action/ExtractContent.java @@ -0,0 +1,67 @@ +package burp.action; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + +import org.json.JSONObject; + +import burp.file.ReadFile; +import jregex.Matcher; +import jregex.Pattern; + +public class ExtractContent { + ReadFile rf = new ReadFile(); + public JSONObject matchRegex(byte[] content, String scopeString, String actionString, String configFilePath) { + JSONObject tabContent = new JSONObject(); + // 正则匹配提取内容 + try { + String jsonStr = rf.readFileContent(configFilePath); + JSONObject jsonObj = new JSONObject(jsonStr); + Iterator k = jsonObj.keys(); + // 遍历json数组 + while (k.hasNext()) { + String contentString = new String(content, "UTF-8").intern(); + String name = k.next(); + JSONObject jsonObj1 = new JSONObject(jsonObj.get(name).toString()); + JSONObject jsonData = new JSONObject(); + String regex = jsonObj1.getString("regex"); + boolean isLoaded = jsonObj1.getBoolean("loaded"); + String scope = jsonObj1.getString("scope"); + String action = jsonObj1.getString("action"); + String color = jsonObj1.getString("color"); + List result = new ArrayList(); + + if(isLoaded && (scope.equals(scopeString) || scope.equals("any")) && (action.equals(actionString) || action.equals("any"))) { + Pattern pattern = new Pattern(regex); + Matcher matcher = pattern.matcher(contentString); + while (matcher.find()) { + // 添加匹配数据至list + // 强制用户使用()包裹正则 + result.add(matcher.group(1)); + } + + // 去除重复内容 + HashSet tmpList = new HashSet(result); + result.clear(); + result.addAll(tmpList); + + if (!result.isEmpty()) { + jsonData.put("color", color); + jsonData.put("data", String.join("\n", result)); + jsonData.put("loaded", isLoaded); + // 初始化格式 + tabContent.put(name, jsonData); + } + } + + } + + + } catch (Exception e) {} + + return tabContent; + } +} diff --git a/burp/action/MatchHTTP.java b/burp/action/MatchHTTP.java new file mode 100644 index 0000000..2ac02bd --- /dev/null +++ b/burp/action/MatchHTTP.java @@ -0,0 +1,36 @@ +package burp.action; + +import java.util.Arrays; +import java.util.List; + +import burp.Config; +import jregex.Matcher; +import jregex.Pattern; +import jregex.REFlags; + +public class MatchHTTP { + // 匹配后缀 + public boolean matchSuffix(String str) { + Pattern pattern = new Pattern(String.format("[\\w]+[\\.](%s)", Config.excludeSuffix), REFlags.IGNORE_CASE); + Matcher matcher = pattern.matcher(str); + if(matcher.find()){ + return true; + }else{ + return false; + } + } + + // 匹配MIME + public boolean matchMIME(List mimeList) { + for (String headerString : mimeList) { + if (headerString.toLowerCase().startsWith("content-type")) { + for (String mime : Arrays.asList(Config.excludeMIME)) { + if (headerString.contains(mime)) { + return true; + } + } + } + } + return false; + } +} diff --git a/burp/color/GetColorKey.java b/burp/color/GetColorKey.java new file mode 100644 index 0000000..ad82b52 --- /dev/null +++ b/burp/color/GetColorKey.java @@ -0,0 +1,23 @@ +package burp.color; + +import java.util.ArrayList; +import java.util.List; + +public class GetColorKey { + /* + * 颜色下标获取 + */ + public List getColorKeys(List keys, String[] colorArray){ + List result = new ArrayList(); + int size = colorArray.length; + // 根据颜色获取下标 + for (int x = 0; x < keys.size(); x++) { + for (int v = 0; v < size; v++) { + if (colorArray[v].equals(keys.get(x))) { + result.add(v); + } + } + } + return result; + } +} diff --git a/burp/color/UpgradeColor.java b/burp/color/UpgradeColor.java new file mode 100644 index 0000000..52c2ff6 --- /dev/null +++ b/burp/color/UpgradeColor.java @@ -0,0 +1,53 @@ +package burp.color; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; + +public class UpgradeColor { + + private String endColor = ""; + /* + * 颜色升级递归算法 + */ + private String colorUpgrade(List colorList, String[] colorArray) { + int colorSize = colorList.size(); + colorList.sort(Comparator.comparingInt(Integer::intValue)); + int i = 0; + List stack = new ArrayList(); + while (i < colorSize) { + if (stack.isEmpty()) { + stack.add(colorList.get(i)); + i++; + } else { + if (colorList.get(i) != stack.stream().reduce((first, second) -> second).orElse(99999999)) { + stack.add(colorList.get(i)); + i++; + } else { + stack.set(stack.size() - 1, stack.get(stack.size() - 1) - 1); + i++; + } + } + + } + // 利用HashSet删除重复元素 + HashSet tmpList = new HashSet(stack); + if (stack.size() == tmpList.size()) { + stack.sort(Comparator.comparingInt(Integer::intValue)); + if(stack.get(0).equals(-1)) { + this.endColor = colorArray[0]; + } else { + this.endColor = colorArray[stack.get(0)]; + } + } else { + this.colorUpgrade(stack, colorArray); + } + return ""; + } + + public String getEndColor(List colorList, String[] colorArray) { + colorUpgrade(colorList, colorArray); + return endColor; + } +} diff --git a/burp/file/FileExists.java b/burp/file/FileExists.java new file mode 100644 index 0000000..8071937 --- /dev/null +++ b/burp/file/FileExists.java @@ -0,0 +1,18 @@ +package burp.file; + +import java.io.File; + +public class FileExists { + + /* + * 判断文件是否存在 + */ + public Boolean fileExists(String fileName) { + File file = new File(fileName); + if(file.exists()){ + return true; + } + return false; + } + +} diff --git a/burp/file/ReadFile.java b/burp/file/ReadFile.java new file mode 100644 index 0000000..a80eff3 --- /dev/null +++ b/burp/file/ReadFile.java @@ -0,0 +1,36 @@ +package burp.file; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +public class ReadFile { + /* + * 获取文件内容 + */ + public String readFileContent(String fileName) { + File file = new File(fileName); + BufferedReader reader = null; + StringBuffer sbf = new StringBuffer(); + try { + reader = new BufferedReader(new FileReader(file)); + String tempStr; + while ((tempStr = reader.readLine()) != null) { + sbf.append(tempStr); + } + reader.close(); + return sbf.toString(); + } catch (IOException e) { + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException err) { + err.printStackTrace(); + } + } + } + return sbf.toString(); + } +} diff --git a/burp/file/RemoveContent.java b/burp/file/RemoveContent.java new file mode 100644 index 0000000..ee7cb56 --- /dev/null +++ b/burp/file/RemoveContent.java @@ -0,0 +1,22 @@ +package burp.file; + +import javax.swing.JOptionPane; + +import org.json.JSONObject; + +public class RemoveContent { + WriteFile w = new WriteFile(); + ReadFile r = new ReadFile(); + /* + * 删除某文件内容 + */ + public void removeFileContent(String key, String configFilePath) { + String jsonStr = r.readFileContent(configFilePath); + JSONObject jsonObj = new JSONObject(jsonStr); + jsonObj.remove(key); + + if (w.writeFileContent(configFilePath, jsonObj.toString())) { + JOptionPane.showMessageDialog(null, "Delete Successfully!", "Info", JOptionPane.INFORMATION_MESSAGE); + } + } +} diff --git a/burp/file/WriteFile.java b/burp/file/WriteFile.java new file mode 100644 index 0000000..c781ad5 --- /dev/null +++ b/burp/file/WriteFile.java @@ -0,0 +1,21 @@ +package burp.file; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; + +public class WriteFile { + /* + * 写入文件内容 + */ + public boolean writeFileContent(String fileName, String fileContent) { + try { + BufferedWriter out = new BufferedWriter(new FileWriter(fileName)); + out.write(fileContent); + out.close(); + return true; + } catch (IOException e) { + return false; + } + } +} diff --git a/burp/ui/FillTable.java b/burp/ui/FillTable.java new file mode 100644 index 0000000..6891639 --- /dev/null +++ b/burp/ui/FillTable.java @@ -0,0 +1,44 @@ +package burp.ui; + +import java.util.Iterator; +import java.util.Vector; + +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +import org.json.JSONObject; + +import burp.file.ReadFile; + +public class FillTable { + ReadFile rf = new ReadFile(); + /* + * 初始化表格内容 + */ + public void fillTable(String configFilePath, JTable table) { + DefaultTableModel dtm=(DefaultTableModel) table.getModel(); + dtm.setRowCount(0); + String jsonStr = rf.readFileContent(configFilePath); + JSONObject jsonObj = new JSONObject(jsonStr); + Iterator k = jsonObj.keys(); + // 遍历json数组 + while (k.hasNext()) { + String name = k.next(); + JSONObject jsonObj1 = new JSONObject(jsonObj.get(name).toString()); + boolean loaded = jsonObj1.getBoolean("loaded"); + String regex = jsonObj1.getString("regex"); + String color = jsonObj1.getString("color"); + String scope = jsonObj1.getString("scope"); + String action = jsonObj1.getString("action"); + // 填充数据 + Vector rules = new Vector(); + rules.add(loaded); + rules.add(name); + rules.add(regex); + rules.add(color); + rules.add(scope); + rules.add(action); + dtm.addRow(rules); + } + } +}