fofa 0.3.15 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/bin/fofacli +35 -3
- data/lib/fofa.rb +60 -9
- data/lib/fofa/version.rb +4 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c547727d9ed816e3d644f0416cc146bf6e856914
|
|
4
|
+
data.tar.gz: 4b972ee2dc95eefadfe1233d4ab01cd912c790d1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e3650e6c08280779282fd7865c912d9e2ec152ca3b8aea318e43f7a6e70014ca32308b7a38de9a45edb2b9e27434dc74fba6c9d2811f05648aea9ba7acff7863
|
|
7
|
+
data.tar.gz: 2e919a75409e0c1a6fc7ee1eba8f9c094f630c061eaabbfa2d84e56519efe98c9583040177503eb48a701f9bf18c913c0419c5d77908c4249a28a05cba5a79b3
|
data/Gemfile.lock
CHANGED
data/bin/fofacli
CHANGED
|
@@ -18,7 +18,10 @@ options = {
|
|
|
18
18
|
fields: 'host',
|
|
19
19
|
post: false,
|
|
20
20
|
query: nil,
|
|
21
|
-
format: 'csv'
|
|
21
|
+
format: 'csv',
|
|
22
|
+
check_app_category: nil,
|
|
23
|
+
check_app_application: nil,
|
|
24
|
+
check_app_all: false
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
ARGV.options do |opts|
|
|
@@ -39,7 +42,7 @@ ARGV.options do |opts|
|
|
|
39
42
|
options[:page] = val.to_i
|
|
40
43
|
end
|
|
41
44
|
|
|
42
|
-
opts.on('-m', '--mode=MODE', String, 'Mode, default to [search], -m should be specified when [import_service, query_ip_list] ') do |val|
|
|
45
|
+
opts.on('-m', '--mode=MODE', String, 'Mode, default to [search], -m should be specified when [import_service, query_ip_list, check_app] ') do |val|
|
|
43
46
|
options[:mode] = val.to_sym
|
|
44
47
|
end
|
|
45
48
|
|
|
@@ -67,6 +70,16 @@ ARGV.options do |opts|
|
|
|
67
70
|
raise "File not exist of #{val}" unless File.exists? val
|
|
68
71
|
options[:query] = File.read(val).strip
|
|
69
72
|
options[:post] = true
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
opts.on('-l', "--application=APPLICATION", String, "Application to check, only used in check_app mode." ) do |val|
|
|
76
|
+
options[:check_app_application] = val
|
|
77
|
+
options[:mode] = :check_app
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
opts.on('-g', "--category=CATEGORY", String, "Category to check, only used in check_app mode." ) do |val|
|
|
81
|
+
options[:check_app_category] = val
|
|
82
|
+
options[:mode] = :check_app
|
|
70
83
|
end
|
|
71
84
|
|
|
72
85
|
opts.separator "Common Options:"
|
|
@@ -84,6 +97,12 @@ ARGV.options do |opts|
|
|
|
84
97
|
options[:verbose] = true
|
|
85
98
|
end
|
|
86
99
|
|
|
100
|
+
opts.on( nil, "--check_app_all", "Check all applications, only used in check_app mode." ) do
|
|
101
|
+
options[:check_app_all] = true
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
87
106
|
opts.separator ""
|
|
88
107
|
opts.separator "For example:"
|
|
89
108
|
opts.separator "\t fofacli -e aaa@bbb.com -a xxx domain=\"baidu.com\""
|
|
@@ -91,7 +110,7 @@ ARGV.options do |opts|
|
|
|
91
110
|
opts.separator "\t fofacli -e aaa@bbb.com -a xxx --query_file /tmp/fofaquery"
|
|
92
111
|
opts.separator "\t fofacli -e aaa@bbb.com -a xxx -d ip,domain,title,port,protocol -m query_ip_list -f ip.txt"
|
|
93
112
|
opts.separator %Q@\t cat vapps.txt | xargs -I{} -n 1 sh -c 'fofacli "app=$1" -d host,ip,port,country,province,city -s 1000 -o json -v > "$1.txt"' -- {}@
|
|
94
|
-
|
|
113
|
+
|
|
95
114
|
begin
|
|
96
115
|
opts.parse!
|
|
97
116
|
rescue OptionParser::InvalidOption => e
|
|
@@ -227,5 +246,18 @@ case options[:mode]
|
|
|
227
246
|
} #File
|
|
228
247
|
pool.shutdown
|
|
229
248
|
pool.wait_for_termination
|
|
249
|
+
when :check_app
|
|
250
|
+
query = options[:query] || ARGV.join(' ')
|
|
251
|
+
res = Fofa::API.new(options[:email], options[:apikey], {debug:options[:verbose]})
|
|
252
|
+
.check_app(query, {
|
|
253
|
+
category:options[:check_app_category],
|
|
254
|
+
application:options[:check_app_application],
|
|
255
|
+
all:options[:all],
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
res.each{|r|
|
|
259
|
+
log_record(options, r)
|
|
260
|
+
}
|
|
261
|
+
|
|
230
262
|
end
|
|
231
263
|
|
data/lib/fofa.rb
CHANGED
|
@@ -33,10 +33,7 @@ module Fofa
|
|
|
33
33
|
url += "&qbase64=#{Base64.encode64(query)}" unless options[:post]
|
|
34
34
|
puts url if @options[:debug]
|
|
35
35
|
uri = URI.parse(url)
|
|
36
|
-
http =
|
|
37
|
-
if uri.scheme == 'https'
|
|
38
|
-
http.use_ssl = true
|
|
39
|
-
end
|
|
36
|
+
http = http_new(uri)
|
|
40
37
|
|
|
41
38
|
if options[:post]
|
|
42
39
|
req = Net::HTTP::Post.new(uri.request_uri)
|
|
@@ -106,11 +103,7 @@ module Fofa
|
|
|
106
103
|
url = "#{@api_server}/api/v1/import/services?key=#{@apikey}&email=#{@email}&port=#{options[:port]}"
|
|
107
104
|
puts url if @options[:debug]
|
|
108
105
|
uri = URI.parse(url)
|
|
109
|
-
http =
|
|
110
|
-
if uri.scheme == 'https'
|
|
111
|
-
http.use_ssl = true
|
|
112
|
-
end
|
|
113
|
-
http.set_debug_output $stderr if @options[:debug]
|
|
106
|
+
http = http_new(uri)
|
|
114
107
|
|
|
115
108
|
File.open(file) do |f|
|
|
116
109
|
results = []
|
|
@@ -139,5 +132,63 @@ module Fofa
|
|
|
139
132
|
{"error"=>"Error: #{e.to_s}"}
|
|
140
133
|
end
|
|
141
134
|
|
|
135
|
+
# Check applications of asset
|
|
136
|
+
#
|
|
137
|
+
# Example:
|
|
138
|
+
# >> Fofa::API.new(email,apikey).checkapp("mail.tsinghua.edu.cn", category:"邮件系统")
|
|
139
|
+
# => ["Coremail"]
|
|
140
|
+
#
|
|
141
|
+
# Arguments:
|
|
142
|
+
# host: (String) Category name
|
|
143
|
+
# options: (Hash) category: Category name, application: Application name, all: return all applications or break when match first
|
|
144
|
+
def check_app(host, options={})
|
|
145
|
+
options = {all:false}.merge(options)
|
|
146
|
+
url = "#{@api_server}/api/v1/search/checkapp?key=#{@apikey}&email=#{@email}&host=#{host}"
|
|
147
|
+
url += "&all=#{options[:all]}" if options[:all]
|
|
148
|
+
url += "&application=#{URI.escape(options[:application])}" if options[:application]
|
|
149
|
+
url += "&category=#{URI.escape(options[:category])}" if options[:category]
|
|
150
|
+
puts url if @options[:debug]
|
|
151
|
+
uri = URI.parse(url)
|
|
152
|
+
http = http_new(uri)
|
|
153
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
154
|
+
resp = http.request(req)
|
|
155
|
+
JSON.parse(resp.body)
|
|
156
|
+
|
|
157
|
+
# File.open(file) do |f|
|
|
158
|
+
# results = []
|
|
159
|
+
# f.each_line.lazy.each_with_index do |line, i|
|
|
160
|
+
#
|
|
161
|
+
# line = line.strip
|
|
162
|
+
# if m = /Discovered open port (?<port>.*?)\/tcp on (?<host>.*?)$/.match(line)
|
|
163
|
+
# hostinfo = "#{m[:host]}:#{m[:port]}"
|
|
164
|
+
# elsif line.include?(':')
|
|
165
|
+
# hostinfo = line
|
|
166
|
+
# else
|
|
167
|
+
# hostinfo = "#{line}:#{options[:port]}"
|
|
168
|
+
# end
|
|
169
|
+
#
|
|
170
|
+
# results << line
|
|
171
|
+
# if i % split_size == 0
|
|
172
|
+
# req = Net::HTTP::Post.new(uri.request_uri)
|
|
173
|
+
# req.body = results.join("\n")
|
|
174
|
+
# resp = http.request(req)
|
|
175
|
+
# puts resp if @options[:debug]
|
|
176
|
+
# results = []
|
|
177
|
+
# end
|
|
178
|
+
# end
|
|
179
|
+
# end
|
|
180
|
+
rescue => e
|
|
181
|
+
{"error"=>"Error: #{e.to_s}"}
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
private
|
|
185
|
+
def http_new(uri)
|
|
186
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
187
|
+
if uri.scheme == 'https'
|
|
188
|
+
http.use_ssl = true
|
|
189
|
+
end
|
|
190
|
+
http.set_debug_output $stderr if @options[:debug]
|
|
191
|
+
http
|
|
192
|
+
end
|
|
142
193
|
end
|
|
143
194
|
end
|
data/lib/fofa/version.rb
CHANGED