OSINT scan & minor refactor

This commit is contained in:
sundowndev 2018-11-21 00:33:01 +01:00
parent b7929a45c2
commit 4adb27213f
1 changed files with 129 additions and 39 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
__version__ = '0.6-dev' __version__ = '0.8-dev'
def banner(): def banner():
print " ___ _ _____ __ " print " ___ _ _____ __ "
@ -11,10 +11,11 @@ def banner():
print " |___/ " print " |___/ "
print " PhoneInfoga Ver. %s " % __version__ print " PhoneInfoga Ver. %s " % __version__
print " Coded by Sundowndev " print " Coded by Sundowndev "
print "\n"
print "\n \033[92m" print "\n \033[92m"
banner() banner()
print "\033[94m\n" print "\033[94m"
import sys import sys
import argparse import argparse
@ -52,15 +53,22 @@ if args.update:
print 'update' print 'update'
sys.exit() sys.exit()
import requests import time
import hashlib import hashlib
import json import json
from bs4 import BeautifulSoup
import re import re
import phonenumbers
from phonenumbers import carrier try:
from phonenumbers import geocoder import requests
from phonenumbers import timezone from bs4 import BeautifulSoup
import html5lib
import phonenumbers
from phonenumbers import carrier
from phonenumbers import geocoder
from phonenumbers import timezone
from googlesearch import search
except:
print code_error + 'Missing requirements. Try running pip install -r requirements.txt'
scanners = ['any', 'all', 'numverify', 'ovh'] scanners = ['any', 'all', 'numverify', 'ovh']
@ -83,10 +91,13 @@ def localScan(number):
return False return False
PhoneNumber['full'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace('+', '') PhoneNumber['full'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace('+', '')
PhoneNumber['country'] = 'FR'
PhoneNumber['countryCode'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0] PhoneNumber['countryCode'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0]
PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '') PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '')
PhoneNumber['international'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
print code_result + 'Local format: (0)%s' % PhoneNumber['number'] print code_result + 'International format: %s' % PhoneNumber['international']
print code_result + 'Local format: 0%s' % PhoneNumber['number']
print code_result + 'Country code: %s' % PhoneNumber['countryCode'] print code_result + 'Country code: %s' % PhoneNumber['countryCode']
print code_result + 'Location: %s' % geocoder.description_for_number(PhoneNumberObject, "en") print code_result + 'Location: %s' % geocoder.description_for_number(PhoneNumberObject, "en")
print code_result + 'Carrier: %s' % carrier.name_for_number(PhoneNumberObject, 'en') print code_result + 'Carrier: %s' % carrier.name_for_number(PhoneNumberObject, 'en')
@ -159,15 +170,13 @@ def numverifyScan(PhoneNumber):
elif data["line_type"] == 'mobile': elif data["line_type"] == 'mobile':
print(code_warning + "This is most likely a mobile, but it can still be a VoIP.") print(code_warning + "This is most likely a mobile, but it can still be a VoIP.")
def ovhScan(countryCode, number): def ovhScan(country, 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...'
#cc querystring = { "country": country.lower() }
querystring = {"country":"fr"}
headers = { headers = {
'accept': "application/json", 'accept': "application/json",
@ -187,39 +196,119 @@ def ovhScan(countryCode, number):
print(code_result + "Number range: " + voip_number['number']) print(code_result + "Number range: " + voip_number['number'])
print(code_result + "City: " + voip_number['city']) print(code_result + "City: " + voip_number['city'])
print(code_result + "Zip code: " + voip_number['zipCode'] if voip_number['zipCode'] is not None else '') print(code_result + "Zip code: " + voip_number['zipCode'] if voip_number['zipCode'] is not None else '')
askForExit()
def osintScan(countryCode, number): def osintScan(countryCode, number, internationalNumber):
if not args.osint: if not args.osint:
return -1 return -1
from googlesearch import search
print code_info + 'Running OSINT reconnaissance...' print code_info + 'Running OSINT footprint reconnaissance...'
# OSINT recon
# social profiles: facebook, twitter, linkedin, instagram
# websites
# emails
# Whitepages # Whitepages
print(code_info + "Searching for owner on 411.com...") print(code_info + "Generating scan URL on 411.com...")
#https://www.411.com/phone/33-6-79-36-82-33 print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-')
# Reputation try:
print(code_info + "Searching for reputation page on whosenumber.info...") # Social profiles: facebook, twitter, linkedin, instagram
for result in search('site:whosenumber.info intext:"%s" intitle:"who called"' % number, stop=1): print(code_info + "Searching for footprints on facebook.com... (limit=5)")
if result: for result in search('site:facebook.com intext:"%s" | "%s"' % (number,number), stop=5):
print(code_result + "Found 1 result on whosenumber.info.") if result:
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 + "Result found: " + result)
print(code_result + "URL: " + result)
# VoIP providers print(code_info + "Searching for footprints on twitter.com... (limit=5)")
print(code_info + "Searching for results on hs3x.com...") for result in search('site:twitter.com intext:"%s" | "%s"' % (number,number), stop=5):
for result in search('site:"hs3x.com" intext:"+%s"' % number, stop=1): if result:
if result: print(code_result + "Result found: " + 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_info + "Searching for footprints on linkedin.com... (limit=5)")
print(code_result + "URL: " + result) for result in search('site:linkedin.com intext:"%s" | "%s"' % (number,number), stop=5):
if result:
print(code_result + "Result found: " + result)
print(code_info + "Searching for footprints on instagram.com... (limit=5)")
for result in search('site:instagram.com intext:"%s" | "%s"' % (number,number), stop=5):
if result:
print(code_result + "Result found: " + result)
print code_warning + "Waiting 10 sec before sending new requests to avoid being blacklisted..."
time.sleep(10)
# Websites
#
# Documents
print(code_info + "Searching for documents... (limit=5)")
for result in search('intext:"%s" | intext:"%s" ext:doc | ext:docx | ext:odt | ext:pdf | ext:rtf | ext:sxw | ext:psw | ext:ppt | ext:pptx | ext:pps | ext:csv | ext:txt | ext:html' % (number,number), stop=5):
if result:
print(code_result + "Result found: " + result)
print code_warning + "Waiting 10 sec before sending new requests to avoid being blacklisted..."
time.sleep(10)
print(code_info + "Searching for documents on washington.edu... (limit=5)")
UWReq = search('site:washington.edu intext:"%s" | "%s"' % (number,number), stop=5)
if len(list(UWReq)) > 0:
print code_info + 'Found %s results' % len(list(UWReq))
for result in UWReq:
if result:
print(code_result + "Result found: " + result)
# Reputation
print(code_info + "Searching for reputation report on whosenumber.info... (limit=1)")
for result in search('site:whosenumber.info intext:"%s" intitle:"who called"' % number, stop=1):
if result:
print(code_result + "Found 1 result on whosenumber.info.")
print(code_info + "This usually mean 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 Phone Fraud footprints... (limit=5)")
for result in search('intitle:"Phone Fraud" intext:"%s" | "%s"' % (number,number), stop=5):
if result:
print(code_result + "Result found: " + result)
print(code_info + "This usually mean you are not the first to search about this number. Check the URL for eventual comments.")
# Temporary number providers
print(code_info + "Searching for results on hs3x.com... (limit=1)")
for result in search('site:"hs3x.com" intext:"+%s"' % number, stop=1):
if result:
print(code_result + "Found a temporary number provider: hs3x.com")
print(code_result + "URL: " + result)
askForExit()
print(code_info + "Searching for results on receive-sms-now.com... (limit=1)")
for result in search('site:"receive-sms-now.com" intext:"+%s"' % number, stop=1):
if result:
print(code_result + "Found a temporary number provider: receive-sms-now.com")
print(code_result + "URL: " + result)
askForExit()
print(code_info + "Searching for results on receive-sms-online.com... (limit=1)")
for result in search('site:"receive-sms-online.com" intext:"+%s"' % number, stop=1):
if result:
print(code_result + "Found a temporary number provider: receive-sms-online.com")
print(code_result + "URL: " + result)
askForExit()
except:
print code_error + 'Impossible to fetch Google search API. This usually mean you\'re temporary blacklisted.'
print(code_info + "Searching for phone number on tempophone.com...")
response = requests.request("GET", "https://tempophone.com/api/v1/phones")
data = json.loads(response.content)
for voip_number in data['objects']:
if voip_number['phone'] == formatNumber(number):
print(code_result + "Found a temporary number provider: tempophone.com")
askForExit()
def askForExit():
if not args.output:
user_input = raw_input(code_info + "Continue scanning ? (Y/n): ")
if user_input.lower() == 'n':
print code_info + "Good bye!"
sys.exit()
else:
return -1
def scanNumber(number): def scanNumber(number):
print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(number) print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(number)
@ -231,8 +320,8 @@ def scanNumber(number):
sys.exit() sys.exit()
numverifyScan(PhoneNumber['full']) numverifyScan(PhoneNumber['full'])
ovhScan(PhoneNumber['countryCode'], PhoneNumber['number']) # TODO: replace 1st parameter to be dynamic ovhScan(PhoneNumber['country'], PhoneNumber['number'])
osintScan(PhoneNumber['countryCode'], PhoneNumber['full']) osintScan(PhoneNumber['countryCode'], PhoneNumber['full'], PhoneNumber['international'])
print '\n' print '\n'
@ -249,6 +338,7 @@ if args.output:
code_title = '' code_title = ''
sys.stdout = args.output sys.stdout = args.output
banner()
else: else:
code_info = '\033[97m[*] ' code_info = '\033[97m[*] '
code_warning = '\033[93m(!) ' code_warning = '\033[93m(!) '