Skip to content

Commit 595a5dd

Browse files
author
Will Strei
committed
Persistence is working. Needs clean up though
1 parent 1c92d84 commit 595a5dd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+839
-281
lines changed

.idea/misc.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/workspace.xml

Lines changed: 484 additions & 272 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Burp_Extractor.iml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<module type="JAVA_MODULE" version="4">
3-
<component name="NewModuleRootManager" inherit-compiler-output="true">
4-
<exclude-output />
2+
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
4+
<output url="file://$MODULE_DIR$/target/classes" />
5+
<output-test url="file://$MODULE_DIR$/target/test-classes" />
56
<content url="file://$MODULE_DIR$">
6-
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
8+
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
9+
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
10+
<excludeFolder url="file://$MODULE_DIR$/target" />
711
</content>
812
<orderEntry type="inheritedJdk" />
913
<orderEntry type="sourceFolder" forTests="false" />
@@ -34,5 +38,6 @@
3438
<SOURCES />
3539
</library>
3640
</orderEntry>
41+
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
3742
</component>
3843
</module>
7.48 KB
Binary file not shown.

pom.xml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>Burp_Extractor</groupId>
8+
<artifactId>Burp_Extractor</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
<build>
11+
<plugins>
12+
<plugin>
13+
<artifactId>maven-assembly-plugin</artifactId>
14+
<version>3.1.1</version>
15+
<configuration>
16+
<descriptorRefs>
17+
<descriptorRef>jar-with-dependencies</descriptorRef>
18+
</descriptorRefs>
19+
</configuration>
20+
<executions>
21+
<execution>
22+
<id>make-assembly</id> <!-- this is used for inheritance merges -->
23+
<phase>package</phase> <!-- bind to the packaging phase -->
24+
<goals>
25+
<goal>single</goal>
26+
</goals>
27+
</execution>
28+
</executions>
29+
</plugin>
30+
<plugin>
31+
<groupId>org.apache.maven.plugins</groupId>
32+
<artifactId>maven-compiler-plugin</artifactId>
33+
<version>3.1</version>
34+
<configuration>
35+
<source>1.8</source>
36+
<target>1.8</target>
37+
</configuration>
38+
</plugin>
39+
</plugins>
40+
</build>
41+
<dependencies>
42+
<dependency>
43+
<groupId>com.google.code.gson</groupId>
44+
<artifactId>gson</artifactId>
45+
<version>2.8.5</version>
46+
</dependency>
47+
</dependencies>
48+
49+
50+
</project>

src/burp/BurpExtender.java renamed to src/main/java/burp/BurpExtender.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
package burp;
22

