OSINT recon & output option

This commit is contained in:
sundowndev 2018-11-19 17:43:19 +01:00
parent 7cf19717cb
commit 369ee12fbc
1 changed files with 88 additions and 57 deletions

View File

@ -1,29 +1,23 @@
#!/usr/bin/env python #!/usr/bin/env python
__version__ = '0.4-dev' __version__ = '0.6-dev'
def banner():
print " ___ _ _____ __ "
print " / _ \ |__ ___ _ __ ___ \_ \_ __ / _| ___ __ _ __ _ "
print " / /_)/ '_ \ / _ \| '_ \ / _ \ / /\/ '_ \| |_ / _ \ / _` |/ _` |"
print " / ___/| | | | (_) | | | | __/\/ /_ | | | | _| (_) | (_| | (_| |"
print " \/ |_| |_|\___/|_| |_|\___\____/ |_| |_|_| \___/ \__, |\__,_|"
print " |___/ "
print " PhoneInfoga Ver. %s " % __version__
print " Coded by Sundowndev "
print "\n \033[92m" print "\n \033[92m"
print " ___ _ _____ __ " banner()
print " / _ \ |__ ___ _ __ ___ \_ \_ __ / _| ___ __ _ __ _ "
print " / /_)/ '_ \ / _ \| '_ \ / _ \ / /\/ '_ \| |_ / _ \ / _` |/ _` |"
print " / ___/| | | | (_) | | | | __/\/ /_ | | | | _| (_) | (_| | (_| |"
print " \/ |_| |_|\___/|_| |_|\___\____/ |_| |_|_| \___/ \__, |\__,_|"
print " |___/ "
print " PhoneInfoga Ver. %s " % __version__
print " Coded by Sundowndev "
print "\033[94m\n" print "\033[94m\n"
import requests
import sys import sys
import hashlib
import json
import argparse import argparse
from bs4 import BeautifulSoup
import re
import phonenumbers
from phonenumbers import carrier
from phonenumbers import geocoder
from phonenumbers import timezone
parser = argparse.ArgumentParser(description= parser = argparse.ArgumentParser(description=
"Advanced information gathering tool for phone numbers (https://github.com/sundowndev/PhoneInfoga) version %s" % __version__, "Advanced information gathering tool for phone numbers (https://github.com/sundowndev/PhoneInfoga) version %s" % __version__,
@ -32,10 +26,10 @@ parser = argparse.ArgumentParser(description=
parser.add_argument('-n', '--number', metavar='number', type=str, parser.add_argument('-n', '--number', metavar='number', type=str,
help='The phone number to scan (E164 or international format)') help='The phone number to scan (E164 or international format)')
parser.add_argument('-i', '--input', metavar="input_file", type=file, parser.add_argument('-i', '--input', metavar="input_file", type=argparse.FileType('r'),
help='Phone number list to scan (one per line)') help='Phone number list to scan (one per line)')
parser.add_argument('-o', '--output', metavar="output_file", type=file, parser.add_argument('-o', '--output', metavar="output_file", type=argparse.FileType('w'),
help='Output to save scan results') help='Output to save scan results')
parser.add_argument('-s', '--scanner', metavar="scanner", default="all", type=str, parser.add_argument('-s', '--scanner', metavar="scanner", default="all", type=str,
@ -52,20 +46,23 @@ args = parser.parse_args()
# If any param is passed, execute help command # If any param is passed, execute help command
if not len(sys.argv) > 1: if not len(sys.argv) > 1:
parser.print_help() parser.print_help()
sys.exit();
if args.update: if args.update:
print 'update' print 'update'
sys.exit() sys.exit()
scanners = ['any', 'all', 'numverify', 'ovh', 'voiplist'] import requests
import hashlib
import json
from bs4 import BeautifulSoup
import re
import phonenumbers
from phonenumbers import carrier
from phonenumbers import geocoder
from phonenumbers import timezone
code_info = '\033[97m[*] ' scanners = ['any', 'all', 'numverify', 'ovh']
code_warning = '\033[93m(!) '
code_result = '\033[1;32m[+] '
code_error = '\033[91m[!] '
def saveToOutput(output):
print 'save'
def formatNumber(number): def formatNumber(number):
return re.sub("(?:\+)?(?:[^[0-9]*)", "", number) return re.sub("(?:\+)?(?:[^[0-9]*)", "", number)
@ -157,15 +154,19 @@ def numverifyScan(PhoneNumber):
print(code_result + "Line type: %s") % data["line_type"] print(code_result + "Line type: %s") % data["line_type"]
if data["line_type"] == 'landline': if data["line_type"] == 'landline':
print(code_warning + "This is most likely a landline, or a fixed VoIP.") print(code_warning + "This is most likely a land line, or a fixed VoIP.")
elif data["line_type"] == 'mobile':
print(code_warning + "This is most likely a mobile, or a VoIP.")
def ovhScan(country, number): def ovhScan(countryCode, number):
if not args.scanner == 'ovh' and not args.scanner == 'all': if not args.scanner == 'ovh' and not args.scanner == 'all':
return -1 return -1
print code_info + 'Running OVH scan...' print code_info + 'Running OVH scan...'
querystring = {"country":country} #cc
querystring = {"country":"fr"}
headers = { headers = {
'accept': "application/json", 'accept': "application/json",
@ -176,46 +177,63 @@ def ovhScan(country, number):
data = json.loads(response.content) data = json.loads(response.content)
def whosenumberScan(countryCode, number): if isinstance(data, list):
if not args.scanner == 'whosenumber' and not args.scanner == 'all': askedNumber = "0" + number.replace(number[-4:], 'xxxx')
return -1
print code_info + 'Running Whosenumber scan...' for voip_number in data:
print 'https://whosenumber.info/' + countryCode + number if voip_number['number'] == askedNumber:
print(code_info + "1 result found in OVH database")
def repScan(countryCode, number): print(code_result + "Number range: " + voip_number['number'])
if not args.scanner == '411' and not args.scanner == 'all': print(code_result + "City: " + voip_number['city'])
return -1 print(code_result + "Zip code: " + voip_number['zipCode'] if voip_number['zipCode'] is not None else '')
print code_info + 'Running 411.com scan...'
print 'https://www.411.com/phone/%s-%s' % (countryCode,number)
def voiplistScan(number):
print code_info + 'Running VoIP list scan...'
# voip search
def osintScan(countryCode, number): def osintScan(countryCode, number):
print code_info + 'Running OSINT scan...' if not args.osint:
return -1
import urllib
from googlesearch import search
print code_info + 'Running OSINT reconnaissance...'
# OSINT recon # OSINT recon
# social profiles # social profiles: facebook, twitter, linkedin, instagram
# websites # websites
# emails # emails
#social
#rep
#whitepages
#voip providers
print(code_info + "Searching for owner on 411.com...")
#https://www.411.com/phone/33-6-79-36-82-33
print(code_info + "Searching for reputation page on whosenumber.info...")
for result in search('site:whosenumber.info intext:"%s" intitle:"who called"' % number, stop=20):
if result:
print(code_result + "Found 1 result on whosenumber.info.")
print(code_info + "This usually means you are not the first to search about this number. Check the URL for eventual comments.")
print(code_result + "URL: " + result)
print(code_info + "Searching for results on hs3x.com...")
for result in search('site:"hs3x.com" intext:"+%s"' % number, stop=20):
if result:
print(code_result + "Found 1 result on hs3x.com.")
print(code_info + "This number seems to be a VoIP number from hs3x.")
print(code_result + "URL: " + result)
def scanNumber(number): def scanNumber(number):
print "\033[1m\033[93m[!] ---- Fetching informations for %s ---- [!]" % number print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(number)
PhoneNumber = localScan(number) PhoneNumber = localScan(number)
if not PhoneNumber: if not PhoneNumber:
print(code_error + "Error: number " + number + " is not valid. Skipping.") print(code_error + "Error: number " + formatNumber(number) + " is not valid. Skipping.")
sys.exit() sys.exit()
numverifyScan(PhoneNumber['full']) numverifyScan(PhoneNumber['full'])
ovhScan('fr', PhoneNumber['full']) # TODO: replace 1st parameter to be dynamic ovhScan(PhoneNumber['countryCode'], PhoneNumber['number']) # TODO: replace 1st parameter to be dynamic
#whosenumberScan(PhoneNumber['countryCode'], PhoneNumber['number'])
#repScan(PhoneNumber['countryCode'], PhoneNumber['number'])
voiplistScan(PhoneNumber['full'])
osintScan(PhoneNumber['countryCode'], PhoneNumber['full']) osintScan(PhoneNumber['countryCode'], PhoneNumber['full'])
print '\n' print '\n'
@ -225,6 +243,21 @@ if not args.scanner in scanners:
print(code_error + "Error: scanner doesn't exists.") print(code_error + "Error: scanner doesn't exists.")
sys.exit() sys.exit()
if args.output:
code_info = '[*] '
code_warning = '(!) '
code_result = '[+] '
code_error = '[!] '
code_title = ''
sys.stdout = args.output
else:
code_info = '\033[97m[*] '
code_warning = '\033[93m(!) '
code_result = '\033[1;32m[+] '
code_error = '\033[91m[!] '
code_title = '\033[1m\033[93m'
if args.number: if args.number:
scanNumber(args.number) scanNumber(args.number)
elif args.input: elif args.input:
@ -232,6 +265,4 @@ elif args.input:
scanNumber(line) scanNumber(line)
if args.output: if args.output:
args.output.write("Hello World")
args.output.close() args.output.close()