You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

163 lines
5.3 KiB

#!/usr/bin/env python3
class Colours:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
try:
import os
import re
import sys
import getopt
import requests
from clint.textui import progress
from bs4 import BeautifulSoup
except Exception as err:
print(Colours.FAIL + "Error: {}".format(err) + Colours.ENDC)
def Usage():
use_msg = '''
---------- Usage ----------
leak-lookup [options] [search term]
---------------------------
Options:
-h: Prints this help message
-p: Searches haveibeenpwned.com
-d: Searches for leaked database
---------------------------
'''
print(use_msg)
def DownloadDatabase(url, name):
try:
r = requests.get(url, stream=True)
with open(name, 'wb') as f:
total_length = int(r.headers.get('content-length'))
for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1):
if chunk:
f.write(chunk)
f.flush()
except (KeyboardInterrupt, SystemExit, EOFError):
print(Colours.FAIL + "An error occurred, cleaning up" + Colours.ENDC)
os.remove(name)
def DatabaseQuery(database):
r = requests.get("https://www.databases.today/search-nojs.php?for=" + database)
if r.reason != "OK":
print(Colours.FAIL + "Error code: {}".format(r.status_code) + Colours.ENDC)
sys.exit(1)
soup = BeautifulSoup(r.text, "html.parser")
dbs = soup.find(id="myTable").find_all("tr")
entries = []
for table in dbs:
entry = table.find_all("td")
if len(entry) != 0:
entries.append([entry[0].text, entry[4].a.get("href")])
print("Which file would you like to download?")
for index, dllink in enumerate(entries):
print("{}) {}".format(index + 1, dllink[0]))
print("a) All")
print("q) Quit")
download_choice = input(">> ")
if download_choice == "q":
sys.exit(0)
elif download_choice == "a":
for x in dllink:
DownloadDatabase(x[1], x[0])
else:
try:
download_choice = int(download_choice) - 1
DownloadDatabase(dllink[1], dllink[0].split(" (")[0])
except:
print(Colours.FAIL + "Error: Invalid selection" + Colours.ENDC)
sys.exit(1)
def QueryHaveIBeenPwned(email):
r = requests.post("https://haveibeenpwned.com/", data={"Account": email})
if r.reason != "OK":
print(Colours.FAIL + "Error code: {}".format(r.status_code) + Colours.ENDC)
sys.exit(1)
soup = BeautifulSoup(r.text, "html.parser")
pwnCount = re.match("Pwned on \d+", soup.find(id="pwnCount").text)
if pwnCount == None:
print(Colours.OKGREEN + "{} has no public leaks".format(email) + Colours.ENDC)
return
print(Colours.FAIL + "{} has {} public leaks avalible".format(email, pwnCount.group().split(" ")[-1]) + Colours.ENDC)
leaks = []
for leak in soup.find_all(class_="pwnedWebsite"):
leak_name = None
leak_status = None
compromised_data = None
leak_name_html = leak.find(class_="pwnedCompanyTitle")
if leak_name_html:
if "(" in leak_name_html.text:
leak_name = leak_name_html.text.split(" (")[0]
leak_status = leak_name_html.text.split(" (")[1][:-2]
else:
leak_name = leak_name_html.text[:-1]
leak_status = None
compromised_data_html = leak.find(class_="dataClasses")
if compromised_data_html:
compromised_data = compromised_data_html.text
if leak_name:
leaks.append([leak_name, leak_status, compromised_data])
print("\nDownload databases:")
for index, leak in enumerate(leaks):
if leak[1] == None:
print("{}) {}: {}".format(index + 1, leak[0], leak[2]))
else:
print("{}) {} ({}): {}".format(index + 1, leak[0], leak[1], leak[2]))
print("a) Download all")
print("q) Quit")
download_choice = input(">> ")
if download_choice == "q":
sys.exit(0)
elif download_choice == "a":
for leak in leaks:
DatabaseQuery(leak[0])
try:
download_choice = int(download_choice) - 1
DatabaseQuery(leaks[download_choice][0])
except:
print(Colours.FAIL + "Error: Invalid selection" + Colours.ENDC)
sys.exit(1)
def main():
if len(sys.argv[1:]) == 0:
Usage()
sys.exit(1)
try:
options, remainder = getopt.getopt(sys.argv[1:],'hpd',['h', 'p','d',])
except getopt.GetoptError as err:
print(Colours.FAIL + "Error: {}".format(err) + Colours.ENDC)
sys.exit(1)
for opt, arg in options:
if opt == "-h":
Usage()
sys.exit(0)
elif opt == "-p":
if len(remainder) == 0:
Usage()
sys.exit(1)
QueryHaveIBeenPwned(" ".join(remainder))
elif opt == "-d":
if len(remainder) == 0:
Usage()
sys.exit(1)
DatabaseQuery(" ".join(remainder))
if __name__ == "__main__":
try:
main()
except (KeyboardInterrupt, SystemExit, EOFError):
sys.exit(0)