• 4 июля стартует курс «Python для Пентестера ©» от команды The Codeby

    Понятные и наглядные учебные материалы с информацией для выполнения ДЗ; Проверка ДЗ вручную – наставник поможет улучшить написанный вами код; Помощь преподавателей при выполнении заданий или в изучении теории; Групповой чат в Telegram с другими учениками, проходящими курс; Опытные разработчики – команда Codeby School, лидер по информационной безопасности в RU-сегменте

    Запись на курс до 15 июля. Подробнее ...

  • 11 июля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 20 июля. Подробнее ...

Статья Получаем общедоступные данные по номеру телефона с помощью Python

Можно ли по номеру телефона узнать местоположение абонента? Безусловно, да. Тут нужно правильно задать вопрос: «Кому это можно сделать?» К сожалению, ответ для нас с вами не особо утешителен.

- Есть варианты за деньги, то есть оплачиваешь тарифный план и пользуешься. Как правило, такие сервисы предоставляют данные на основе HLR-запросов.
- Есть вариант хакнуть сеть сигнализации SS7. Но, тут уж как звезды сойдутся. Да и не получиться это сделать у любого человека с улицы. У вас должен быть выход в эту сеть, плюс к тому возможность формировать любые сообщения сигнализации, а также в сети не должно быть фильтрации некорректных или подозрительных сообщений SS7.
- И как вариант, запрос правоохранительных органов.

Если вы не нашли своего состояния в данных описаниях, то скорее всего просто так получить данные у вас не получиться.

000.png



Получение местонахождения мобильного телефона

Первый – это получение примерного местонахождения с помощью HLR-запроса отправленного в СМС-центр. Подробнее о данном способе можно поискать информацию в интернете, да и наверняка вы видели рекламу сервисов предоставляющих эту услугу. Здесь есть подводные камни. Не всегда можно получить данные с высокой точностью. Вернее даже, о точности тут речь не ведется. Если город достаточно крупный, то возможно у вас получиться улучшить результаты. Если же нет, тут уж как повезет. У многих операторов коммутаторы расположены не в тех городах, где находиться абонент, а где-нибудь в другом городе, откуда данный коммутатор и обслуживает всех абонентов. Ведь вспомните, когда вы разрешаете сервисам геолокации определить ваше местонахождение, то есть без использования GPS, то ваше местоположение зачастую определяется неправильно. У меня, например, всегда разные результаты.

А вот в Европе с этим получше. Там коммутаторы установлены в каждом областном центре и крупном городе. А потому, информация, полученная с данных коммутаторов будет намного выше и позволит даже отследить перемещение телефона из соты в соту.

Второй способ – каким-то чудесным образом получить IP-адрес сотового телефона. В этом может помочь сниффер. Но такой способ тоже полон недостатков. Для начала, этот способ поможет получить город, но не точное местоположение. Ну и потом, те сервисы, что предоставляют информацию, не всегда обладают достаточно полной базой, чтобы определить геопозицию по IP.

Еще один способ, получить ваше местоположение с помощью технологии HTML5 Geolocation. Тут уже точность повыше. Так как используется как вычисление до положения на основе близости от вышки оператора, так и получение GPS-координат. Так же возможно получение местоположения, если вы подключены к какому-либо из публичных Wi-Fi. Тут все зависит от того, есть ли Wi-Fi на общедоступной карте размещения роутеров. Ну и используется также получение местоположения по IP. То есть, некая совокупность способов. Однако, это доступно для телефона. А не для человека, который просто запросил данные по номеру.

Лучше всего вас могут найти сотовые операторы, которые вычисляют ваше местоположение методом триангуляции. Здесь уже точность обнаружения может варьироваться до 50-ти метров. Этими же данными пользуются правоохранительные органы, которые запрашивают их у операторов.

Ну и еще один способ – банальный обман пользователя. Если вы зададитесь целью и поищете, то найдете массу сервисов подобного толка. Здесь вам будет предлагаться ввести номер телефона и протестировать данную услугу. Вот только не думайте, что это можно проделать несколько раз. Если бы все было так просто, то этими сервисами пользовались бы все. И нужды в особых услугах не было бы. Но, тут, специально для вас изобразят бурный поиск данных, после чего определят примерное местонахождение, которое в лучшем случае покажет область регистрации телефона. Все остальные данные будут якобы доступны после регистрации и оплаты тарифного плана. Но, увы, это не так. Главное здесь, заставить вас заплатить. А все остальное – это уже ваши проблемы.

