mirror of
https://github.com/laramies/theHarvester.git
synced 2024-11-14 11:36:56 +08:00
291 lines
13 KiB
Python
291 lines
13 KiB
Python
import datetime
|
|
import sqlite3
|
|
|
|
|
|
class stash_manager:
|
|
|
|
def __init__(self):
|
|
self.db = "stash.sqlite"
|
|
self.results = ""
|
|
self.totalresults = ""
|
|
self.latestscandomain = {}
|
|
self.domainscanhistory = []
|
|
#self.scanboarddata = []
|
|
self.scanboarddata = {}
|
|
self.scanstats = []
|
|
self.latestscanresults = []
|
|
self.previousscanresults = []
|
|
|
|
def do_init(self):
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('CREATE TABLE results (domain text, resource text, type text, find_date date, source text)')
|
|
conn.commit()
|
|
conn.close()
|
|
return
|
|
|
|
def store(self, domain, resource, res_type, source):
|
|
self.domain = domain
|
|
self.resource = resource
|
|
self.type = res_type
|
|
self.source = source
|
|
self.date = datetime.date.today()
|
|
try:
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('INSERT INTO results (domain,resource, type, find_date, source) VALUES (?,?,?,?,?)',
|
|
(self.domain, self.resource, self.type, self.date, self.source))
|
|
conn.commit()
|
|
conn.close()
|
|
except Exception as e:
|
|
print(e)
|
|
return
|
|
|
|
def store_all(self, domain, all, res_type, source):
|
|
self.domain = domain
|
|
self.all = all
|
|
self.type = res_type
|
|
self.source = source
|
|
self.date = datetime.date.today()
|
|
for x in self.all:
|
|
try:
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('INSERT INTO results (domain,resource, type, find_date, source) VALUES (?,?,?,?,?)',
|
|
(self.domain, x, self.type, self.date, self.source))
|
|
conn.commit()
|
|
conn.close()
|
|
except Exception as e:
|
|
print(e)
|
|
return
|
|
|
|
def generatedashboardcode(self, domain):
|
|
try:
|
|
self.latestscandomain["domain"] = domain
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="host"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["host"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="email"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["email"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="ip"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["ip"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="vhost"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["vhost"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="shodan"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["shodan"] = data[0]
|
|
c.execute('''SELECT MAX(find_date) FROM results WHERE domain=?''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["latestdate"] = data[0]
|
|
latestdate = data[0]
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="host"''', (domain, latestdate,))
|
|
scandetailshost = c.fetchall()
|
|
self.latestscandomain["scandetailshost"] = scandetailshost
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="email"''',
|
|
(domain, latestdate,))
|
|
scandetailsemail = c.fetchall()
|
|
self.latestscandomain["scandetailsemail"] = scandetailsemail
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="ip"''', (domain, latestdate,))
|
|
scandetailsip = c.fetchall()
|
|
self.latestscandomain["scandetailsip"] = scandetailsip
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="vhost"''',
|
|
(domain, latestdate,))
|
|
scandetailsvhost = c.fetchall()
|
|
self.latestscandomain["scandetailsvhost"] = scandetailsvhost
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="shodan"''',
|
|
(domain, latestdate,))
|
|
scandetailsshodan = c.fetchall()
|
|
self.latestscandomain["scandetailsshodan"] = scandetailsshodan
|
|
return self.latestscandomain
|
|
except Exception as e:
|
|
print(e)
|
|
finally:
|
|
conn.close()
|
|
|
|
def getlatestscanresults(self, domain, previousday=False):
|
|
try:
|
|
conn = sqlite3.connect(self.db)
|
|
if previousday:
|
|
try:
|
|
c = conn.cursor()
|
|
c.execute('''
|
|
SELECT DISTINCT(find_date)
|
|
FROM results
|
|
WHERE find_date=date('now', '-1 day') and domain=?''', (domain,))
|
|
previousscandate = c.fetchone()
|
|
if not previousscandate: # When theHarvester runs first time/day this query will return.
|
|
self.previousscanresults = ["No results", "No results", "No results", "No results", "No results"]
|
|
else:
|
|
c = conn.cursor()
|
|
c.execute('''
|
|
SELECT find_date, domain, source, type, resource
|
|
FROM results
|
|
WHERE find_date=? and domain=?
|
|
ORDER BY source,type
|
|
''', (previousscandate[0], domain,))
|
|
results = c.fetchall()
|
|
self.previousscanresults = results
|
|
return self.previousscanresults
|
|
except Exception as e:
|
|
print('Error in getting the previous scan results from the database: ' + str(e))
|
|
else:
|
|
try:
|
|
c = conn.cursor()
|
|
c.execute('''SELECT MAX(find_date) FROM results WHERE domain=?''', (domain,))
|
|
latestscandate = c.fetchone()
|
|
c = conn.cursor()
|
|
c.execute('''
|
|
SELECT find_date, domain, source, type, resource
|
|
FROM results
|
|
WHERE find_date=? and domain=?
|
|
ORDER BY source,type
|
|
''', (latestscandate[0], domain,))
|
|
results = c.fetchall()
|
|
self.latestscanresults = results
|
|
return self.latestscanresults
|
|
except Exception as e:
|
|
print('Error in getting the latest scan results from the database: ' + str(e))
|
|
except Exception as e:
|
|
print('Error connecting to theHarvester database: ' + str(e))
|
|
finally:
|
|
conn.close()
|
|
|
|
def getscanboarddata(self):
|
|
try:
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE type="host"''')
|
|
data = c.fetchone()
|
|
self.scanboarddata["host"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE type="email"''')
|
|
data = c.fetchone()
|
|
self.scanboarddata["email"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE type="ip"''')
|
|
data = c.fetchone()
|
|
self.scanboarddata["ip"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE type="vhost"''')
|
|
data = c.fetchone()
|
|
self.scanboarddata["vhost"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE type="shodan"''')
|
|
data = c.fetchone()
|
|
self.scanboarddata["shodan"] = data[0]
|
|
c.execute('''SELECT COUNT(DISTINCT(domain)) FROM results ''')
|
|
data = c.fetchone()
|
|
self.scanboarddata["domains"] = data[0]
|
|
return self.scanboarddata
|
|
except Exception as e:
|
|
print(e)
|
|
finally:
|
|
conn.close()
|
|
|
|
def getscanhistorydomain(self, domain):
|
|
try:
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('''SELECT DISTINCT(find_date) FROM results WHERE domain=?''', (domain,))
|
|
dates = c.fetchall()
|
|
for date in dates:
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="host" AND find_date=?''',
|
|
(domain, date[0]))
|
|
counthost = c.fetchone()
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="email" AND find_date=?''',
|
|
(domain, date[0]))
|
|
countemail = c.fetchone()
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="ip" AND find_date=?''',
|
|
(domain, date[0]))
|
|
countip = c.fetchone()
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="vhost" AND find_date=?''',
|
|
(domain, date[0]))
|
|
countvhost = c.fetchone()
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="shodan" AND find_date=?''',
|
|
(domain, date[0]))
|
|
countshodan = c.fetchone()
|
|
results = {
|
|
"date": str(date[0]),
|
|
"hosts": str(counthost[0]),
|
|
"email": str(countemail[0]),
|
|
"ip": str(countip[0]),
|
|
"vhost": str(countvhost[0]),
|
|
"shodan": str(countshodan[0])
|
|
}
|
|
self.domainscanhistory.append(results)
|
|
return self.domainscanhistory
|
|
except Exception as e:
|
|
print(e)
|
|
finally:
|
|
conn.close()
|
|
|
|
def getpluginscanstatistics(self):
|
|
try:
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('''
|
|
SELECT domain,find_date, type, source, count(*)
|
|
FROM results
|
|
GROUP BY domain, find_date, type, source
|
|
''')
|
|
results = c.fetchall()
|
|
self.scanstats = results
|
|
return self.scanstats
|
|
except Exception as e:
|
|
print(e)
|
|
finally:
|
|
conn.close()
|
|
|
|
def latestscanchartdata(self, domain):
|
|
try:
|
|
self.latestscandomain["domain"] = domain
|
|
conn = sqlite3.connect(self.db)
|
|
c = conn.cursor()
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="host"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["host"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="email"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["email"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="ip"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["ip"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="vhost"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["vhost"] = data[0]
|
|
c.execute('''SELECT COUNT(*) from results WHERE domain=? AND type="shodan"''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["shodan"] = data[0]
|
|
c.execute('''SELECT MAX(find_date) FROM results WHERE domain=?''', (domain,))
|
|
data = c.fetchone()
|
|
self.latestscandomain["latestdate"] = data[0]
|
|
latestdate = data[0]
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="host"''', (domain, latestdate,))
|
|
scandetailshost = c.fetchall()
|
|
self.latestscandomain["scandetailshost"] = scandetailshost
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="email"''',
|
|
(domain, latestdate,))
|
|
scandetailsemail = c.fetchall()
|
|
self.latestscandomain["scandetailsemail"] = scandetailsemail
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="ip"''', (domain, latestdate,))
|
|
scandetailsip = c.fetchall()
|
|
self.latestscandomain["scandetailsip"] = scandetailsip
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="vhost"''',
|
|
(domain, latestdate,))
|
|
scandetailsvhost = c.fetchall()
|
|
self.latestscandomain["scandetailsvhost"] = scandetailsvhost
|
|
c.execute('''SELECT * FROM results WHERE domain=? AND find_date=? AND type="shodan"''',
|
|
(domain, latestdate,))
|
|
scandetailsshodan = c.fetchall()
|
|
self.latestscandomain["scandetailsshodan"] = scandetailsshodan
|
|
return self.latestscandomain
|
|
except Exception as e:
|
|
print(e)
|
|
finally:
|
|
conn.close()
|