From b7929a45c2236689c1d5ab1606a1fe80fe54a407 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Wed, 21 Nov 2018 00:32:45 +0100 Subject: [PATCH 01/30] Requirements --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index feaee98..02ae170 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ requests -ovh bs4 html5lib phonenumbers From 4adb27213f7a1560cfde9274dfb5ab3f98873006 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Wed, 21 Nov 2018 00:33:01 +0100 Subject: [PATCH 02/30] OSINT scan & minor refactor --- phoneinfoga.py | 168 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 129 insertions(+), 39 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index 0b98fd2..1ccbaa7 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -__version__ = '0.6-dev' +__version__ = '0.8-dev' def banner(): print " ___ _ _____ __ " @@ -11,10 +11,11 @@ def banner(): print " |___/ " print " PhoneInfoga Ver. %s " % __version__ print " Coded by Sundowndev " + print "\n" print "\n \033[92m" banner() -print "\033[94m\n" +print "\033[94m" import sys import argparse @@ -52,15 +53,22 @@ if args.update: print 'update' sys.exit() -import requests +import time import hashlib import json -from bs4 import BeautifulSoup import re -import phonenumbers -from phonenumbers import carrier -from phonenumbers import geocoder -from phonenumbers import timezone + +try: + import requests + 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'] @@ -83,10 +91,13 @@ def localScan(number): return False 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['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 + 'Location: %s' % geocoder.description_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': 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': return -1 print code_info + 'Running OVH scan...' - #cc - - querystring = {"country":"fr"} + querystring = { "country": country.lower() } headers = { 'accept': "application/json", @@ -187,39 +196,119 @@ def ovhScan(countryCode, number): print(code_result + "Number range: " + voip_number['number']) print(code_result + "City: " + voip_number['city']) 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: return -1 - from googlesearch import search - print code_info + 'Running OSINT reconnaissance...' - # OSINT recon - - # social profiles: facebook, twitter, linkedin, instagram - # websites - # emails + print code_info + 'Running OSINT footprint reconnaissance...' # Whitepages - print(code_info + "Searching for owner on 411.com...") - #https://www.411.com/phone/33-6-79-36-82-33 + print(code_info + "Generating scan URL on 411.com...") + print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-') - # Reputation - print(code_info + "Searching for reputation page on whosenumber.info...") - 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 means you are not the first to search about this number. Check the URL for eventual comments.") - print(code_result + "URL: " + result) + try: + # Social profiles: facebook, twitter, linkedin, instagram + print(code_info + "Searching for footprints on facebook.com... (limit=5)") + for result in search('site:facebook.com intext:"%s" | "%s"' % (number,number), stop=5): + if result: + print(code_result + "Result found: " + result) - # VoIP providers - print(code_info + "Searching for results on hs3x.com...") - for result in search('site:"hs3x.com" intext:"+%s"' % number, stop=1): - 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) + print(code_info + "Searching for footprints on twitter.com... (limit=5)") + for result in search('site:twitter.com intext:"%s" | "%s"' % (number,number), stop=5): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Searching for footprints on linkedin.com... (limit=5)") + 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): print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(number) @@ -231,8 +320,8 @@ def scanNumber(number): sys.exit() numverifyScan(PhoneNumber['full']) - ovhScan(PhoneNumber['countryCode'], PhoneNumber['number']) # TODO: replace 1st parameter to be dynamic - osintScan(PhoneNumber['countryCode'], PhoneNumber['full']) + ovhScan(PhoneNumber['country'], PhoneNumber['number']) + osintScan(PhoneNumber['countryCode'], PhoneNumber['full'], PhoneNumber['international']) print '\n' @@ -249,6 +338,7 @@ if args.output: code_title = '' sys.stdout = args.output + banner() else: code_info = '\033[97m[*] ' code_warning = '\033[93m(!) ' From 9dc719804fee99b106622edc4ef7c988dcdfb748 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Wed, 21 Nov 2018 16:53:41 +0100 Subject: [PATCH 03/30] Parse country code for OVH scanner --- phoneinfoga.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index 1ccbaa7..e552350 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -91,8 +91,11 @@ def localScan(number): return False PhoneNumber['full'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace('+', '') - PhoneNumber['country'] = 'FR' PhoneNumber['countryCode'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0] + + countryRequest = json.loads(requests.request('GET', 'https://restcountries.eu/rest/v2/callingcode/%s' % PhoneNumber['countryCode'].replace('+', '')).content) + PhoneNumber['country'] = countryRequest[0]['alpha2Code'] + PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '') PhoneNumber['international'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL) From d7cc63a025669ddb41e186abe491961fb6692ba6 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Sun, 25 Nov 2018 21:19:58 +0100 Subject: [PATCH 04/30] Keyboard interrupt exception --- phoneinfoga.py | 83 ++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index e552350..42ce2d2 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -15,7 +15,6 @@ def banner(): print "\n \033[92m" banner() -print "\033[94m" import sys import argparse @@ -53,12 +52,11 @@ if args.update: print 'update' sys.exit() -import time -import hashlib -import json -import re - try: + import time + import hashlib + import json + import re import requests from bs4 import BeautifulSoup import html5lib @@ -67,8 +65,12 @@ try: from phonenumbers import geocoder from phonenumbers import timezone from googlesearch import search +except KeyboardInterrupt: + print '\033[91m[!] Exiting.' + sys.exit() except: - print code_error + 'Missing requirements. Try running pip install -r requirements.txt' + print '\033[91m[!] Missing requirements. Try running pip install -r requirements.txt' + sys.exit() scanners = ['any', 'all', 'numverify', 'ovh'] @@ -95,7 +97,7 @@ def localScan(number): countryRequest = json.loads(requests.request('GET', 'https://restcountries.eu/rest/v2/callingcode/%s' % PhoneNumber['countryCode'].replace('+', '')).content) PhoneNumber['country'] = countryRequest[0]['alpha2Code'] - + PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '') PhoneNumber['international'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL) @@ -205,7 +207,6 @@ def osintScan(countryCode, number, internationalNumber): if not args.osint: return -1 - print code_info + 'Running OSINT footprint reconnaissance...' # Whitepages @@ -305,9 +306,9 @@ def osintScan(countryCode, number, internationalNumber): def askForExit(): if not args.output: - user_input = raw_input(code_info + "Continue scanning ? (Y/n): ") + user_input = raw_input(code_info + "Continue scanning ? (Y/n) ") - if user_input.lower() == 'n': + if user_input.lower() == 'n' or user_input.lower() == 'no': print code_info + "Good bye!" sys.exit() else: @@ -328,32 +329,36 @@ def scanNumber(number): print '\n' -# Verify scanner option -if not args.scanner in scanners: - print(code_error + "Error: scanner doesn't exists.") +try: + if args.output: + code_info = '[*] ' + code_warning = '(!) ' + code_result = '[+] ' + code_error = '[!] ' + code_title = '' + + sys.stdout = args.output + banner() + else: + code_info = '\033[97m[*] ' + code_warning = '\033[93m(!) ' + code_result = '\033[1;32m[+] ' + code_error = '\033[91m[!] ' + code_title = '\033[1m\033[93m' + + # Verify scanner option + if not args.scanner in scanners: + print(code_error + "Error: scanner doesn't exists.") + sys.exit() + + if args.number: + scanNumber(args.number) + elif args.input: + for line in args.input.readlines(): + scanNumber(line) + + if args.output: + args.output.close() +except KeyboardInterrupt: + print code_info + "Scan interrupted. Good bye!" sys.exit() - -if args.output: - code_info = '[*] ' - code_warning = '(!) ' - code_result = '[+] ' - code_error = '[!] ' - code_title = '' - - sys.stdout = args.output - banner() -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: - scanNumber(args.number) -elif args.input: - for line in args.input.readlines(): - scanNumber(line) - -if args.output: - args.output.close() From c5f4205e344dd67f6017891a85da19df6ae6c148 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Wed, 28 Nov 2018 16:01:58 +0100 Subject: [PATCH 05/30] Example google request file --- example_google.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 example_google.py diff --git a/example_google.py b/example_google.py new file mode 100644 index 0000000..04224ed --- /dev/null +++ b/example_google.py @@ -0,0 +1,62 @@ +import requests,random + +uagent=[] +uagent.append("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14") +uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0") +uagent.append("Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3") +uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)") +uagent.append("Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.7 (KHTML, like Gecko) Comodo_Dragon/16.1.1.0 Chrome/16.0.912.63 Safari/535.7") +uagent.append("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)") +uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1") +uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") + +proxy=[] +proxy.append("118.97.125.150:8080") +proxy.append("212.23.250.46:80") +proxy.append("197.149.128.190:42868") +proxy.append("87.128.41.56:80",) +proxy.append("197.149.129.252:32486") +proxy.append("159.69.211.173:3128") +proxy.append("197.149.128.190:44655") +proxy.append("196.13.208.23:8080") +proxy.append("196.13.208.22:8080") +proxy.append("82.136.122.127:80") +proxy.append("178.60.28.98:9999") +proxy.append("41.60.1.102:80") +proxy.append("212.56.139.253:80") + +number = '49495363899' + +dorks=[] +dorks.append('site%3Anuminfo.net+intext%3A"luciusunegbu%40gmail.com"') +dorks.append('site%3A"hs3x.com"+intext%3A"%2B61437954897"') +dorks.append('site:facebook.com intext:"%s" | "%s"' % (number,number)) +dorks.append('site:twitter.com intext:"%s" | "%s"' % (number,number)) +dorks.append('site:linkedin.com intext:"%s" | "%s"' % (number,number)) +dorks.append('site:instagram.com intext:"%s" | "%s"' % (number,number)) +dorks.append('site:whosenumber.info intext:"%s" intitle:"who called"' % number) +dorks.append('site:"hs3x.com" intext:"+%s"' % number) +dorks.append('site:"receive-sms-now.com" intext:"+%s"' % number) +dorks.append('site:"receive-sms-online.com" intext:"+%s"' % number) + +for req in dorks: + chosenProxy = random.choice(proxy) + chosenUserAgent = random.choice(uagent) + + s = requests.Session() + proxies = {"http": chosenProxy} + headers = { + 'User-Agent': chosenUserAgent, + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-us,en;q=0.5', + 'Accept-Encoding': 'gzip,deflate', + 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', + 'Keep-Alive': '115', + 'Connection': 'keep-alive', + 'Cookie': 'Cookie: CGIC=Ij90ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSwqLyo7cT0wLjg; CONSENT=YES+RE.fr+20150809-08-0; 1P_JAR=2018-11-28-14; NID=148=aSdSHJz71rufCokaUC93nH3H7lOb8E7BNezDWV-PyyiHTXqWK5Y5hsvj7IAzhZAK04-QNTXjYoLXVu_eiAJkiE46DlNn6JjjgCtY-7Fr0I4JaH-PZRb7WFgSTjiFqh0fw2cCWyN69DeP92dzMd572tQW2Z1gPwno3xuPrYC1T64wOud1DjZDhVAZkpk6UkBrU0PBcnLWL7YdL6IbEaCQlAI9BwaxoH_eywPVyS9V; SID=uAYeu3gT23GCz-ktdGInQuOSf-5SSzl3Plw11-CwsEYY0mqJLSiv7tFKeRpB_5iz8SH5lg.; HSID=AZmH_ctAfs0XbWOCJ; SSID=A0PcRJSylWIxJYTq_; APISID=HHB2bKfJ-2ZUL5-R/Ac0GK3qtM8EHkloNw; SAPISID=wQoxetHBpyo4pJKE/A2P6DUM9zGnStpIVt; SIDCC=ABtHo-EhFAa2AJrJIUgRGtRooWyVK0bAwiQ4UgDmKamfe88xOYBXM47FoL5oZaTxR3H-eOp7-rE; OTZ=4671861_52_52_123900_48_436380; OGPC=873035776-8:; OGP=-873035776:; GOOGLE_ABUSE_EXEMPTION=ID=5f05257564a6b82d:TM=1543414930:C=r:IP=165.227.163.116-:S=APGng0vsERIFITaqUYe9u-Uu9E6iJxUx-g' + } + + r = s.get('https://www.google.com/search?q=%s&gws_rd=ssl' % req, headers=headers, proxies=proxies) + #print(r.text) + + print "%s\nRequested %s using Proxy %s\nUser-Agent: %s" % (r, req, chosenProxy, chosenUserAgent) From 8d1c269b2c01d73080c4d5e57131051e399e8adb Mon Sep 17 00:00:00 2001 From: sundowndev Date: Wed, 28 Nov 2018 16:02:34 +0100 Subject: [PATCH 06/30] Minor refactor --- phoneinfoga.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index e552350..7203cfa 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -95,7 +95,7 @@ def localScan(number): countryRequest = json.loads(requests.request('GET', 'https://restcountries.eu/rest/v2/callingcode/%s' % PhoneNumber['countryCode'].replace('+', '')).content) PhoneNumber['country'] = countryRequest[0]['alpha2Code'] - + PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '') PhoneNumber['international'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL) @@ -205,7 +205,6 @@ def osintScan(countryCode, number, internationalNumber): if not args.osint: return -1 - print code_info + 'Running OSINT footprint reconnaissance...' # Whitepages @@ -229,16 +228,19 @@ def osintScan(countryCode, number, internationalNumber): 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 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 - # + print(code_info + "Searching for footprints on web pages... (limit=5)") + for result in search('%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber), stop=5): + if result: + print(code_result + "Result found: " + result) # Documents print(code_info + "Searching for documents... (limit=5)") @@ -249,14 +251,6 @@ def osintScan(countryCode, number, internationalNumber): 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): @@ -279,6 +273,9 @@ def osintScan(countryCode, number, internationalNumber): print(code_result + "URL: " + result) askForExit() + print code_warning + "Waiting 10 sec before sending new requests to avoid being blacklisted..." + time.sleep(10) + 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: @@ -326,6 +323,8 @@ def scanNumber(number): ovhScan(PhoneNumber['country'], PhoneNumber['number']) osintScan(PhoneNumber['countryCode'], PhoneNumber['full'], PhoneNumber['international']) + print code_info + "Scan finished." + print '\n' # Verify scanner option From 5105f1772d2a430ceec33a87d38d3deef93a389e Mon Sep 17 00:00:00 2001 From: sundowndev Date: Thu, 29 Nov 2018 00:22:56 +0100 Subject: [PATCH 07/30] Google search function & OSINT scan --- example_google.py | 62 ------------ phoneinfoga.py | 247 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 233 insertions(+), 76 deletions(-) delete mode 100644 example_google.py diff --git a/example_google.py b/example_google.py deleted file mode 100644 index 04224ed..0000000 --- a/example_google.py +++ /dev/null @@ -1,62 +0,0 @@ -import requests,random - -uagent=[] -uagent.append("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14") -uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0") -uagent.append("Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3") -uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)") -uagent.append("Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.7 (KHTML, like Gecko) Comodo_Dragon/16.1.1.0 Chrome/16.0.912.63 Safari/535.7") -uagent.append("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)") -uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1") -uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") - -proxy=[] -proxy.append("118.97.125.150:8080") -proxy.append("212.23.250.46:80") -proxy.append("197.149.128.190:42868") -proxy.append("87.128.41.56:80",) -proxy.append("197.149.129.252:32486") -proxy.append("159.69.211.173:3128") -proxy.append("197.149.128.190:44655") -proxy.append("196.13.208.23:8080") -proxy.append("196.13.208.22:8080") -proxy.append("82.136.122.127:80") -proxy.append("178.60.28.98:9999") -proxy.append("41.60.1.102:80") -proxy.append("212.56.139.253:80") - -number = '49495363899' - -dorks=[] -dorks.append('site%3Anuminfo.net+intext%3A"luciusunegbu%40gmail.com"') -dorks.append('site%3A"hs3x.com"+intext%3A"%2B61437954897"') -dorks.append('site:facebook.com intext:"%s" | "%s"' % (number,number)) -dorks.append('site:twitter.com intext:"%s" | "%s"' % (number,number)) -dorks.append('site:linkedin.com intext:"%s" | "%s"' % (number,number)) -dorks.append('site:instagram.com intext:"%s" | "%s"' % (number,number)) -dorks.append('site:whosenumber.info intext:"%s" intitle:"who called"' % number) -dorks.append('site:"hs3x.com" intext:"+%s"' % number) -dorks.append('site:"receive-sms-now.com" intext:"+%s"' % number) -dorks.append('site:"receive-sms-online.com" intext:"+%s"' % number) - -for req in dorks: - chosenProxy = random.choice(proxy) - chosenUserAgent = random.choice(uagent) - - s = requests.Session() - proxies = {"http": chosenProxy} - headers = { - 'User-Agent': chosenUserAgent, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'en-us,en;q=0.5', - 'Accept-Encoding': 'gzip,deflate', - 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'Keep-Alive': '115', - 'Connection': 'keep-alive', - 'Cookie': 'Cookie: CGIC=Ij90ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSwqLyo7cT0wLjg; CONSENT=YES+RE.fr+20150809-08-0; 1P_JAR=2018-11-28-14; NID=148=aSdSHJz71rufCokaUC93nH3H7lOb8E7BNezDWV-PyyiHTXqWK5Y5hsvj7IAzhZAK04-QNTXjYoLXVu_eiAJkiE46DlNn6JjjgCtY-7Fr0I4JaH-PZRb7WFgSTjiFqh0fw2cCWyN69DeP92dzMd572tQW2Z1gPwno3xuPrYC1T64wOud1DjZDhVAZkpk6UkBrU0PBcnLWL7YdL6IbEaCQlAI9BwaxoH_eywPVyS9V; SID=uAYeu3gT23GCz-ktdGInQuOSf-5SSzl3Plw11-CwsEYY0mqJLSiv7tFKeRpB_5iz8SH5lg.; HSID=AZmH_ctAfs0XbWOCJ; SSID=A0PcRJSylWIxJYTq_; APISID=HHB2bKfJ-2ZUL5-R/Ac0GK3qtM8EHkloNw; SAPISID=wQoxetHBpyo4pJKE/A2P6DUM9zGnStpIVt; SIDCC=ABtHo-EhFAa2AJrJIUgRGtRooWyVK0bAwiQ4UgDmKamfe88xOYBXM47FoL5oZaTxR3H-eOp7-rE; OTZ=4671861_52_52_123900_48_436380; OGPC=873035776-8:; OGP=-873035776:; GOOGLE_ABUSE_EXEMPTION=ID=5f05257564a6b82d:TM=1543414930:C=r:IP=165.227.163.116-:S=APGng0vsERIFITaqUYe9u-Uu9E6iJxUx-g' - } - - r = s.get('https://www.google.com/search?q=%s&gws_rd=ssl' % req, headers=headers, proxies=proxies) - #print(r.text) - - print "%s\nRequested %s using Proxy %s\nUser-Agent: %s" % (r, req, chosenProxy, chosenUserAgent) diff --git a/phoneinfoga.py b/phoneinfoga.py index 78fcaac..f4e9e97 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -18,6 +18,7 @@ banner() import sys import argparse +import random parser = argparse.ArgumentParser(description= "Advanced information gathering tool for phone numbers (https://github.com/sundowndev/PhoneInfoga) version %s" % __version__, @@ -64,7 +65,7 @@ try: from phonenumbers import carrier from phonenumbers import geocoder from phonenumbers import timezone - from googlesearch import search + #from googlesearch import search except KeyboardInterrupt: print '\033[91m[!] Exiting.' sys.exit() @@ -74,6 +75,84 @@ except: scanners = ['any', 'all', 'numverify', 'ovh'] +uagent=[] +uagent.append("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14") +uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0") +uagent.append("Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3") +uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)") +uagent.append("Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.7 (KHTML, like Gecko) Comodo_Dragon/16.1.1.0 Chrome/16.0.912.63 Safari/535.7") +uagent.append("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)") +uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1") +uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") + +proxy=[] +proxy.append("118.97.125.150:8080") +proxy.append("212.23.250.46:80") +proxy.append("197.149.128.190:42868") +proxy.append("87.128.41.56:80",) +proxy.append("197.149.129.252:32486") +proxy.append("159.69.211.173:3128") +proxy.append("197.149.128.190:44655") +proxy.append("196.13.208.23:8080") +proxy.append("196.13.208.22:8080") +proxy.append("82.136.122.127:80") +proxy.append("178.60.28.98:9999") +proxy.append("41.60.1.102:80") +proxy.append("212.56.139.253:80") + +GoogleAbuseToken = '' + +def search(req, stop): + global GoogleAbuseToken + global uagent + global proxy + + chosenProxy = random.choice(proxy) + chosenUserAgent = random.choice(uagent) + + s = requests.Session() + proxies = {"http": chosenProxy} + headers = { + 'User-Agent': chosenUserAgent, + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-us,en;q=0.5', + 'Accept-Encoding': 'gzip,deflate', + 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', + 'Keep-Alive': '115', + 'Connection': 'keep-alive', + 'Cookie': 'Cookie: CGIC=Ij90ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSwqLyo7cT0wLjg; CONSENT=YES+RE.fr+20150809-08-0; 1P_JAR=2018-11-28-14; NID=148=aSdSHJz71rufCokaUC93nH3H7lOb8E7BNezDWV-PyyiHTXqWK5Y5hsvj7IAzhZAK04-QNTXjYoLXVu_eiAJkiE46DlNn6JjjgCtY-7Fr0I4JaH-PZRb7WFgSTjiFqh0fw2cCWyN69DeP92dzMd572tQW2Z1gPwno3xuPrYC1T64wOud1DjZDhVAZkpk6UkBrU0PBcnLWL7YdL6IbEaCQlAI9BwaxoH_eywPVyS9V; SID=uAYeu3gT23GCz-ktdGInQuOSf-5SSzl3Plw11-CwsEYY0mqJLSiv7tFKeRpB_5iz8SH5lg.; HSID=AZmH_ctAfs0XbWOCJ; SSID=A0PcRJSylWIxJYTq_; APISID=HHB2bKfJ-2ZUL5-R/Ac0GK3qtM8EHkloNw; SAPISID=wQoxetHBpyo4pJKE/A2P6DUM9zGnStpIVt; SIDCC=ABtHo-EhFAa2AJrJIUgRGtRooWyVK0bAwiQ4UgDmKamfe88xOYBXM47FoL5oZaTxR3H-eOp7-rE; OTZ=4671861_52_52_123900_48_436380; OGPC=873035776-8:; OGP=-873035776:;' + } + + if True: + URL = 'https://www.google.com/search?tbs=li:1&q=%s&gws_rd=ssl' % (req) + r = s.get(URL + GoogleAbuseToken, headers=headers, proxies=proxies) + + while r.status_code == 503: + print code_warning + 'You are temporary blacklisted from Google search. Complete the captcha at the following URL and copy/paste the content of GOOGLE_ABUSE_EXEMPTION cookie : %s' % URL + print '\n' + code_info + 'Need help ? Read the doc at https://github.com/sundowndev/PhoneInfoga' + token = raw_input('\nGOOGLE_ABUSE_EXEMPTION=') + GoogleAbuseToken = '&google_abuse=' + token + r = s.get(URL + GoogleAbuseToken, headers=headers, proxies=proxies) + + soup = BeautifulSoup(r.content, 'html.parser') + results = soup.find("div", id="search").find_all("div", class_="g") + + links=[] + counter=0 + + for result in results: + counter += 1 + + if int(counter) > int(stop): + break + + url = result.find("cite").string + links.append(url) + + return links + #except: + #print code_error + 'Failed search.' + def formatNumber(number): return re.sub("(?:\+)?(?:[^[0-9]*)", "", number) @@ -213,8 +292,9 @@ def osintScan(countryCode, number, internationalNumber): print(code_info + "Generating scan URL on 411.com...") print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-') - try: + if True: # Social profiles: facebook, twitter, linkedin, instagram + print(code_info + '[Social media footprints]') print(code_info + "Searching for footprints on facebook.com... (limit=5)") for result in search('site:facebook.com intext:"%s" | "%s"' % (number,number), stop=5): if result: @@ -230,15 +310,13 @@ def osintScan(countryCode, number, internationalNumber): 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 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) # Websites + print(code_info + '[Web pages footprints]') print(code_info + "Searching for footprints on web pages... (limit=5)") for result in search('%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber), stop=5): if result: @@ -250,9 +328,6 @@ def osintScan(countryCode, number, internationalNumber): 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) - # 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): @@ -267,7 +342,14 @@ def osintScan(countryCode, number, internationalNumber): 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.") + print(code_info + "Generating URL on scamcallfighters.com...") + print code_result + 'http://www.scamcallfighters.com/search-phone-%s.html' % number + + #print code_warning + "Waiting 10 sec before sending new requests to avoid being blacklisted..." + #time.sleep(10) + # Temporary number providers + print(code_info + '[Temporary number providers footprints]') 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: @@ -275,9 +357,6 @@ def osintScan(countryCode, number, internationalNumber): print(code_result + "URL: " + result) askForExit() - print code_warning + "Waiting 10 sec before sending new requests to avoid being blacklisted..." - time.sleep(10) - 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: @@ -285,14 +364,154 @@ def osintScan(countryCode, number, internationalNumber): print(code_result + "URL: " + result) askForExit() + print(code_info + "Searching for results on smslisten.com... (limit=1)") + for result in search('site:"smslisten.com" intext:"%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: smslisten.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on smsnumbersonline.com... (limit=1)") + for result in search('site:"smsnumbersonline.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: smsnumbersonline.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on freesmscode.com... (limit=1)") + for result in search('site:"freesmscode.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: freesmscode.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on catchsms.com... (limit=1)") + for result in search('site:"catchsms.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: catchsms.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on smstibo.com... (limit=1)") + for result in search('site:"smstibo.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: smstibo.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on smsreceiving.com... (limit=1)") + for result in search('site:"smsreceiving.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: smsreceiving.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on getfreesmsnumber.com... (limit=1)") + for result in search('site:"getfreesmsnumber.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: getfreesmsnumber.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on sellaite.com... (limit=1)") + for result in search('site:"sellaite.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: sellaite.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receive-sms-online.info... (limit=1)") + for result in search('site:"receive-sms-online.info" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receive-sms-online.info") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receivesmsonline.com... (limit=1)") + for result in search('site:"receivesmsonline.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receivesmsonline.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receive-a-sms.com... (limit=1)") + for result in search('site:"receive-a-sms.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receive-a-sms.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on sms-receive.net... (limit=1)") + for result in search('site:"sms-receive.net" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: sms-receive.net") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receivefreesms.com... (limit=1)") + for result in search('site:"receivefreesms.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receivefreesms.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on freeonlinephone.org... (limit=1)") + for result in search('site:"freeonlinephone.org" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: freeonlinephone.org") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receive-sms.com... (limit=1)") + for result in search('site:"receive-sms.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receive-sms.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receivetxt.com... (limit=1)") + for result in search('site:"receivetxt.com" %s' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receivetxt.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receive-smss.com... (limit=1)") + for result in search('site:"receive-smss.com" intext:"+%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receive-smss.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on freephonenum.com... (limit=1)") + for result in search('site:"freephonenum.com" intext:"%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: freephonenum.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on receivefreesms.com... (limit=1)") + for result in search('site:"receivefreesms.com" intext:"%s"' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: receivefreesms.com") + print(code_result + "URL: " + result) + askForExit() + + print(code_info + "Searching for results on freesmsverification.com... (limit=1)") + for result in search('site:"freesmsverification.com" %s' % number, stop=1): + if result: + print(code_result + "Found a temporary number provider: freesmsverification.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): + 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.' + #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") From 55db8b7b6a28f4df91ac12682f5a4c3688e4359f Mon Sep 17 00:00:00 2001 From: Raphael Date: Thu, 29 Nov 2018 12:24:54 +0100 Subject: [PATCH 08/30] Rename test.txt to list.txt --- tests/{test.txt => list.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{test.txt => list.txt} (100%) diff --git a/tests/test.txt b/tests/list.txt similarity index 100% rename from tests/test.txt rename to tests/list.txt From 28186896b8db2fc18ca85afd5699a8059897aa16 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Fri, 30 Nov 2018 15:34:53 +0100 Subject: [PATCH 09/30] OSINT passive recon requests --- osint/disposable_num_providers.json | 107 ++++++++++++++++++++++++++++ osint/individuals.json | 14 ++++ osint/reputation.json | 7 ++ osint/social_medias.json | 14 ++++ tests/list.txt | 2 +- 5 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 osint/disposable_num_providers.json create mode 100644 osint/individuals.json create mode 100644 osint/reputation.json create mode 100644 osint/social_medias.json diff --git a/osint/disposable_num_providers.json b/osint/disposable_num_providers.json new file mode 100644 index 0000000..adb5bf9 --- /dev/null +++ b/osint/disposable_num_providers.json @@ -0,0 +1,107 @@ +[ + { + "site": "hs3x.com", + "request": "site:\"hs3x.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receive-sms-now.com", + "request": "site:\"receive-sms-now.com\" intext:\"$n\"", + "stop": 1 + }, + { + "site": "smslisten.com", + "request": "site:\"smslisten.com\" intext:\"$n\"", + "stop": 1 + }, + { + "site": "smsnumbersonline.com", + "request": "site:\"smsnumbersonline.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "freesmscode.com", + "request": "site:\"freesmscode.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "catchsms.com", + "request": "site:\"catchsms.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "smstibo.com", + "request": "site:\"smstibo.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "smsreceiving.com", + "request": "site:\"smsreceiving.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "getfreesmsnumber.com", + "request": "site:\"getfreesmsnumber.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "sellaite.com", + "request": "site:\"sellaite.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receive-sms-online.info", + "request": "site:\"receive-sms-online.info\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receivesmsonline.com", + "request": "site:\"receivesmsonline.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receive-a-sms.com", + "request": "site:\"receive-a-sms.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "sms-receive.net", + "request": "site:\"sms-receive.net\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receivefreesms.com", + "request": "site:\"receivefreesms.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receive-sms.com", + "request": "site:\"receive-sms.com\" intext:\"+$n\"", + "stop": 1 + }, + { + "site": "receivetxt.com", + "request": "site:\"receivetxt.com\" $n", + "stop": 1 + }, + { + "site": "freephonenum.com", + "request": "site:\"freephonenum.com\" intext:\"$n\"", + "stop": 1 + }, + { + "site": "receivefreesms.com", + "request": "site:\"receivefreesms.com\" intext:\"$n\"", + "stop": 1 + }, + { + "site": "freesmsverification.com", + "request": "site:\"freesmsverification.com\" $n", + "stop": 1 + }, + { + "site": "receive-sms-online.com", + "request": "site:\"receive-sms-online.com\" intext:\"$n\"", + "stop": 1 + } +] diff --git a/osint/individuals.json b/osint/individuals.json new file mode 100644 index 0000000..315d3a1 --- /dev/null +++ b/osint/individuals.json @@ -0,0 +1,14 @@ +[ + { + "site": "facebook.com", + "request": "site:\"facebook.com\" intext:\"$n\" | $n", + "dialCode": null, + "stop": 5 + }, + { + "site": "twitter.com", + "request": "site:\"twitter.com\" intext:\"$n\" | $n", + "dialCode": null, + "stop": 5 + } +] diff --git a/osint/reputation.json b/osint/reputation.json new file mode 100644 index 0000000..778f528 --- /dev/null +++ b/osint/reputation.json @@ -0,0 +1,7 @@ +[ + { + "site": "whosenumber.info", + "request": "site:\"whosenumber.info\" intext:\"$n\" intitle:\"who called\"", + "stop": 1, + } +] diff --git a/osint/social_medias.json b/osint/social_medias.json new file mode 100644 index 0000000..315d3a1 --- /dev/null +++ b/osint/social_medias.json @@ -0,0 +1,14 @@ +[ + { + "site": "facebook.com", + "request": "site:\"facebook.com\" intext:\"$n\" | $n", + "dialCode": null, + "stop": 5 + }, + { + "site": "twitter.com", + "request": "site:\"twitter.com\" intext:\"$n\" | $n", + "dialCode": null, + "stop": 5 + } +] diff --git a/tests/list.txt b/tests/list.txt index 794367b..cc802f8 100644 --- a/tests/list.txt +++ b/tests/list.txt @@ -1,6 +1,6 @@ +856 20 99 453 217 +59172768361 -+33679368233 ++32474123456 +1 (541) 754-3010 +86 591 2284 8571 +7 496 4819375 From f493009dcec243ef58db9d3a0326c3e1683a7f61 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Fri, 30 Nov 2018 15:35:06 +0100 Subject: [PATCH 10/30] Delete data folder --- data/area_codes.json | 1647 ------------------------------- data/carrier_codes.json | 2027 --------------------------------------- data/country_codes.json | 1212 ----------------------- 3 files changed, 4886 deletions(-) delete mode 100644 data/area_codes.json delete mode 100644 data/carrier_codes.json delete mode 100644 data/country_codes.json diff --git a/data/area_codes.json b/data/area_codes.json deleted file mode 100644 index fb300c5..0000000 --- a/data/area_codes.json +++ /dev/null @@ -1,1647 +0,0 @@ -[ - { - "CountryCode": "FR", - "AreaCodes": [ - { - "area": "Bordeaux", - "code": "5" - }, - { - "area": "Boulogne", - "code": "3" - }, - { - "area": "Brest", - "code": "2" - }, - { - "area": "Calais", - "code": "3" - }, - { - "area": "Cannes", - "code": "4" - }, - { - "area": "Corsica", - "code": "495" - }, - { - "area": "Dijon", - "code": "3" - }, - { - "area": "Grenoble", - "code": "4" - }, - { - "area": "Cherbourg", - "code": "2" - }, - { - "area": "Le Havre", - "code": "2" - }, - { - "area": "Lille", - "code": "3" - }, - { - "area": "Limoges", - "code": "5" - }, - { - "area": "Lourdes", - "code": "5" - }, - { - "area": "Lyon", - "code": "4" - }, - { - "area": "Marseille", - "code": "4" - }, - { - "area": "Nancy", - "code": "3" - }, - { - "area": "Nantes", - "code": "2" - }, - { - "area": "Nice", - "code": "4" - }, - { - "area": "Orleans", - "code": "2" - }, - { - "area": "Paris", - "code": "1" - }, - { - "area": "Reims", - "code": "3" - }, - { - "area": "Rouen", - "code": "2" - }, - { - "area": "St. Etienne", - "code": "4" - }, - { - "area": "Strasbourg", - "code": "3" - }, - { - "area": "Toulon", - "code": "4" - }, - { - "area": "Toulouse", - "code": "5" - }, - { - "area": "Troyes", - "code": "3" - }, - { - "area": "Valence", - "code": "4" - } - ] - }, - { - "CountryCode": "CN", - "AreaCodes": [ - { - "area": "Anshan", - "code": "412" - }, - { - "area": "Beijing", - "code": "10" - }, - { - "area": "Dalian", - "code": "411" - }, - { - "area": "Guangzhou", - "code": "20" - }, - { - "area": "Hangzhou", - "code": "571" - }, - { - "area": "Harbin", - "code": "451" - }, - { - "area": "Huaian", - "code": "517" - }, - { - "area": "Huaibei", - "code": "561" - }, - { - "area": "Changchun", - "code": "431" - }, - { - "area": "Chengdu", - "code": "28" - }, - { - "area": "Chongqing", - "code": "23" - }, - { - "area": "Jilin", - "code": "432" - }, - { - "area": "Jinan", - "code": "531" - }, - { - "area": "Nanjing", - "code": "25" - }, - { - "area": "Ningbo", - "code": "574" - }, - { - "area": "Qingdao", - "code": "532" - }, - { - "area": "Shanghai", - "code": "21" - }, - { - "area": "Shenyang", - "code": "24" - }, - { - "area": "Suizhou", - "code": "722" - }, - { - "area": "Tianjin", - "code": "22" - }, - { - "area": "Weifang", - "code": "536" - }, - { - "area": "Wuhan", - "code": "27" - }, - { - "area": "Wuxi", - "code": "510" - }, - { - "area": "Xiangfan", - "code": "710" - }, - { - "area": "Yangzhou", - "code": "514" - }, - { - "area": "Yantai", - "code": "535" - }, - { - "area": "Zaozhuang", - "code": "632" - }, - { - "area": "Zibo", - "code": "533" - } - ] - }, - { - "CountryCode": "DE", - "AreaCodes": [ - { - "area": "Aachen", - "code": "241" - }, - { - "area": "Augsburg", - "code": "821" - }, - { - "area": "Berlin", - "code": "30" - }, - { - "area": "Bielefeld", - "code": "521" - }, - { - "area": "Bochum", - "code": "234" - }, - { - "area": "Bonn", - "code": "228" - }, - { - "area": "Brandenburg", - "code": "3381" - }, - { - "area": "Bremen", - "code": "421" - }, - { - "area": "Dortmund", - "code": "231" - }, - { - "area": "Dresden", - "code": "351" - }, - { - "area": "Duisburg", - "code": "203" - }, - { - "area": "Dusseldorf", - "code": "211" - }, - { - "area": "Essen", - "code": "201" - }, - { - "area": "Frankfurt", - "code": "69" - }, - { - "area": "Gelsenkirchen", - "code": "209" - }, - { - "area": "Hamburg", - "code": "40" - }, - { - "area": "Hannover", - "code": "511" - }, - { - "area": "Chemnitz", - "code": "371" - }, - { - "area": "Karlsruhe", - "code": "721" - }, - { - "area": "Koln", - "code": "221" - }, - { - "area": "Krefeld", - "code": "2151" - }, - { - "area": "Leipzig", - "code": "341" - }, - { - "area": "Mainz", - "code": "6131" - }, - { - "area": "Mannheim", - "code": "621" - }, - { - "area": "Munchen", - "code": "89" - }, - { - "area": "Munster", - "code": "6071" - }, - { - "area": "Nurnberg", - "code": "911" - }, - { - "area": "Stuttgart", - "code": "711" - }, - { - "area": "Wiesbaden", - "code": "611" - }, - { - "area": "Wuppertal", - "code": "202" - } - ] - }, - { - "CountryCode": "US", - "AreaCodes": [ - { - "code": "201", - "area": "New Jersey" - }, - { - "code": "202", - "area": "District of Columbia" - }, - { - "code": "203", - "area": "Connecticut" - }, - { - "code": "204", - "area": "Manitoba" - }, - { - "code": "205", - "area": "Alabama" - }, - { - "code": "206", - "area": "Washington" - }, - { - "code": "207", - "area": "Maine" - }, - { - "code": "208", - "area": "Idaho" - }, - { - "code": "209", - "area": "California" - }, - { - "code": "210", - "area": "Texas" - }, - { - "code": "212", - "area": "New York" - }, - { - "code": "213", - "area": "California" - }, - { - "code": "214", - "area": "Texas" - }, - { - "code": "215", - "area": "Pennsylvania" - }, - { - "code": "216", - "area": "Ohio" - }, - { - "code": "217", - "area": "Illinois" - }, - { - "code": "218", - "area": "Minnesota" - }, - { - "code": "219", - "area": "Indiana" - }, - { - "code": "224", - "area": "Illinois" - }, - { - "code": "225", - "area": "Louisiana" - }, - { - "code": "228", - "area": "Mississippi" - }, - { - "code": "229", - "area": "Georgia" - }, - { - "code": "231", - "area": "Michigan" - }, - { - "code": "234", - "area": "Ohio" - }, - { - "code": "239", - "area": "Florida" - }, - { - "code": "240", - "area": "Maryland" - }, - { - "code": "242", - "area": "Bahamas" - }, - { - "code": "246", - "area": "Barbados" - }, - { - "code": "248", - "area": "Michigan" - }, - { - "code": "250", - "area": "British Columbia" - }, - { - "code": "251", - "area": "Alabama" - }, - { - "code": "252", - "area": "North Carolina" - }, - { - "code": "253", - "area": "Washington" - }, - { - "code": "254", - "area": "Texas" - }, - { - "code": "256", - "area": "Alabama" - }, - { - "code": "260", - "area": "Indiana" - }, - { - "code": "262", - "area": "Wisconsin" - }, - { - "code": "264", - "area": "Anguilla" - }, - { - "code": "267", - "area": "Pennsylvania" - }, - { - "code": "268", - "area": "Antigua\/Barbuda" - }, - { - "code": "269", - "area": "Michigan" - }, - { - "code": "270", - "area": "Kentucky" - }, - { - "code": "276", - "area": "Virginia" - }, - { - "code": "281", - "area": "Texas" - }, - { - "code": "284", - "area": "British Virgin Islands" - }, - { - "code": "289", - "area": "Ontario" - }, - { - "code": "301", - "area": "Maryland" - }, - { - "code": "302", - "area": "Delaware" - }, - { - "code": "303", - "area": "Colorado" - }, - { - "code": "304", - "area": "West Virginia" - }, - { - "code": "305", - "area": "Florida" - }, - { - "code": "306", - "area": "Saskatchewan" - }, - { - "code": "307", - "area": "Wyoming" - }, - { - "code": "308", - "area": "Nebraska" - }, - { - "code": "309", - "area": "Illinois" - }, - { - "code": "310", - "area": "California" - }, - { - "code": "312", - "area": "Illinois" - }, - { - "code": "313", - "area": "Michigan" - }, - { - "code": "314", - "area": "Missouri" - }, - { - "code": "315", - "area": "New York" - }, - { - "code": "316", - "area": "Kansas" - }, - { - "code": "317", - "area": "Indiana" - }, - { - "code": "318", - "area": "Louisiana" - }, - { - "code": "319", - "area": "Iowa" - }, - { - "code": "320", - "area": "Minnesota" - }, - { - "code": "321", - "area": "Florida" - }, - { - "code": "323", - "area": "California" - }, - { - "code": "325", - "area": "Texas" - }, - { - "code": "330", - "area": "Ohio" - }, - { - "code": "334", - "area": "Alabama" - }, - { - "code": "336", - "area": "North Carolina" - }, - { - "code": "337", - "area": "Louisiana" - }, - { - "code": "339", - "area": "Massachusetts" - }, - { - "code": "340", - "area": "US Virgin Islands" - }, - { - "code": "345", - "area": "Cayman Islands" - }, - { - "code": "347", - "area": "New York" - }, - { - "code": "351", - "area": "Massachusetts" - }, - { - "code": "352", - "area": "Florida" - }, - { - "code": "360", - "area": "Washington" - }, - { - "code": "361", - "area": "Texas" - }, - { - "code": "386", - "area": "Florida" - }, - { - "code": "401", - "area": "Rhode Island" - }, - { - "code": "402", - "area": "Nebraska" - }, - { - "code": "403", - "area": "Alberta" - }, - { - "code": "404", - "area": "Georgia" - }, - { - "code": "405", - "area": "Oklahoma" - }, - { - "code": "406", - "area": "Montana" - }, - { - "code": "407", - "area": "Florida" - }, - { - "code": "408", - "area": "California" - }, - { - "code": "409", - "area": "Texas" - }, - { - "code": "410", - "area": "Maryland" - }, - { - "code": "412", - "area": "Pennsylvania" - }, - { - "code": "413", - "area": "Massachusetts" - }, - { - "code": "414", - "area": "Wisconsin" - }, - { - "code": "415", - "area": "California" - }, - { - "code": "416", - "area": "Ontario" - }, - { - "code": "417", - "area": "Missouri" - }, - { - "code": "418", - "area": "Quebec" - }, - { - "code": "419", - "area": "Ohio" - }, - { - "code": "423", - "area": "Tennessee" - }, - { - "code": "425", - "area": "Washington" - }, - { - "code": "430", - "area": "Texas" - }, - { - "code": "432", - "area": "Texas" - }, - { - "code": "434", - "area": "Virginia" - }, - { - "code": "435", - "area": "Utah" - }, - { - "code": "440", - "area": "Ohio" - }, - { - "code": "441", - "area": "Bermuda" - }, - { - "code": "443", - "area": "Maryland" - }, - { - "code": "450", - "area": "Quebec" - }, - { - "code": "456", - "area": "NANP area" - }, - { - "code": "469", - "area": "Texas" - }, - { - "code": "473", - "area": "Grenada" - }, - { - "code": "478", - "area": "Georgia" - }, - { - "code": "479", - "area": "Arkansas" - }, - { - "code": "480", - "area": "Arizona" - }, - { - "code": "484", - "area": "Pennsylvania" - }, - { - "code": "501", - "area": "Arkansas" - }, - { - "code": "502", - "area": "Kentucky" - }, - { - "code": "503", - "area": "Oregon" - }, - { - "code": "504", - "area": "Louisiana" - }, - { - "code": "505", - "area": "New Mexico" - }, - { - "code": "506", - "area": "New Brunswick" - }, - { - "code": "507", - "area": "Minnesota" - }, - { - "code": "508", - "area": "Massachusetts" - }, - { - "code": "509", - "area": "Washington" - }, - { - "code": "510", - "area": "California" - }, - { - "code": "512", - "area": "Texas" - }, - { - "code": "513", - "area": "Ohio" - }, - { - "code": "514", - "area": "Quebec" - }, - { - "code": "515", - "area": "Iowa" - }, - { - "code": "516", - "area": "New York" - }, - { - "code": "517", - "area": "Michigan" - }, - { - "code": "518", - "area": "New York" - }, - { - "code": "519", - "area": "Ontario" - }, - { - "code": "520", - "area": "Arizona" - }, - { - "code": "530", - "area": "California" - }, - { - "code": "540", - "area": "Virginia" - }, - { - "code": "541", - "area": "Oregon" - }, - { - "code": "551", - "area": "New Jersey" - }, - { - "code": "559", - "area": "California" - }, - { - "code": "561", - "area": "Florida" - }, - { - "code": "562", - "area": "California" - }, - { - "code": "563", - "area": "Iowa" - }, - { - "code": "567", - "area": "Ohio" - }, - { - "code": "570", - "area": "Pennsylvania" - }, - { - "code": "571", - "area": "Virginia" - }, - { - "code": "573", - "area": "Missouri" - }, - { - "code": "574", - "area": "Indiana" - }, - { - "code": "580", - "area": "Oklahoma" - }, - { - "code": "585", - "area": "New York" - }, - { - "code": "586", - "area": "Michigan" - }, - { - "code": "601", - "area": "Mississippi" - }, - { - "code": "602", - "area": "Arizona" - }, - { - "code": "603", - "area": "New Hampshire" - }, - { - "code": "604", - "area": "British Columbia" - }, - { - "code": "605", - "area": "South Dakota" - }, - { - "code": "606", - "area": "Kentucky" - }, - { - "code": "607", - "area": "New York" - }, - { - "code": "608", - "area": "Wisconsin" - }, - { - "code": "609", - "area": "New Jersey" - }, - { - "code": "610", - "area": "Pennsylvania" - }, - { - "code": "612", - "area": "Minnesota" - }, - { - "code": "613", - "area": "Ontario" - }, - { - "code": "614", - "area": "Ohio" - }, - { - "code": "615", - "area": "Tennessee" - }, - { - "code": "616", - "area": "Michigan" - }, - { - "code": "617", - "area": "Massachusetts" - }, - { - "code": "618", - "area": "Illinois" - }, - { - "code": "619", - "area": "California" - }, - { - "code": "620", - "area": "Kansas" - }, - { - "code": "623", - "area": "Arizona" - }, - { - "code": "626", - "area": "California" - }, - { - "code": "630", - "area": "Illinois" - }, - { - "code": "631", - "area": "New York" - }, - { - "code": "636", - "area": "Missouri" - }, - { - "code": "641", - "area": "Iowa" - }, - { - "code": "646", - "area": "New York" - }, - { - "code": "647", - "area": "Ontario" - }, - { - "code": "649", - "area": "Turks & Caicos Islands" - }, - { - "code": "650", - "area": "California" - }, - { - "code": "651", - "area": "Minnesota" - }, - { - "code": "660", - "area": "Missouri" - }, - { - "code": "661", - "area": "California" - }, - { - "code": "662", - "area": "Mississippi" - }, - { - "code": "664", - "area": "Montserrat" - }, - { - "code": "670", - "area": "CNMI" - }, - { - "code": "671", - "area": "Guam" - }, - { - "code": "678", - "area": "Georgia" - }, - { - "code": "682", - "area": "Texas" - }, - { - "code": "701", - "area": "North Dakota" - }, - { - "code": "702", - "area": "Nevada" - }, - { - "code": "703", - "area": "Virginia" - }, - { - "code": "704", - "area": "North Carolina" - }, - { - "code": "705", - "area": "Ontario" - }, - { - "code": "706", - "area": "Georgia" - }, - { - "code": "707", - "area": "California" - }, - { - "code": "708", - "area": "Illinois" - }, - { - "code": "709", - "area": "Newfoundland" - }, - { - "code": "710", - "area": "US" - }, - { - "code": "712", - "area": "Iowa" - }, - { - "code": "713", - "area": "Texas" - }, - { - "code": "714", - "area": "California" - }, - { - "code": "715", - "area": "Wisconsin" - }, - { - "code": "716", - "area": "New York" - }, - { - "code": "717", - "area": "Pennsylvania" - }, - { - "code": "718", - "area": "New York" - }, - { - "code": "719", - "area": "Colorado" - }, - { - "code": "720", - "area": "Colorado" - }, - { - "code": "724", - "area": "Pennsylvania" - }, - { - "code": "727", - "area": "Florida" - }, - { - "code": "731", - "area": "Tennessee" - }, - { - "code": "732", - "area": "New Jersey" - }, - { - "code": "734", - "area": "Michigan" - }, - { - "code": "740", - "area": "Ohio" - }, - { - "code": "754", - "area": "Florida" - }, - { - "code": "757", - "area": "Virginia" - }, - { - "code": "758", - "area": "St. Lucia" - }, - { - "code": "760", - "area": "California" - }, - { - "code": "763", - "area": "Minnesota" - }, - { - "code": "765", - "area": "Indiana" - }, - { - "code": "767", - "area": "Dominica" - }, - { - "code": "770", - "area": "Georgia" - }, - { - "code": "772", - "area": "Florida" - }, - { - "code": "773", - "area": "Illinois" - }, - { - "code": "774", - "area": "Massachusetts" - }, - { - "code": "775", - "area": "Nevada" - }, - { - "code": "778", - "area": "British Columbia" - }, - { - "code": "780", - "area": "Alberta" - }, - { - "code": "781", - "area": "Massachusetts" - }, - { - "code": "784", - "area": "St. Vincent & Grenadines" - }, - { - "code": "785", - "area": "Kansas" - }, - { - "code": "786", - "area": "Florida" - }, - { - "code": "787", - "area": "Puerto Rico" - }, - { - "code": "801", - "area": "Utah" - }, - { - "code": "802", - "area": "Vermont" - }, - { - "code": "803", - "area": "South Carolina" - }, - { - "code": "804", - "area": "Virginia" - }, - { - "code": "805", - "area": "California" - }, - { - "code": "806", - "area": "Texas" - }, - { - "code": "807", - "area": "Ontario" - }, - { - "code": "808", - "area": "Hawaii" - }, - { - "code": "809", - "area": "Dominican Republic" - }, - { - "code": "810", - "area": "Michigan" - }, - { - "code": "812", - "area": "Indiana" - }, - { - "code": "813", - "area": "Florida" - }, - { - "code": "814", - "area": "Pennsylvania" - }, - { - "code": "815", - "area": "Illinois" - }, - { - "code": "816", - "area": "Missouri" - }, - { - "code": "817", - "area": "Texas" - }, - { - "code": "818", - "area": "California" - }, - { - "code": "819", - "area": "Quebec" - }, - { - "code": "828", - "area": "North Carolina" - }, - { - "code": "830", - "area": "Texas" - }, - { - "code": "831", - "area": "California" - }, - { - "code": "832", - "area": "Texas" - }, - { - "code": "843", - "area": "South Carolina" - }, - { - "code": "845", - "area": "New York" - }, - { - "code": "847", - "area": "Illinois" - }, - { - "code": "848", - "area": "New Jersey" - }, - { - "code": "850", - "area": "Florida" - }, - { - "code": "856", - "area": "New Jersey" - }, - { - "code": "857", - "area": "Massachusetts" - }, - { - "code": "858", - "area": "California" - }, - { - "code": "859", - "area": "Kentucky" - }, - { - "code": "860", - "area": "Connecticut" - }, - { - "code": "862", - "area": "New Jersey" - }, - { - "code": "863", - "area": "Florida" - }, - { - "code": "864", - "area": "South Carolina" - }, - { - "code": "865", - "area": "Tennessee" - }, - { - "code": "867", - "area": "Yukon, NW Terr., Nunavut" - }, - { - "code": "868", - "area": "Trinidad & Tobago" - }, - { - "code": "869", - "area": "St. Kitts & Nevis" - }, - { - "code": "870", - "area": "Arkansas" - }, - { - "code": "876", - "area": "Jamaica" - }, - { - "code": "878", - "area": "Pennsylvania" - }, - { - "code": "880", - "area": "NANP area" - }, - { - "code": "881", - "area": "NANP area" - }, - { - "code": "882", - "area": "NANP area" - }, - { - "code": "901", - "area": "Tennessee" - }, - { - "code": "902", - "area": "Nova Scotia" - }, - { - "code": "903", - "area": "Texas" - }, - { - "code": "904", - "area": "Florida" - }, - { - "code": "905", - "area": "Ontario" - }, - { - "code": "906", - "area": "Michigan" - }, - { - "code": "907", - "area": "Alaska" - }, - { - "code": "908", - "area": "New Jersey" - }, - { - "code": "909", - "area": "California" - }, - { - "code": "910", - "area": "North Carolina" - }, - { - "code": "912", - "area": "Georgia" - }, - { - "code": "913", - "area": "Kansas" - }, - { - "code": "914", - "area": "New York" - }, - { - "code": "915", - "area": "Texas" - }, - { - "code": "916", - "area": "California" - }, - { - "code": "917", - "area": "New York" - }, - { - "code": "918", - "area": "Oklahoma" - }, - { - "code": "919", - "area": "North Carolina" - }, - { - "code": "920", - "area": "Wisconsin" - }, - { - "code": "925", - "area": "California" - }, - { - "code": "928", - "area": "Arizona" - }, - { - "code": "931", - "area": "Tennessee" - }, - { - "code": "936", - "area": "Texas" - }, - { - "code": "937", - "area": "Ohio" - }, - { - "code": "939", - "area": "Puerto Rico" - }, - { - "code": "940", - "area": "Texas" - }, - { - "code": "941", - "area": "Florida" - }, - { - "code": "947", - "area": "Michigan" - }, - { - "code": "949", - "area": "California" - }, - { - "code": "952", - "area": "Minnesota" - }, - { - "code": "954", - "area": "Florida" - }, - { - "code": "956", - "area": "Texas" - }, - { - "code": "970", - "area": "Colorado" - }, - { - "code": "971", - "area": "Oregon" - }, - { - "code": "972", - "area": "Texas" - }, - { - "code": "973", - "area": "New Jersey" - }, - { - "code": "978", - "area": "Massachusetts" - }, - { - "code": "979", - "area": "Texas" - }, - { - "code": "980", - "area": "North Carolina" - }, - { - "code": "985", - "area": "Louisiana" - }, - { - "code": "989", - "area": "Michigan" - } - ] - }, - { - "CountryCode": "CN", - "AreaCodes": [] - } -] - diff --git a/data/carrier_codes.json b/data/carrier_codes.json deleted file mode 100644 index 20b95a5..0000000 --- a/data/carrier_codes.json +++ /dev/null @@ -1,2027 +0,0 @@ -[ - { - "country": "FR", - "carriers": [ - { - "area": { - "code": null, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Other", - "updated_at": null - } - }, - { - "area": { - "code": 6, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 7, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 9, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 17, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 36, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 61, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 62, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 66, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 67, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 68, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 76, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 77, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 78, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 79, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 87, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 148, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 149, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 180, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 181, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 182, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 183, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 214, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 218, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 222, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 230, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 234, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 236, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 244, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 245, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 246, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 249, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 250, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 252, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 253, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 256, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 261, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 272, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 276, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 277, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 278, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 285, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 290, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 310, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 345, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 351, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 352, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 354, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 355, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 357, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 358, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 359, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 370, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 371, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 372, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 373, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 411, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 413, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 415, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 420, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 422, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 426, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 427, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 430, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 434, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 443, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 456, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 457, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 463, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 469, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 480, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 481, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 482, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 483, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 484, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 486, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 487, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 488, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 489, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 516, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 517, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 519, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 524, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 531, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 533, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 535, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 540, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 547, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 564, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 567, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 579, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 581, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 582, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 587, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Clec", - "updated_at": null - } - }, - { - "area": { - "code": 601, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 603, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 605, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 607, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 608, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 609, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 630, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 631, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 632, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 633, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 634, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 635, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 637, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 642, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 643, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 645, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 646, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 647, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 648, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 650, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 653, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 654, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 655, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 658, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 659, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 698, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 699, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 780, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6001, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6002, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6003, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6007, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6008, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6009, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6020, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6021, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6022, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6023, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6040, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6041, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6044, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6045, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6046, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6047, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6048, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6049, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6064, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6065, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6066, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6067, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6068, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6069, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6360, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6361, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6362, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6363, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6364, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6365, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6366, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6367, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6368, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6369, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6381, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6382, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6383, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6384, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6385, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6386, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6387, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6388, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6389, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6401, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6402, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6403, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6404, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6405, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6406, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6407, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6408, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6409, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6417, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6444, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6445, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6446, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6490, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6491, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6492, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6493, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6494, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 6495, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 7705, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 7706, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 7707, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 7708, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 7709, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 60041, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 60042, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Bouygues Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 60051, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 60052, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64160, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64161, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Orange Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64166, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64167, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64168, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64169, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64995, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64998, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - }, - { - "area": { - "code": 64999, - "country_code": 33, - "country_id": 73, - "created_at": null, - "name": "France Sfr Mobile", - "updated_at": null - } - } - ] - } -] \ No newline at end of file diff --git a/data/country_codes.json b/data/country_codes.json deleted file mode 100644 index 116f43e..0000000 --- a/data/country_codes.json +++ /dev/null @@ -1,1212 +0,0 @@ -[ - { - "name":"Israel", - "dial_code":"+972", - "code":"IL" - }, - { - "name":"Afghanistan", - "dial_code":"+93", - "code":"AF" - }, - { - "name":"Albania", - "dial_code":"+355", - "code":"AL" - }, - { - "name":"Algeria", - "dial_code":"+213", - "code":"DZ" - }, - { - "name":"AmericanSamoa", - "dial_code":"+1684", - "code":"AS" - }, - { - "name":"Andorra", - "dial_code":"+376", - "code":"AD" - }, - { - "name":"Angola", - "dial_code":"+244", - "code":"AO" - }, - { - "name":"Anguilla", - "dial_code":"+1264", - "code":"AI" - }, - { - "name":"Antigua and Barbuda", - "dial_code":"+1268", - "code":"AG" - }, - { - "name":"Argentina", - "dial_code":"+54", - "code":"AR" - }, - { - "name":"Armenia", - "dial_code":"+374", - "code":"AM" - }, - { - "name":"Aruba", - "dial_code":"+297", - "code":"AW" - }, - { - "name":"Australia", - "dial_code":"+61", - "code":"AU" - }, - { - "name":"Austria", - "dial_code":"+43", - "code":"AT" - }, - { - "name":"Azerbaijan", - "dial_code":"+994", - "code":"AZ" - }, - { - "name":"Bahamas", - "dial_code":"+1242", - "code":"BS" - }, - { - "name":"Bahrain", - "dial_code":"+973", - "code":"BH" - }, - { - "name":"Bangladesh", - "dial_code":"+880", - "code":"BD" - }, - { - "name":"Barbados", - "dial_code":"+1246", - "code":"BB" - }, - { - "name":"Belarus", - "dial_code":"+375", - "code":"BY" - }, - { - "name":"Belgium", - "dial_code":"+32", - "code":"BE" - }, - { - "name":"Belize", - "dial_code":"+501", - "code":"BZ" - }, - { - "name":"Benin", - "dial_code":"+229", - "code":"BJ" - }, - { - "name":"Bermuda", - "dial_code":"+1441", - "code":"BM" - }, - { - "name":"Bhutan", - "dial_code":"+975", - "code":"BT" - }, - { - "name":"Bosnia and Herzegovina", - "dial_code":"+387", - "code":"BA" - }, - { - "name":"Botswana", - "dial_code":"+267", - "code":"BW" - }, - { - "name":"Brazil", - "dial_code":"+55", - "code":"BR" - }, - { - "name":"British Indian Ocean Territory", - "dial_code":"+246", - "code":"IO" - }, - { - "name":"Bulgaria", - "dial_code":"+359", - "code":"BG" - }, - { - "name":"Burkina Faso", - "dial_code":"+226", - "code":"BF" - }, - { - "name":"Burundi", - "dial_code":"+257", - "code":"BI" - }, - { - "name":"Cambodia", - "dial_code":"+855", - "code":"KH" - }, - { - "name":"Cameroon", - "dial_code":"+237", - "code":"CM" - }, - { - "name":"Canada", - "dial_code":"+1", - "code":"CA" - }, - { - "name":"Cape Verde", - "dial_code":"+238", - "code":"CV" - }, - { - "name":"Cayman Islands", - "dial_code":"+ 345", - "code":"KY" - }, - { - "name":"Central African Republic", - "dial_code":"+236", - "code":"CF" - }, - { - "name":"Chad", - "dial_code":"+235", - "code":"TD" - }, - { - "name":"Chile", - "dial_code":"+56", - "code":"CL" - }, - { - "name":"China", - "dial_code":"+86", - "code":"CN" - }, - { - "name":"Christmas Island", - "dial_code":"+61", - "code":"CX" - }, - { - "name":"Colombia", - "dial_code":"+57", - "code":"CO" - }, - { - "name":"Comoros", - "dial_code":"+269", - "code":"KM" - }, - { - "name":"Congo", - "dial_code":"+242", - "code":"CG" - }, - { - "name":"Cook Islands", - "dial_code":"+682", - "code":"CK" - }, - { - "name":"Costa Rica", - "dial_code":"+506", - "code":"CR" - }, - { - "name":"Croatia", - "dial_code":"+385", - "code":"HR" - }, - { - "name":"Cuba", - "dial_code":"+53", - "code":"CU" - }, - { - "name":"Cyprus", - "dial_code":"+537", - "code":"CY" - }, - { - "name":"Czech Republic", - "dial_code":"+420", - "code":"CZ" - }, - { - "name":"Denmark", - "dial_code":"+45", - "code":"DK" - }, - { - "name":"Djibouti", - "dial_code":"+253", - "code":"DJ" - }, - { - "name":"Dominica", - "dial_code":"+1767", - "code":"DM" - }, - { - "name":"Dominican Republic", - "dial_code":"+1849", - "code":"DO" - }, - { - "name":"Ecuador", - "dial_code":"+593", - "code":"EC" - }, - { - "name":"Egypt", - "dial_code":"+20", - "code":"EG" - }, - { - "name":"El Salvador", - "dial_code":"+503", - "code":"SV" - }, - { - "name":"Equatorial Guinea", - "dial_code":"+240", - "code":"GQ" - }, - { - "name":"Eritrea", - "dial_code":"+291", - "code":"ER" - }, - { - "name":"Estonia", - "dial_code":"+372", - "code":"EE" - }, - { - "name":"Ethiopia", - "dial_code":"+251", - "code":"ET" - }, - { - "name":"Faroe Islands", - "dial_code":"+298", - "code":"FO" - }, - { - "name":"Fiji", - "dial_code":"+679", - "code":"FJ" - }, - { - "name":"Finland", - "dial_code":"+358", - "code":"FI" - }, - { - "name":"France", - "dial_code":"+33", - "code":"FR" - }, - { - "name":"French Guiana", - "dial_code":"+594", - "code":"GF" - }, - { - "name":"French Polynesia", - "dial_code":"+689", - "code":"PF" - }, - { - "name":"Gabon", - "dial_code":"+241", - "code":"GA" - }, - { - "name":"Gambia", - "dial_code":"+220", - "code":"GM" - }, - { - "name":"Georgia", - "dial_code":"+995", - "code":"GE" - }, - { - "name":"Germany", - "dial_code":"+49", - "code":"DE" - }, - { - "name":"Ghana", - "dial_code":"+233", - "code":"GH" - }, - { - "name":"Gibraltar", - "dial_code":"+350", - "code":"GI" - }, - { - "name":"Greece", - "dial_code":"+30", - "code":"GR" - }, - { - "name":"Greenland", - "dial_code":"+299", - "code":"GL" - }, - { - "name":"Grenada", - "dial_code":"+1473", - "code":"GD" - }, - { - "name":"Guadeloupe", - "dial_code":"+590", - "code":"GP" - }, - { - "name":"Guam", - "dial_code":"+1671", - "code":"GU" - }, - { - "name":"Guatemala", - "dial_code":"+502", - "code":"GT" - }, - { - "name":"Guinea", - "dial_code":"+224", - "code":"GN" - }, - { - "name":"Guinea-Bissau", - "dial_code":"+245", - "code":"GW" - }, - { - "name":"Guyana", - "dial_code":"+595", - "code":"GY" - }, - { - "name":"Haiti", - "dial_code":"+509", - "code":"HT" - }, - { - "name":"Honduras", - "dial_code":"+504", - "code":"HN" - }, - { - "name":"Hungary", - "dial_code":"+36", - "code":"HU" - }, - { - "name":"Iceland", - "dial_code":"+354", - "code":"IS" - }, - { - "name":"India", - "dial_code":"+91", - "code":"IN" - }, - { - "name":"Indonesia", - "dial_code":"+62", - "code":"ID" - }, - { - "name":"Iraq", - "dial_code":"+964", - "code":"IQ" - }, - { - "name":"Ireland", - "dial_code":"+353", - "code":"IE" - }, - { - "name":"Israel", - "dial_code":"+972", - "code":"IL" - }, - { - "name":"Italy", - "dial_code":"+39", - "code":"IT" - }, - { - "name":"Jamaica", - "dial_code":"+1876", - "code":"JM" - }, - { - "name":"Japan", - "dial_code":"+81", - "code":"JP" - }, - { - "name":"Jordan", - "dial_code":"+962", - "code":"JO" - }, - { - "name":"Kazakhstan", - "dial_code":"+7 7", - "code":"KZ" - }, - { - "name":"Kenya", - "dial_code":"+254", - "code":"KE" - }, - { - "name":"Kiribati", - "dial_code":"+686", - "code":"KI" - }, - { - "name":"Kuwait", - "dial_code":"+965", - "code":"KW" - }, - { - "name":"Kyrgyzstan", - "dial_code":"+996", - "code":"KG" - }, - { - "name":"Latvia", - "dial_code":"+371", - "code":"LV" - }, - { - "name":"Lebanon", - "dial_code":"+961", - "code":"LB" - }, - { - "name":"Lesotho", - "dial_code":"+266", - "code":"LS" - }, - { - "name":"Liberia", - "dial_code":"+231", - "code":"LR" - }, - { - "name":"Liechtenstein", - "dial_code":"+423", - "code":"LI" - }, - { - "name":"Lithuania", - "dial_code":"+370", - "code":"LT" - }, - { - "name":"Luxembourg", - "dial_code":"+352", - "code":"LU" - }, - { - "name":"Madagascar", - "dial_code":"+261", - "code":"MG" - }, - { - "name":"Malawi", - "dial_code":"+265", - "code":"MW" - }, - { - "name":"Malaysia", - "dial_code":"+60", - "code":"MY" - }, - { - "name":"Maldives", - "dial_code":"+960", - "code":"MV" - }, - { - "name":"Mali", - "dial_code":"+223", - "code":"ML" - }, - { - "name":"Malta", - "dial_code":"+356", - "code":"MT" - }, - { - "name":"Marshall Islands", - "dial_code":"+692", - "code":"MH" - }, - { - "name":"Martinique", - "dial_code":"+596", - "code":"MQ" - }, - { - "name":"Mauritania", - "dial_code":"+222", - "code":"MR" - }, - { - "name":"Mauritius", - "dial_code":"+230", - "code":"MU" - }, - { - "name":"Mayotte", - "dial_code":"+262", - "code":"YT" - }, - { - "name":"Mexico", - "dial_code":"+52", - "code":"MX" - }, - { - "name":"Monaco", - "dial_code":"+377", - "code":"MC" - }, - { - "name":"Mongolia", - "dial_code":"+976", - "code":"MN" - }, - { - "name":"Montenegro", - "dial_code":"+382", - "code":"ME" - }, - { - "name":"Montserrat", - "dial_code":"+1664", - "code":"MS" - }, - { - "name":"Morocco", - "dial_code":"+212", - "code":"MA" - }, - { - "name":"Myanmar", - "dial_code":"+95", - "code":"MM" - }, - { - "name":"Namibia", - "dial_code":"+264", - "code":"NA" - }, - { - "name":"Nauru", - "dial_code":"+674", - "code":"NR" - }, - { - "name":"Nepal", - "dial_code":"+977", - "code":"NP" - }, - { - "name":"Netherlands", - "dial_code":"+31", - "code":"NL" - }, - { - "name":"Netherlands Antilles", - "dial_code":"+599", - "code":"AN" - }, - { - "name":"New Caledonia", - "dial_code":"+687", - "code":"NC" - }, - { - "name":"New Zealand", - "dial_code":"+64", - "code":"NZ" - }, - { - "name":"Nicaragua", - "dial_code":"+505", - "code":"NI" - }, - { - "name":"Niger", - "dial_code":"+227", - "code":"NE" - }, - { - "name":"Nigeria", - "dial_code":"+234", - "code":"NG" - }, - { - "name":"Niue", - "dial_code":"+683", - "code":"NU" - }, - { - "name":"Norfolk Island", - "dial_code":"+672", - "code":"NF" - }, - { - "name":"Northern Mariana Islands", - "dial_code":"+1670", - "code":"MP" - }, - { - "name":"Norway", - "dial_code":"+47", - "code":"NO" - }, - { - "name":"Oman", - "dial_code":"+968", - "code":"OM" - }, - { - "name":"Pakistan", - "dial_code":"+92", - "code":"PK" - }, - { - "name":"Palau", - "dial_code":"+680", - "code":"PW" - }, - { - "name":"Panama", - "dial_code":"+507", - "code":"PA" - }, - { - "name":"Papua New Guinea", - "dial_code":"+675", - "code":"PG" - }, - { - "name":"Paraguay", - "dial_code":"+595", - "code":"PY" - }, - { - "name":"Peru", - "dial_code":"+51", - "code":"PE" - }, - { - "name":"Philippines", - "dial_code":"+63", - "code":"PH" - }, - { - "name":"Poland", - "dial_code":"+48", - "code":"PL" - }, - { - "name":"Portugal", - "dial_code":"+351", - "code":"PT" - }, - { - "name":"Puerto Rico", - "dial_code":"+1939", - "code":"PR" - }, - { - "name":"Qatar", - "dial_code":"+974", - "code":"QA" - }, - { - "name":"Romania", - "dial_code":"+40", - "code":"RO" - }, - { - "name":"Rwanda", - "dial_code":"+250", - "code":"RW" - }, - { - "name":"Samoa", - "dial_code":"+685", - "code":"WS" - }, - { - "name":"San Marino", - "dial_code":"+378", - "code":"SM" - }, - { - "name":"Saudi Arabia", - "dial_code":"+966", - "code":"SA" - }, - { - "name":"Senegal", - "dial_code":"+221", - "code":"SN" - }, - { - "name":"Serbia", - "dial_code":"+381", - "code":"RS" - }, - { - "name":"Seychelles", - "dial_code":"+248", - "code":"SC" - }, - { - "name":"Sierra Leone", - "dial_code":"+232", - "code":"SL" - }, - { - "name":"Singapore", - "dial_code":"+65", - "code":"SG" - }, - { - "name":"Slovakia", - "dial_code":"+421", - "code":"SK" - }, - { - "name":"Slovenia", - "dial_code":"+386", - "code":"SI" - }, - { - "name":"Solomon Islands", - "dial_code":"+677", - "code":"SB" - }, - { - "name":"South Africa", - "dial_code":"+27", - "code":"ZA" - }, - { - "name":"South Georgia and the South Sandwich Islands", - "dial_code":"+500", - "code":"GS" - }, - { - "name":"Spain", - "dial_code":"+34", - "code":"ES" - }, - { - "name":"Sri Lanka", - "dial_code":"+94", - "code":"LK" - }, - { - "name":"Sudan", - "dial_code":"+249", - "code":"SD" - }, - { - "name":"Suriname", - "dial_code":"+597", - "code":"SR" - }, - { - "name":"Swaziland", - "dial_code":"+268", - "code":"SZ" - }, - { - "name":"Sweden", - "dial_code":"+46", - "code":"SE" - }, - { - "name":"Switzerland", - "dial_code":"+41", - "code":"CH" - }, - { - "name":"Tajikistan", - "dial_code":"+992", - "code":"TJ" - }, - { - "name":"Thailand", - "dial_code":"+66", - "code":"TH" - }, - { - "name":"Togo", - "dial_code":"+228", - "code":"TG" - }, - { - "name":"Tokelau", - "dial_code":"+690", - "code":"TK" - }, - { - "name":"Tonga", - "dial_code":"+676", - "code":"TO" - }, - { - "name":"Trinidad and Tobago", - "dial_code":"+1868", - "code":"TT" - }, - { - "name":"Tunisia", - "dial_code":"+216", - "code":"TN" - }, - { - "name":"Turkey", - "dial_code":"+90", - "code":"TR" - }, - { - "name":"Turkmenistan", - "dial_code":"+993", - "code":"TM" - }, - { - "name":"Turks and Caicos Islands", - "dial_code":"+1649", - "code":"TC" - }, - { - "name":"Tuvalu", - "dial_code":"+688", - "code":"TV" - }, - { - "name":"Uganda", - "dial_code":"+256", - "code":"UG" - }, - { - "name":"Ukraine", - "dial_code":"+380", - "code":"UA" - }, - { - "name":"United Arab Emirates", - "dial_code":"+971", - "code":"AE" - }, - { - "name":"United Kingdom", - "dial_code":"+44", - "code":"GB" - }, - { - "name":"United States", - "dial_code":"+1", - "code":"US" - }, - { - "name":"Uruguay", - "dial_code":"+598", - "code":"UY" - }, - { - "name":"Uzbekistan", - "dial_code":"+998", - "code":"UZ" - }, - { - "name":"Vanuatu", - "dial_code":"+678", - "code":"VU" - }, - { - "name":"Wallis and Futuna", - "dial_code":"+681", - "code":"WF" - }, - { - "name":"Yemen", - "dial_code":"+967", - "code":"YE" - }, - { - "name":"Zambia", - "dial_code":"+260", - "code":"ZM" - }, - { - "name":"Zimbabwe", - "dial_code":"+263", - "code":"ZW" - }, - { - "name":"land Islands", - "dial_code":"", - "code":"AX" - }, - { - "name":"Antarctica", - "dial_code":null, - "code":"AQ" - }, - { - "name":"Bolivia, Plurinational State of", - "dial_code":"+591", - "code":"BO" - }, - { - "name":"Brunei Darussalam", - "dial_code":"+673", - "code":"BN" - }, - { - "name":"Cocos (Keeling) Islands", - "dial_code":"+61", - "code":"CC" - }, - { - "name":"Congo, The Democratic Republic of the", - "dial_code":"+243", - "code":"CD" - }, - { - "name":"Cote d'Ivoire", - "dial_code":"+225", - "code":"CI" - }, - { - "name":"Falkland Islands (Malvinas)", - "dial_code":"+500", - "code":"FK" - }, - { - "name":"Guernsey", - "dial_code":"+44", - "code":"GG" - }, - { - "name":"Holy See (Vatican City State)", - "dial_code":"+379", - "code":"VA" - }, - { - "name":"Hong Kong", - "dial_code":"+852", - "code":"HK" - }, - { - "name":"Iran, Islamic Republic of", - "dial_code":"+98", - "code":"IR" - }, - { - "name":"Isle of Man", - "dial_code":"+44", - "code":"IM" - }, - { - "name":"Jersey", - "dial_code":"+44", - "code":"JE" - }, - { - "name":"Korea, Democratic People's Republic of", - "dial_code":"+850", - "code":"KP" - }, - { - "name":"Korea, Republic of", - "dial_code":"+82", - "code":"KR" - }, - { - "name":"Lao People's Democratic Republic", - "dial_code":"+856", - "code":"LA" - }, - { - "name":"Libyan Arab Jamahiriya", - "dial_code":"+218", - "code":"LY" - }, - { - "name":"Macao", - "dial_code":"+853", - "code":"MO" - }, - { - "name":"Macedonia, The Former Yugoslav Republic of", - "dial_code":"+389", - "code":"MK" - }, - { - "name":"Micronesia, Federated States of", - "dial_code":"+691", - "code":"FM" - }, - { - "name":"Moldova, Republic of", - "dial_code":"+373", - "code":"MD" - }, - { - "name":"Mozambique", - "dial_code":"+258", - "code":"MZ" - }, - { - "name":"Palestinian Territory, Occupied", - "dial_code":"+970", - "code":"PS" - }, - { - "name":"Pitcairn", - "dial_code":"+872", - "code":"PN" - }, - { - "name":"Réunion", - "dial_code":"+262", - "code":"RE" - }, - { - "name":"Russia", - "dial_code":"+7", - "code":"RU" - }, - { - "name":"Saint Barthélemy", - "dial_code":"+590", - "code":"BL" - }, - { - "name":"Saint Helena, Ascension and Tristan Da Cunha", - "dial_code":"+290", - "code":"SH" - }, - { - "name":"Saint Kitts and Nevis", - "dial_code":"+1869", - "code":"KN" - }, - { - "name":"Saint Lucia", - "dial_code":"+1758", - "code":"LC" - }, - { - "name":"Saint Martin", - "dial_code":"+590", - "code":"MF" - }, - { - "name":"Saint Pierre and Miquelon", - "dial_code":"+508", - "code":"PM" - }, - { - "name":"Saint Vincent and the Grenadines", - "dial_code":"+1784", - "code":"VC" - }, - { - "name":"Sao Tome and Principe", - "dial_code":"+239", - "code":"ST" - }, - { - "name":"Somalia", - "dial_code":"+252", - "code":"SO" - }, - { - "name":"Svalbard and Jan Mayen", - "dial_code":"+47", - "code":"SJ" - }, - { - "name":"Syrian Arab Republic", - "dial_code":"+963", - "code":"SY" - }, - { - "name":"Taiwan, Province of China", - "dial_code":"+886", - "code":"TW" - }, - { - "name":"Tanzania, United Republic of", - "dial_code":"+255", - "code":"TZ" - }, - { - "name":"Timor-Leste", - "dial_code":"+670", - "code":"TL" - }, - { - "name":"Venezuela, Bolivarian Republic of", - "dial_code":"+58", - "code":"VE" - }, - { - "name":"Viet Nam", - "dial_code":"+84", - "code":"VN" - }, - { - "name":"Virgin Islands, British", - "dial_code":"+1284", - "code":"VG" - }, - { - "name":"Virgin Islands, U.S.", - "dial_code":"+1340", - "code":"VI" - } -] \ No newline at end of file From 37684992ba88b463bce8ae817f46c1a588a942d6 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Fri, 30 Nov 2018 15:38:50 +0100 Subject: [PATCH 11/30] Disposable number providers & refactor Added support for json files to make scanners easier to handle. Added a temporary solution for bug #1 and removed proxy list because they were used as HTTP proxies (so useless for requests using HTTPS) and Google was blacklisting them instantly without taking care of the whitelist cookie. --- phoneinfoga.py | 349 +++++++++++++++---------------------------------- 1 file changed, 106 insertions(+), 243 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index f4e9e97..cf82ebe 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -__version__ = '0.8-dev' +__version__ = '0.9-dev' def banner(): print " ___ _ _____ __ " @@ -85,33 +85,15 @@ uagent.append("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1") uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") -proxy=[] -proxy.append("118.97.125.150:8080") -proxy.append("212.23.250.46:80") -proxy.append("197.149.128.190:42868") -proxy.append("87.128.41.56:80",) -proxy.append("197.149.129.252:32486") -proxy.append("159.69.211.173:3128") -proxy.append("197.149.128.190:44655") -proxy.append("196.13.208.23:8080") -proxy.append("196.13.208.22:8080") -proxy.append("82.136.122.127:80") -proxy.append("178.60.28.98:9999") -proxy.append("41.60.1.102:80") -proxy.append("212.56.139.253:80") - GoogleAbuseToken = '' def search(req, stop): global GoogleAbuseToken global uagent - global proxy - chosenProxy = random.choice(proxy) chosenUserAgent = random.choice(uagent) s = requests.Session() - proxies = {"http": chosenProxy} headers = { 'User-Agent': chosenUserAgent, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', @@ -123,16 +105,16 @@ def search(req, stop): 'Cookie': 'Cookie: CGIC=Ij90ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSwqLyo7cT0wLjg; CONSENT=YES+RE.fr+20150809-08-0; 1P_JAR=2018-11-28-14; NID=148=aSdSHJz71rufCokaUC93nH3H7lOb8E7BNezDWV-PyyiHTXqWK5Y5hsvj7IAzhZAK04-QNTXjYoLXVu_eiAJkiE46DlNn6JjjgCtY-7Fr0I4JaH-PZRb7WFgSTjiFqh0fw2cCWyN69DeP92dzMd572tQW2Z1gPwno3xuPrYC1T64wOud1DjZDhVAZkpk6UkBrU0PBcnLWL7YdL6IbEaCQlAI9BwaxoH_eywPVyS9V; SID=uAYeu3gT23GCz-ktdGInQuOSf-5SSzl3Plw11-CwsEYY0mqJLSiv7tFKeRpB_5iz8SH5lg.; HSID=AZmH_ctAfs0XbWOCJ; SSID=A0PcRJSylWIxJYTq_; APISID=HHB2bKfJ-2ZUL5-R/Ac0GK3qtM8EHkloNw; SAPISID=wQoxetHBpyo4pJKE/A2P6DUM9zGnStpIVt; SIDCC=ABtHo-EhFAa2AJrJIUgRGtRooWyVK0bAwiQ4UgDmKamfe88xOYBXM47FoL5oZaTxR3H-eOp7-rE; OTZ=4671861_52_52_123900_48_436380; OGPC=873035776-8:; OGP=-873035776:;' } - if True: + try: URL = 'https://www.google.com/search?tbs=li:1&q=%s&gws_rd=ssl' % (req) - r = s.get(URL + GoogleAbuseToken, headers=headers, proxies=proxies) + r = s.get(URL + GoogleAbuseToken, headers=headers) while r.status_code == 503: print code_warning + 'You are temporary blacklisted from Google search. Complete the captcha at the following URL and copy/paste the content of GOOGLE_ABUSE_EXEMPTION cookie : %s' % URL print '\n' + code_info + 'Need help ? Read the doc at https://github.com/sundowndev/PhoneInfoga' token = raw_input('\nGOOGLE_ABUSE_EXEMPTION=') GoogleAbuseToken = '&google_abuse=' + token - r = s.get(URL + GoogleAbuseToken, headers=headers, proxies=proxies) + r = s.get(URL + GoogleAbuseToken, headers=headers) soup = BeautifulSoup(r.content, 'html.parser') results = soup.find("div", id="search").find_all("div", class_="g") @@ -146,12 +128,17 @@ def search(req, stop): if int(counter) > int(stop): break - url = result.find("cite").string + url = result.find("a").get('href') + url = re.sub(r'(?:\/url\?q\=)', '', url) + url = re.sub(r'(?:\/url\?url\=)', '', url) + url = re.sub(r'(?:\&sa\=)(?:.*)', '', url) + url = re.sub(r'(?:\&rct\=)(?:.*)', '', url) + links.append(url) return links - #except: - #print code_error + 'Failed search.' + except: + print code_error + 'Request failed. Please retry or open an issue on GitHub.' def formatNumber(number): return re.sub("(?:\+)?(?:[^[0-9]*)", "", number) @@ -218,7 +205,7 @@ def numverifyScan(PhoneNumber): 'host': "numverify.com", 'connection': "keep-alive", 'content-length': "49", - 'accept': "application/json, text/javascript, */*; q=0.01", + 'accept': "application/json", 'origin': "https://numverify.com", 'x-requested-with': "XMLHttpRequest", 'user-agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", @@ -282,6 +269,19 @@ def ovhScan(country, number): print(code_result + "Zip code: " + voip_number['zipCode'] if voip_number['zipCode'] is not None else '') askForExit() +def osintDisposableNumScan(number): + dorks = json.load(open('osint/disposable_num_providers.json')) + + for dork in dorks: + dorkRequest = dork['request'].replace('$n', number).replace('$n', number) + + print(code_info + "Searching for results on %s..." % dork['site']) + for result in search(dorkRequest, stop=dork['stop']): + if result: + print(code_result + "Found a temporary number provider: %s" % dork['site']) + print(code_result + "URL: " + result) + askForExit() + def osintScan(countryCode, number, internationalNumber): if not args.osint: return -1 @@ -292,226 +292,38 @@ def osintScan(countryCode, number, internationalNumber): print(code_info + "Generating scan URL on 411.com...") print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-') - if True: - # Social profiles: facebook, twitter, linkedin, instagram - print(code_info + '[Social media footprints]') - print(code_info + "Searching for footprints on facebook.com... (limit=5)") - for result in search('site:facebook.com intext:"%s" | "%s"' % (number,number), stop=5): - if result: - print(code_result + "Result found: " + result) + print(code_info + '---- Web pages footprints ----') - print(code_info + "Searching for footprints on twitter.com... (limit=5)") - for result in search('site:twitter.com intext:"%s" | "%s"' % (number,number), stop=5): - if result: - print(code_result + "Result found: " + result) + print(code_info + "Searching for footprints on web pages... (limit=5)") + for result in search('%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber), stop=5): + if result: + print(code_result + "Result found: " + result) - print(code_info + "Searching for footprints on linkedin.com... (limit=5)") - for result in search('site:linkedin.com intext:"%s" | "%s"' % (number,number), stop=5): - if result: - print(code_result + "Result found: " + result) + # 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,internationalNumber), 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_info + '---- Reputation footprints ----') - # Websites - print(code_info + '[Web pages footprints]') - print(code_info + "Searching for footprints on web pages... (limit=5)") - for result in search('%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber), stop=5): - if result: - print(code_result + "Result found: " + result) + print(code_info + "Searching for reputation report on whosenumber.info...") + 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) - # 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_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.") - # 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 + "Generating URL on scamcallfighters.com...") + print code_result + 'http://www.scamcallfighters.com/search-phone-%s.html' % number - 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.") - - print(code_info + "Generating URL on scamcallfighters.com...") - print code_result + 'http://www.scamcallfighters.com/search-phone-%s.html' % number - - #print code_warning + "Waiting 10 sec before sending new requests to avoid being blacklisted..." - #time.sleep(10) - - # Temporary number providers - print(code_info + '[Temporary number providers footprints]') - 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 smslisten.com... (limit=1)") - for result in search('site:"smslisten.com" intext:"%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: smslisten.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on smsnumbersonline.com... (limit=1)") - for result in search('site:"smsnumbersonline.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: smsnumbersonline.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on freesmscode.com... (limit=1)") - for result in search('site:"freesmscode.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: freesmscode.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on catchsms.com... (limit=1)") - for result in search('site:"catchsms.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: catchsms.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on smstibo.com... (limit=1)") - for result in search('site:"smstibo.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: smstibo.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on smsreceiving.com... (limit=1)") - for result in search('site:"smsreceiving.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: smsreceiving.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on getfreesmsnumber.com... (limit=1)") - for result in search('site:"getfreesmsnumber.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: getfreesmsnumber.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on sellaite.com... (limit=1)") - for result in search('site:"sellaite.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: sellaite.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receive-sms-online.info... (limit=1)") - for result in search('site:"receive-sms-online.info" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receive-sms-online.info") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receivesmsonline.com... (limit=1)") - for result in search('site:"receivesmsonline.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receivesmsonline.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receive-a-sms.com... (limit=1)") - for result in search('site:"receive-a-sms.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receive-a-sms.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on sms-receive.net... (limit=1)") - for result in search('site:"sms-receive.net" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: sms-receive.net") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receivefreesms.com... (limit=1)") - for result in search('site:"receivefreesms.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receivefreesms.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on freeonlinephone.org... (limit=1)") - for result in search('site:"freeonlinephone.org" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: freeonlinephone.org") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receive-sms.com... (limit=1)") - for result in search('site:"receive-sms.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receive-sms.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receivetxt.com... (limit=1)") - for result in search('site:"receivetxt.com" %s' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receivetxt.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receive-smss.com... (limit=1)") - for result in search('site:"receive-smss.com" intext:"+%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receive-smss.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on freephonenum.com... (limit=1)") - for result in search('site:"freephonenum.com" intext:"%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: freephonenum.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on receivefreesms.com... (limit=1)") - for result in search('site:"receivefreesms.com" intext:"%s"' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: receivefreesms.com") - print(code_result + "URL: " + result) - askForExit() - - print(code_info + "Searching for results on freesmsverification.com... (limit=1)") - for result in search('site:"freesmsverification.com" %s' % number, stop=1): - if result: - print(code_result + "Found a temporary number provider: freesmsverification.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 + '---- Temporary number providers footprints ----') print(code_info + "Searching for phone number on tempophone.com...") response = requests.request("GET", "https://tempophone.com/api/v1/phones") @@ -521,15 +333,62 @@ def osintScan(countryCode, number, internationalNumber): print(code_result + "Found a temporary number provider: tempophone.com") askForExit() + osintDisposableNumScan(number) + + print(code_info + '---- Social media footprints ----') + + print(code_info + "Searching for footprints on facebook.com... (limit=5)") + for result in search('site:facebook.com intext:"%s" | "%s"' % (number,internationalNumber), stop=5): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Searching for footprints on twitter.com... (limit=5)") + for result in search('site:twitter.com intext:"%s" | "%s"' % (number,internationalNumber), stop=5): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Searching for footprints on linkedin.com... (limit=5)") + for result in search('site:linkedin.com intext:"%s" | "%s"' % (number,internationalNumber), 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,internationalNumber), stop=5): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Searching for footprints on numinfo.net... (limit=2)") + for result in search('site:numinfo.net intext:"%s" | "%s"' % (number,internationalNumber), stop=2): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Searching for footprints on numinfo.net... (limit=2)") + for result in search('site:numinfo.net intext:"%s" | "%s"' % (number,internationalNumber), stop=2): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Searching for footprints on sync.me... ") + for result in search('site:sync.me inurl:"%s" | "%s"' % (number,internationalNumber), stop=1): + if result: + print(code_result + "Result found: " + result) + + print(code_info + "Generating URL on True People... ") + print code_result + 'https://www.truepeoplesearch.com/results?phoneno=%s' % internationalNumber + + print(code_info + "Searching for footprints on whocallsyou.de... ") + for result in search('site:whocallsyou.de inurl:"0%s"' % (number), stop=1): + if result: + print(code_result + "Result found: " + result) + def askForExit(): if not args.output: - user_input = raw_input(code_info + "Continue scanning ? (Y/n) ") + user_input = raw_input(code_info + "Continue scanning ? (y/N) ") - if user_input.lower() == 'n' or user_input.lower() == 'no': + if user_input.lower() == 'y' or user_input.lower() == 'yes': + return -1 + else: print code_info + "Good bye!" sys.exit() - else: - return -1 def scanNumber(number): print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(number) @@ -556,6 +415,10 @@ try: code_error = '[!] ' code_title = '' + if args.osint: + print '\033[91m[!] OSINT scanner is not available using output option (sorry).' + sys.exit() + sys.stdout = args.output banner() else: From 851005603a77450539e050a97bf65a5eaa827818 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 30 Nov 2018 15:39:43 +0100 Subject: [PATCH 12/30] Delete todo.md --- todo.md | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 todo.md diff --git a/todo.md b/todo.md deleted file mode 100644 index 2f20810..0000000 --- a/todo.md +++ /dev/null @@ -1,16 +0,0 @@ -# Todo list - -- Input feature: Done -- Output feature: Done -- OVH scanner - - Search for number range -- Update feature -- Offline scan: Done -- OSINT recon - - Search for social profiles (facebook, twitter, linkedin, instagram) - - Search for documents - - Search for websites - - Search for emails - - Search on 411 - - Search on hs3x - - Search on whosenumber From 63b6987d68f73ea12a0b584f1f0c7239b78e88d3 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 30 Nov 2018 15:40:09 +0100 Subject: [PATCH 13/30] Remove unused google library --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 02ae170..ada83e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,3 @@ requests bs4 html5lib phonenumbers -google From 588d02d739fa304659e2a9213f25c385e9ac226b Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 30 Nov 2018 15:42:15 +0100 Subject: [PATCH 14/30] Remove unused google library import --- phoneinfoga.py | 1 - 1 file changed, 1 deletion(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index cf82ebe..c4255bb 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -65,7 +65,6 @@ try: from phonenumbers import carrier from phonenumbers import geocoder from phonenumbers import timezone - #from googlesearch import search except KeyboardInterrupt: print '\033[91m[!] Exiting.' sys.exit() From 358fa08996c2004891ac2b2e6a48188e2da848c4 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 30 Nov 2018 23:39:14 +0100 Subject: [PATCH 15/30] Duplicate entry --- osint/disposable_num_providers.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/osint/disposable_num_providers.json b/osint/disposable_num_providers.json index adb5bf9..bb9f23a 100644 --- a/osint/disposable_num_providers.json +++ b/osint/disposable_num_providers.json @@ -89,11 +89,6 @@ "request": "site:\"freephonenum.com\" intext:\"$n\"", "stop": 1 }, - { - "site": "receivefreesms.com", - "request": "site:\"receivefreesms.com\" intext:\"$n\"", - "stop": 1 - }, { "site": "freesmsverification.com", "request": "site:\"freesmsverification.com\" $n", From 31dd315c189f0aad6432cdf78af65643e58d3292 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 30 Nov 2018 23:54:22 +0100 Subject: [PATCH 16/30] Disable .html results for documents footprints --- phoneinfoga.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index c4255bb..fc9c35b 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -300,7 +300,7 @@ def osintScan(countryCode, number, internationalNumber): # 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,internationalNumber), stop=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' % (number,internationalNumber), stop=5): if result: print(code_result + "Result found: " + result) @@ -356,11 +356,8 @@ def osintScan(countryCode, number, internationalNumber): if result: print(code_result + "Result found: " + result) - print(code_info + "Searching for footprints on numinfo.net... (limit=2)") - for result in search('site:numinfo.net intext:"%s" | "%s"' % (number,internationalNumber), stop=2): - if result: - print(code_result + "Result found: " + result) - + print(code_info + '---- Phone books footprints ----') + print(code_info + "Searching for footprints on numinfo.net... (limit=2)") for result in search('site:numinfo.net intext:"%s" | "%s"' % (number,internationalNumber), stop=2): if result: From bcb4c398b18af801a5a00a674ea0e6c1b5761b13 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Sun, 2 Dec 2018 00:04:48 +0100 Subject: [PATCH 17/30] Reputation OSINT queries --- osint/reputation.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osint/reputation.json b/osint/reputation.json index 778f528..40bd55b 100644 --- a/osint/reputation.json +++ b/osint/reputation.json @@ -1,7 +1,12 @@ [ { - "site": "whosenumber.info", + "title": "reputation report on whosenumber.info", "request": "site:\"whosenumber.info\" intext:\"$n\" intitle:\"who called\"", "stop": 1, + }, + { + "title": "phone fraud footprints", + "request": "intitle:\"Phone Fraud\" intext:\"$n\" | \"$n\"", + "stop": 5, } ] From 11b41963c2eeea44db7cf8a3078adf9453793362 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Sun, 2 Dec 2018 00:05:11 +0100 Subject: [PATCH 18/30] Social medias OSINT queries --- osint/social_medias.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/osint/social_medias.json b/osint/social_medias.json index 315d3a1..53d7876 100644 --- a/osint/social_medias.json +++ b/osint/social_medias.json @@ -1,14 +1,22 @@ [ { "site": "facebook.com", - "request": "site:\"facebook.com\" intext:\"$n\" | $n", - "dialCode": null, + "request": "site:\"facebook.com\" intext:\"$n\" | $i", "stop": 5 }, { "site": "twitter.com", - "request": "site:\"twitter.com\" intext:\"$n\" | $n", - "dialCode": null, + "request": "site:\"twitter.com\" intext:\"$n\" | $i", + "stop": 5 + }, + { + "site": "linkedin.com", + "request": "site:\"linkedin.com\" intext:\"$n\" | $i", + "stop": 5 + }, + { + "site": "instagram.com", + "request": "site:\"instagram.com\" intext:\"$n\" | $i", "stop": 5 } ] From cff4e8f22714be90bbc8d06fa5368a97e8dffa17 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Sun, 2 Dec 2018 00:06:10 +0100 Subject: [PATCH 19/30] some code refactor --- osint/individuals.json | 12 ++++++------ phoneinfoga.py | 11 ++++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/osint/individuals.json b/osint/individuals.json index 315d3a1..1ee189a 100644 --- a/osint/individuals.json +++ b/osint/individuals.json @@ -1,14 +1,14 @@ [ { - "site": "facebook.com", - "request": "site:\"facebook.com\" intext:\"$n\" | $n", + "site": "numinfo.net", + "request": "site:\"numinfo.net\" intext:\"$n\" | $i", "dialCode": null, - "stop": 5 + "stop": 2 }, { - "site": "twitter.com", - "request": "site:\"twitter.com\" intext:\"$n\" | $n", + "site": "sync.me", + "request": "site:\"sync.me\" intext:\"$n\" | $i", "dialCode": null, - "stop": 5 + "stop": 1 } ] diff --git a/phoneinfoga.py b/phoneinfoga.py index fc9c35b..e375601 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -274,10 +274,10 @@ def osintDisposableNumScan(number): for dork in dorks: dorkRequest = dork['request'].replace('$n', number).replace('$n', number) - print(code_info + "Searching for results on %s..." % dork['site']) + print(code_info + "Searching for footprints on %s..." % dork['site']) for result in search(dorkRequest, stop=dork['stop']): if result: - print(code_result + "Found a temporary number provider: %s" % dork['site']) + print(code_result + "Result found: %s" % dork['site']) print(code_result + "URL: " + result) askForExit() @@ -291,6 +291,11 @@ def osintScan(countryCode, number, internationalNumber): print(code_info + "Generating scan URL on 411.com...") print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-') + AskingCustomPayload = raw_input(code_info + 'Would you like to use an additional format for this number ? (y/N) ') + + if AskingCustomPayload == 'y': + customPayload = raw_input(code_info + 'Custom format: ') + print(code_info + '---- Web pages footprints ----') print(code_info + "Searching for footprints on web pages... (limit=5)") @@ -357,7 +362,7 @@ def osintScan(countryCode, number, internationalNumber): print(code_result + "Result found: " + result) print(code_info + '---- Phone books footprints ----') - + print(code_info + "Searching for footprints on numinfo.net... (limit=2)") for result in search('site:numinfo.net intext:"%s" | "%s"' % (number,internationalNumber), stop=2): if result: From 5a8a76e44a89e041d5d3492692d8f343d6db65f4 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 7 Dec 2018 17:57:32 +0100 Subject: [PATCH 20/30] Documentation --- README.md | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index bf9ff5f..f01d648 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,22 @@ # PhoneInfoga -Advanced information gathering & OSINT reconnaissance tool for phone numbers. Designed for Social Engineering and red teaming. - -### Hello, friend. Next time cover your tracks. - - +Information gathering & OSINT reconnaissance tool for phone numbers. Designed for Social Engineering and red teaming. ## The project -Building the most advanced tool to scan phone numbers using only free resources. The goal is to first identify basic informations such as country, area, carrier and line type on any international phone numbers with a very good accuracy, and then detect the VoIP provider or search for footprints on search engines to try identify the owner. +Building one of the most advanced tools to scan phone numbers using only free resources. The goal is to first gather basic information such as country, area, carrier and line type on any international phone numbers with a very good accuracy. Then try to determine the VoIP provider or search for footprints on search engines to try identify the owner. **This tool requires python 2.x** ## Features -- Check if phone number exists +- Check if phone number exists and is possible - Gather standard informations such as country, line type and carrier - Check several numbers at once -- Set an output for result(s) -- Check if number is from a VoIP provider - OSINT reconnaissance using external APIs, Google Hacking, phone books & search engines +- Use custom formatting for more effective OSINT reconnaissance + +![](https://i.imgur.com/Gdd4FMZ.png) ## Formats @@ -70,10 +67,16 @@ optional arguments: -u, --update Update the tool & databases ``` -Example : +Example (quotes are optional, use it when typing special formats) : ``` -python phoneinfoga.py -n +42837544833 +python phoneinfoga.py -n "(+42)837544833" +``` + +Check for a number range on OVH : + +``` +python phoneinfoga.py -n +42837544833 -s ovh ``` Check several numbers at once : @@ -82,10 +85,12 @@ Check several numbers at once : python ./phoneinfoga.py -i numbers.txt -o results.txt ``` -Check for a number range on OVH (just put some zeros) : +**Note: `--osint` is not compatible with `--output` option.** + +Use all scanners and run OSINT reconnaissance : ``` -python phoneinfoga.py -n +42837544833 -s ovh +python phoneinfoga.py -n +42837544833 -s all --osint ``` ## Formatting @@ -115,10 +120,20 @@ Here’s the same phone number in E.164 formatting: +442071838750 ![](https://i.imgur.com/Ovso0w2.png) +## Dealing with Google captcha + +PhoneInfo use a workaround to handle Google bot detection. When running OSINT scan, you will usually be blacklisted very easily by Google, which will ask the tool to complete a captcha. + +## Custom formatting + +... + ## License This tool is licensed under the GNU General Public License v3.0. +---- + ## Resources Regular expression : `^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$` From 69af4036a4bad8df702dd42bf590dc2d6739f280 Mon Sep 17 00:00:00 2001 From: Raphael Date: Sat, 8 Dec 2018 00:25:44 +0100 Subject: [PATCH 21/30] Documentation --- README.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f01d648..43a4194 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Building one of the most advanced tools to scan phone numbers using only free re - OSINT reconnaissance using external APIs, Google Hacking, phone books & search engines - Use custom formatting for more effective OSINT reconnaissance -![](https://i.imgur.com/Gdd4FMZ.png) +![](https://i.imgur.com/bWx79dy.png) ## Formats @@ -114,16 +114,25 @@ In the UK, and many other countries internationally, local dialing may require t For example, here’s a UK-based number in standard local formatting: 020 7183 8750 -![](https://i.imgur.com/WdXKSZY.png) - Here’s the same phone number in E.164 formatting: +442071838750 -![](https://i.imgur.com/Ovso0w2.png) - ## Dealing with Google captcha PhoneInfo use a workaround to handle Google bot detection. When running OSINT scan, you will usually be blacklisted very easily by Google, which will ask the tool to complete a captcha. +>When you search on Google using custom requests (Google Dorks), you get very easily blacklisted. So Google shows up a page where you have to complete a captcha to continue. As soon as the captcha is completed, Google create a cookie named "GOOGLE_ABUSE_EXEMPTION" which is used to whitelist your browser and IP address for some minutes. This temporary whitelist is enough to let you gather a lot of information from many sources. So I decided to add a simple user manipulation to bypass this bot detection. [...] So I'll just try make requests and wait until I get a 503 error, which means I got blacklisted. Then I ask the user to follow an URL to manually complete the captcha and copy the whitelist token to paste it in the CLI. The tool is now able to continue to scan! + +![](https://i.imgur.com/qbFZa1m.png) + +### Steps + +- Follow the URL +- Open the dev tool (F12 on most browsers) +- Go to **Storage**, then **Cookies** +- Copy the value of the *GOOGLE_ABUSE_EXEMPTION* cookie and paste it in the CLI + +![](https://i.imgur.com/KkE1EM5.png) + ## Custom formatting ... From 97ef5579a8a0b3093a2e7984736ef74a3c2e9c61 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Sun, 9 Dec 2018 17:36:07 +0100 Subject: [PATCH 22/30] OSINT requests --- osint/individuals.json | 6 ++++++ osint/reputation.json | 4 ++-- osint/social_medias.json | 8 ++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/osint/individuals.json b/osint/individuals.json index 1ee189a..abd159c 100644 --- a/osint/individuals.json +++ b/osint/individuals.json @@ -10,5 +10,11 @@ "request": "site:\"sync.me\" intext:\"$n\" | $i", "dialCode": null, "stop": 1 + }, + { + "site": "whocallsyou.de", + "request": "site:\"whocallsyou.de\" intext:\"0$n\"", + "dialCode": null, + "stop": 1 } ] diff --git a/osint/reputation.json b/osint/reputation.json index 40bd55b..47726f0 100644 --- a/osint/reputation.json +++ b/osint/reputation.json @@ -2,11 +2,11 @@ { "title": "reputation report on whosenumber.info", "request": "site:\"whosenumber.info\" intext:\"$n\" intitle:\"who called\"", - "stop": 1, + "stop": 1 }, { "title": "phone fraud footprints", "request": "intitle:\"Phone Fraud\" intext:\"$n\" | \"$n\"", - "stop": 5, + "stop": 5 } ] diff --git a/osint/social_medias.json b/osint/social_medias.json index 53d7876..f36adfb 100644 --- a/osint/social_medias.json +++ b/osint/social_medias.json @@ -1,22 +1,22 @@ [ { "site": "facebook.com", - "request": "site:\"facebook.com\" intext:\"$n\" | $i", + "request": "site:\"facebook.com\" intext:\"$i\" | intext:\"$n\"", "stop": 5 }, { "site": "twitter.com", - "request": "site:\"twitter.com\" intext:\"$n\" | $i", + "request": "site:\"twitter.com\" intext:\"$i\" | intext:\"$n\"", "stop": 5 }, { "site": "linkedin.com", - "request": "site:\"linkedin.com\" intext:\"$n\" | $i", + "request": "site:\"linkedin.com\" intext:\"$i\" | intext:\"$n\"", "stop": 5 }, { "site": "instagram.com", - "request": "site:\"instagram.com\" intext:\"$n\" | $i", + "request": "site:\"instagram.com\" intext:\"$i\" | intext:\"$n\"", "stop": 5 } ] From e6d64a133674b79f9cf1b28c69d33d807bcf8fbf Mon Sep 17 00:00:00 2001 From: sundowndev Date: Sun, 9 Dec 2018 17:37:14 +0100 Subject: [PATCH 23/30] Number formatting Use number formats globally and handle custom format from user input. --- phoneinfoga.py | 262 ++++++++++++++++++++++++++++++------------------- 1 file changed, 161 insertions(+), 101 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index e375601..4291ce6 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -84,10 +84,17 @@ uagent.append("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko uagent.append("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1") uagent.append("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") -GoogleAbuseToken = '' +number = '' # Full number format +localNumber = '' # Local number format +internationalNumber = '' # International numberformat +numberCountryCode = '' # Dial code; e.g:"+33" +numberCountry = '' # Country; e.g:France + +googleAbuseToken = '' +customFormatting = '' def search(req, stop): - global GoogleAbuseToken + global googleAbuseToken global uagent chosenUserAgent = random.choice(uagent) @@ -106,14 +113,14 @@ def search(req, stop): try: URL = 'https://www.google.com/search?tbs=li:1&q=%s&gws_rd=ssl' % (req) - r = s.get(URL + GoogleAbuseToken, headers=headers) + r = s.get(URL + googleAbuseToken, headers=headers) while r.status_code == 503: print code_warning + 'You are temporary blacklisted from Google search. Complete the captcha at the following URL and copy/paste the content of GOOGLE_ABUSE_EXEMPTION cookie : %s' % URL print '\n' + code_info + 'Need help ? Read the doc at https://github.com/sundowndev/PhoneInfoga' token = raw_input('\nGOOGLE_ABUSE_EXEMPTION=') - GoogleAbuseToken = '&google_abuse=' + token - r = s.get(URL + GoogleAbuseToken, headers=headers) + googleAbuseToken = '&google_abuse=' + token + r = s.get(URL + googleAbuseToken, headers=headers) soup = BeautifulSoup(r.content, 'html.parser') results = soup.find("div", id="search").find_all("div", class_="g") @@ -133,21 +140,28 @@ def search(req, stop): url = re.sub(r'(?:\&sa\=)(?:.*)', '', url) url = re.sub(r'(?:\&rct\=)(?:.*)', '', url) + if re.match(r"^(/search\?q=)", url) is not None: + url = 'https://google.com' + url + links.append(url) return links except: print code_error + 'Request failed. Please retry or open an issue on GitHub.' -def formatNumber(number): - return re.sub("(?:\+)?(?:[^[0-9]*)", "", number) +def formatNumber(InputNumber): + return re.sub("(?:\+)?(?:[^[0-9]*)", "", InputNumber) + +def localScan(InputNumber): + global number + global localNumber + global internationalNumber + global numberCountryCode + global numberCountry -def localScan(number): print code_info + 'Running local scan...' - PhoneNumber = dict(); - - FormattedPhoneNumber = "+" + formatNumber(number) + FormattedPhoneNumber = "+" + formatNumber(InputNumber) try: PhoneNumberObject = phonenumbers.parse(FormattedPhoneNumber, None) @@ -157,18 +171,18 @@ def localScan(number): if not phonenumbers.is_valid_number(PhoneNumberObject): return False - PhoneNumber['full'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace('+', '') - PhoneNumber['countryCode'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0] + number = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace('+', '') + numberCountryCode = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0] - countryRequest = json.loads(requests.request('GET', 'https://restcountries.eu/rest/v2/callingcode/%s' % PhoneNumber['countryCode'].replace('+', '')).content) - PhoneNumber['country'] = countryRequest[0]['alpha2Code'] + countryRequest = json.loads(requests.request('GET', 'https://restcountries.eu/rest/v2/callingcode/%s' % numberCountryCode.replace('+', '')).content) + numberCountry = countryRequest[0]['alpha2Code'] - PhoneNumber['number'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(PhoneNumber['countryCode'], '') - PhoneNumber['international'] = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL) + localNumber = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(numberCountryCode, '') + internationalNumber = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL) - 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 + 'International format: %s' % internationalNumber + print code_result + 'Local format: 0%s' % localNumber + print code_result + 'Country code: %s' % numberCountryCode 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 + 'Area: %s' % geocoder.description_for_number(PhoneNumberObject, 'en') @@ -180,9 +194,9 @@ def localScan(number): else: print code_warning + 'The number is valid but might not be possible.' - return PhoneNumber +def numverifyScan(): + global number -def numverifyScan(PhoneNumber): if not args.scanner == 'numverify' and not args.scanner == 'all': return -1 @@ -197,7 +211,7 @@ def numverifyScan(PhoneNumber): break; apiKey = hashlib.md5() - apiKey.update(PhoneNumber + requestSecret) + apiKey.update(number + requestSecret) apiKey = apiKey.hexdigest() headers = { @@ -215,7 +229,7 @@ def numverifyScan(PhoneNumber): 'cache-control': "no-cache" } - response = requests.request("GET", "https://numverify.com/php_helper_scripts/phone_api.php?secret_key=" + apiKey + "&number=" + PhoneNumber, data="", headers=headers) + response = requests.request("GET", "https://numverify.com/php_helper_scripts/phone_api.php?secret_key=" + apiKey + "&number=" + number, data="", headers=headers) if response.content == "Unauthorized" or response.status_code != 200: print(code_error + "An error occured while calling the API (bad request or wrong api key).") @@ -240,13 +254,16 @@ def numverifyScan(PhoneNumber): elif data["line_type"] == 'mobile': print(code_warning + "This is most likely a mobile, but it can still be a VoIP.") -def ovhScan(country, number): +def ovhScan(): + global localNumber + global numberCountry + if not args.scanner == 'ovh' and not args.scanner == 'all': return -1 print code_info + 'Running OVH scan...' - querystring = { "country": country.lower() } + querystring = { "country": numberCountry.lower() } headers = { 'accept': "application/json", @@ -258,7 +275,7 @@ def ovhScan(country, number): data = json.loads(response.content) if isinstance(data, list): - askedNumber = "0" + number.replace(number[-4:], 'xxxx') + askedNumber = "0" + localNumber.replace(localNumber[-4:], 'xxxx') for voip_number in data: if voip_number['number'] == askedNumber: @@ -268,11 +285,71 @@ def ovhScan(country, number): print(code_result + "Zip code: " + voip_number['zipCode'] if voip_number['zipCode'] is not None else '') askForExit() -def osintDisposableNumScan(number): +def osintIndividualScan(): + global number + global internationalNumber + global numberCountryCode + global customFormatting + + dorks = json.load(open('osint/individuals.json')) + + for dork in dorks: + if dork['dialCode'] is None or dork['dialCode'] == numberCountryCode: + if customFormatting: + dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) + ' | intext:"%s"' % (customFormatting) + else: + dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) + + print(code_info + "Searching for footprints on %s..." % dork['site']) + for result in search(dorkRequest, stop=dork['stop']): + if result: + print(code_result + "URL: " + result) + else: + return -1 + +def osintReputationScan(): + global number + global internationalNumber + global customFormatting + + dorks = json.load(open('osint/reputation.json')) + + for dork in dorks: + if customFormatting: + dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) + ' | intext:"%s"' % (customFormatting) + else: + dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) + + print(code_info + "Searching for %s..." % dork['title']) + for result in search(dorkRequest, stop=dork['stop']): + if result: + print(code_result + "URL: " + result) + +def osintSocialMediaScan(): + global number + global internationalNumber + global customFormatting + + dorks = json.load(open('osint/social_medias.json')) + + for dork in dorks: + if customFormatting: + dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) + ' | intext:"%s"' % (customFormatting) + else: + dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) + + print(code_info + "Searching for footprints on %s..." % dork['site']) + for result in search(dorkRequest, stop=dork['stop']): + if result: + print(code_result + "URL: " + result) + +def osintDisposableNumScan(): + global number + dorks = json.load(open('osint/disposable_num_providers.json')) for dork in dorks: - dorkRequest = dork['request'].replace('$n', number).replace('$n', number) + dorkRequest = dork['request'].replace('$n', number) print(code_info + "Searching for footprints on %s..." % dork['site']) for result in search(dorkRequest, stop=dork['stop']): @@ -281,7 +358,14 @@ def osintDisposableNumScan(number): print(code_result + "URL: " + result) askForExit() -def osintScan(countryCode, number, internationalNumber): +def osintScan(): + global number + global localNumber + global internationalNumber + global numberCountryCode + global numberCountry + global customFormatting + if not args.osint: return -1 @@ -291,95 +375,65 @@ def osintScan(countryCode, number, internationalNumber): print(code_info + "Generating scan URL on 411.com...") print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-') - AskingCustomPayload = raw_input(code_info + 'Would you like to use an additional format for this number ? (y/N) ') + askingCustomPayload = raw_input(code_info + 'Would you like to use an additional format for this number ? (y/N) ') - if AskingCustomPayload == 'y': - customPayload = raw_input(code_info + 'Custom format: ') + if askingCustomPayload == 'y' or askingCustomPayload == 'yes': + customFormatting = raw_input(code_info + 'Custom format: ') print(code_info + '---- Web pages footprints ----') print(code_info + "Searching for footprints on web pages... (limit=5)") - for result in search('%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber), stop=5): + if customFormatting: + req = '%s | intext:"%s" | intext:"%s" | intext:"%s"' % (number,number,internationalNumber,customFormatting) + else: + req = '%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber) + for result in search(req, stop=5): if result: print(code_result + "Result found: " + result) # 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' % (number,internationalNumber), stop=5): + print(code_info + "Searching for documents... (limit=10)") + if customFormatting: + req = 'intext:"%s" | 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' % (number,internationalNumber,customFormatting) + else: + req = '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' % (number,internationalNumber) + 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' % (number,internationalNumber), stop=10): if result: print(code_result + "Result found: " + result) print(code_info + '---- Reputation footprints ----') - print(code_info + "Searching for reputation report on whosenumber.info...") - 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.") + osintReputationScan() print(code_info + "Generating URL on scamcallfighters.com...") print code_result + 'http://www.scamcallfighters.com/search-phone-%s.html' % number - print(code_info + '---- Temporary number providers footprints ----') + tmpNumAsk = raw_input(code_info + "Would you like to search for temporary number providers footprints ? (Y/n) ") - 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() + if tmpNumAsk.lower() != 'n' and tmpNumAsk.lower() != 'no': + print(code_info + '---- Temporary number providers footprints ----') - osintDisposableNumScan(number) + 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() + + osintDisposableNumScan() print(code_info + '---- Social media footprints ----') - print(code_info + "Searching for footprints on facebook.com... (limit=5)") - for result in search('site:facebook.com intext:"%s" | "%s"' % (number,internationalNumber), stop=5): - if result: - print(code_result + "Result found: " + result) - - print(code_info + "Searching for footprints on twitter.com... (limit=5)") - for result in search('site:twitter.com intext:"%s" | "%s"' % (number,internationalNumber), stop=5): - if result: - print(code_result + "Result found: " + result) - - print(code_info + "Searching for footprints on linkedin.com... (limit=5)") - for result in search('site:linkedin.com intext:"%s" | "%s"' % (number,internationalNumber), 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,internationalNumber), stop=5): - if result: - print(code_result + "Result found: " + result) + osintSocialMediaScan() print(code_info + '---- Phone books footprints ----') - print(code_info + "Searching for footprints on numinfo.net... (limit=2)") - for result in search('site:numinfo.net intext:"%s" | "%s"' % (number,internationalNumber), stop=2): - if result: - print(code_result + "Result found: " + result) + if numberCountryCode == '+1': + print(code_info + "Generating URL on True People... ") + print code_result + 'https://www.truepeoplesearch.com/results?phoneno=%s' % internationalNumber.replace(' ', '') - print(code_info + "Searching for footprints on sync.me... ") - for result in search('site:sync.me inurl:"%s" | "%s"' % (number,internationalNumber), stop=1): - if result: - print(code_result + "Result found: " + result) - - print(code_info + "Generating URL on True People... ") - print code_result + 'https://www.truepeoplesearch.com/results?phoneno=%s' % internationalNumber - - print(code_info + "Searching for footprints on whocallsyou.de... ") - for result in search('site:whocallsyou.de inurl:"0%s"' % (number), stop=1): - if result: - print(code_result + "Result found: " + result) + osintIndividualScan() def askForExit(): if not args.output: @@ -391,18 +445,24 @@ def askForExit(): print code_info + "Good bye!" sys.exit() -def scanNumber(number): - print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(number) +def scanNumber(InputNumber): + print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(InputNumber) - PhoneNumber = localScan(number) + localScan(InputNumber) - if not PhoneNumber: - print(code_error + "Error: number " + formatNumber(number) + " is not valid. Skipping.") + global number + global localNumber + global internationalNumber + global numberCountryCode + global numberCountry + + if not number: + print(code_error + "Error: number " + formatNumber(InputNumber) + " is not valid. Skipping.") sys.exit() - numverifyScan(PhoneNumber['full']) - ovhScan(PhoneNumber['country'], PhoneNumber['number']) - osintScan(PhoneNumber['countryCode'], PhoneNumber['full'], PhoneNumber['international']) + numverifyScan() + ovhScan() + osintScan() print code_info + "Scan finished." @@ -443,5 +503,5 @@ try: if args.output: args.output.close() except KeyboardInterrupt: - print code_info + "Scan interrupted. Good bye!" + print(code_error + "Scan interrupted. Good bye!") sys.exit() From 1a8197f295f6c73deb99348911660f211df8a9aa Mon Sep 17 00:00:00 2001 From: Raphael Date: Sun, 9 Dec 2018 18:19:21 +0100 Subject: [PATCH 24/30] Documentation --- README.md | 47 ++--------------------------------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 431bc34..57a08af 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ PhoneInfo use a workaround to handle Google bot detection. When running OSINT sc ### Steps - Follow the URL +- Complete the captcha if needed - Open the dev tool (F12 on most browsers) - Go to **Storage**, then **Cookies** - Copy the value of the *GOOGLE_ABUSE_EXEMPTION* cookie and paste it in the CLI @@ -135,52 +136,8 @@ PhoneInfo use a workaround to handle Google bot detection. When running OSINT sc ## Custom formatting -... +Sometimes the phone number has footprints but is used with a different formatting. This is a problem because for example if we search for "+15417543010", we'll not find web pages that write it that way : "(541) 754–3010". So the tool use a (optional) custom formatting given by the user to find further and more accurate results. ## License This tool is licensed under the GNU General Public License v3.0. - ----- - -## Resources - -Regular expression : `^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$` - -### Docs - -- http://whitepages.fr/phonesystem/ -- https://support.twilio.com/hc/en-us/articles/223183008-Formatting-International-Phone-Numbers -- https://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers - -### open data - -- https://api.ovh.com/console/#/telephony - - `/telephony/number/ranges` - - `/telephony/number/detailedZones` - - `/telephony/number/specificNumbers` -- https://countrycode.org/ -- http://www.countryareacode.net/en/ -- http://directory.didww.com/area-prefixes -- http://hs3x.com/ -- http://www.numinfo.net/ - -### Scanners - -- https://www.phonevalidator.com/ -- https://freecarrierlookup.com/ -- https://www.411.com/ -- https://www.washington.edu/home/peopledir/ - -### OSINT - -- https://osintframework.com/ -- http://raidersec.blogspot.com/2012/12/automated-open-source-intelligence.html#google_api - -#### Google dork requests - -- `insubject:"+XXXXXXXXX" | insubject:"+XXXXX" | insubject:"XXXXX XXX XXX` -- `insubject:"{number}" | intitle:"{number}"` -- `intext:"{number}" 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` -- voip provider check: `site:"hs3x.com" intext:"+61437954897"` -- scam number check:`site:signal-arnaques.com intext:"0682649478" intitle:" | Phone Fraud"` From 14f9cce67c04a20eed976e24be38f15cfad366aa Mon Sep 17 00:00:00 2001 From: Raphael Date: Sun, 9 Dec 2018 19:02:54 +0100 Subject: [PATCH 25/30] Need help statement about Google captcha --- phoneinfoga.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index 4291ce6..6ad1b35 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -117,7 +117,7 @@ def search(req, stop): while r.status_code == 503: print code_warning + 'You are temporary blacklisted from Google search. Complete the captcha at the following URL and copy/paste the content of GOOGLE_ABUSE_EXEMPTION cookie : %s' % URL - print '\n' + code_info + 'Need help ? Read the doc at https://github.com/sundowndev/PhoneInfoga' + print '\n' + code_info + 'Need help ? Read https://github.com/sundowndev/PhoneInfoga#dealing-with-google-captcha' token = raw_input('\nGOOGLE_ABUSE_EXEMPTION=') googleAbuseToken = '&google_abuse=' + token r = s.get(URL + googleAbuseToken, headers=headers) From 93462b5ed4ce4f85d90427ca20bdcc53d9351c7b Mon Sep 17 00:00:00 2001 From: Raphael Date: Sun, 9 Dec 2018 19:05:20 +0100 Subject: [PATCH 26/30] Documentation --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 57a08af..f7c9056 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ # PhoneInfoga -Information gathering & OSINT reconnaissance tool for phone numbers. Designed for Social Engineering and red teaming. +Information gathering & OSINT reconnaissance tool for phone numbers. -## The project - -Building one of the most advanced tools to scan phone numbers using only free resources. The goal is to first gather basic information such as country, area, carrier and line type on any international phone numbers with a very good accuracy. Then try to determine the VoIP provider or search for footprints on search engines to try identify the owner. +One of the most advanced tools to scan phone numbers using only free resources. The goal is to first gather basic information such as country, area, carrier and line type on any international phone numbers with a very good accuracy. Then try to determine the VoIP provider or search for footprints on search engines to try identify the owner. **This tool requires python 2.x** From aa155692cca78e1b453b627b58702f2f360c6834 Mon Sep 17 00:00:00 2001 From: Raphael Date: Sun, 9 Dec 2018 20:27:03 +0100 Subject: [PATCH 27/30] Installation --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f7c9056..3616f0b 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ Use `any` to disable this feature. Default value: `all` git clone https://github.com/sundowndev/PhoneInfoga cd ./PhoneInfoga pip install -r requirements.txt -python ./phoneinfoga.py -h ``` ## Usage From 3964c4a504e9830f93efcbc60f2e925570c25544 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 10 Dec 2018 16:22:38 +0100 Subject: [PATCH 28/30] Refactor to use Python3 using 2to3 --- phoneinfoga.py | 166 ++++++++++++++++++++++++------------------------- 1 file changed, 82 insertions(+), 84 deletions(-) diff --git a/phoneinfoga.py b/phoneinfoga.py index 6ad1b35..0014c7a 100644 --- a/phoneinfoga.py +++ b/phoneinfoga.py @@ -3,17 +3,17 @@ __version__ = '0.9-dev' def banner(): - print " ___ _ _____ __ " - print " / _ \ |__ ___ _ __ ___ \_ \_ __ / _| ___ __ _ __ _ " - print " / /_)/ '_ \ / _ \| '_ \ / _ \ / /\/ '_ \| |_ / _ \ / _` |/ _` |" - print " / ___/| | | | (_) | | | | __/\/ /_ | | | | _| (_) | (_| | (_| |" - print " \/ |_| |_|\___/|_| |_|\___\____/ |_| |_|_| \___/ \__, |\__,_|" - print " |___/ " - print " PhoneInfoga Ver. %s " % __version__ - print " Coded by Sundowndev " - print "\n" + print(" ___ _ _____ __ ") + print(" / _ \ |__ ___ _ __ ___ \_ \_ __ / _| ___ __ _ __ _ ") + print(" / /_)/ '_ \ / _ \| '_ \ / _ \ / /\/ '_ \| |_ / _ \ / _` |/ _` |") + print(" / ___/| | | | (_) | | | | __/\/ /_ | | | | _| (_) | (_| | (_| |") + print(" \/ |_| |_|\___/|_| |_|\___\____/ |_| |_|_| \___/ \__, |\__,_|") + print(" |___/ ") + print(" PhoneInfoga Ver. %s " % __version__) + print(" Coded by Sundowndev ") + print("\n") -print "\n \033[92m" +print("\n \033[92m") banner() import sys @@ -50,7 +50,7 @@ if not len(sys.argv) > 1: sys.exit(); if args.update: - print 'update' + print('update') sys.exit() try: @@ -66,10 +66,10 @@ try: from phonenumbers import geocoder from phonenumbers import timezone except KeyboardInterrupt: - print '\033[91m[!] Exiting.' + print('\033[91m[!] Exiting.') sys.exit() except: - print '\033[91m[!] Missing requirements. Try running pip install -r requirements.txt' + print('\033[91m[!] Missing requirements. Try running pip install -r requirements.txt') sys.exit() scanners = ['any', 'all', 'numverify', 'ovh'] @@ -116,9 +116,9 @@ def search(req, stop): r = s.get(URL + googleAbuseToken, headers=headers) while r.status_code == 503: - print code_warning + 'You are temporary blacklisted from Google search. Complete the captcha at the following URL and copy/paste the content of GOOGLE_ABUSE_EXEMPTION cookie : %s' % URL - print '\n' + code_info + 'Need help ? Read https://github.com/sundowndev/PhoneInfoga#dealing-with-google-captcha' - token = raw_input('\nGOOGLE_ABUSE_EXEMPTION=') + print(code_warning + 'You are temporary blacklisted from Google search. Complete the captcha at the following URL and copy/paste the content of GOOGLE_ABUSE_EXEMPTION cookie : %s' % URL) + print('\n' + code_info + 'Need help ? Read https://github.com/sundowndev/PhoneInfoga#dealing-with-google-captcha') + token = input('\nGOOGLE_ABUSE_EXEMPTION=') googleAbuseToken = '&google_abuse=' + token r = s.get(URL + googleAbuseToken, headers=headers) @@ -147,7 +147,7 @@ def search(req, stop): return links except: - print code_error + 'Request failed. Please retry or open an issue on GitHub.' + print(code_error + 'Request failed. Please retry or open an issue on GitHub.') def formatNumber(InputNumber): return re.sub("(?:\+)?(?:[^[0-9]*)", "", InputNumber) @@ -159,7 +159,7 @@ def localScan(InputNumber): global numberCountryCode global numberCountry - print code_info + 'Running local scan...' + print(code_info + 'Running local scan...') FormattedPhoneNumber = "+" + formatNumber(InputNumber) @@ -180,19 +180,19 @@ def localScan(InputNumber): localNumber = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.E164).replace(numberCountryCode, '') internationalNumber = phonenumbers.format_number(PhoneNumberObject, phonenumbers.PhoneNumberFormat.INTERNATIONAL) - print code_result + 'International format: %s' % internationalNumber - print code_result + 'Local format: 0%s' % localNumber - print code_result + 'Country code: %s' % numberCountryCode - 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 + 'Area: %s' % geocoder.description_for_number(PhoneNumberObject, 'en') + print(code_result + 'International format: %s' % internationalNumber) + print(code_result + 'Local format: 0%s' % localNumber) + print(code_result + 'Country code: %s' % numberCountryCode) + 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 + 'Area: %s' % geocoder.description_for_number(PhoneNumberObject, 'en')) for timezoneResult in timezone.time_zones_for_number(PhoneNumberObject): - print code_result + 'Timezone: %s' % (timezoneResult) + print(code_result + 'Timezone: %s' % (timezoneResult)) if phonenumbers.is_possible_number(PhoneNumberObject): - print code_info + 'The number is valid and possible.' + print(code_info + 'The number is valid and possible.') else: - print code_warning + 'The number is valid but might not be possible.' + print(code_warning + 'The number is valid but might not be possible.') def numverifyScan(): global number @@ -200,7 +200,7 @@ def numverifyScan(): if not args.scanner == 'numverify' and not args.scanner == 'all': return -1 - print code_info + 'Running Numverify.com scan...' + print(code_info + 'Running Numverify.com scan...') requestSecret = '' resp = requests.get('https://numverify.com/') @@ -210,9 +210,7 @@ def numverifyScan(): requestSecret = tag['value'] break; - apiKey = hashlib.md5() - apiKey.update(number + requestSecret) - apiKey = apiKey.hexdigest() + apiKey = hashlib.md5((number + requestSecret).encode('utf-8')).hexdigest() headers = { 'host': "numverify.com", @@ -232,27 +230,27 @@ def numverifyScan(): response = requests.request("GET", "https://numverify.com/php_helper_scripts/phone_api.php?secret_key=" + apiKey + "&number=" + number, data="", headers=headers) if response.content == "Unauthorized" or response.status_code != 200: - print(code_error + "An error occured while calling the API (bad request or wrong api key).") + print((code_error + "An error occured while calling the API (bad request or wrong api key).")) return -1 data = json.loads(response.content) if data["valid"] == False: - print(code_error + "Error: Please specify a valid phone number. Example: +6464806649") + print((code_error + "Error: Please specify a valid phone number. Example: +6464806649")) sys.exit() InternationalNumber = '('+data["country_prefix"]+')' + data["local_format"] - print(code_result + "Number: (%s) %s") % (data["country_prefix"],data["local_format"]) - print(code_result + "Country: %s (%s)") % (data["country_name"],data["country_code"]) - print(code_result + "Location: %s") % data["location"] - print(code_result + "Carrier: %s") % data["carrier"] - print(code_result + "Line type: %s") % data["line_type"] + print((code_result + "Number: (%s) %s") % (data["country_prefix"],data["local_format"])) + print((code_result + "Country: %s (%s)") % (data["country_name"],data["country_code"])) + print((code_result + "Location: %s") % data["location"]) + print((code_result + "Carrier: %s") % data["carrier"]) + print((code_result + "Line type: %s") % data["line_type"]) if data["line_type"] == 'landline': - print(code_warning + "This is most likely a land line, but it can still be a fixed VoIP.") + print((code_warning + "This is most likely a land line, but it can still be a fixed VoIP.")) 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(): global localNumber @@ -261,7 +259,7 @@ def ovhScan(): if not args.scanner == 'ovh' and not args.scanner == 'all': return -1 - print code_info + 'Running OVH scan...' + print(code_info + 'Running OVH scan...') querystring = { "country": numberCountry.lower() } @@ -279,10 +277,10 @@ def ovhScan(): for voip_number in data: if voip_number['number'] == askedNumber: - print(code_info + "1 result found in OVH database") - print(code_result + "Number range: " + voip_number['number']) - 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_info + "1 result found in OVH database")) + print((code_result + "Number range: " + voip_number['number'])) + print((code_result + "City: " + voip_number['city'])) + print((code_result + "Zip code: " + voip_number['zipCode'] if voip_number['zipCode'] is not None else '')) askForExit() def osintIndividualScan(): @@ -300,10 +298,10 @@ def osintIndividualScan(): else: dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) - print(code_info + "Searching for footprints on %s..." % dork['site']) + print((code_info + "Searching for footprints on %s..." % dork['site'])) for result in search(dorkRequest, stop=dork['stop']): if result: - print(code_result + "URL: " + result) + print((code_result + "URL: " + result)) else: return -1 @@ -320,10 +318,10 @@ def osintReputationScan(): else: dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) - print(code_info + "Searching for %s..." % dork['title']) + print((code_info + "Searching for %s..." % dork['title'])) for result in search(dorkRequest, stop=dork['stop']): if result: - print(code_result + "URL: " + result) + print((code_result + "URL: " + result)) def osintSocialMediaScan(): global number @@ -338,10 +336,10 @@ def osintSocialMediaScan(): else: dorkRequest = dork['request'].replace('$n', number).replace('$i', internationalNumber) - print(code_info + "Searching for footprints on %s..." % dork['site']) + print((code_info + "Searching for footprints on %s..." % dork['site'])) for result in search(dorkRequest, stop=dork['stop']): if result: - print(code_result + "URL: " + result) + print((code_result + "URL: " + result)) def osintDisposableNumScan(): global number @@ -351,11 +349,11 @@ def osintDisposableNumScan(): for dork in dorks: dorkRequest = dork['request'].replace('$n', number) - print(code_info + "Searching for footprints on %s..." % dork['site']) + print((code_info + "Searching for footprints on %s..." % dork['site'])) for result in search(dorkRequest, stop=dork['stop']): if result: - print(code_result + "Result found: %s" % dork['site']) - print(code_result + "URL: " + result) + print((code_result + "Result found: %s" % dork['site'])) + print((code_result + "URL: " + result)) askForExit() def osintScan(): @@ -369,84 +367,84 @@ def osintScan(): if not args.osint: return -1 - print code_info + 'Running OSINT footprint reconnaissance...' + print(code_info + 'Running OSINT footprint reconnaissance...') # Whitepages - print(code_info + "Generating scan URL on 411.com...") - print code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-') + print((code_info + "Generating scan URL on 411.com...")) + print(code_result + "Scan URL: https://www.411.com/phone/%s" % internationalNumber.replace('+', '').replace(' ', '-')) - askingCustomPayload = raw_input(code_info + 'Would you like to use an additional format for this number ? (y/N) ') + askingCustomPayload = input(code_info + 'Would you like to use an additional format for this number ? (y/N) ') if askingCustomPayload == 'y' or askingCustomPayload == 'yes': - customFormatting = raw_input(code_info + 'Custom format: ') + customFormatting = input(code_info + 'Custom format: ') - print(code_info + '---- Web pages footprints ----') + print((code_info + '---- Web pages footprints ----')) - print(code_info + "Searching for footprints on web pages... (limit=5)") + print((code_info + "Searching for footprints on web pages... (limit=5)")) if customFormatting: req = '%s | intext:"%s" | intext:"%s" | intext:"%s"' % (number,number,internationalNumber,customFormatting) else: req = '%s | intext:"%s" | intext:"%s"' % (number,number,internationalNumber) for result in search(req, stop=5): if result: - print(code_result + "Result found: " + result) + print((code_result + "Result found: " + result)) # Documents - print(code_info + "Searching for documents... (limit=10)") + print((code_info + "Searching for documents... (limit=10)")) if customFormatting: req = 'intext:"%s" | 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' % (number,internationalNumber,customFormatting) else: req = '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' % (number,internationalNumber) 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' % (number,internationalNumber), stop=10): if result: - print(code_result + "Result found: " + result) + print((code_result + "Result found: " + result)) - print(code_info + '---- Reputation footprints ----') + print((code_info + '---- Reputation footprints ----')) osintReputationScan() - print(code_info + "Generating URL on scamcallfighters.com...") - print code_result + 'http://www.scamcallfighters.com/search-phone-%s.html' % number + print((code_info + "Generating URL on scamcallfighters.com...")) + print(code_result + 'http://www.scamcallfighters.com/search-phone-%s.html' % number) - tmpNumAsk = raw_input(code_info + "Would you like to search for temporary number providers footprints ? (Y/n) ") + tmpNumAsk = input(code_info + "Would you like to search for temporary number providers footprints ? (Y/n) ") if tmpNumAsk.lower() != 'n' and tmpNumAsk.lower() != 'no': - print(code_info + '---- Temporary number providers footprints ----') + print((code_info + '---- Temporary number providers footprints ----')) - print(code_info + "Searching for phone number on tempophone.com...") + 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") + print((code_result + "Found a temporary number provider: tempophone.com")) askForExit() osintDisposableNumScan() - print(code_info + '---- Social media footprints ----') + print((code_info + '---- Social media footprints ----')) osintSocialMediaScan() - print(code_info + '---- Phone books footprints ----') + print((code_info + '---- Phone books footprints ----')) if numberCountryCode == '+1': - print(code_info + "Generating URL on True People... ") - print code_result + 'https://www.truepeoplesearch.com/results?phoneno=%s' % internationalNumber.replace(' ', '') + print((code_info + "Generating URL on True People... ")) + print(code_result + 'https://www.truepeoplesearch.com/results?phoneno=%s' % internationalNumber.replace(' ', '')) osintIndividualScan() def askForExit(): if not args.output: - user_input = raw_input(code_info + "Continue scanning ? (y/N) ") + user_input = input(code_info + "Continue scanning ? (y/N) ") if user_input.lower() == 'y' or user_input.lower() == 'yes': return -1 else: - print code_info + "Good bye!" + print(code_info + "Good bye!") sys.exit() def scanNumber(InputNumber): - print code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(InputNumber) + print(code_title + "[!] ---- Fetching informations for %s ---- [!]" % formatNumber(InputNumber)) localScan(InputNumber) @@ -457,16 +455,16 @@ def scanNumber(InputNumber): global numberCountry if not number: - print(code_error + "Error: number " + formatNumber(InputNumber) + " is not valid. Skipping.") + print((code_error + "Error: number " + formatNumber(InputNumber) + " is not valid. Skipping.")) sys.exit() numverifyScan() ovhScan() osintScan() - print code_info + "Scan finished." + print(code_info + "Scan finished.") - print '\n' + print('\n') try: if args.output: @@ -477,7 +475,7 @@ try: code_title = '' if args.osint: - print '\033[91m[!] OSINT scanner is not available using output option (sorry).' + print('\033[91m[!] OSINT scanner is not available using output option (sorry).') sys.exit() sys.stdout = args.output @@ -491,7 +489,7 @@ try: # Verify scanner option if not args.scanner in scanners: - print(code_error + "Error: scanner doesn't exists.") + print((code_error + "Error: scanner doesn't exists.")) sys.exit() if args.number: @@ -503,5 +501,5 @@ try: if args.output: args.output.close() except KeyboardInterrupt: - print(code_error + "Scan interrupted. Good bye!") + print((code_error + "Scan interrupted. Good bye!")) sys.exit() From f03061dd00b1f40616be662a3a32bfa762a60be2 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 10 Dec 2018 16:23:36 +0100 Subject: [PATCH 29/30] Add argparse to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index ada83e1..7969552 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ requests bs4 html5lib phonenumbers +argparse From aa0485ba9d329814b39571975868601d8a85479e Mon Sep 17 00:00:00 2001 From: sundowndev Date: Mon, 10 Dec 2018 16:24:09 +0100 Subject: [PATCH 30/30] Badges --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3616f0b..a9516b2 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # PhoneInfoga +![](https://img.shields.io/badge/python-3.x-blue.svg) +![](https://img.shields.io/badge/license-MIT-brightgreen.svg) + Information gathering & OSINT reconnaissance tool for phone numbers. One of the most advanced tools to scan phone numbers using only free resources. The goal is to first gather basic information such as country, area, carrier and line type on any international phone numbers with a very good accuracy. Then try to determine the VoIP provider or search for footprints on search engines to try identify the owner. -**This tool requires python 2.x** - ## Features - Check if phone number exists and is possible @@ -38,7 +39,7 @@ Use `any` to disable this feature. Default value: `all` ```bash git clone https://github.com/sundowndev/PhoneInfoga cd ./PhoneInfoga -pip install -r requirements.txt +pip3 install -r requirements.txt ``` ## Usage