From 53ca25b1dce9cb8e9e5e9937c465d55f647b474a Mon Sep 17 00:00:00 2001 From: Samuel Pua Date: Sat, 27 Apr 2019 00:13:05 +0800 Subject: [PATCH] Release --- Build/burp/BurpExtender$1.class | Bin 0 -> 702 bytes Build/burp/BurpExtender$BodyType.class | Bin 0 -> 939 bytes Build/burp/BurpExtender.class | Bin 0 -> 7778 bytes BurpExtender.java | 179 +++++++++++++++++++++++++ README.md | 23 +++- build.sh | 3 + copy-as-go-http.jar | Bin 0 -> 5726 bytes 7 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 Build/burp/BurpExtender$1.class create mode 100644 Build/burp/BurpExtender$BodyType.class create mode 100644 Build/burp/BurpExtender.class create mode 100644 BurpExtender.java create mode 100644 build.sh create mode 100644 copy-as-go-http.jar diff --git a/Build/burp/BurpExtender$1.class b/Build/burp/BurpExtender$1.class new file mode 100644 index 0000000000000000000000000000000000000000..5e8c1f7b55e8dc4ec1624afe5f0504ebf0b5f5e4 GIT binary patch literal 702 zcmaJ<+iuf95IyT8b!%LjQtq@As3lSt>VS9)LV_rWNGU}H@xs%_nWkGg>)>67{uWXz z5D$C+ABC88D^ZCGOP(3;%p9LNv%h}-_zB<{q6IW?!O(5#UmY zc`Sqo@gT$o7J1%EmGdys6Be(pH5J`V8so%kR-7`a$I0&SkWwqKb|KAyGOQUD%gOYznTMEvLkUi=NUuYAPh*g6;>X4}N_ wSyPLfDwz0~dye6KNBwU{P~{%;&$b!*3U_;0!BzHkzK_?j%2B{b4fg!}0i$83hyVZp literal 0 HcmV?d00001 diff --git a/Build/burp/BurpExtender$BodyType.class b/Build/burp/BurpExtender$BodyType.class new file mode 100644 index 0000000000000000000000000000000000000000..7764c8c2118f0e33da34e6d7ba3c582c3aba62c3 GIT binary patch literal 939 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 b(dySJfNnAP{3xgoKv?fW9|kY;(c||625{|U literal 0 HcmV?d00001 diff --git a/BurpExtender.java b/BurpExtender.java new file mode 100644 index 0000000..1fc4d3d --- /dev/null +++ b/BurpExtender.java @@ -0,0 +1,179 @@ +package burp; + +import java.util.*; +import java.awt.datatransfer.*; +import java.awt.event.*; +import java.awt.Toolkit; +import java.io.UnsupportedEncodingException; +import javax.swing.JMenuItem; + +public class BurpExtender implements IBurpExtender, IContextMenuFactory, ClipboardOwner +{ + private IExtensionHelpers helpers; + + private final static String NAME = "Copy as Go HTTP"; + private final static String[] GO_ESCAPE = new String[256]; + private int currentID = 0; + private int currentTotal = 0; + + static { + for (int i = 0x00; i <= 0xFF; i++) GO_ESCAPE[i] = String.format("\\x%02x", i); + for (int i = 0x20; i < 0x80; i++) GO_ESCAPE[i] = String.valueOf((char)i); + GO_ESCAPE['\n'] = "\\n"; + GO_ESCAPE['\r'] = "\\r"; + GO_ESCAPE['\t'] = "\\t"; + GO_ESCAPE['"'] = "\\\""; + GO_ESCAPE['\\'] = "\\\\"; + } + + @Override + public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) + { + helpers = callbacks.getHelpers(); + callbacks.setExtensionName(NAME); + callbacks.registerContextMenuFactory(this); + } + + @Override + public List createMenuItems(IContextMenuInvocation invocation) { + final IHttpRequestResponse[] messages = invocation.getSelectedMessages(); + if (messages == null || messages.length == 0) return null; + JMenuItem i = new JMenuItem(NAME); + i.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + copyMessages(messages); + } + }); + return Collections.singletonList(i); + } + + private void copyMessages(IHttpRequestResponse[] messages) { + StringBuilder goSrc = new StringBuilder(""); + buildBoilerCodeStart(goSrc); + + this.currentID = 0; + this.currentTotal = messages.length; + + for (IHttpRequestResponse message : messages) { + this.currentID += 1; + IRequestInfo ri = helpers.analyzeRequest(message); + byte[] req = message.getRequest(); + + goSrc.append(String.format(" method"+ this.currentID +" := \"%s\"\n", escapeGoString(ri.getMethod()))); + goSrc.append(String.format(" url"+ this.currentID +" := \"%s\"\n", escapeGoString(ri.getUrl().toString()))); + goSrc.append("\n"); + goSrc.append(" // making body\n"); + processBody(goSrc, req, ri.getBodyOffset()); + buildBoilerCodeRequest(goSrc); + processHeaders(goSrc, ri.getHeaders()); + buildBoilerCodeSend(goSrc); + } + goSrc.append(" return res\n"); + goSrc.append("}\n"); + + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(goSrc.toString()), this); + } + + public String escapeGoString(String src) { + StringBuilder buildStr = new StringBuilder(""); + for (int i=0;i headers) { + boolean firstHeader = true; + for (String header : headers) { + int colonPos = header.indexOf(':'); + if (colonPos == -1) continue; + if (header.substring(0,colonPos).toLowerCase().equals("cookie")) { + goSrc.append(" newRequest"+ this.currentID +".Header.Add(\""); + goSrc.append(header, 0, colonPos); + goSrc.append("\",\""); + goSrc.append(header, colonPos + 2, header.length()); + goSrc.append("\")\n"); + goSrc.append(" urlStruct"+ this.currentID +", _ := url.Parse(url"+ this.currentID +")\n"); + goSrc.append(" urlStruct"+ this.currentID +".Path = \"/\"\n"); + goSrc.append(" client.Jar.SetCookies(urlStruct"+ this.currentID +", newRequest"+ this.currentID +".Cookies())\n"); + goSrc.append(" newRequest"+ this.currentID +".Header.Del(\""+header.substring(0,colonPos)+"\")\n"); + } else { + goSrc.append(" newRequest"+ this.currentID +".Header.Add(\""); + goSrc.append(header, 0, colonPos); + goSrc.append("\",\""); + goSrc.append(header, colonPos + 2, header.length()); + goSrc.append("\")\n"); + } + } + } + + private void processBody(StringBuilder goSrc, byte[] fullRequest, int start) { + byte[] bodyBytes = Arrays.copyOfRange(fullRequest, start, fullRequest.length); + String str = new String(bodyBytes); + String bodyStr = String.format(" body"+ this.currentID +" := strings.NewReader(\"%s\")\n", escapeGoString(str)); + goSrc.append(bodyStr); + } + + + @Override + public void lostOwnership(Clipboard aClipboard, Transferable aContents) {} +} diff --git a/README.md b/README.md index cd927be..9aab422 100644 --- a/README.md +++ b/README.md @@ -1 +1,22 @@ -# copy-as-go-http \ No newline at end of file +# Burp Extension - copy-as-go-http + +It's a Burp extensions that generates Go code that would trigger the active request(s) on Burp. + +## Getting Started + +Run build.sh to build the Java plugin. + +To install it on Burp, use the 'extender' option on Burp + +## Versioning + +2019-04-27 1.0 Release + +## Authors + +* **Samuel Pua** - *Initial work* - [telboon](https://github.com/telboon) + +## License + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details + diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..9fb2770 --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#! /bin/bash +javac -target 1.8 -source 1.8 -cp ~/BurpSuitePro/burpsuite_pro.jar BurpExtender.java -d Build +jar -cvf copy-as-go-http.jar -C Build/ . diff --git a/copy-as-go-http.jar b/copy-as-go-http.jar new file mode 100644 index 0000000000000000000000000000000000000000..1beadef2c89e033ede60af9725515f3d03201d62 GIT binary patch literal 5726 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 literal 0 HcmV?d00001