OSINT scan & minor refactor
This commit is contained in:
parent
b7929a45c2
commit
4adb27213f
168
phoneinfoga.py
168
phoneinfoga.py
|
|
@ -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(!) '
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue