fofa 0.3.18 → 0.3.19
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 +5 -5
- data/Gemfile.lock +2 -2
- data/bin/fofacli +52 -5
- data/lib/fofa.rb +60 -0
- data/lib/fofa/version.rb +4 -1
- metadata +6 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: bfc764bb2b5c3d56f6dfd68ac14a74478a7d19c4e14c72bec35b1d3f547fb7aa
|
|
4
|
+
data.tar.gz: 8c52a5488290a45f3c074fcdccca99bef75685e91d42fe554268eb886cad36f3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 67ba297c2bba208e41d01700549cb396de980fb3937e932e01699ee90ce0185d2e9f6daac48fd9366ac919adbc883cd3377686ec5b5fff15e5b44c2ff594e381
|
|
7
|
+
data.tar.gz: c998095f14e85ceeb262b4f6b3b02c102d3a75dd0d2c0088c6b0402b7e8b968e0311a950261c91c45719d80fb02d3e5910da3106d1c8470dd1ab04eba3eaf03a
|
data/Gemfile.lock
CHANGED
data/bin/fofacli
CHANGED
|
@@ -21,7 +21,8 @@ options = {
|
|
|
21
21
|
format: 'csv',
|
|
22
22
|
check_app_category: nil,
|
|
23
23
|
check_app_application: nil,
|
|
24
|
-
check_app_all: false
|
|
24
|
+
check_app_all: false,
|
|
25
|
+
task_id: nil
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
ARGV.options do |opts|
|
|
@@ -42,12 +43,16 @@ ARGV.options do |opts|
|
|
|
42
43
|
options[:page] = val.to_i
|
|
43
44
|
end
|
|
44
45
|
|
|
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|
|
|
46
|
+
opts.on('-m', '--mode=MODE', String, 'Mode, default to [search], -m should be specified when [import_service, query_ip_list, check_app, ip_tags] ') do |val|
|
|
46
47
|
options[:mode] = val.to_sym
|
|
47
48
|
end
|
|
48
49
|
|
|
49
|
-
opts.on('-f', '--file=FILE', String, 'Used at [import_service, check_app] mode') do |val|
|
|
50
|
+
opts.on('-f', '--file=FILE', String, 'Used at [import_service, check_app, ip_tags] mode') do |val|
|
|
50
51
|
options[:file] = val
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
opts.on('-t', '--task_id=ID', Integer, 'Used at [ip_tags] mode') do |val|
|
|
55
|
+
options[:task_id] = val.to_i
|
|
51
56
|
end
|
|
52
57
|
|
|
53
58
|
opts.on('-s', '--limit=SIZE', Integer, "Limit size to fetch, default to #{options[:limit]}") do |val|
|
|
@@ -80,7 +85,7 @@ ARGV.options do |opts|
|
|
|
80
85
|
opts.on('-g', "--category=CATEGORY", String, "Category to check, only used in check_app mode." ) do |val|
|
|
81
86
|
options[:check_app_category] = val
|
|
82
87
|
options[:mode] = :check_app
|
|
83
|
-
|
|
88
|
+
end
|
|
84
89
|
|
|
85
90
|
opts.separator "Common Options:"
|
|
86
91
|
|
|
@@ -99,7 +104,7 @@ ARGV.options do |opts|
|
|
|
99
104
|
|
|
100
105
|
opts.on( nil, "--check_app_all", "Check all applications, only used in check_app mode." ) do
|
|
101
106
|
options[:check_app_all] = true
|
|
102
|
-
|
|
107
|
+
end
|
|
103
108
|
|
|
104
109
|
|
|
105
110
|
|
|
@@ -111,6 +116,8 @@ ARGV.options do |opts|
|
|
|
111
116
|
opts.separator "\t fofacli -e aaa@bbb.com -a xxx -d ip,domain,title,port,protocol -m query_ip_list -f ip.txt"
|
|
112
117
|
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"' -- {}@
|
|
113
118
|
opts.separator "\t fofacli -m check_app --app \"Coremail\" mail.tsinghua.edu.cn"
|
|
119
|
+
opts.separator "\t fofacli -e aaa@bbb.com -a xxx -m ip_tags -f ./ip.txt"
|
|
120
|
+
opts.separator "\t fofacli -e aaa@bbb.com -a xxx -m ip_tags -t 1"
|
|
114
121
|
|
|
115
122
|
begin
|
|
116
123
|
opts.parse!
|
|
@@ -285,8 +292,48 @@ case options[:mode]
|
|
|
285
292
|
$stderr.puts "[WARNING] No result!"
|
|
286
293
|
end
|
|
287
294
|
|
|
295
|
+
end
|
|
296
|
+
when :ip_tags
|
|
297
|
+
fofa = Fofa::API.new(options[:email], options[:apikey], {debug:options[:verbose]})
|
|
298
|
+
if options[:task_id]
|
|
299
|
+
task_id = options[:task_id]
|
|
300
|
+
else
|
|
301
|
+
unless options[:file]
|
|
302
|
+
puts "File not specified.".red
|
|
303
|
+
puts ARGV.options
|
|
304
|
+
exit -1
|
|
305
|
+
end
|
|
306
|
+
puts "Import ip and get tags from '#{options[:file]}'"
|
|
307
|
+
result = fofa.ip_tags(options[:file])
|
|
308
|
+
if result['error']
|
|
309
|
+
puts result
|
|
310
|
+
exit -1
|
|
311
|
+
end
|
|
312
|
+
puts result
|
|
313
|
+
task_id = result['task_id']
|
|
288
314
|
end
|
|
289
315
|
|
|
316
|
+
if task_id
|
|
317
|
+
get_info = -> (fofa, id) { fofa.tag_info(id) }
|
|
318
|
+
puts "Checking progress!"
|
|
319
|
+
sleep(2)
|
|
320
|
+
|
|
321
|
+
loop do
|
|
322
|
+
info = get_info.call(fofa, task_id)
|
|
323
|
+
if info['error']
|
|
324
|
+
puts info
|
|
325
|
+
break
|
|
326
|
+
elsif info['progress'].to_i == 100
|
|
327
|
+
puts "state: #{info['state']}; progress: #{info['progress']}."
|
|
328
|
+
puts info['download_url']
|
|
329
|
+
break
|
|
330
|
+
else
|
|
331
|
+
puts "state: #{info['state']}; progress: #{info['progress']}."
|
|
332
|
+
sleep(10)
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
end
|
|
290
337
|
|
|
291
338
|
end
|
|
292
339
|
|
data/lib/fofa.rb
CHANGED
|
@@ -157,6 +157,66 @@ module Fofa
|
|
|
157
157
|
{"error"=>"Error: #{e.to_s}"}
|
|
158
158
|
end
|
|
159
159
|
|
|
160
|
+
# Import ip and get tags
|
|
161
|
+
#
|
|
162
|
+
# Example:
|
|
163
|
+
# >> Fofa::API.new(email,apikey).ip_tags('./ips.txt')
|
|
164
|
+
# => {"task_id"=>1}
|
|
165
|
+
#
|
|
166
|
+
# Arguments:
|
|
167
|
+
# file: (String) ip file
|
|
168
|
+
def ip_tags(file)
|
|
169
|
+
url = "#{@api_server}/api/v1/ip_tags?key=#{@apikey}&email=#{@email}"
|
|
170
|
+
puts url if @options[:debug]
|
|
171
|
+
|
|
172
|
+
# Token used to terminate the file in the post body. Make sure it is not
|
|
173
|
+
# present in the file you're uploading.
|
|
174
|
+
# You might want to use `SecureRandom` class to generate this random strings
|
|
175
|
+
boundary = "AaB03x"
|
|
176
|
+
uri = URI.parse(url)
|
|
177
|
+
|
|
178
|
+
post_body = []
|
|
179
|
+
post_body << "--#{boundary}\r\n"
|
|
180
|
+
post_body << "Content-Disposition: form-data; name=\"file\"; filename=\"#{File.basename(file)}\"\r\n"
|
|
181
|
+
post_body << "Content-Type: text/plain\r\n"
|
|
182
|
+
post_body << "\r\n"
|
|
183
|
+
post_body << File.read(file)
|
|
184
|
+
post_body << "\r\n--#{boundary}--\r\n"
|
|
185
|
+
|
|
186
|
+
http = http_new(uri)
|
|
187
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
|
188
|
+
req.body = post_body.join
|
|
189
|
+
req["Content-Type"] = "multipart/form-data, boundary=#{boundary}"
|
|
190
|
+
|
|
191
|
+
resp = http.request(req)
|
|
192
|
+
puts resp if @options[:debug]
|
|
193
|
+
JSON.parse(resp.body)
|
|
194
|
+
rescue => e
|
|
195
|
+
{"error"=>"Error: #{e.to_s}"}
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Check ip_tags's task state, progress, and download_url
|
|
199
|
+
#
|
|
200
|
+
# Example:
|
|
201
|
+
# >> Fofa::API.new(email,apikey).tag_info(1)
|
|
202
|
+
# => {"state"=>"success", "progress"=>100, "download_url"=>"https://host/xxx/56af409c1c55762a7b9e9a39a801f80d.json"}
|
|
203
|
+
#
|
|
204
|
+
# Arguments:
|
|
205
|
+
# task_id: (Integer) task id
|
|
206
|
+
def tag_info(task_id)
|
|
207
|
+
url = "#{@api_server}/api/v1/ip_tags/info?key=#{@apikey}&email=#{@email}&task_id=#{task_id}"
|
|
208
|
+
puts url if @options[:debug]
|
|
209
|
+
uri = URI.parse(url)
|
|
210
|
+
http = http_new(uri)
|
|
211
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
212
|
+
|
|
213
|
+
resp = http.request(req)
|
|
214
|
+
JSON.parse(resp.body)
|
|
215
|
+
rescue => e
|
|
216
|
+
$stderr.puts "[WARNING]: #{e.to_s}"
|
|
217
|
+
{"error"=>"Error: #{e.to_s}"}
|
|
218
|
+
end
|
|
219
|
+
|
|
160
220
|
private
|
|
161
221
|
def http_new(uri)
|
|
162
222
|
http = Net::HTTP.new(uri.host, uri.port)
|
data/lib/fofa/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fofa
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.19
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- fofa
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-06-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -106,7 +106,7 @@ homepage: https://fofa.so
|
|
|
106
106
|
licenses:
|
|
107
107
|
- MIT
|
|
108
108
|
metadata: {}
|
|
109
|
-
post_install_message:
|
|
109
|
+
post_install_message:
|
|
110
110
|
rdoc_options: []
|
|
111
111
|
require_paths:
|
|
112
112
|
- lib
|
|
@@ -121,9 +121,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
121
121
|
- !ruby/object:Gem::Version
|
|
122
122
|
version: '0'
|
|
123
123
|
requirements: []
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
signing_key:
|
|
124
|
+
rubygems_version: 3.0.6
|
|
125
|
+
signing_key:
|
|
127
126
|
specification_version: 4
|
|
128
127
|
summary: A Ruby library to interact with the FOFA API. https://fofa.so
|
|
129
128
|
test_files: []
|