给HaE和BurpDomain的升级

​ 原来打算记录将HaE升级到2.2的过程单独写一篇文章的,一边改一边记录,结果发现太水了,刚好跟b哥打算给BurpDomainbscan做个缝合,一直挺想学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();
}

/**
* 使用setMessage用来做Extractor
*/
@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();
/**
* 是否显示,HaE的规则中,判断了当流量包有用户设置好的规则时,才会显示这个选项供用户使用
*/
boolean isEnabled(byte[] content, boolean isRequest);
/**
* 此处是传入数据,取流量包的数据传入,当需要返回自己设定的控件时,需要用此项返回去处理。
*/
void setMessage(byte[] content, boolean isRequest);
/**
* 取得流量包的数据
*/
byte[] getMessage();
//以下两个并不在HaE的使用范围里,所以我一个传了false,一个传了null
/**
* 这个是用来判断上一次调用的控件的内容与本次调用的控件的内容是否一样,猜测是为了提升效率,当内容一样时就不会再去重新去获取流量包等等,省去了中间的过程从内存里读取上一次的结果。
*/
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变量

1
private JTable jTable = new JTable();

接着在MarkInfoTab类的方法getUiComponent中,原先这个方法就是用来返回JTabbedPane的,那么我在返回之前,先给这个JTabbedPane添加了选中控件改变事件监听

1
2
3
4
5
6
7
8
9
10
@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也可以返回想要的数据

1
2
3
4
5
6
7
8
9
@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一部分代码重构一下,重构完再继续写这篇文章,博客还有其他文章要更新。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!