原来打算记录将HaE升级到2.2的过程单独写一篇文章的,一边改一边记录,结果发现太水了,刚好跟b哥打算给BurpDomain和bscan做个缝合,一直挺想学go的,bscan是用go写的,可以顺带学一下go。顺手把这些过程一起记录一下。
很多经验对于我的朋友们来说可能都挺简单的,但是我觉得记录下来总比没有记录下来好。这也是开博客的原因。
HaE:让规则匹配功能更加强大
这部分可能有点水,但是如果有想法开发burp插件的朋友可能看了会有用,在4月21号我更新了一个可能有点意思的技巧。可以看看。
0x00 更新方向
小key这俩天叫我把HaE完善一个新的功能,即将Proxy->HTTP history中的Markinfo的控件返回成JTabbedPannel嵌套JTable的形式,不知道有没有其他师傅研究一下,也没有去检索,于是自己上手来搞一下。
原先HaE返回MarkInfo的代码是这样的:
路径在https://github.com/gh0stkey/HaE/blob/master/src/main/java/burp/BurpExtender.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| class MarkInfoTab implements IMessageEditorTab { private final ITextEditor markInfoText; private byte[] currentMessage; private final IMessageEditorController controller; private byte[] extractRequestContent; private byte[] extractResponseContent;
public MarkInfoTab(IMessageEditorController controller, boolean editable) { this.controller = controller; this.markInfoText = callbacks.createTextEditor(); this.markInfoText.setEditable(editable); }
@Override public String getTabCaption() { return "MarkInfo"; }
@Override public Component getUiComponent() { return this.markInfoText.getComponent(); }
@Override public boolean isEnabled(byte[] content, boolean isRequest) { String c = new String(content, StandardCharsets.UTF_8).intern(); List<String> result = pm.processMessageByContent(helpers, content, isRequest, false); if (result != null && !result.isEmpty()) { if (isRequest) { this.extractRequestContent = result.get(0).getBytes(); } else { this.extractResponseContent = result.get(0).getBytes(); } return true; } return false; }
@Override public byte[] getMessage() { return this.currentMessage; }
@Override public boolean isModified() { return this.markInfoText.isTextModified(); }
@Override public byte[] getSelectedData() { return this.markInfoText.getSelectedText(); }
@Override public void setMessage(byte[] content, boolean isRequest) { String c = new String(content, StandardCharsets.UTF_8).intern(); if (content.length > 0) { if (isRequest) { this.markInfoText.setText(this.extractRequestContent); } else { this.markInfoText.setText(this.extractResponseContent); } } this.currentMessage = content; } }
@Override public IMessageEditorTab createNewInstance(IMessageEditorController controller, boolean editable) { return new MarkInfoTab(controller, editable); } }
|
根据burp官方的要求,来看一下继承接口IMessageEditorTab需要重写的方法,我把原先英文的注释都删除了,简化成自己的理解,也不一定对,大家将就看一下。
0x01 将IMessageEditorTab返回自定义UI控件
下面是burp IMessageEditorTab接口类的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public interface IMessageEditorTab {
String getTabCaption();
Component getUiComponent();
boolean isEnabled(byte[] content, boolean isRequest);
void setMessage(byte[] content, boolean isRequest);
byte[] getMessage();
boolean isModified();
byte[] getSelectedData(); }
|
原先key用的是burp重写的textarea,ITextEditor这个控件。一开始我拿到源码的时候还在考虑有没有可能不支持原生控件,需要彻底重写呢。想了半天不如自己动手试一下,在尝试了返回一个JTable之后,我就打算放弃写这篇文章了,感觉会很水,因为发现返回的JTable完美地解决问题,没有后续研究的必要了。
不过我把我的思考全写在上面代码的注释了,感兴趣的朋友可以看看。
0x02 同类型多个控件统一管理方法
这是4月21号的更新,key跟我说HaE没有办法复制Markinfo里的内容,检查了一下发现是getSelectData()的问题。在第一版我将getSelectData返回了一个null。后面key重新看了官方文档之类的,发现Burp自带了检测复制快捷键的监听,所以当按下快捷键时,会调用这个方法去获取选中的数据,复制到剪贴板里。
如果只是一个JTable还好,那么多个JTable呢,我的更新方法写在上面,大概就是建一个JTabedPane,然后匹配到规则就新建一个JTable,那么就需要我接下来写的同类型多个控件统一管理方法。
我想到了几年前我开发CTFCrackTools时,一个老哥给我的tip,在多个同类型控件情况下,通过单个变量就可以管理这些控件。
我们需要实现什么功能呢,因为HaE的新版本,会把所有匹配出来的规则单独生成一个JTable,这样使每个规则匹配出来的数据都清晰地单独地显示出来。
我在HaE中的解决办法是这样的:
首先在MarkInfoTab类声明一个jTbale变量
| private JTable jTable = new JTable();
|
接着在MarkInfoTab类的方法getUiComponent中,原先这个方法就是用来返回JTabbedPane的,那么我在返回之前,先给这个JTabbedPane添加了选中控件改变事件监听
| @Override public Component getUiComponent() { jTabbedPane.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent arg0) { jTable = (JTable) ((JScrollPane)jTabbedPane.getSelectedComponent()).getViewport().getView(); } }); return this.jTabbedPane; }
|
修改成这样之后,当每一次JTabbedPane变更的时候,都会将当前选中的JTable赋值给jTable这个变量。
后续在getSelectData也可以返回想要的数据
| @Override public byte[] getSelectedData() { int[] selectRows = jTable.getSelectedRows(); StringBuilder selectData = new StringBuilder(); for (int row : selectRows) { selectData.append(jTable.getValueAt(row, 0).toString()).append("\n"); } return helpers.stringToBytes(selectData.toString()); }
|
0x03 HaE 2.2更新
HaE的这次2.2版本改动,优化了UI,可以让命中规则的信息以更加清晰的方式显示。
至于最新的代码,大家可以自行到github仓库里进行比对。
BurpDomain与Bscan的套娃升级
之前BurpDomain写出来后,b哥就对url这个功能一直不满意,就是下面这个地方。所以他想把这部分修改成为扫描器的扫描结果。那实现这两个工具的交互就是我的任务了。
之前可能很多用户对于我使用mysql作为数据库不是很理解,确实如果单独考虑到只是作为收集域名的角度看,那采用更加简便的sqlite是更高效的方式,但是我在开发的时候考虑到可能会有更多玩法,使用mysql的话,可以作为中间数据的载体
B哥代码太复杂了,我打算把Bscan一部分代码重构一下,重构完再继续写这篇文章,博客还有其他文章要更新。