theHarvester/theHarvester.py

919 lines
39 KiB
Python
Raw Normal View History

2019-01-06 13:14:46 +08:00
#!/usr/bin/env python3
2011-05-04 23:07:06 +08:00
import argparse
from discovery import *
from discovery.constants import *
from lib.core import *
from lib import hostchecker
from lib import htmlExport
2018-12-30 10:29:25 +08:00
from lib import reportgraph
from lib import statichtmlgenerator
2019-01-11 10:09:47 +08:00
import datetime
2019-01-13 05:49:05 +08:00
import ipaddress
2019-01-11 10:09:47 +08:00
import re
import stash
import time
try:
2018-12-27 15:43:32 +08:00
import bs4
2018-12-30 10:29:25 +08:00
except ImportError:
print('\n\033[93m[!] BeautifulSoup library not found, please install before proceeding.\n\n \033[0m')
2018-12-27 15:53:12 +08:00
sys.exit(1)
2018-12-16 11:07:37 +08:00
2018-11-30 05:28:37 +08:00
try:
2018-12-27 15:43:32 +08:00
import requests
2018-12-30 10:29:25 +08:00
except ImportError:
print('\n\033[93m[!] Requests library not found, please install before proceeding.\n\n \033[0m')
2018-12-27 15:53:12 +08:00
sys.exit(1)
Core.banner()
2011-05-04 23:07:06 +08:00
2018-12-30 10:29:25 +08:00
def start():
parser = argparse.ArgumentParser(description='theHarvester is a open source intelligence gathering tool(OSINT) that is used for recon')
parser.add_argument('-d', '--domain', help='Company name or domain to search', required=True)
parser.add_argument('-t', '--dnstld', help='Perform a DNS TLD expansion discovery', default=True)
parser.add_argument('-l', '--limit', help='limit the number of search results', default=500)
parser.add_argument('-s', '--shodan', help='use Shodan to query discovered hosts', default=True)
parser.add_argument('-f', '--filename', help='save the results to an HTML and/or XML file')
parser.add_argument('-p', '--portscan', help='port scan the detected hosts and check for Takeovers (21,22,80,443,8080)', default=True)
parser.add_argument('-b', '--source', help='''source: baidu, bing, bingapi, censys, crtsh, cymon, dogpile,
google, googleCSE, google-certificates, google-profiles,
hunter, linkedin, netcraft, pgp, securityTrails, threatcrowd,
trello, twitter, vhost, virustotal, yahoo, all''', required=True)
args = parser.parse_args()
2018-03-23 06:32:50 +08:00
try:
2018-12-16 11:07:37 +08:00
db = stash.stash_manager()
2018-03-23 06:32:50 +08:00
db.do_init()
except Exception:
2018-03-23 06:32:50 +08:00
pass
2018-12-18 07:14:42 +08:00
all_emails = []
all_hosts = []
all_ip = []
bingapi = 'yes'
dnsbrute = False
dnslookup = False
dnsserver = ""
dnstld = args.dnstld
filename = args.filename
full = []
google_dorking = False
host_ip = []
limit = args.limit
ports_scanning = args.portscan
shodan = args.shodan
start = 0
takeover_check = False
trello_info = ([], False)
vhost = []
virtual = False
word = args.domain
# elif opt == '-g':
# google_dorking = True
# elif opt == '-s':
# start = int(arg)
# elif opt == '-v':
# virtual = 'basic'
# elif opt == '-f':
# filename = arg
# elif opt == '-n':
# dnslookup = True
# elif opt == '-c':
# dnsbrute = True
# elif opt == '-h':
# shodan = True
# elif opt == '-e':
# dnsserver = arg
# elif opt == '-p':
# ports_scanning = True
# elif opt == '-t':
# dnstld = True
engines = set(args.source.split(','))
if set(engines).issubset(Core.get_supportedengines()):
print(f'\033[94m[*] Target domain: {word} \n \033[0m')
for engineitem in engines:
if engineitem == 'baidu':
print('\033[94m[*] Searching Baidu. \033[0m')
try:
search = baidusearch.SearchBaidu(word, limit)
search.process()
all_emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'baidu')
db.store_all(word, all_emails, 'email', 'baidu')
except Exception:
pass
elif engineitem == 'bing' or engineitem == 'bingapi':
print('\033[94m[*] Searching Bing. \033[0m')
try:
search = bingsearch.SearchBing(word, limit, start)
if engineitem == 'bingapi':
bingapi = 'yes'
else:
bingapi = 'no'
search.process(bingapi)
all_emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
2018-12-18 07:14:42 +08:00
all_hosts.extend(hosts)
2018-12-20 03:39:33 +08:00
db = stash.stash_manager()
db.store_all(word, all_hosts, 'email', 'bing')
db.store_all(word, all_hosts, 'host', 'bing')
except Exception as e:
if isinstance(e, MissingKey):
print(e)
2019-01-11 15:21:45 +08:00
else:
pass
elif engineitem == 'censys':
print('\033[94m[*] Searching Censys. \033[0m')
from discovery import censys
# Import locally or won't work
search = censys.SearchCensys(word, limit)
search.process()
all_ip = search.get_ipaddresses()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'censys')
db.store_all(word, all_ip, 'ip', 'censys')
elif engineitem == 'crtsh':
print('\033[94m[*] Searching CRT.sh. \033[0m')
search = crtsh.search_crtsh(word)
search.process()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'CRTsh')
elif engineitem == 'cymon':
print('\033[94m[*] Searching Cymon. \033[0m')
from discovery import cymon
# Import locally or won't work.
search = cymon.search_cymon(word)
search.process()
all_ip = search.get_ipaddresses()
db = stash.stash_manager()
db.store_all(word, all_ip, 'ip', 'cymon')
elif engineitem == 'dogpile':
print('\033[94m[*] Searching Dogpile. \033[0m')
search = dogpilesearch.SearchDogpile(word, limit)
search.process()
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
all_emails.extend(emails)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'email', 'dogpile')
db.store_all(word, all_hosts, 'host', 'dogpile')
elif engineitem == 'duckduckgo':
print('\033[94m[*] Searching DuckDuckGo. \033[0m')
from discovery import duckduckgosearch
search = duckduckgosearch.SearchDuckDuckGo(word, limit)
search.process()
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
all_emails.extend(emails)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'email', 'duckduckgo')
db.store_all(word, all_hosts, 'host', 'duckduckgo')
elif engineitem == 'google':
print('\033[94m[*] Searching Google. \033[0m')
search = googlesearch.search_google(word, limit, start)
search.process(google_dorking)
emails = filter(search.get_emails())
all_emails.extend(emails)
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'google')
db.store_all(word, all_emails, 'email', 'google')
elif engineitem == 'googleCSE':
print('\033[94m[*] Searching Google Custom Search. \033[0m')
try:
search = googleCSE.SearchGoogleCSE(word, limit, start)
search.process()
search.store_results()
all_emails = filter(search.get_emails())
db = stash.stash_manager()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db.store_all(word, all_hosts, 'email', 'googleCSE')
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'googleCSE')
except Exception as e:
if isinstance(e, MissingKey):
print(e)
else:
pass
elif engineitem == 'google-certificates':
print('\033[94m[*] Searching Google Certificate transparency report. \033[0m')
search = googlecertificates.SearchGoogleCertificates(word, limit, start)
search.process()
hosts = filter(search.get_domains())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'google-certificates')
elif engineitem == 'google-profiles':
print('\033[94m[*] Searching Google profiles. \033[0m')
search = googlesearch.search_google(word, limit, start)
search.process_profiles()
people = search.get_profiles()
db = stash.stash_manager()
db.store_all(word, people, 'name', 'google-profile')
if len(people) == 0:
print('\n[*] No users found.\n\n')
else:
print('\n[*] Users found: ' + str(len(people)))
print('---------------------')
for user in sorted(list(set(people))):
print(user)
2019-01-11 15:21:45 +08:00
sys.exit(0)
elif engineitem == 'hunter':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Hunter. \033[0m')
2018-11-11 22:24:58 +08:00
from discovery import huntersearch
2018-12-27 15:53:12 +08:00
# Import locally or won't work.
try:
search = huntersearch.SearchHunter(word, limit, start)
search.process()
emails = filter(search.get_emails())
all_emails.extend(emails)
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'hunter')
db.store_all(word, all_emails, 'email', 'hunter')
except Exception as e:
if isinstance(e, MissingKey):
print(e)
else:
pass
2018-11-11 22:24:58 +08:00
elif engineitem == 'linkedin':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Linkedin. \033[0m')
search = linkedinsearch.SearchLinkedin(word, limit)
2018-12-23 04:29:11 +08:00
search.process()
people = search.get_people()
db = stash.stash_manager()
db.store_all(word, people, 'name', 'linkedin')
2019-01-11 15:21:45 +08:00
if len(people) == 0:
print('\n[*] No users found.\n\n')
else:
print('\n[*] Users found: ' + str(len(people)))
print('---------------------')
for user in sorted(list(set(people))):
print(user)
sys.exit(0)
2018-12-23 04:29:11 +08:00
elif engineitem == 'netcraft':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Netcraft. \033[0m')
search = netcraft.SearchNetcraft(word)
2018-12-01 04:57:12 +08:00
search.process()
hosts = filter(search.get_hostnames())
2018-12-18 07:14:42 +08:00
all_hosts.extend(hosts)
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'netcraft')
2018-12-20 03:39:33 +08:00
elif engineitem == 'pgp':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching PGP key server. \033[0m')
try:
search = pgpsearch.SearchPgp(word)
search.process()
all_emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'pgp')
db.store_all(word, all_emails, 'email', 'pgp')
except Exception:
pass
2018-12-23 04:29:11 +08:00
elif engineitem == 'securityTrails':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching SecurityTrails. \033[0m')
from discovery import securitytrailssearch
try:
2019-01-12 04:40:35 +08:00
search = securitytrailssearch.search_securitytrail(word)
search.process()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, hosts, 'host', 'securityTrails')
ips = search.get_ips()
all_ip.extend(ips)
db = stash.stash_manager()
db.store_all(word, ips, 'ip', 'securityTrails')
except Exception as e:
if isinstance(e, MissingKey):
print(e)
else:
pass
elif engineitem == 'threatcrowd':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Threatcrowd. \033[0m')
try:
search = threatcrowd.search_threatcrowd(word)
search.process()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
2019-01-06 13:14:46 +08:00
db.store_all(word, all_hosts, 'host', 'threatcrowd')
except Exception:
pass
2018-12-16 11:07:37 +08:00
elif engineitem == 'trello':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Trello. \033[0m')
from discovery import trello
2018-12-27 15:43:32 +08:00
# Import locally or won't work.
search = trello.search_trello(word, limit)
search.process()
emails = filter(search.get_emails())
all_emails.extend(emails)
info = search.get_urls()
hosts = filter(info[0])
trello_info = (info[1], True)
all_hosts.extend(hosts)
2018-12-20 03:39:33 +08:00
db = stash.stash_manager()
db.store_all(word, hosts, 'host', 'trello')
db.store_all(word, emails, 'email', 'trello')
2018-12-16 11:07:37 +08:00
elif engineitem == 'twitter':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Twitter. \033[0m')
2018-12-23 04:29:11 +08:00
search = twittersearch.search_twitter(word, limit)
search.process()
people = search.get_people()
2018-12-20 03:39:33 +08:00
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, people, 'name', 'twitter')
2019-01-12 04:40:35 +08:00
if len(people) == 0:
print('\n[*] No users found.\n\n')
else:
print('\n[*] Users found: ' + str(len(people)))
print('---------------------')
for user in sorted(list(set(people))):
print(user)
sys.exit(0)
2018-12-16 11:07:37 +08:00
2018-12-23 04:29:11 +08:00
# vhost
2018-12-16 11:07:37 +08:00
elif engineitem == 'virustotal':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching VirusTotal. \033[0m')
2018-12-23 04:29:11 +08:00
search = virustotal.search_virustotal(word)
search.process()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'virustotal')
2018-12-16 11:07:37 +08:00
elif engineitem == 'yahoo':
2019-01-11 15:21:45 +08:00
print('\033[94m[*] Searching Yahoo. \033[0m')
2018-12-23 04:29:11 +08:00
search = yahoosearch.search_yahoo(word, limit)
search.process()
hosts = search.get_hostnames()
emails = search.get_emails()
all_hosts.extend(filter(hosts))
all_emails.extend(filter(emails))
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'yahoo')
db.store_all(word, all_emails, 'email', 'yahoo')
elif engineitem == 'all':
print(('Full harvest on ' + word))
all_emails = []
all_hosts = []
try:
print('[*] Searching Baidu.')
search = baidusearch.SearchBaidu(word, limit)
search.process()
all_emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'baidu')
db.store_all(word, all_emails, 'email', 'baidu')
except Exception:
pass
2018-12-23 04:29:11 +08:00
print('[*] Searching Bing.')
bingapi = 'no'
search = bingsearch.SearchBing(word, limit, start)
2018-12-23 04:29:11 +08:00
search.process(bingapi)
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
2018-12-16 11:07:37 +08:00
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'bing')
all_emails.extend(emails)
2018-12-23 04:29:11 +08:00
all_emails = sorted(set(all_emails))
db.store_all(word, all_emails, 'email', 'bing')
2018-12-16 11:07:37 +08:00
print('[*] Searching Censys.')
2018-12-23 04:29:11 +08:00
from discovery import censys
search = censys.SearchCensys(word, limit)
search.process()
ips = search.get_ipaddresses()
setips = set(ips)
2019-01-11 11:56:49 +08:00
uniqueips = list(setips) # Remove duplicates.
all_ip.extend(uniqueips)
hosts = filter(search.get_hostnames())
sethosts = set(hosts)
2019-01-11 11:56:49 +08:00
uniquehosts = list(sethosts) # Remove duplicates.
all_hosts.extend(uniquehosts)
2018-12-16 11:07:37 +08:00
db = stash.stash_manager()
db.store_all(word, uniquehosts, 'host', 'censys')
db.store_all(word, uniqueips, 'ip', 'censys')
print('[*] Searching CRT.sh.')
search = crtsh.search_crtsh(word)
search.process()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
2018-12-16 11:07:37 +08:00
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'CRTsh')
2018-12-23 04:29:11 +08:00
# cymon
2018-11-11 22:24:58 +08:00
2018-12-23 04:29:11 +08:00
# dogpile
print('[*] Searching DuckDuckGo.')
from discovery import duckduckgosearch
search = duckduckgosearch.SearchDuckDuckGo(word, limit)
search.process()
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
all_emails.extend(emails)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'email', 'duckduckgo')
db.store_all(word, all_hosts, 'host', 'duckduckgo')
print('[*] Searching Google.')
2018-12-23 04:29:11 +08:00
search = googlesearch.search_google(word, limit, start)
search.process(google_dorking)
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
2018-12-23 04:29:11 +08:00
all_emails.extend(emails)
db = stash.stash_manager()
db.store_all(word, all_emails, 'email', 'google')
all_hosts.extend(hosts)
2018-12-16 11:07:37 +08:00
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'google')
print('[*] Searching Google Certificate transparency report.')
2019-01-12 04:40:35 +08:00
search = googlecertificates.SearchGoogleCertificates(word, limit, start)
2018-12-23 04:29:11 +08:00
search.process()
domains = filter(search.get_domains())
2018-12-23 04:29:11 +08:00
all_hosts.extend(domains)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'google-certificates')
2018-12-23 04:29:11 +08:00
try:
print('[*] Searching Google profiles.')
search = googlesearch.search_google(word, limit, start)
search.process_profiles()
people = search.get_profiles()
db = stash.stash_manager()
db.store_all(word, people, 'name', 'google-profile')
print('\nUsers from Google profiles:')
print('---------------------------')
for users in people:
print(users)
except Exception:
pass
2018-11-03 07:04:20 +08:00
print('[*] Searching Hunter.')
2018-11-11 22:24:58 +08:00
from discovery import huntersearch
2018-12-27 15:43:32 +08:00
# Import locally.
try:
search = huntersearch.SearchHunter(word, limit, start)
search.process()
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, hosts, 'host', 'hunter')
all_emails.extend(emails)
all_emails = sorted(set(all_emails))
db.store_all(word, all_emails, 'email', 'hunter')
except Exception as e:
if isinstance(e, MissingKey):
print(e)
else:
pass
2018-12-27 15:43:32 +08:00
2018-12-23 04:29:11 +08:00
# linkedin
print('[*] Searching Netcraft.')
search = netcraft.SearchNetcraft(word)
search.process()
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'netcraft')
print('[*] Searching PGP key server.')
try:
search = pgpsearch.SearchPgp(word)
search.process()
emails = filter(search.get_emails())
hosts = filter(search.get_hostnames())
sethosts = set(hosts)
2019-01-11 11:56:49 +08:00
uniquehosts = list(sethosts) # Remove duplicates.
all_hosts.extend(uniquehosts)
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'PGP')
all_emails.extend(emails)
db = stash.stash_manager()
db.store_all(word, all_emails, 'email', 'PGP')
except Exception:
pass
2018-11-23 05:20:06 +08:00
print('[*] Searching Threatcrowd.')
2018-12-23 04:29:11 +08:00
try:
search = threatcrowd.search_threatcrowd(word)
search.process()
hosts = filter(search.get_hostnames())
2018-12-23 04:29:11 +08:00
all_hosts.extend(hosts)
db = stash.stash_manager()
2019-01-06 13:14:46 +08:00
db.store_all(word, all_hosts, 'host', 'threatcrowd')
except Exception:
pass
2018-12-23 04:29:11 +08:00
print('[*] Searching Trello.')
from discovery import trello
2018-12-27 15:43:32 +08:00
# Import locally or won't work.
search = trello.search_trello(word, limit)
search.process()
emails = filter(search.get_emails())
all_emails.extend(emails)
info = search.get_urls()
hosts = filter(info[0])
trello_info = (info[1], True)
all_hosts.extend(hosts)
db = stash.stash_manager()
db.store_all(word, hosts, 'host', 'trello')
db.store_all(word, emails, 'email', 'trello')
try:
print('[*] Searching Twitter.')
search = twittersearch.search_twitter(word, limit)
search.process()
people = search.get_people()
db = stash.stash_manager()
db.store_all(word, people, 'name', 'twitter')
print('\nUsers from Twitter:')
print('-------------------')
for user in people:
print(user)
except Exception:
pass
2018-12-23 04:29:11 +08:00
# vhost
print('[*] Searching VirusTotal.')
2018-12-23 04:29:11 +08:00
search = virustotal.search_virustotal(word)
2018-12-23 02:46:27 +08:00
search.process()
2018-12-27 15:43:32 +08:00
hosts = filter(search.get_hostnames())
all_hosts.extend(hosts)
2018-12-23 02:46:27 +08:00
db = stash.stash_manager()
2018-12-23 04:29:11 +08:00
db.store_all(word, all_hosts, 'host', 'virustotal')
print('[*] Searching Yahoo.')
search = yahoosearch.search_yahoo(word, limit)
search.process()
hosts = search.get_hostnames()
emails = search.get_emails()
all_hosts.extend(filter(hosts))
all_emails.extend(filter(emails))
db = stash.stash_manager()
db.store_all(word, all_hosts, 'host', 'yahoo')
db.store_all(word, all_emails, 'email', 'yahoo')
else:
print('\033[93m[!] Invalid source.\n\n \033[0m')
sys.exit(1)
2018-11-11 22:24:58 +08:00
2018-12-27 15:43:32 +08:00
# Sanity check to see if all_emails and all_hosts are defined.
2018-11-23 05:20:06 +08:00
try:
all_emails
except NameError:
print('\n\n\033[93m[!] No emails found because all_emails is not defined.\n\n \033[0m')
2018-12-27 15:43:32 +08:00
sys.exit(1)
2018-11-23 05:20:06 +08:00
try:
all_hosts
except NameError:
print('\n\n\033[93m[!] No hosts found because all_hosts is not defined.\n\n \033[0m')
2018-12-27 15:43:32 +08:00
sys.exit(1)
2018-11-23 05:20:06 +08:00
# Results
if len(all_ip) == 0:
2019-01-11 15:21:45 +08:00
print('\n[*] No IPs found.')
else:
2019-01-11 15:21:45 +08:00
print('\n[*] IPs found: ' + str(len(all_ip)))
print('-------------------')
2019-01-13 05:49:05 +08:00
ips = sorted(ipaddress.ip_address(line.strip()) for line in all_ip)
print('\n'.join(map(str, ips)))
2019-01-11 15:21:45 +08:00
if len(all_emails) == 0:
print('\n[*] No emails found.')
else:
2019-01-11 15:21:45 +08:00
print('\n[*] Emails found: ' + str(len(all_emails)))
print('----------------------')
print(('\n'.join(sorted(list(set(all_emails))))))
2019-01-11 15:21:45 +08:00
if len(all_hosts) == 0:
print('\n[*] No hosts found.\n\n')
else:
2019-01-11 15:21:45 +08:00
print('\n[*] Hosts found: ' + str(len(all_hosts)))
print('---------------------')
all_hosts = sorted(list(set(all_hosts)))
full_host = hostchecker.Checker(all_hosts)
full = full_host.check()
for host in full:
2018-04-16 19:55:52 +08:00
ip = host.split(':')[1]
2018-11-23 05:20:06 +08:00
print(host)
if ip != 'empty':
if host_ip.count(ip.lower()):
pass
else:
host_ip.append(ip.lower())
2018-12-16 11:07:37 +08:00
2018-12-20 03:39:33 +08:00
db = stash.stash_manager()
db.store_all(word, host_ip, 'ip', 'DNS-resolver')
2019-01-11 10:09:47 +08:00
if trello_info[1] is True:
trello_urls = trello_info[0]
if trello_urls == []:
2019-01-11 15:21:45 +08:00
print('\n[*] No URLs found.')
else:
total = len(trello_urls)
2019-01-11 15:21:45 +08:00
print('\n[*] URLs found: ' + str(total))
print('--------------------')
for url in sorted(list(set(trello_urls))):
print(url)
2019-01-11 10:09:47 +08:00
# DNS brute force
dnsres = []
if dnsbrute is True:
print('\n[*] Starting DNS brute force.')
a = dnssearch.dns_force(word, dnsserver, verbose=True)
res = a.process()
print('\n[*] Hosts found after DNS brute force:')
print('-------------------------------------')
for y in res:
2018-11-23 05:20:06 +08:00
print(y)
dnsres.append(y.split(':')[0])
if y not in full:
full.append(y)
2018-12-16 11:07:37 +08:00
db = stash.stash_manager()
db.store_all(word, dnsres, 'host', 'dns_bruteforce')
2019-01-11 10:09:47 +08:00
# Port scanning
if ports_scanning is True:
print('\n\n[*] Scanning ports (active).\n')
2018-12-16 11:07:37 +08:00
for x in full:
host = x.split(':')[1]
domain = x.split(':')[0]
if host != 'empty':
print(('[*] Scanning ' + host))
2018-12-27 15:43:32 +08:00
ports = [21, 22, 80, 443, 8080]
2018-12-16 11:07:37 +08:00
try:
2019-01-01 10:38:32 +08:00
scan = port_scanner.PortScan(host, ports)
2018-12-16 11:07:37 +08:00
openports = scan.process()
if len(openports) > 1:
print(('\t[*] Detected open ports: ' + ','.join(str(e) for e in openports)))
2018-12-16 11:07:37 +08:00
takeover_check = 'True'
if takeover_check == 'True':
if len(openports) > 0:
search_take = takeover.take_over(domain)
search_take.process()
except Exception as e:
print(e)
# DNS reverse lookup
dnsrev = []
if dnslookup is True:
print('\n[*] Starting active queries.')
analyzed_ranges = []
2018-04-16 19:55:52 +08:00
for x in host_ip:
2018-11-23 05:20:06 +08:00
print(x)
ip = x.split(':')[0]
range = ip.split('.')
range[3] = '0/24'
2018-11-23 05:20:06 +08:00
s = '.'
range = s.join(range)
if not analyzed_ranges.count(range):
print('[*] Performing reverse lookup in ' + range)
a = dnssearch.dns_reverse(range, True)
a.list()
res = a.process()
analyzed_ranges.append(range)
else:
continue
for x in res:
if x.count(word):
dnsrev.append(x)
if x not in full:
full.append(x)
print('Hosts found after reverse lookup (in target domain):')
print('----------------------------------------------------')
for xh in dnsrev:
2018-11-23 05:20:06 +08:00
print(xh)
2018-12-16 11:07:37 +08:00
# DNS TLD expansion
dnstldres = []
if dnstld is True:
print('[*] Starting DNS TLD expansion.')
a = dnssearch.dns_tld(word, dnsserver, verbose=True)
res = a.process()
print('\n[*] Hosts found after DNS TLD expansion:')
print('----------------------------------------')
for y in res:
2018-11-23 05:20:06 +08:00
print(y)
dnstldres.append(y)
if y not in full:
full.append(y)
# Virtual hosts search
if virtual == 'basic':
print('\n[*] Virtual hosts:')
print('------------------')
for l in host_ip:
search = bingsearch.SearchBing(l, limit, start)
search.process_vhost()
res = search.get_allhostnames()
for x in res:
2018-12-16 11:07:37 +08:00
x = re.sub(r'[[\<\/?]*[\w]*>]*', '', x)
x = re.sub('<', '', x)
x = re.sub('>', '', x)
print((l + '\t' + x))
vhost.append(l + ':' + x)
full.append(l + ':' + x)
2018-12-16 11:07:37 +08:00
vhost = sorted(set(vhost))
else:
pass
2018-12-27 15:43:32 +08:00
2019-01-11 10:09:47 +08:00
# Shodan
shodanres = []
2019-01-05 00:28:11 +08:00
import texttable
tab = texttable.Texttable()
header = ['IP address', 'Hostname', 'Org', 'Services:Ports', 'Technologies']
2019-01-05 00:28:11 +08:00
tab.header(header)
tab.set_cols_align(['c', 'c', 'c', 'c', 'c'])
tab.set_cols_valign(['m', 'm', 'm', 'm', 'm'])
2019-01-05 00:28:11 +08:00
tab.set_chars(['-', '|', '+', '#'])
tab.set_cols_width([15, 20, 15, 15, 18])
host_ip = list(set(host_ip))
2019-01-01 07:37:47 +08:00
if shodan is True:
print('\n\n[*] Shodan DB search (passive):\n')
2019-01-05 00:28:11 +08:00
try:
for ip in host_ip:
print(('\tSearching for: ' + ip))
2019-01-05 00:28:11 +08:00
shodan = shodansearch.search_shodan()
rowdata = shodan.search_ip(ip)
time.sleep(2)
tab.add_row(rowdata)
printedtable = tab.draw()
print('\n [*] Shodan results:')
print('-------------------')
2019-01-05 00:28:11 +08:00
print(printedtable)
except Exception as e:
print(f'[!] Error occurred in theHarvester - Shodan search module: {e}')
else:
pass
2018-12-23 04:29:11 +08:00
# Here we need to add explosion mode.
2019-01-11 10:09:47 +08:00
# We have to take out the TLDs to do this.
recursion = None
if recursion:
start = 0
for word in vhost:
search = googlesearch.search_google(word, limit, start)
search.process(google_dorking)
emails = search.get_emails()
hosts = search.get_hostnames()
2018-11-23 05:20:06 +08:00
print(emails)
print(hosts)
else:
pass
# Reporting
if filename != "":
try:
print('NEW REPORTING BEGINS.')
2018-12-16 01:22:02 +08:00
db = stash.stash_manager()
scanboarddata = db.getscanboarddata()
latestscanresults = db.getlatestscanresults(word)
2019-01-11 11:56:49 +08:00
previousscanresults = db.getlatestscanresults(word, previousday=True)
latestscanchartdata = db.latestscanchartdata(word)
scanhistorydomain = db.getscanhistorydomain(word)
pluginscanstatistics = db.getpluginscanstatistics()
2018-12-16 01:22:02 +08:00
generator = statichtmlgenerator.htmlgenerator(word)
HTMLcode = generator.beginhtml()
HTMLcode += generator.generatelatestscanresults(latestscanresults)
2019-01-11 11:56:49 +08:00
HTMLcode += generator.generatepreviousscanresults(previousscanresults)
2018-12-16 01:22:02 +08:00
graph = reportgraph.graphgenerator(word)
HTMLcode += graph.drawlatestscangraph(word, latestscanchartdata)
2019-01-11 11:56:49 +08:00
HTMLcode += graph.drawscattergraphscanhistory(word, scanhistorydomain)
HTMLcode += generator.generatepluginscanstatistics(pluginscanstatistics)
HTMLcode += generator.generatedashboardcode(scanboarddata)
HTMLcode += '<p><span style="color: #000000;">Report generated on ' + str(
datetime.datetime.now()) + '</span></p>'
2018-12-20 03:39:33 +08:00
HTMLcode += '''
</body>
</html>
'''
Html_file = open('report.html', 'w')
2018-12-16 01:22:02 +08:00
Html_file.write(HTMLcode)
Html_file.close()
print('NEW REPORTING FINISHED!')
print('[*] Saving files.')
html = htmlExport.htmlExport(
all_emails,
full,
vhost,
dnsres,
dnsrev,
filename,
word,
shodanres,
dnstldres)
save = html.writehtml()
except Exception as e:
2018-11-23 05:20:06 +08:00
print(e)
print('Error creating the file.')
try:
filename = filename.split('.')[0] + '.xml'
file = open(filename, 'w')
file.write('<?xml version="1.0" encoding="UTF-8"?><theHarvester>')
for x in all_emails:
file.write('<email>' + x + '</email>')
for x in full:
x = x.split(':')
if len(x) == 2:
2019-01-05 00:28:11 +08:00
file.write(
'<host>' + '<ip>' + x[1] + '</ip><hostname>' + x[0] + '</hostname>' + '</host>')
else:
file.write('<host>' + x + '</host>')
for x in vhost:
x = x.split(':')
if len(x) == 2:
2019-01-05 00:28:11 +08:00
file.write(
'<vhost>' + '<ip>' + x[1] + '</ip><hostname>' + x[0] + '</hostname>' + '</vhost>')
else:
file.write('<vhost>' + x + '</vhost>')
if shodanres != []:
shodanalysis = []
for x in shodanres:
res = x.split('SAPO')
file.write('<shodan>')
file.write('<host>' + res[0] + '</host>')
file.write('<port>' + res[2] + '</port>')
file.write('<banner><!--' + res[1] + '--></banner>')
reg_server = re.compile('Server:.*')
temp = reg_server.findall(res[1])
if temp != []:
shodanalysis.append(res[0] + ':' + temp[0])
file.write('</shodan>')
if shodanalysis != []:
2018-12-16 11:07:37 +08:00
shodanalysis = sorted(set(shodanalysis))
file.write('<servers>')
for x in shodanalysis:
file.write('<server>' + x + '</server>')
file.write('</servers>')
2018-12-23 04:29:11 +08:00
file.write('</theHarvester>')
2016-03-05 23:25:44 +08:00
file.flush()
file.close()
print('Files saved!')
except Exception as er:
print(f'Error saving XML file: {er}')
2019-01-11 15:21:45 +08:00
print('\n\n')
sys.exit(0)
2018-12-16 11:07:37 +08:00
if __name__ == '__main__':
try:
start()
except KeyboardInterrupt:
print('\n\n\033[93m[!] ctrl+c detected from user, quitting.\n\n \033[0m')
2018-11-23 05:20:06 +08:00
except Exception:
import traceback
print(traceback.print_exc())
2019-01-14 02:48:47 +08:00
sys.exit(1)