Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
davidtavarez
GitHub Repository: davidtavarez/pwndb
Path: blob/master/pwndb.py
234 views
1
#!/usr/bin/env python
2
# Authors:
3
# - davidtavarez
4
# - D4Vinci
5
6
import sys
7
8
import requests
9
import argparse
10
from email.utils import getaddresses
11
import json
12
13
from requests import ConnectionError
14
15
if sys.version_info >= (3, 0):
16
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1)
17
18
G, B, R, W, M, C, end = '\033[92m', '\033[94m', '\033[91m', '\x1b[37m', '\x1b[35m', '\x1b[36m', '\033[0m'
19
info = end + W + "[-]" + W
20
good = end + G + "[+]" + C
21
bad = end + R + "[" + W + "!" + R + "]"
22
23
24
def main(emails, output=None):
25
if not output:
26
print(info + " Searching for leaks...")
27
28
results = []
29
30
for email in emails:
31
leaks = find_leaks(email.strip())
32
if leaks:
33
for leak in leaks:
34
results.append(leak)
35
36
if not results:
37
if not output:
38
print(bad + " No leaks found." + end)
39
40
if not output or output == 'txt':
41
for result in results:
42
username = result.get('username', '')
43
domain = result.get('domain', '')
44
password = result.get('password', '')
45
46
if not output:
47
print(good + "\t" + username + "@" + domain + ":" + password)
48
if output == 'txt':
49
print(username + "@" + domain + ":" + password)
50
if output == 'json':
51
print(json.dumps(results))
52
53
def find_leaks(email):
54
url = "http://pwndb2am4tzkvold.onion/"
55
username = email
56
domain = "%"
57
58
if "@" in email:
59
username = email.split("@")[0]
60
domain = email.split("@")[1]
61
if not username:
62
username = '%'
63
64
request_data = {'luser': username, 'domain': domain, 'luseropr': 1, 'domainopr': 1, 'submitform': 'em'}
65
66
r = session.post(url, data=request_data)
67
68
return parse_pwndb_response(r.text)
69
70
71
def parse_pwndb_response(text):
72
if "Array" not in text:
73
return None
74
75
leaks = text.split("Array")[1:]
76
emails = []
77
78
for leak in leaks:
79
leaked_email = ''
80
domain = ''
81
password = ''
82
try :
83
leaked_email = leak.split("[luser] =>")[1].split("[")[0].strip()
84
domain = leak.split("[domain] =>")[1].split("[")[0].strip()
85
password = leak.split("[password] =>")[1].split(")")[0].strip()
86
except:
87
pass
88
if leaked_email:
89
emails.append({'username': leaked_email, 'domain': domain, 'password': password})
90
return emails
91
92
93
if __name__ == '__main__':
94
parser = argparse.ArgumentParser(prog='pwndb.py')
95
parser.add_argument("--target", help="Target email/domain to search for leaks.")
96
parser.add_argument("--list", help="A list of emails in a file to search for leaks.")
97
parser.add_argument("--output", help="Return results as json/txt")
98
parser.add_argument("--proxy", default='127.0.0.1:9050', type=str, help="Set Tor proxy (default: 127.0.0.1:9050)")
99
args = parser.parse_args()
100
101
# Tor proxy
102
proxy = args.proxy
103
session = requests.session()
104
session.proxies = {'http': 'socks5h://{}'.format(proxy), 'https': 'socks5h://{}'.format(proxy)}
105
106
if not args.list and not args.target:
107
print(bad + " Missing parameters!" + end)
108
parser.print_help()
109
exit(-1)
110
111
emails = []
112
113
output = None
114
if args.output:
115
if args.output not in ['json', 'txt']:
116
print(bad + " Output should be json or txt" + end)
117
exit(-1)
118
output = args.output
119
120
if args.target:
121
emails.append(args.target)
122
123
if args.list:
124
try:
125
lines = open(args.list).readlines()
126
for line in lines:
127
for input in line.split(','):
128
addresses = getaddresses([input])
129
for address in addresses:
130
emails.append(str(addresses[0][1]).strip())
131
except Exception as e:
132
print(bad + " Can't read the file: " + str(args.list))
133
exit(-1)
134
try:
135
main(emails, output)
136
except ConnectionError:
137
print(bad + " Can't connect to service! Make sure Tor socks proxy is listening on " + proxy)
138
except Exception as e:
139
print(bad + " " + str(e))
140
141