Статья PoC: Узнать ник, по номеру телефона (Python/Telegram)

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

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

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

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

Мне попалась библиотка telethon. А простой запрос в гугл "telethon add user by phone" по первой же ссылке предлагает годный пример кода.

По понятным причинам(защита от скрипткиддисов) приведу здесь лишь самую важную часть кода, оставив вам для самостоятельного ресёрча всё остальное.

Итак, после импорта всех необходимых объектов из библиотеки, а так же ID и токена приложения для ТГ добавляем переменную для хранения искомого номера, на который зарегистрирован аккаунт ТГ.
Код:
guest_phone_number='+3809ХХХХХХХХ'
Проводим инициализацию и подключаемся к ТГ
Код:
client = TelegramClient('session_name', api_id, api_hash)
client.connect()
Пропускаем формальности про ввод пин-кода, приходящего на мобильник при подклчении из нового места. И добавляем искомый номер в наш список контактов
Код:
contact = InputPhoneContact(client_id=0, phone=guest_phone_number, first_name="custom_first_name", last_name="custom_last_name")
result = client.invoke(ImportContactsRequest([contact]))
Ну и последним шагом получаем ник по тому же номеру
Код:
contact_info = client.get_entity(guest_phone_number)
print(contact_info.username)

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

Каждый, кто хоть немного разобрался в программировании на Python, сможет закончить данный проект. Остальные же, могут написать в телеграм чатике https://t.me/thecodeby запрос на данный скрипт с указанием предлагаемой стоимости ;)
 
Последнее редактирование:
Полезная статья! Давно думал что можно так парсить ники по номерам и находить нужных людей.
 
Хех, несколько минут покопался, измени пару переменных, и теперь можно вытаскивать Fist - Last name, Username. Код занял 16 строк.
 
Последнее редактирование:
Ролли, подскажи, как имена вытаскивал? Они же должны быть назначены тобой при добавлении юзера по номеру телефона. Правда я не пробовал, может быть если не добавлять их, то приходят оргинальные.
 
Последнее редактирование:
Ролли, подскажи, как имена вытаскивал? Они же должны быть назначены тобой при добавлении юзера по номеру телефона. Правда я не пробовал, может быть если не добавлять их, то приходят оргинальные.
contact_info.first_name
contact_info.last_name
contact_info.username

Ролли, подскажи, как имена вытаскивал? Они же должны быть назначены тобой при добавлении юзера по номеру телефона. Правда я не пробовал, может быть если не добавлять их, то приходят оргинальные.
У тебя еще ошибка в коде, connect.start, или это защита от скрипткидисов?
 
Я понимаю как обратиться к элементам объекта типа .first_name, но если ты посмотришь на мой код, то увидишь там строку, где явно задаются эти имена.
Код:
contact = InputPhoneContact(client_id=0, phone=guest_phone_number, first_name="custom_first_name", last_name="custom_last_name")
Соответсвенно, после добавления контакта, именно указанные мной имена будут отображаться. Так что мой вопрос состоял не в том, как обратиться к этим элементам объекта, а в том, как получить реальные значения, а не установленные мной ранее.

Касаемо connect.start, опять же, если внимательно смотреть в мой код, то там нет ничего подобного.

Ну и по отзывам нескольких читателей оказалось, что мой pip выкачал старую версию библиотеки, а именно 0.19.1.6, поэтому там есть метод invoke(), который отсутсвует в более новых версиях. А это значит, что скрипткиддисам будет немножко сложнее ;) потому что надо нагуглить(это же так сложно) как выполнить этот шаг в новой версии. Либо как пип ставит более старую версию либы, это, кстати, попроще будет ;)
 
Я понимаю как обратиться к элементам объекта типа .first_name, но если ты посмотришь на мой код, то увидишь там строку, где явно задаются эти имена.
Код:
contact = InputPhoneContact(client_id=0, phone=guest_phone_number, first_name="custom_first_name", last_name="custom_last_name")
Соответсвенно, после добавления контакта, именно указанные мной имена будут отображаться. Так что мой вопрос состоял не в том, как обратиться к этим элементам объекта, а в том, как получить реальные значения, а не установленные мной ранее.

Касаемо connect.start, опять же, если внимательно смотреть в мой код, то там нет ничего подобного.

Ну и по отзывам нескольких читателей оказалось, что мой pip выкачал старую версию библиотеки, а именно 0.19.1.6, поэтому там есть метод invoke(), который отсутсвует в более новых версиях. А это значит, что скрипткиддисам будет немножко сложнее ;) потому что надо нагуглить(это же так сложно) как выполнить этот шаг в новой версии. Либо как пип ставит более старую версию либы, это, кстати, попроще будет ;)
Тут эта строчка не нужна, я её полностью убрал.
Код:
contact = InputPhoneContact(client_id=0, phone=guest_phone_number, first_name="custom_first_name", last_name="custom_last_name")
Я имею ввиду что нужно start(), а не connect()
 
  • Нравится
Реакции: de-architect
Как не нужна? Ты же формируешь объект contact, где указываешь номер телефона, для того что бы дальше передать этот объект аргументом к функции ImportContactsRequest([contact])
 
Не стыдно ли Вам зарабатывать на чужой информации и называть других кидисами. Я сам потом полный код выложу с объяснением для новичков

На какой чужой информации? Эта псевдо бага известна каждому, кто юзает телеграм. Просто был хайп в СМИ, и я решил создать иллюстрацию, но поскольку в сети очень много заказов на подобную программу, я решил скрыть часть инфы для того что бы нубы не копировали код и не продавали его, не вложив и грамма мозга.
 
Да, конечно, всем интересно открывать новые горизонты. Но пока у меня 11 лайкой. Буду копить новые. Возможно даже придумаю идейки для новых статей.
 
Telegram-CLI-Tools ищет по номеру телефона, потом уже можете искать @shortname

-Удобный импорт в телефон (самый быстрый способ)
-Средней скорости перебор в заданном диапазоне
biggrin.png
 
Telegram-CLI-Tools ищет по номеру телефона, потом уже можете искать @shortname

-Удобный импорт в телефон (самый быстрый способ)
-Средней скорости перебор в заданном диапазоне
biggrin.png


Забавная штука. Сам пробовал? Она немного иначе работает, являясь обёрткой над установленным telegram-cli. Просто шлёт в stdin команды по добавлению контакта и получению инфы. Мне же захотелось на более низком уровне реализовать этот механизм, что я и сделал, да ещё и в меньшее количество кода уложился.
 
Уахахах, тут ещё один метод подъехал, правада тоже не новый и не супер актуальный:

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

А можно подробнее про это? у них разве нет ограничений на добавление количества контактов? Даже если залить их в Гугл, подтянет ли телефон такое количество контактов при синхронизации?
 
А можно подробнее про это? у них разве нет ограничений на добавление количества контактов? Даже если залить их в Гугл, подтянет ли телефон такое количество контактов при синхронизации?
Мопед не мой, сам не пробовал.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!