3-
public class BurpExtender implements burp.IBurpExtender {
3+
import burp.persistence.Persistor;
4+
5+
public class BurpExtender implements IBurpExtender {
46

57
@Override
6-
public void registerExtenderCallbacks(burp.IBurpExtenderCallbacks callbacks) {
8+
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
79
callbacks.setExtensionName("Extractor");
810

911
// Create main extractor tab and an extractor, which actually does the work
1012
ExtractorMainTab extractorMainTab = new ExtractorMainTab(callbacks);
1113
Extractor extractor = new Extractor(extractorMainTab, callbacks);
1214

15+
// Initialize the Persistor
16+
Persistor.init(extractorMainTab, callbacks);
17+
18+
// Attempt to load a saved state
19+
Persistor.restoreExtractor();
20+
1321
// Register Extractor as an HTTP listener
1422
callbacks.registerHttpListener(extractor);
1523

src/burp/ButtonTabComponent.java renamed to src/main/java/burp/ButtonTabComponent.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public void actionPerformed(ActionEvent e) {
5252
extractorMainTab.removeTab(index);
5353
extractorMainTab.removeExtractor(tabNum);
5454
ExtractorMainTab.tabsRemoved++;
55-
5655
}
5756
}
5857
}

src/burp/Extractor.java renamed to src/main/java/burp/Extractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public Extractor(ExtractorMainTab extractorMainTab, IBurpExtenderCallbacks callb
1717
}
1818

1919
@Override
20-
public void processHttpMessage(int toolFlag, boolean messageIsRequest, burp.IHttpRequestResponse messageInfo) {
20+
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
2121
if (messageIsRequest) {
2222
logger.debug("Processing request...");
2323
byte[] requestBytes = messageInfo.getRequest();

src/burp/ExtractorEditor.java renamed to src/main/java/burp/ExtractorEditor.java

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package burp;
22

3+
import burp.persistence.InScopeTools;
4+
import burp.persistence.Persistor;
5+
import burp.persistence.RequestResponseState;
6+
37
import javax.swing.*;
48
import javax.swing.border.Border;
9+
import javax.swing.event.DocumentEvent;
10+
import javax.swing.event.DocumentListener;
511
import java.awt.*;
612
import java.awt.event.*;
713
import java.io.PrintWriter;
@@ -171,6 +177,12 @@ private void addTextFields(JPanel pane) {
171177

172178
// Add radio button for scope
173179
this.useScope = new JRadioButton("Use suite scope ");
180+
this.useScope.addItemListener(new ItemListener() {
181+
@Override
182+
public void itemStateChanged(ItemEvent e) {
183+
Persistor.persistExtractor();
184+
}
185+
});
174186
targetConstraints.gridx = 0;
175187
targetPanel.add(this.useScope, targetConstraints);
176188

@@ -187,13 +199,36 @@ private void addTextFields(JPanel pane) {
187199

188200
// Add text field for target host
189201
this.targetHost = new JTextField();
202+
this.targetHost.getDocument().addDocumentListener(new DocumentListener() {
203+
@Override
204+
public void insertUpdate(DocumentEvent e) {
205+
Persistor.persistExtractor();
206+
207+
}
208+
209+
@Override
210+
public void removeUpdate(DocumentEvent e) {
211+
Persistor.persistExtractor();
212+
}
213+
214+
@Override
215+
public void changedUpdate(DocumentEvent e) {
216+
Persistor.persistExtractor();
217+
}
218+
});
190219
targetConstraints.gridx += 1;
191220
targetConstraints.weightx = 1;
192221
targetConstraints.fill = GridBagConstraints.HORIZONTAL;
193222
targetPanel.add(this.targetHost, targetConstraints);
194223

195224
// Add regex checkBox
196225
this.regexCheckBox = new JCheckBox("Regex");
226+
this.regexCheckBox.addActionListener(new ActionListener() {
227+
@Override
228+
public void actionPerformed(ActionEvent e) {
229+
Persistor.persistExtractor();
230+
}
231+
});
197232
targetConstraints.gridx += 1;
198233
targetConstraints.weightx = 0;
199234
targetConstraints.fill = GridBagConstraints.NONE;
@@ -216,6 +251,22 @@ private void addTextFields(JPanel pane) {
216251

217252
// Add text field for startRegex
218253
this.startRegex = new JTextField();
254+
this.startRegex.getDocument().addDocumentListener(new DocumentListener() {
255+
@Override
256+
public void insertUpdate(DocumentEvent e) {
257+
Persistor.persistExtractor();
258+
}
259+
260+
@Override
261+
public void removeUpdate(DocumentEvent e) {
262+
Persistor.persistExtractor();
263+
}
264+
265+
@Override
266+
public void changedUpdate(DocumentEvent e) {
267+
Persistor.persistExtractor();
268+
}
269+
});
219270
constraints.gridx = 1;
220271
constraints.gridy = 2;
221272
constraints.fill = GridBagConstraints.HORIZONTAL;
@@ -233,6 +284,23 @@ private void addTextFields(JPanel pane) {
233284

234285
// Add text field for endRegex
235286
this.endRegex = new JTextField();
287+
this.endRegex.getDocument().addDocumentListener(new DocumentListener() {
288+
@Override
289+
public void insertUpdate(DocumentEvent e) {
290+
Persistor.persistExtractor();
291+
}
292+
293+
@Override
294+
public void removeUpdate(DocumentEvent e) {
295+
Persistor.persistExtractor();
296+
}
297+
298+
@Override
299+
public void changedUpdate(DocumentEvent e) {
300+
Persistor.persistExtractor();
301+
}
302+
});
303+
236304
constraints.gridx = 3;
237305
constraints.gridy = 2;
238306
constraints.fill = GridBagConstraints.HORIZONTAL;
@@ -244,7 +312,8 @@ private void addTextFields(JPanel pane) {
244312
private String[] buildSelectionRegex() {
245313

246314
// Only perform action if user has selected something
247-
if (textSelector.getSelectedText().length > 0) {
315+
byte[] selected = textSelector.getSelectedText();
316+
if (textSelector.getSelectedText() != null) {
248317
int[] bounds = textSelector.getSelectionBounds();
249318
byte[] message = textSelector.getText();
250319

@@ -355,6 +424,43 @@ public boolean useSuiteScope() {
355424
return this.useScope.isSelected();
356425
}
357426

427+
public String getEditorContent() {
428+
return this.helpers.bytesToString(this.textSelector.getText());
429+
}
430+
431+
public RequestResponseState getEditorState() {
432+
InScopeTools tools = new InScopeTools(this.allTools.isSelected(),
433+
this.isToolSelected(IBurpExtenderCallbacks.TOOL_PROXY),
434+
this.isToolSelected(IBurpExtenderCallbacks.TOOL_SCANNER),
435+
this.isToolSelected(IBurpExtenderCallbacks.TOOL_INTRUDER),
436+
this.isToolSelected(IBurpExtenderCallbacks.TOOL_REPEATER));
437+
String[] requestSelectionRegex = this.getSelectionRegex();
438+
RequestResponseState state = new RequestResponseState(tools,
439+
this.useSuiteScope(),
440+
this.getTargetHost(),
441+
this.useRegexForTarget(),
442+
requestSelectionRegex[0],
443+
requestSelectionRegex[1],
444+
this.getEditorContent());
445+
return state;
446+
}
447+
448+
public void setEditorState(RequestResponseState state) {
449+
this.allTools.setSelected(state.inScopeTools.allTools);
450+
this.toolSelectors.get(IBurpExtenderCallbacks.TOOL_PROXY).setSelected(state.inScopeTools.proxy);
451+
this.toolSelectors.get(IBurpExtenderCallbacks.TOOL_SCANNER).setSelected(state.inScopeTools.scanner);
452+
this.toolSelectors.get(IBurpExtenderCallbacks.TOOL_INTRUDER).setSelected(state.inScopeTools.intruder);
453+
this.toolSelectors.get(IBurpExtenderCallbacks.TOOL_REPEATER).setSelected(state.inScopeTools.repeater);
454+
this.useScope.setSelected(state.useSuiteScope);
455+
this.useCustomHost.setSelected(!state.useSuiteScope);
456+
this.targetHost.setText(state.targetHost);
457+
this.regexCheckBox.setSelected(state.useRegex);
458+
this.startRegex.setText(state.beforeRegex);
459+
this.endRegex.setText(state.afterRegex);
460+
this.textSelector.setText(state.content.getBytes());
461+
}
462+
463+
358464
// Create our own MenuItem so that we can prevent closing on every click
359465
public class ToolMenuItem extends JCheckBoxMenuItem {
360466

@@ -377,6 +483,8 @@ public void doClick() {
377483
allTools.setSelected(false);
378484
}
379485
}
486+
logger.info("Saving in-scope....");
487+
Persistor.persistExtractor();
380488
}
381489

382490
@Override

src/burp/ExtractorMainTab.java renamed to src/main/java/burp/ExtractorMainTab.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package burp;
22

3+
import burp.persistence.ExtractorTabState;
4+
import burp.persistence.Persistor;
5+
36
import javax.swing.*;
47
import java.awt.*;
58
import java.util.ArrayList;
@@ -33,11 +36,31 @@ public void addMessageFromMenu(IHttpRequestResponse message) {
3336
public ExtractorTab createExtractorTab(byte[] response, byte[] request, String responseHost, String requestHost, IBurpExtenderCallbacks callbacks) {
3437
this.tabNum++;
3538
int index = (this.tabNum) - this.tabsRemoved;
39+
// Pause Persistor so that we don't write values before the tab loads
40+
Persistor.pause();
3641
ExtractorTab extractorTab = new ExtractorTab(response, request, responseHost, requestHost, callbacks);
3742
this.tabbedPane.add(extractorTab.getUiComponent());
3843
this.tabbedPane.setTabComponentAt(index, new ButtonTabComponent(this, this.tabNum));
3944
this.tabbedPane.setSelectedIndex(index);
4045
this.extractorTabMap.put(this.tabNum, extractorTab);
46+
47+
// Now unpause, and write the addition
48+
Persistor.unpause();
49+
Persistor.persistExtractor();
50+
return extractorTab;
51+
}
52+
53+
public ExtractorTab createExtractorTab(ExtractorTabState tabState, IBurpExtenderCallbacks callbacks) {
54+
ExtractorTab extractorTab = this.createExtractorTab(tabState.responseState.content.getBytes(),
55+
tabState.requestState.content.getBytes(),
56+
tabState.requestState.targetHost,
57+
tabState.responseState.targetHost,
58+
callbacks);
59+
// Pause Persistor so that we don't have unnecessary writes for each change we make
60+
Persistor.pause();
61+
extractorTab.setState(tabState);
62+
Persistor.unpause();
63+
Persistor.persistExtractor();
4164
return extractorTab;
4265
}
4366

@@ -55,6 +78,7 @@ public void removeTab(int index) {
5578

5679
public void removeExtractor(int tabNum) {
5780
this.extractorTabMap.remove(tabNum);
81+
Persistor.persistExtractor();
5882
}
5983

6084
@Override

0 commit comments

Comments
 (0)