А что же с питоном? Можно ли с его помощью установить местонахождение? Тут все довольно просто. Конечно же, если вы ОпСоС, то вам возможно все. В пределах вашей сети, конечно. А то и дальше. Но, нам, простым смертным доступно не так много опций. Давайте напишем небольшой скрипт, который будет получать те данные, которые есть в общем доступе. А вот что для этого понадобиться, об этом немного ниже.

Возможно, что особо практической пользы данный скрипт не несет, кроме общеобразовательных целей и практики. Ну и может пригодиться, если вам на скорую руку нужно узнать оператора и регион звонившего. Ну и да, для работы скрипта не требуется интернет при работе с российскими номерами. А вот те, что прогоняются через стороннюю библиотеку, тут уж да, интернет будет не лишним.


Что понадобиться?

Установить библиотеку phonenumbers. Делается это просто. Запустите терминал и введите команду:

pip install phonenumbers

В принципе, эта библиотека не особо нужна. Но, для обработки номеров отличных от российских она вполне пригодиться. Далее нужно скачать справочник Роснумерации. Лежит он в открытом доступе, но на момент написания статьи был недоступен. . Написано было, что проводятся технические работы. Поэтому я еще немного поискал и нашел данный справочник . На данной странице нас интересует «Выписка по диапазону 9xx», то есть, мобильных операторов связи. Предоставляется она в формате csv, а потому, я ее даже не стал переименовывать, а работал с тем, что скачалось. Ну и небольшой файлик в формате json, который я уже скомпоновал сам, из того, что было. В нем содержаться регионы и их часовые пояса. Для совместимости со справочником Роснумерации названия регионов такие же, как в нем. Я его выложу в прикрепленных файлах. А если не позволит размер, то размещу на Яндекс.Диске и дам ссылку на загрузку.


А теперь давайте писать код

Для начала импортируем все, что понадобиться в скрипте:

Python:
import csv
import json

from phonenumbers.phonenumberutil import NumberParseException
from phonenumbers import parse
from phonenumbers import geocoder
from phonenumbers import timezone
from phonenumbers import carrier

Из нестандартного тут только библиотека phonenumbers, из которой пришлось импортировать модули по отдельности, но только лишь исключительно ради удобства. Давайте сегодня начнем с функции main(). В ней происходит начало действа с номерами телефонов.

Для начала печатается строка в которой говориться, что тут вообще происходит. Далее запрашивается номер телефона пользователя, который приводиться в нужный вид путем замещения всяких «лишних» символов. Впрочем, все предусмотреть невозможно. Если только поместить в список всю клавиатуру и заменять все, что не соответствует номеру телефона ))

Затем проверяется первый символ. Если это плюс, то смотрим дальше второй символ. И если это 7, то тогда вызываем функцию обработки российских номеров. Ну и так же для первого символа 8. Если же это не так, работу с номером передаем в цепкие лапы phonenumbers.

Python:
def main():
    print('\n* ИНФОРМАЦИЯ О НОМЕРЕ ТЕЛЕФОНА. РЕГИОН, ОПЕРАТОР И ЧАСОВОЙ ПОЯС *\n')
    phone = input('Введите номер >>> ').replace("-", "").replace("(", "").replace(")", "").replace(" ", "")
    if phone[0:1] == "+":
        if phone[1:2] == "7":
            russia_num(phone)
        else:
            phnum_parse(phone)
    elif phone[0:1] == "8":
        russia_num(phone)
    else:
        phnum_parse(phone)

Следующей будет функция обработки российских номеров. Я назвал ее russia_num(phone) и на вход она принимает номер телефона. Тут идет проверка первого и третьего символа в случае с плюсом и первого и второго в случае с восьмеркой. Нужно это для того, чтобы разделить номер телефона на части, которые и будут участвовать в проверке.

Дело в том, что номер телефона, после +7 или 8, что является кодом страны, содержит в себе еще и зону нумерации, которая состоит из трех цифр. Как раз таки вот эти вот 913, 905 и прочие. А дальше идет собственно сам номер телефона. Вот их то и будет проверять.

Структура загруженного справочника такова, что в нем содержится в первом столбце зона нумерации, во втором и третьем диапазон номеров для данной зоны. Дальше идет емкость, которая нам не нужна, а после оператор, регион и ИНН оператора. Вот оператора и регион мы будем забирать. Итак, из данного справочника необходимо забрать зону нумерации, диапазон, оператора и регион.

