5
5
6
6
7
7
require 'msf/core'
8
- require 'rex'
9
- require 'net/https'
10
- require 'uri'
8
+ require 'rex/proto/http'
11
9
12
10
13
11
class MetasploitModule < Msf ::Auxiliary
14
12
15
- include Msf ::Exploit ::Remote ::HttpClient
16
13
include Msf ::Auxiliary ::Report
17
14
18
15
def initialize ( info = { } )
@@ -45,6 +42,17 @@ def initialize(info={})
45
42
] , self . class )
46
43
end
47
44
45
+ # Check to see if api.zoomeye.org resolves properly
46
+ def zoomeye_resolvable?
47
+ begin
48
+ Rex ::Socket . resolv_to_dotted ( "api.zoomeye.org" )
49
+ rescue RuntimeError , SocketError
50
+ return false
51
+ end
52
+
53
+ true
54
+ end
55
+
48
56
def dork_search ( dork , resource , page , facet = [ 'ip' ] )
49
57
# param: dork
50
58
# ex: country:cn
@@ -57,19 +65,30 @@ def dork_search(dork, resource, page, facet=['ip'])
57
65
# ex: [app, device]
58
66
# A comma-separated list of properties to get summary information
59
67
60
- zoomeye_dork_api = "https://api.zoomeye.org/#{ resource } /search"
61
- zoomeye_dork_api << "?query=" + Rex ::Text . uri_encode ( dork )
62
- zoomeye_dork_api << "&page=#{ page } "
63
- zoomeye_dork_api << "&facet=facet"
64
-
65
- uri = URI . parse ( zoomeye_dork_api )
66
- http = Net ::HTTP . new ( uri . host , uri . port )
67
- http . use_ssl = true
68
- request = Net ::HTTP ::Get . new ( uri . request_uri )
69
- request [ 'Authorization' ] = "JWT #{ datastore [ 'ZOOMEYE_APIKEY' ] } "
68
+ cli = Rex ::Proto ::Http ::Client . new ( 'api.zoomeye.org' , 443 , { } , true )
69
+ cli . connect
70
+
71
+ begin
72
+ req = cli . request_cgi ( {
73
+ 'uri' => "/#{ resource } /search" ,
74
+ 'method' => 'GET' ,
75
+ 'headers' => { 'Authorization' => "JWT #{ datastore [ 'ZOOMEYE_APIKEY' ] } " } ,
76
+ 'vars_get' => {
77
+ 'query' => Rex ::Text . uri_encode ( dork ) ,
78
+ 'page' => page ,
79
+ 'facet' => facet
80
+ }
81
+ } )
82
+
83
+ res = cli . send_recv ( req )
84
+ rescue ::Rex ::ConnectionError , Errno ::ECONNREFUSED , Errno ::ETIMEDOUT
85
+ print_error ( "HTTP Connection Failed" )
86
+ end
70
87
71
- res = http . request ( request )
72
- return 'server_response_error' unless res
88
+ unless res
89
+ print_error ( 'server_response_error' )
90
+ return
91
+ end
73
92
74
93
# Invalid Token, Not enough segments
75
94
# Invalid Token, Signature has expired
@@ -78,7 +97,6 @@ def dork_search(dork, resource, page, facet=['ip'])
78
97
end
79
98
80
99
ActiveSupport ::JSON . decode ( res . body )
81
-
82
100
end
83
101
84
102
def match_records? ( records )
@@ -106,11 +124,19 @@ def parse_web_records(records)
106
124
end
107
125
108
126
def run
127
+ # check to ensure api.zoomeye.org is resolvable
128
+ unless zoomeye_resolvable?
129
+ print_error ( "Unable to resolve api.zoomeye.org" )
130
+ return
131
+ end
132
+
133
+ # create ZoomEye request parameters
109
134
dork = datastore [ 'ZOOMEYE_DORK' ]
110
135
resource = datastore [ 'RESOURCE' ]
111
136
page = 1
112
137
maxpage = datastore [ 'MAXPAGE' ]
113
138
139
+ # scroll max pages from ZoomEye
114
140
while page <= maxpage
115
141
print_status ( "ZoomEye #{ resource } Search: #{ dork } - page: #{ page } " )
116
142
results = dork_search ( dork , resource , page ) if dork
0 commit comments