{"id":2460,"date":"2024-06-19T12:08:07","date_gmt":"2024-06-19T10:08:07","guid":{"rendered":"https:\/\/security.humanativaspa.it\/?p=2460"},"modified":"2025-12-10T09:00:21","modified_gmt":"2025-12-10T09:00:21","slug":"extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5","status":"publish","type":"post","link":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/","title":{"rendered":"Extending Burp Suite for fun and profit &#8211; The Montoya way &#8211; Part 5"},"content":{"rendered":"<ol>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-1\">Setting up the environment + Hello World<\/a><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-2\">Inspecting and tampering HTTP requests and responses<\/a><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3\">Inspecting and tampering WebSocket messages<\/a><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-4\">Creating new tabs for processing HTTP requests and responses<\/a><\/li>\n<li><strong>-&gt; Adding new functionalities to the context menu (accessible by right-clicking)<\/strong><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-6\">Adding new checks to Burp Suite Active and Passive Scanner<\/a><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-7\/\">Using the Collaborator in Burp Suite plugins<\/a><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-8\/\">BChecks &#8211; A quick way to extend Burp Suite Active and Passive Scanner<\/a><\/li>\n<li><a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-9\/\">Custom scan checks &#8211; An improved quick way to extend Burp Suite Active and Passive Scanner<\/a><\/li>\n<li>&#8230; and much more!<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Hi there!<\/p>\n<p>Today we will see how to develop an extension that will <strong>add items to the context menu<\/strong> that opens with a right-click of the mouse. This type of plugin can be useful in many cases. One example is selecting part of a request or a response and using a plugin to perform some operation on it, such as encryption or decryption.<\/p>\n<p>For this tutorial, we will use the same demo application as the previous article (see <a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-4\">part 4<\/a> of this <a href=\"https:\/\/hnsecurity.it\/tag\/extending-burp-suite\/\">series<\/a>) but we will solve our scenario in a different way, using a different type of plugin. Let&#8217;s have a quick recap. We are analyzing a mobile application that adds an encryption layer to the HTTP request and response bodies. The mobile application encrypts the body using AES before sending the request and decrypts the response body in the same way, as it is encrypted by the backend application. A full description of the scenario that includes the source code of the backend can be found in <a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-4\">part 4<\/a>.<\/p>\n<p>Let&#8217;s start with the same encrypted request as the previous example:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-2397 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2023\/06\/3-2.png\" alt=\"\" width=\"1135\" height=\"297\" \/><\/p>\n<p>In the previous example, we created a plugin that added a tab to the HTTP requests and responses containing a decrypted version of the HTTP message body. Now, instead, we will create a plugin that will add some functionalities accessible from the context menu, which can be invoked as follows:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3346 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_1-1.png\" alt=\"\" width=\"1122\" height=\"535\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_1-1.png 1122w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_1-1-300x143.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_1-1-1024x488.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_1-1-768x366.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_1-1-350x167.png 350w\" sizes=\"(max-width: 1122px) 100vw, 1122px\" \/><\/p>\n<p>First, let&#8217;s think about what we want our plugin to do. We want to highlight encrypted content, right-click, and ask our extension to decrypt it. Once decrypted, we can analyze the clear-text value and maybe modify it, and then before sending our request, we will highlight the decrypted value and ask our extension to encrypt it again.<\/p>\n<p>So we will add two items to the context menu: <strong>&#8220;Encrypt&#8221; and &#8220;Decrypt&#8221;<\/strong>.<\/p>\n<p>We also need to consider an important aspect, which is that these functions can be invoked by the user on both editable HTTP messages (e.g., requests in the Repeater or request\/response intercepted by the Proxy) and non-editable messages (e.g., Proxy History or responses in the Repeater). In the first case, we can directly modify the highlighted content in-place; in the second case, the content is not modifiable. We will handle the latter case by creating a small popup with the result of our encryption\/decryption routine, allowing its use even on non-editable HTTP messages.<\/p>\n<p>As usual, we start from the Hello World plugin skeleton we wrote in the <a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-1\">part 1<\/a> of the <a href=\"https:\/\/hnsecurity.it\/tag\/extending-burp-suite\/\">series<\/a>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">package org.fd.montoyatutorial;\r\n\r\nimport burp.api.montoya.BurpExtension;\r\nimport burp.api.montoya.MontoyaApi;\r\nimport burp.api.montoya.logging.Logging;\r\n\r\npublic class ContextMenuExample implements BurpExtension {\r\n\r\n    MontoyaApi api;\r\n    Logging logging;\r\n\r\n    @Override\r\n    public void initialize(MontoyaApi api) {\r\n\r\n        \/\/ Save a reference to the MontoyaApi object\r\n        this.api = api;\r\n\r\n        \/\/ api.logging() returns an object that we can use to print messages to stdout and stderr\r\n        this.logging = api.logging();\r\n\r\n        \/\/ Set the name of the extension\r\n        api.extension().setName(\"Montoya API tutorial - ContextMenuExample\");\r\n\r\n        \/\/ Print a message to the stdout\r\n        this.logging.logToOutput(\"*** Montoya API tutorial - ContextMenuExample loaded ***\");\r\n\r\n        \/\/ TODO - Register our listeners\r\n\r\n    }\r\n}<\/pre>\n<p>The plugin we need is of type <strong>ContextMenuItem <\/strong>and\u00a0can be registered from the\u00a0<em><a href=\"https:\/\/portswigger.github.io\/burp-extensions-montoya-api\/javadoc\/burp\/api\/montoya\/ui\/UserInterface.html\">UserInterface<\/a><\/em>\u00a0object that we can get from the usual\u00a0<a href=\"https:\/\/portswigger.github.io\/burp-extensions-montoya-api\/javadoc\/burp\/api\/montoya\/MontoyaApi.html\"><em>MontoyaApi<\/em><\/a>\u00a0(the object supplied as argument to the\u00a0<em>initialize<\/em>\u00a0function of the plugin).<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3348 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_2-1.png\" alt=\"\" width=\"1252\" height=\"854\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_2-1.png 1252w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_2-1-300x205.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_2-1-1024x698.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_2-1-768x524.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_2-1-350x239.png 350w\" sizes=\"(max-width: 1252px) 100vw, 1252px\" \/><\/p>\n<p>To register our plugin we need to code an object that implements the interface <a href=\"https:\/\/portswigger.github.io\/burp-extensions-montoya-api\/javadoc\/burp\/api\/montoya\/ui\/contextmenu\/ContextMenuItemsProvider.html\"><em>ContextMenuItemsProvider<\/em><\/a> and that will contain our encryption and decryption routines. The interface <em>ContextMenuItemsProvider<\/em> is documented as follows:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3350 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_3-1.png\" alt=\"\" width=\"1247\" height=\"466\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_3-1.png 1247w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_3-1-300x112.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_3-1-1024x383.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_3-1-768x287.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_3-1-350x131.png 350w\" sizes=\"(max-width: 1247px) 100vw, 1247px\" \/><\/p>\n<p>As we can see from the documentation, the <em>ContextMenuItemsProvider<\/em> interface has three different methods, each of which populates the context menu at different times. The first is called when the right mouse button is clicked on an <strong>audit issue<\/strong>, the second on an <strong>HTTP message<\/strong>, and the third on a <strong>WebSocket message<\/strong>. The three methods are defined as <em>default<\/em>: this means that a default implementation for the three methods is already provided in the interface definition. The purpose of this default implementation is to allow the user to redefine only the method(s) they are interested in, while without a default implementation they would have to implement all of them in order to compile the plugin. In this example we will give an implementation only to the second one, the one related to HTTP messages.<\/p>\n<p>The skeleton of our object implementing the <em>ContextMenuItemsProvider<\/em> interface is the following one:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">public class CustomContextMenuItemProvider implements ContextMenuItemsProvider {\r\n\r\n    MontoyaApi api;\r\n    Logging logging;\r\n\r\n    public CustomContextMenuItemProvider(MontoyaApi api) {\r\n\r\n        \/\/ Save a reference to the MontoyaApi object\r\n        this.api = api;\r\n        \/\/ Save a reference to the logging object of the MontoyaApi\r\n        this.logging = api.logging();\r\n        \/\/ Save a reference to the Base64 utilities offere by the MontoyaApi\r\n        this.base64Utils = api.utilities().base64Utils();\r\n\r\n    }\r\n\r\n    @Override\r\n    public List&lt;Component&gt; provideMenuItems(ContextMenuEvent event) {\r\n        \r\n        \/\/ Initialize an empty list that will contains our context menu entries\r\n        List&lt;Component&gt; menuItems = new ArrayList&lt;Component&gt;();\r\n        \r\n        \/\/ Add our entries\r\n\r\n        return menuItems;\r\n\r\n    }\r\n\r\n}<\/pre>\n<p>First, let&#8217;s add a method that will handle encryption and decryption (we can define it as static since it does not require instance fields of the object):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">public static byte[] encryptDecrypt(int encryptionOrDecryption, byte[] data, Logging logging) {\r\n\r\n    try {\r\n\r\n        \/\/ Create a specific object containing the IV for encryption\r\n        byte[] iv = HexFormat.of().parseHex(ivHex);\r\n        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);\r\n\r\n        \/\/ Create a specific object containing the key for encryption\r\n        byte[] key = HexFormat.of().parseHex(keyHex);\r\n        SecretKey SecKey = new SecretKeySpec(key, 0, key.length, \"AES\");\r\n\r\n        \/\/ Initialize our AER cipher\r\n        Cipher aesCipher = Cipher.getInstance(\"AES\/CBC\/PKCS5Padding\");\r\n        aesCipher.init(encryptionOrDecryption, SecKey, ivParameterSpec);\r\n\r\n        \/\/ Encrypt or decrypt the input data\r\n        byte[] processedMessage = aesCipher.doFinal(data);\r\n\r\n        return processedMessage;\r\n\r\n    } catch (Exception e) {\r\n\r\n        logging.logToError(e.toString());\r\n        return null;\r\n\r\n    }\r\n\r\n}<\/pre>\n<p>Now let&#8217;s modify the <em>provideMenuItems<\/em> method, which is responsible for populating the context menu entries.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@Override\r\npublic List&lt;Component&gt; provideMenuItems(ContextMenuEvent event) {\r\n\r\n    \/\/ Initialize an empty list that will contains our context menu entries\r\n    List&lt;Component&gt; menuItems = new ArrayList&lt;Component&gt;();\r\n\r\n    \/\/ Create the menu only if the menu has been created on a request\/response object\r\n    event.messageEditorRequestResponse().ifPresent(messageEditorReqRes -&gt; {\r\n\r\n        \/\/ Create the menu only if the request\/response has a selected portion\r\n        messageEditorReqRes.selectionOffsets().ifPresent(selectionOffset -&gt; {\r\n\r\n            \/\/ Get the HTTP message\r\n            HttpRequestResponse reqRes = messageEditorReqRes.requestResponse();\r\n\r\n            \/\/ Necessary to understand if the context menu has been created on a request or on a response\r\n            MessageEditorHttpRequestResponse.SelectionContext selectionContext = messageEditorReqRes.selectionContext();\r\n\r\n            \/\/ Create the \"Decrypt\" entry of the context menu\r\n            JMenuItem decryptItem = new JMenuItem(\"Decrypt\");\r\n            decryptItem.addActionListener(al -&gt; {\r\n\r\n                \/\/ Logic of our plugin (decryption)\r\n\r\n            });\r\n\r\n            \/\/ Add the new items to the list we will return\r\n            menuItems.add(decryptItem);\r\n\r\n        });\r\n\r\n\r\n    });\r\n\r\n    return menuItems;\r\n\r\n}<\/pre>\n<p>The <em>provideMenuItems<\/em> method is provided with a <em>ContextMenuEvent<\/em> argument that contains the HTTP message, the necessary information to determine if any parts of the message are highlighted, and other contextual information.<\/p>\n<p>Lines 8 and 11 may be difficult to read for those unfamiliar with <strong>Java lambda expressions<\/strong>, but they simply extract the HTTP message and the selection, and proceed in the method only if both are present (we are interested in encrypting\/decrypting a part of the message, and fundamental requirements are that the user has clicked on an HTTP request or response and has selected a part of the content before clicking).<\/p>\n<p>Next, we save the actual HTTP message and a piece of information called <em>selectionContext<\/em>, which will essentially help us understand if we are in the context of an HTTP request or response. After this, we create our graphical menu entries using the Java <em>JMenuItem<\/em> object and add an action listener on that, that is a block of code that will be executed when our entry is clicked (again defined using Java lambda expressions, which, once learned, make the code much more readable but can be quite tedious for those unfamiliar with them \ud83d\ude42 ).<\/p>\n<p>After this, we just need to write the code that will be executed when our entry is clicked, which is the code implementing the logic of our extension (the code includes only the button that decrypts, but the final extension will also have a very similar one responsible for encrypting):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ Create the \"Decrypt\" entry of the context menu\r\nJMenuItem decryptItem = new JMenuItem(\"Decrypt\");\r\ndecryptItem.addActionListener(al -&gt; {\r\n\r\n    ByteArray requestResponseBytes;\r\n    \/\/ Request\r\n    if(selectionContext == MessageEditorHttpRequestResponse.SelectionContext.REQUEST) {\r\n        requestResponseBytes = reqRes.request().toByteArray();\r\n    \/\/ Response\r\n    } else {\r\n        requestResponseBytes = reqRes.response().toByteArray();\r\n    }\r\n\r\n    \/\/ Get the selected portion of the request\/response in ByteArray\r\n    ByteArray selectedBytes = requestResponseBytes.subArray(selectionOffset.startIndexInclusive(),\r\n            selectionOffset.endIndexExclusive());\r\n\r\n    \/\/ Base64 decode the selected portion\r\n    ByteArray decodedSelectedBytes = this.api.utilities().base64Utils().decode(selectedBytes);\r\n\r\n    \/\/ Decrypt the selected portion\r\n    byte[] decryptedMessage = encryptDecrypt(Cipher.DECRYPT_MODE,decodedSelectedBytes.getBytes(),logging);\r\n    String decryptedMessageString = new String(decryptedMessage);\r\n\r\n    \/\/ Create a new HTTP message that contains the decrypted value instead of the\r\n    \/\/ selected portion of the message\r\n    ByteArray editedRequestResponseBytes = requestResponseBytes.subArray(0,selectionOffset.startIndexInclusive());\r\n    editedRequestResponseBytes = editedRequestResponseBytes.withAppended(byteArray(decryptedMessage));\r\n    if(selectionOffset.endIndexExclusive()&lt;requestResponseBytes.length())\r\n        editedRequestResponseBytes = editedRequestResponseBytes.withAppended(requestResponseBytes.subArray(selectionOffset.endIndexExclusive(),requestResponseBytes.length()));\r\n    String editedRequestResponseString = editedRequestResponseBytes.toString();\r\n\r\n    \/\/ Try to replace the original HTTP message with the new one. This operation may fail if the\r\n    \/\/ request\/response is not editable (es. in the History of the Proxy)\r\n    try {\r\n\r\n        \/\/ Request\r\n        if(selectionContext == MessageEditorHttpRequestResponse.SelectionContext.REQUEST) {\r\n            messageEditorReqRes.setRequest(HttpRequest.httpRequest(editedRequestResponseBytes));\r\n        \/\/ Response\r\n        } else {\r\n            messageEditorReqRes.setResponse(HttpResponse.httpResponse(editedRequestResponseBytes));\r\n        }\r\n\r\n    } catch (UnsupportedOperationException ex) {\r\n\r\n        \/\/ If the request\/response is not editable, an UnsupportedOperationException arises and\r\n        \/\/ we print our edited message in a popup.\r\n        SwingUtilities.invokeLater(new Runnable() {\r\n\r\n            @Override\r\n            public void run() {\r\n\r\n                JTextArea ta = new JTextArea(20, 60);\r\n                ta.setLineWrap(true);\r\n                ta.setText(decryptedMessageString);\r\n                JOptionPane.showMessageDialog(null, new JScrollPane(ta), \"Edited message\", JOptionPane.INFORMATION_MESSAGE);\r\n\r\n            }\r\n\r\n        });\r\n\r\n    }\r\n\r\n});<\/pre>\n<p>In lines 5 to 16, we extract the bytes of the HTTP request or response and the portion selected by the user, that is the portion we will decrypt with our extension. Next, from lines 18 to 23, we decode from Base64 (remember that our content is encrypted and encoded in Base64) using utilities provided by the Burp Suite API, and then we decrypt it using the previously defined <em>encryptDecrypt<\/em> method.<\/p>\n<p>From lines 27 to 31, we build a new HTTP message that will contain the decrypted version of the content selected by the user instead of the encrypted one. To do this, we use the <a href=\"https:\/\/portswigger.github.io\/burp-extensions-montoya-api\/javadoc\/burp\/api\/montoya\/core\/ByteArray.html\"><em>ByteArray<\/em><\/a> class offered by the Burp Suite API, which provides numerous methods for operations on byte arrays, which are usually quite cumbersome in Java. With this class, we extract the portion of the original request before the start of the user-selected portion, add the decrypted value, and then add the portion of the original request that follows the selection.<\/p>\n<p>From lines 35 to 45, we replace the request or response in the Burp object with our newly created version of the request\/response. We need the try\/catch block because this operation can fail if the user is working on a non-modifiable HTTP message (for example, one from the Proxy History or from a response in the Repeater). In this case, we cannot modify the original HTTP message, so instead, we create a popup with a Java object (<em>JTextArea<\/em>)\u00a0that contains the result of our decryption operation (lines 49-61).<\/p>\n<p>Before compiling our plugin we need to register our class as a &#8220;context menu item provider&#8221; in the <em>initialize<\/em> method of our extension, in order to have it called once the user click with the right button on Burp Suite:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@Override\r\npublic void initialize(MontoyaApi api) {\r\n\r\n    \/\/ Save a reference to the MontoyaApi object\r\n    this.api = api;\r\n\r\n    \/\/ api.logging() returns an object that we can use to print messages to stdout and stderr\r\n    this.logging = api.logging();\r\n\r\n    \/\/ Set the name of the extension\r\n    api.extension().setName(\"Montoya API tutorial - ContextMenuExample\");\r\n\r\n    \/\/ Print a message to the stdout\r\n    this.logging.logToOutput(\"*** Montoya API tutorial - ContextMenuExample loaded ***\");\r\n\r\n    \/\/ Register our Context Menu Item Provider\r\n    CustomContextMenuItemProvider customContextMenuItemProvider = new CustomContextMenuItemProvider(api);\r\n    api.userInterface().registerContextMenuItemsProvider(customContextMenuItemProvider);\r\n\r\n}<\/pre>\n<p>After compiling our plugin (for detailed instructions, see <a href=\"https:\/\/hnsecurity.it\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-1\">part 1<\/a>) and loading it into Burp Suite, we have our entry in the context menu that performs decryption of the content selected by the user:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3360 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_4-1.png\" alt=\"\" width=\"1121\" height=\"673\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_4-1.png 1121w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_4-1-300x180.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_4-1-1024x615.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_4-1-768x461.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_4-1-350x210.png 350w\" sizes=\"(max-width: 1121px) 100vw, 1121px\" \/><\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3362 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_5-1.png\" alt=\"\" width=\"1122\" height=\"671\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_5-1.png 1122w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_5-1-300x179.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_5-1-1024x612.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_5-1-768x459.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_5-1-350x209.png 350w\" sizes=\"(max-width: 1122px) 100vw, 1122px\" \/><\/p>\n<p>We can do the same to decrypt the content of the response as well. However, since the response in the Repeater tool is non-editable, if everything works correctly, we should see the decrypted content in a popup.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3361 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_6-1.png\" alt=\"\" width=\"1119\" height=\"672\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_6-1.png 1119w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_6-1-300x180.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_6-1-1024x615.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_6-1-768x461.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_6-1-350x210.png 350w\" sizes=\"(max-width: 1119px) 100vw, 1119px\" \/><\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3363 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_7-1.png\" alt=\"\" width=\"1121\" height=\"670\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_7-1.png 1121w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_7-1-300x179.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_7-1-1024x612.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_7-1-768x459.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_7-1-350x209.png 350w\" sizes=\"(max-width: 1121px) 100vw, 1121px\" \/><\/p>\n<p>We can now add a new entry to the context menu that will handle the encryption operation. The code will be completely analogous, but it will call the <em>encryptDecrypt<\/em> method in encryption mode instead of decryption. The code is the following (step-by-step explanation will be omitted as the method is almost identical to the previous one):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">JMenuItem encryptItem = new JMenuItem(\"Encrypt\");\r\nencryptItem.addActionListener(al -&gt; {\r\n\r\n    ByteArray requestResponseBytes;\r\n    \/\/ Request\r\n    if(selectionContext == MessageEditorHttpRequestResponse.SelectionContext.REQUEST) {\r\n        requestResponseBytes = reqRes.request().toByteArray();\r\n        \/\/ Response\r\n    } else {\r\n        requestResponseBytes = reqRes.response().toByteArray();\r\n    }\r\n\r\n    \/\/ Get the selected portion of the request\/response in ByteArray\r\n    ByteArray selectedBytes = requestResponseBytes.subArray(selectionOffset.startIndexInclusive(),\r\n            selectionOffset.endIndexExclusive());\r\n\r\n    \/\/ Encrypt the selected portion\r\n    byte[] encryptedMessage = encryptDecrypt(Cipher.ENCRYPT_MODE,selectedBytes.getBytes(),logging);\r\n\r\n    \/\/ Encode the encrypted value in Base64\r\n    ByteArray encodedMessage = this.api.utilities().base64Utils().encode(ByteArray.byteArray(encryptedMessage));\r\n    String encodedMessageString =  encodedMessage.toString();\r\n\r\n    \/\/ Create a new HTTP message that contains the encrypted value instead of the\r\n    \/\/ selected portion of the message\r\n    ByteArray editedRequestResponseBytes = requestResponseBytes.subArray(0,selectionOffset.startIndexInclusive());\r\n    editedRequestResponseBytes = editedRequestResponseBytes.withAppended(encodedMessage);\r\n    if(selectionOffset.endIndexExclusive()&lt;requestResponseBytes.length())\r\n        editedRequestResponseBytes = editedRequestResponseBytes.withAppended(requestResponseBytes.subArray(selectionOffset.endIndexExclusive(),requestResponseBytes.length()));\r\n\r\n    \/\/ Try to replace the original HTTP message with the new one. This operation may fail if the\r\n    \/\/ request\/response is not editable (es. in the History of the Proxy)\r\n    try {\r\n\r\n        \/\/ Request\r\n        if (selectionContext == MessageEditorHttpRequestResponse.SelectionContext.REQUEST) {\r\n            messageEditorReqRes.setRequest(HttpRequest.httpRequest(editedRequestResponseBytes));\r\n            \/\/ Response\r\n        } else {\r\n            messageEditorReqRes.setResponse(HttpResponse.httpResponse(editedRequestResponseBytes));\r\n        }\r\n\r\n    } catch (UnsupportedOperationException ex) {\r\n\r\n        \/\/ If the request\/response is not editable, an UnsupportedOperationException arises and\r\n        \/\/ we print our edited message in a popup.\r\n        SwingUtilities.invokeLater(new Runnable()  {\r\n\r\n            @Override\r\n            public void run()  {\r\n\r\n                JTextArea ta = new JTextArea(20, 60);\r\n                ta.setLineWrap(true);\r\n                ta.setText(encodedMessageString);\r\n                JOptionPane.showMessageDialog(null, new JScrollPane(ta), \"Edited message\", JOptionPane.INFORMATION_MESSAGE);\r\n\r\n            }\r\n\r\n        });\r\n\r\n    }\r\n\r\n});\r\n\r\n\/\/ Add the new items to the list we will return\r\nmenuItems.add(encryptItem);<\/pre>\n<p>After a quick recompilation, we can also try the encryption operation. Let&#8217;s decrypt the content of the request as we did before, modify it, and try to encrypt it again with our new context menu entry.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3366 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_8-1.png\" alt=\"\" width=\"1120\" height=\"671\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_8-1.png 1120w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_8-1-300x180.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_8-1-1024x613.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_8-1-768x460.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_8-1-350x210.png 350w\" sizes=\"(max-width: 1120px) 100vw, 1120px\" \/><\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3367 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_9-1.png\" alt=\"\" width=\"1120\" height=\"669\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_9-1.png 1120w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_9-1-300x179.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_9-1-1024x612.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_9-1-768x459.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_9-1-350x209.png 350w\" sizes=\"(max-width: 1120px) 100vw, 1120px\" \/><\/p>\n<p>We can then verify that the operation was successful by decrypting the content of the response with our &#8220;Decrypt&#8221; menu entry, as done previously:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-3368 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_10-1.png\" alt=\"\" width=\"1115\" height=\"675\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_10-1.png 1115w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_10-1-300x182.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_10-1-1024x620.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_10-1-768x465.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2024\/06\/part5_10-1-350x212.png 350w\" sizes=\"(max-width: 1115px) 100vw, 1115px\" \/><\/p>\n<p>And that&#8217;s all for today. In the next part, we will see how to <strong>extend the Burp Scanner<\/strong> to integrate our checks into both active and passive scanner.<\/p>\n<p>As always, the complete code of the backend and of the plugins can be downloaded from <a href=\"https:\/\/github.com\/federicodotta\/Burp-Suite-Extender-Montoya-Course\">my GitHub repository.<\/a><\/p>\n<p>Cheers!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Setting up the environment + Hello World Inspecting and tampering HTTP requests and responses Inspecting and tampering WebSocket messages Creating [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":159897,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[88,91],"tags":[189,104,115,185,186,187,188],"class_list":["post-2460","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tools","category-articles","tag-tutorial","tag-burp-suite","tag-web","tag-extender","tag-extender-course","tag-extending-burp-suite","tag-montoya-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HN Security Extending Burp Suite for fun and profit - The Montoya way - Part 5<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HN Security Extending Burp Suite for fun and profit - The Montoya way - Part 5\" \/>\n<meta property=\"og:description\" content=\"Setting up the environment + Hello World Inspecting and tampering HTTP requests and responses Inspecting and tampering WebSocket messages Creating [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\" \/>\n<meta property=\"og:site_name\" content=\"HN Security\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-19T10:08:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-10T09:00:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"836\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Federico Dotta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hnsec\" \/>\n<meta name=\"twitter:site\" content=\"@hnsec\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Federico Dotta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\"},\"author\":{\"name\":\"Federico Dotta\",\"@id\":\"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/e0e6046bd2bc829f7d945ad361bce702\"},\"headline\":\"Extending Burp Suite for fun and profit &#8211; The Montoya way &#8211; Part 5\",\"datePublished\":\"2024-06-19T10:08:07+00:00\",\"dateModified\":\"2025-12-10T09:00:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\"},\"wordCount\":1545,\"publisher\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg\",\"keywords\":[\"Tutorial\",\"Burp Suite\",\"web\",\"Extender\",\"Extender course\",\"Extending Burp Suite\",\"Montoya API\"],\"articleSection\":[\"Tools\",\"Articles\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\",\"url\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\",\"name\":\"HN Security Extending Burp Suite for fun and profit - The Montoya way - Part 5\",\"isPartOf\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg\",\"datePublished\":\"2024-06-19T10:08:07+00:00\",\"dateModified\":\"2025-12-10T09:00:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage\",\"url\":\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg\",\"contentUrl\":\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg\",\"width\":1600,\"height\":836},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/hnsecurity.it\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Extending Burp Suite for fun and profit &#8211; The Montoya way &#8211; Part 5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/hnsecurity.it\/it\/#website\",\"url\":\"https:\/\/hnsecurity.it\/it\/\",\"name\":\"HN Security\",\"description\":\"Offensive Security Specialists\",\"publisher\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/hnsecurity.it\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/hnsecurity.it\/it\/#organization\",\"name\":\"HN Security\",\"url\":\"https:\/\/hnsecurity.it\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/hnsecurity.it\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2026\/01\/hn-libellula.jpg\",\"contentUrl\":\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2026\/01\/hn-libellula.jpg\",\"width\":696,\"height\":696,\"caption\":\"HN Security\"},\"image\":{\"@id\":\"https:\/\/hnsecurity.it\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/hnsec\",\"https:\/\/www.linkedin.com\/company\/hnsecurity\/\",\"https:\/\/github.com\/hnsecurity\",\"https:\/\/infosec.exchange\/@hnsec\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/e0e6046bd2bc829f7d945ad361bce702\",\"name\":\"Federico Dotta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g\",\"caption\":\"Federico Dotta\"},\"url\":\"https:\/\/hnsecurity.it\/it\/blog\/author\/federico-dotta\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HN Security Extending Burp Suite for fun and profit - The Montoya way - Part 5","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/","og_locale":"it_IT","og_type":"article","og_title":"HN Security Extending Burp Suite for fun and profit - The Montoya way - Part 5","og_description":"Setting up the environment + Hello World Inspecting and tampering HTTP requests and responses Inspecting and tampering WebSocket messages Creating [&hellip;]","og_url":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/","og_site_name":"HN Security","article_published_time":"2024-06-19T10:08:07+00:00","article_modified_time":"2025-12-10T09:00:21+00:00","og_image":[{"width":1600,"height":836,"url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg","type":"image\/jpeg"}],"author":"Federico Dotta","twitter_card":"summary_large_image","twitter_creator":"@hnsec","twitter_site":"@hnsec","twitter_misc":{"Scritto da":"Federico Dotta","Tempo di lettura stimato":"10 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#article","isPartOf":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/"},"author":{"name":"Federico Dotta","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/e0e6046bd2bc829f7d945ad361bce702"},"headline":"Extending Burp Suite for fun and profit &#8211; The Montoya way &#8211; Part 5","datePublished":"2024-06-19T10:08:07+00:00","dateModified":"2025-12-10T09:00:21+00:00","mainEntityOfPage":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/"},"wordCount":1545,"publisher":{"@id":"https:\/\/hnsecurity.it\/it\/#organization"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage"},"thumbnailUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg","keywords":["Tutorial","Burp Suite","web","Extender","Extender course","Extending Burp Suite","Montoya API"],"articleSection":["Tools","Articles"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/","url":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/","name":"HN Security Extending Burp Suite for fun and profit - The Montoya way - Part 5","isPartOf":{"@id":"https:\/\/hnsecurity.it\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage"},"thumbnailUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg","datePublished":"2024-06-19T10:08:07+00:00","dateModified":"2025-12-10T09:00:21+00:00","breadcrumb":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#primaryimage","url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg","contentUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg","width":1600,"height":836},{"@type":"BreadcrumbList","@id":"https:\/\/hnsecurity.it\/it\/blog\/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hnsecurity.it\/it\/"},{"@type":"ListItem","position":2,"name":"Extending Burp Suite for fun and profit &#8211; The Montoya way &#8211; Part 5"}]},{"@type":"WebSite","@id":"https:\/\/hnsecurity.it\/it\/#website","url":"https:\/\/hnsecurity.it\/it\/","name":"HN Security","description":"Offensive Security Specialists","publisher":{"@id":"https:\/\/hnsecurity.it\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hnsecurity.it\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/hnsecurity.it\/it\/#organization","name":"HN Security","url":"https:\/\/hnsecurity.it\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/logo\/image\/","url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2026\/01\/hn-libellula.jpg","contentUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2026\/01\/hn-libellula.jpg","width":696,"height":696,"caption":"HN Security"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/hnsec","https:\/\/www.linkedin.com\/company\/hnsecurity\/","https:\/\/github.com\/hnsecurity","https:\/\/infosec.exchange\/@hnsec"]},{"@type":"Person","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/e0e6046bd2bc829f7d945ad361bce702","name":"Federico Dotta","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g","caption":"Federico Dotta"},"url":"https:\/\/hnsecurity.it\/it\/blog\/author\/federico-dotta\/"}]}},"jetpack_featured_media_url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/BURP.jpg","_links":{"self":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/2460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/comments?post=2460"}],"version-history":[{"count":2,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/2460\/revisions"}],"predecessor-version":[{"id":161264,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/2460\/revisions\/161264"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/media\/159897"}],"wp:attachment":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/media?parent=2460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/categories?post=2460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/tags?post=2460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}