screenshot5.png

Вернемся к коду. На основании плюса или восьмерки забираем зону нумерации. Здесь еще делается проверка на то, идет после 7-ки или 8-ки девятка. Так как в Казахстане, к примеру, номера так же могут начинаться на +7. Что приведет к ошибке. И если все в порядке, и девятка обнаружена, вызывается функция распарсивания csv. Если же нет, номер телефона передается библиотеке phonenumbers.

Python:
def russia_num(phone):
    if phone[0:1] == "+" and phone[2:3] == "9":
        num_one = phone[2:5]
        two_num = phone[5:]
        csv_read(num_one, two_num, phone)
    elif phone[0:1] == "8" and phone[1:2] == "9":
        num_one = phone[1:4]
        two_num = phone[4:]
        csv_read(num_one, two_num, phone)
    else:
        phnum_parse(phone)

Теперь код функции обработки номера с помощью библиотеки phonenumbers. Назвал функцию phnum_parse(phone). На вход она принимает номер телефона. Уж, почему у функции такое странное название не помню. Наверняка, на момент, когда я ее обзывал, оно что-то значило.

Для начала с помощью функции parse распарсиваем номер телефона. Справиться она может далеко не со всеми номерами. К примеру, вообще не работает с номерами Армении и еще какой-то страны, код которых начинается с 0. Но это частности. Тем не менее, функция падает в осадок, а потому надо этот осадок поймать. Заключаем распарсивание номера в блок try-except. Ну и если что-то не так, возвращаем принт о неправильном регионе и катапультируемся из функции вообще. Если же все в порядке, идем дальше. А дальше определяем часовой пояс с помощью timezone.time_zones_for_number, в которую передаем распарсенный номер телефона. Затем определяем регион или страну. Тут уже по-разному. В geocoder.description_for_number передаем номер телефона и указываем обязательный параметр – язык вывода результата. У меня стоит русский.

Определяем оператора carrier.name_for_number, в которого так же передаем распарсенный номер телефона и язык вывода. А дальше проверяем, не является ли одна из переменных с пустым значением, так как иногда оператор не определяется или другой параметр. Вместо них подставляем Unknown. Исключение пришлось сделать только для часового пояса, так как это значение заменить не получалось. Потому пришлось указать полный принт. После этого принта функция завершается. Если же нет, то переходит к принту уже с полными или замененными параметрами.

Python:
def phnum_parse(phone):
    try:
        ph_parse = parse(phone)
    except NumberParseException:
        print('[-] Неправильный регион')
        return
    ph_timezone = timezone.time_zones_for_number(ph_parse)
    ph_region = geocoder.description_for_number(ph_parse, 'ru')
    ph_prov = carrier.name_for_number(ph_parse, 'ru')
    if ph_prov == "":
        ph_prov = "Unknown"
    elif ph_region == "":
        ph_region = "Unknown"
    elif ph_timezone[0] == "":
        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
              f'- Регион: {ph_region}\n    - Часовой пояс: Unknown')
        return
    print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
          f'- Регион: {ph_region}\n    - Часовой пояс: {ph_timezone[0]}')

Ну и, собственно, распарсивание csv. Я так эту функцию и назвал csv_read(zone, number, phone). В нее передается зона нумерации, номер телефона и полный номер, который мы получили после ввода. Сначала я его передавать не хотел, а хотел собрать из того, что есть. А потом подумал, что так будет при печати покрасивее ))

Итак, поехали. Открываем и читаем файл json с часовыми поясами. Затем отрываем справочник Роснумерации и тоже читаем. В цикле пробегаемся по нему, где делаем проверки. Первая проверка это на нулевую строку. В ней содержаться заголовки. А они нам совершенно не нужны, потому мы их просто пропускаем. Затем пилим полученную строку по точке с запятой и забираем нулевой элемент. Если вы помните, то в справочнике здесь лежит зона нумерации. Сравниваем ее с той, что в номере телефона. Если не она, идем дальше. Ах, да, чуть не забыл. Здесь еще и проверяется одновременным условием and, входит ли номер в диапазон, если все же зона нумерации совпадает. Ну и так до самого совпадения. После чего в цикле забирается информация о часовом поясе, если она есть в json и все это добро печатается в терминал. С или без часового пояса.

Python:
def csv_read(zone, number, phone):
    with open('zone.json', 'r', encoding='utf-8') as f:
        zone_t = json.load(f)
    with open("DEF-9xx.csv", "r", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    region = line[0].split(";")[5].strip()
                    try:
                        for z in zone_t:
                            if region in z:
                                time_zone = z[region]
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}\n    - Часовой пояс: {time_zone}')
                        return
                    except KeyError:
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}')
                        return

Вот, в принципе и все. Как видите, информации не густо. И это то, что можно получить, не прибегая ни к каким уловкам. Все остальное, это уже проверки в базах утечек или в гетконтактах. Это немного не то. А вот именно та информация, которая общедоступная, по большей части вся. Ну да, тут еще можно было выкорчевать ИНН оператора. Но он, наверное, не нужен.

Понятно дело, что я мог что-то упустить или недоглядеть, так как не претендую на полноту информации. Если да, то подскажите. С удовольствием покопаю в этом направлении.

Python:
# pip install phonenumbers

import csv
import json

from phonenumbers.phonenumberutil import NumberParseException
from phonenumbers import parse
from phonenumbers import geocoder
from phonenumbers import timezone
from phonenumbers import carrier


def russia_num(phone):
    if phone[0:1] == "+" and phone[2:3] == "9":
        num_one = phone[2:5]
        two_num = phone[5:]
        csv_read(num_one, two_num, phone)
    elif phone[0:1] == "8" and phone[1:2] == "9":
        num_one = phone[1:4]
        two_num = phone[4:]
        csv_read(num_one, two_num, phone)
    else:
        phnum_parse(phone)


def csv_read(zone, number, phone):
    with open('zone.json', 'r', encoding='utf-8') as f:
        zone_t = json.load(f)
    with open("DEF-9xx.csv", "r", encoding='utf-8') as f:
        reader = csv.reader(f, delimiter="\t")
        for i, line in enumerate(reader):
            if i != 0:
                if line[0].split(";")[0] == zone and \
                        [k for k in range(int(line[0].split(";")[1]), int(line[0].split(";")[2])) if int(number) == k]:
                    prov = line[0].split(";")[4]
                    region = line[0].split(";")[5].strip()
                    try:
                        for z in zone_t:
                            if region in z:
                                time_zone = z[region]
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}\n    - Часовой пояс: {time_zone}')
                        return
                    except KeyError:
                        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {prov}\n    '
                              f'- Регион: {region}')
                        return


def phnum_parse(phone):
    try:
        ph_parse = parse(phone)
    except NumberParseException:
        print('[-] Неправильный регион')
        return
    ph_timezone = timezone.time_zones_for_number(ph_parse)
    ph_region = geocoder.description_for_number(ph_parse, 'ru')
    ph_prov = carrier.name_for_number(ph_parse, 'ru')
    if ph_prov == "":
        ph_prov = "Uncnown"
    elif ph_region == "":
        ph_region = "Uncnown"
    elif ph_timezone[0] == "":
        print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
              f'- Регион: {ph_region}\n    - Часовой пояс: Uncnown')
        return
    print(f'\n[+] Информация о номере: {phone}:\n    - Провайдер (ОпСоС): {ph_prov}\n    '
          f'- Регион: {ph_region}\n    - Часовой пояс: {ph_timezone[0]}')
  

def main():
    print('\n* ИНФОРМАЦИЯ О НОМЕРЕ ТЕЛЕФОНА. РЕГИОН, ОПЕРАТОР И ЧАСОВОЙ ПОЯС *\n')
    phone = input('Введите номер >>> ').replace("-", "").replace("(", "").replace(")", "").replace(" ", "")
    if phone[0:1] == "+":
        if phone[1:2] == "7":
            russia_num(phone)
        else:
            phnum_parse(phone)
    elif phone[0:1] == "8":
        russia_num(phone)
    else:
        phnum_parse(phone)
  

if __name__ == "__main__":
    main()

P.S.: Одно время ездил по вахтам и у меня много накопилось номеров телефонов. Да и так, самых разных, со временем. Когда сделал скрипт, сидел, баловался, определял регион и оператора :LOL:

Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезной
 

Вложения

  • zone.zip
    1,7 КБ · Просмотры: 44

And4R

One Level
05.01.2022
2
1
а номер +4..... польша этим скриптом проверить можно ,я ещё плохо в этом соображаю ... поможете. спасибо
 
Мы в соцсетях: