• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Сбор информации об IP и пробиваем номер сотового. [Python для хакера] Часть 3

Ciao, дорогие участники нашего форума) Давненько от меня не выходило статей. Но это все по тому, что я совместно с @BadBlackHat и @r0hack создаем курс по веб пентесту. Думаю вам понравится. А теперь перейдем непосредственно к сути. Сегодня, мы напишем 2 не больших скрипта на Python, которые не много облегчат вам сбор информации. Первый скрипт получает информацию об IP, а второй не много о номере сотового.

[1] - Сбор информации об IP.

Для начала определимся с тем, какую информацию хотим получить. В основном, это будет город, страна, континент (а вдруг) и провайдер. Также не плохо было бы получить информацию whois. Для написания нашего скрипта, я составил простенький алгоритм.

Код:
1. Взять на вход IP адрес
2. Составить URL адрес по типу: http://ipinfo.io/<IP>/json
3. Запросить JSON данные обратившись по этому адресу
4. Изменяем из JSON формата в словарь на языке Python
5. По средством Python выполним команду в терминале whois <IP>
6. Прочтем данные из пункта выше
7. В читабельном виде выведем полученную информацию

Для начала разберемся с сервисом ipinfo.io - он предоставляет нам информацию об указанном вами IP адресе. Но что же такое JSON? Это всего то один из способов ранения данных. Мы же этот способ переформируем в словарь. Чтобы лучше понять, давайте пропишем в адресной строке вашего браузера следующий URL

Код:
https://ipinfo.io/101.50.1.2/json

Прописав этот URL, вы как будто говорите серверу "Предоставь мне информацию об IP адресе 101.50.1.2 в виде JSON". Данный IP является прокси сервером.

6234512_stock-vector-hand-with-a-syringe-injection-vaccination-medicine.jpg


Так вот, когда мы из JSON переформируем данные в словарь, то чтобы получить, например информацию о городе, существует ключ "city". Более обширная информация о регионе, то ключ "region". Надеюсь, что на этом моменте все понятно. Приступим к написанию непосредственно кода.

Первым делом импортируем необходимые библиотеки. Мы воспользуемся библиотеками json - для обработки информации, urllib.request - для отправки запросов на ресурс и получении данных и os - для выполнения команд в терминале Linux.

Python:
import urllib.request
import json
import os

Теперь же, нам необходимо запросить у пользователя IP адрес, о котором собственно и будет собрана информация.

Код:
getIP = input("[+] Enter IP --> ")

Составляем необходимый URL, дабы в дальнейшем запросить с него информацию.

Код:
url = "https://ipinfo.io/" + getIP + "/json"

Запрашиваем информацию и записываем ее в переменную getInfo. Но, для выявления ошибок, заключаем наш запрос в конструкцию try --> except

Код:
try:
    getInfo = urllib.request.urlopen( url )
except:
    print( "\n[!] - IP not found! - [!]\n" )

Как раз, после выполнения данной строки, если IP был найден в базе сайта и мы корректно подключились к нему, нужно преобразовать данные из JSON в словарь. Для этого воспользуемся опять таки одной строкой))

Код:
infoList = json.load(getInfo)

Данные получены, но не спешите выводить всю информацию, это мы сделаем в последнюю очередь. А теперь получаем whois информацию. Здесь все еще проще.

Код:
myComand = "whois " + getIP
whoisInfo = os.popen( myComand ).read()

После того, как мы собрали всю информацию, нам необходимо красиво вывести ее.

Код:
print( "-" * 60 )

print( "IP: ", infoList["ip"] )
print( "City: ", infoList["city"] )
print( "Region: ", infoList["region"] )
print( "Country: ", infoList["country"] )
print( "Hostname: ", infoList["hostname"] )

print( "-" * 60 )
print( whoisInfo )
print( "-" * 60)

Код я не много видоизменил и "продекорировал". Вот, что получилось в итоге

Код:
import urllib.request
import json
import os

getIP = input("[+] Enter IP --> ")
url = "https://ipinfo.io/" + getIP + "/json"

try:
    getInfo = urllib.request.urlopen( url )

except:
    print( "\n[!] - IP not found! - [!]\n" )

infoList = json.load(getInfo)

def whoisIPinfo(ip):

    try:

        myComand = "whois " + getIP
        whoisInfo = os.popen( myComand ).read()
        return whoisInfo

    except:

        return "\n [!] -- Error -- [!] \n"

     
print( "-" * 60 )

print( "IP: ", infoList["ip"] )
print( "City: ", infoList["city"] )
print( "Region: ", infoList["region"] )
print( "Country: ", infoList["country"] )
print( "Hostname: ", infoList["hostname"] )

print( "-" * 60 )
print( whoisIPinfo ( getIP ) )
print( "-" * 60)

Snimok_Ekrana_Ot_2018-07-16_17-54-43.png


[2] - Пробиваем номер сотового.

Здесь, все строиться практически на таком же алгоритме. За исключением whois))) В число интересующей нас информации входит город, страна, сотовый оператор.
Брать информацию мы будем в виде JSON. Для начала, посмотрим на ее "внешний вид". Для этого пропишите какой-либо номер используя следующий URL.

Код:
https://htmlweb.ru/geo/api.php?json&telcod=<ТЕЛЕФОН>

Я возьму телефон с ресурса onlinesim.

060a40c2afe46ffb448e754d465d9381.png


Думаю, что при конвертации этого из JSON получится многомерный словарь)) Т.е. нужно будет использовать ключи 2 раза. Например словарь[key1][key2]
Приступим конечно же к кодингу. Ничего не меняется, мы импортируем все те же библиотеки, за исключением os.

Код:
import urllib.request
import json

Далее, запрашиваем у пользователя номер сотового телефона

Код:
phone = input("Enter phone: ")

Формируем URL для запроса

Код:
getInfo = "https://htmlweb.ru/geo/api.php?json&telcod=" + phone

Запрашиваем у ресурса информацию о сотовом в json формате

Код:
try:
    infoPhone = urllib.request.urlopen( getInfo )
except:
    print( "\n[!] - Phone not found - [!]\n" )

Из полученной информации, которая храниться в виде json создаем многомерный словарь)

Код:
infoPhone = json.load( infoPhone )

И, конечно, красиво выводим все полученную информацию.

Код:
print( u"Номер сотового --->", "+" + phone )
print( u"Страна ---> ", infoPhone["country"]["name"] )
print( u"Регион ---> ", infoPhone["region"]["name"] )
print( u"Округ ---> ", infoPhone["region"]["okrug"] )
print( u"Оператор ---> ", infoPhone["0"]["oper"] )
print( u"Часть света ---> ", infoPhone["country"]["location"] )

На вход программе давайте номер сотового, но без +

989.jpg


А на этом, друзья, все)

P.S: А не начать ли нам, в следующей части, писать свой сканер web - ресурсов, для сбора информации?
 
Последнее редактирование:

Your 2B wify

Green Team
01.06.2018
96
21
BIT
0
Составляем необходимый URL, дабы в дальнейшем запросить с него информацию.
Python:
url = "https://ipinfo.io/" + getIP + "/json"
Мне кажется, что в учебно курсе должно быть все максимально правильно и по феншую. Почему автор не использовал .format()?
В итоге получилось бы
Python:
url = "https://ipinfo.io/{}/json".format(getIp)
 
  • Нравится
Реакции: SooLFaa

vag4b0nd

Green Team
24.05.2017
303
1 472
BIT
30
Мне кажется, что в учебно курсе должно быть все максимально правильно и по феншую. Почему автор не использовал .format()?
В итоге получилось бы
Python:
url = "https://ipinfo.io/{}/json".format(getIp)
Фен шуй нынче не в моде. Прошу прощения за что вам не зашла эта строка кода.. тогда я писал статью в быстром темпе и, видимо, на автомате соскочило то, что уже несколько месяцев написано. Однако, кто-то сказал, что эта запись не правильна? Такой вид тоже имеет смысл быть, тем более переменная всего одна. Однако, в дальнейшем постараюсь писать код намного интеллегентно.
 

Rocer

Green Team
04.09.2017
135
13
BIT
0
Ребят без обид но какой смысл ехать в Москву через Пекин если есть прямая дорога с Тулы ведь на данный момент существуют очень много сайтов которые пробьют какой оператор провайдер и тому подобное без написания скриптов и тому подобное данный скрипт был бы очень крут если бы он выдавал данные по номеру на кого зарегистрирован данный номер и тому подобное
 
  • Не нравится
Реакции: Your 2B wify

Your 2B wify

Green Team
01.06.2018
96
21
BIT
0
Ребят без обид но какой смысл ехать в Москву через Пекин если есть прямая дорога с Тулы ведь на данный момент существуют очень много сайтов которые пробьют какой оператор провайдер и тому подобное без написания скриптов и тому подобное данный скрипт был бы очень крут если бы он выдавал данные по номеру на кого зарегистрирован данный номер и тому подобное
А смысл вообще изучать ЯП?
Эта статья не называется Как вычислить motherfuckera, который кинул вам винлок вместо читов на майнкрафт[Для ноликов без палочек]", а это часть учебного курса,в котором автор показывает мощь змеи во всей красе, используя красивый практический пример.
 
  • Нравится
Реакции: Johan Van и vag4b0nd

Rocer

Green Team
04.09.2017
135
13
BIT
0
А смысл вообще изучать ЯП?
Эта статья не называется Как вычислить motherfuckera, который кинул вам винлок вместо читов на майнкрафт[Для ноликов без палочек]", а это часть учебного курса,в котором автор показывает мощь змеи во всей красе, используя красивый практический пример.
Ни кто не спорит да статья хорошая но как и сказано всё это можно узнать и при помощи обычных методов если нужно срочно что то узнать например у меня были ситуации когда в течении считанных секунд узнать кто звонит откуда и так далее и увы данный способ займёт не 10 секунд пока ты пробьёшь что либо
 

vag4b0nd

Green Team
24.05.2017
303
1 472
BIT
30
Ни кто не спорит да статья хорошая но как и сказано всё это можно узнать и при помощи обычных методов если нужно срочно что то узнать например у меня были ситуации когда в течении считанных секунд узнать кто звонит откуда и так далее и увы данный способ займёт не 10 секунд пока ты пробьёшь что либо
Вам не навязывали, что этот способ самый лучший и именно его вы должны использовать, хотя так может быть проще, когда сам скрипт уже сохранен. Также, просвятите нас в методы, которые по номеру позволят узнать конкретную информацию не подкупая операторов (причём, я не призываю никого к таким действиям. Это противозаконно) , как это делают многие отчаянные... Скрипт не идеален, с этим я согласен. Однако, что мешает самому его дополнить и, например, поделится под статьёй с остальными?)
 
  • Нравится
  • Не нравится
Реакции: lnxsstm, DSCH и Rocer

Your 2B wify

Green Team
01.06.2018
96
21
BIT
0
Ок, я был не прав кинув сообщения из пм, но дизлайками ты знатно поднял мне настроение)
 

Rocer

Green Team
04.09.2017
135
13
BIT
0
Ок, я был не прав кинув сообщения из пм, но дизлайками ты знатно поднял мне настроение)
Как и ты мне просто так не кто не делает о чём был разговор у двоих не нужно знать всему форуму это не хороший поступок с твоей стороны
 

Tayler

Green Team
08.07.2017
40
46
BIT
1
<ТЕЛЕФОН>

Если пишешь статью, то подбирай нормальный материал и сервисы, услуги которых ты будешь демонстрировать.
Данный апи, предоставляет для демо версии (использование без токена), только 20 запросов в сутки.

подключился бы к базе get_contact

К сожалению, уже прикрыли лавочку(
 

SooLFaa

Platinum
15.07.2016
898
1 559
BIT
19
Если пишешь статью, то подбирай нормальный материал и сервисы, услуги которых ты будешь демонстрировать.
Данный апи, предоставляет для демо версии (использование без токена), только 20 запросов в сутки.



К сожалению, уже прикрыли лавочку(
Нет, не прикрыли.
 

masscontrolx

Green Team
02.03.2018
43
8
BIT
0
Приветствую, а как вместо
phone = input("Enter phone: ")
указать список номеров из файла?
 

masscontrolx

Green Team
02.03.2018
43
8
BIT
0
Читаешь файл и дальше циклом по строкам
Так и не смог разобраться, Может покажет кто: -сейчас вот нашел парсер ок, добился только запись в файл результатов, но не могу опять понять как взять данные из файла,
сейчас вызывается так: python3 test.py 79246202039, а нужно python3 test.py numbers.txt, какие варианты только не пробовал, весь день в поисковиках провел.....
Также интересно посмотреть как вписать количество потоков, python новое для меня, многое понять не могу.


Python:
#!/usr/bin/env python3
import argparse
import requests

import sys
#import re
from bs4 import BeautifulSoup


 



temp = sys.stdout
sys.stdout=open("out.txt","a")
sys.stdout.write(str() + '\n')
OK_LOGIN_URL = \
    'https://www.ok.ru/dk?st.cmd=anonymMain&st.accRecovery=on&st.error=errors.password.wrong'
OK_RECOVER_URL = \
    'https://www.ok.ru/dk?st.cmd=anonymRecoveryAfterFailedLogin&st._aid=LeftColumn_Login_ForgotPassword'


def check_login(login_data):
    session = requests.Session()
    session.get(f'{OK_LOGIN_URL}&st.email={login_data}')
    request = session.get(OK_RECOVER_URL)
    root_soup = BeautifulSoup(request.content, 'html.parser')
    soup = root_soup.find('div', {'data-l': 'registrationContainer,offer_contact_rest'})
    if soup:
        account_info = soup.find('div', {'class': 'ext-registration_tx taCenter'})
        masked_email = soup.find('button', {'data-l': 't,email'})
        masked_phone = soup.find('button', {'data-l': 't,phone'})
        if masked_phone:
            masked_phone = masked_phone.find('div', {'class': 'ext-registration_stub_small_header'}).get_text()
        if masked_email:
            masked_email = masked_email.find('div', {'class': 'ext-registration_stub_small_header'}).get_text()
        if account_info:
            masked_name = account_info.find('div', {'class': 'ext-registration_username_header'})
            if masked_name:
                masked_name = masked_name.get_text()
            account_info = account_info.findAll('div', {'class': 'lstp-t'})
            if account_info:
                profile_info = account_info[0].get_text()
                profile_registred = account_info[1].get_text()
            else:
                profile_info = None
                profile_registred = None
        else:
            return None

        return {
            'masked_name': masked_name,
            'masked_email': masked_email,
            'masked_phone': masked_phone,
            'profile_info': profile_info,
            'profile_registred': profile_registred,
        }

    if root_soup.find('div', {'data-l': 'registrationContainer,home_rest'}):
        return 'not associated'


def console_output(login_data, parsed_response):
    if parsed_response:
        if parsed_response == 'not associated':
            print('{login_data}', "NONE", end="")
        else:
            print(f'{login_data}', end=' ')
            for key, value in parsed_response.items():
                if value:
                    #print(f'{key} - {value}')
                    print(f'{value}', end=' ')
         
    else:
        print('No fault, but server return unknown response')


def console_run():
    arg_parser = argparse.ArgumentParser(description='Simple checker for ok.ru partial private data disclosure')
    arg_parser.add_argument('login_data', help='known credential to check (email / phone number / username)')
    args = arg_parser.parse_args()
    login_data = args.login_data
    response = check_login(login_data)
    console_output(login_data, response)


if __name__ == '__main__':
    console_run()
    sys.stdout.close()
    sys.stdout = temp
 
Последнее редактирование:

OPOSTAL

Green Team
18.01.2021
35
2
BIT
0
всем привет. я не понял, как вы смоги достать эту json ссылку?
 

Den245851

New member
14.04.2022
1
0
BIT
0
Ciao, дорогие участники нашего форума) Давненько от меня не выходило статей. Но это все по тому, что я совместно с @BadBlackHat и @r0hack создаем курс по веб пентесту. Думаю вам понравится. А теперь перейдем непосредственно к сути. Сегодня, мы напишем 2 не больших скрипта на Python, которые не много облегчат вам сбор информации. Первый скрипт получает информацию об IP, а второй не много о номере сотового.

[1] - Сбор информации об IP.

Для начала определимся с тем, какую информацию хотим получить. В основном, это будет город, страна, континент (а вдруг) и провайдер. Также не плохо было бы получить информацию whois. Для написания нашего скрипта, я составил простенький алгоритм.

Код:
1. Взять на вход IP адрес
2. Составить URL адрес по типу: http://ipinfo.io/<IP>/json
3. Запросить JSON данные обратившись по этому адресу
4. Изменяем из JSON формата в словарь на языке Python
5. По средством Python выполним команду в терминале whois <IP>
6. Прочтем данные из пункта выше
7. В читабельном виде выведем полученную информацию

Для начала разберемся с сервисом ipinfo.io - он предоставляет нам информацию об указанном вами IP адресе. Но что же такое JSON? Это всего то один из способов ранения данных. Мы же этот способ переформируем в словарь. Чтобы лучше понять, давайте пропишем в адресной строке вашего браузера следующий URL

Код:
https://ipinfo.io/101.50.1.2/json

Прописав этот URL, вы как будто говорите серверу "Предоставь мне информацию об IP адресе 101.50.1.2 в виде JSON". Данный IP является прокси сервером.

Посмотреть вложение 20343

Так вот, когда мы из JSON переформируем данные в словарь, то чтобы получить, например информацию о городе, существует ключ "city". Более обширная информация о регионе, то ключ "region". Надеюсь, что на этом моменте все понятно. Приступим к написанию непосредственно кода.

Первым делом импортируем необходимые библиотеки. Мы воспользуемся библиотеками json - для обработки информации, urllib.request - для отправки запросов на ресурс и получении данных и os - для выполнения команд в терминале Linux.

Python:
import urllib.request
import json
import os

Теперь же, нам необходимо запросить у пользователя IP адрес, о котором собственно и будет собрана информация.

Код:
getIP = input("[+] Enter IP --> ")

Составляем необходимый URL, дабы в дальнейшем запросить с него информацию.

Код:
url = "https://ipinfo.io/" + getIP + "/json"

Запрашиваем информацию и записываем ее в переменную getInfo. Но, для выявления ошибок, заключаем наш запрос в конструкцию try --> except

Код:
try:
    getInfo = urllib.request.urlopen( url )
except:
    print( "\n[!] - IP not found! - [!]\n" )

Как раз, после выполнения данной строки, если IP был найден в базе сайта и мы корректно подключились к нему, нужно преобразовать данные из JSON в словарь. Для этого воспользуемся опять таки одной строкой))

Код:
infoList = json.load(getInfo)

Данные получены, но не спешите выводить всю информацию, это мы сделаем в последнюю очередь. А теперь получаем whois информацию. Здесь все еще проще.

Код:
myComand = "whois " + getIP
whoisInfo = os.popen( myComand ).read()

После того, как мы собрали всю информацию, нам необходимо красиво вывести ее.

Код:
print( "-" * 60 )

print( "IP: ", infoList["ip"] )
print( "City: ", infoList["city"] )
print( "Region: ", infoList["region"] )
print( "Country: ", infoList["country"] )
print( "Hostname: ", infoList["hostname"] )

print( "-" * 60 )
print( whoisInfo )
print( "-" * 60)

Код я не много видоизменил и "продекорировал". Вот, что получилось в итоге

Код:
import urllib.request
import json
import os

getIP = input("[+] Enter IP --> ")
url = "https://ipinfo.io/" + getIP + "/json"

try:
    getInfo = urllib.request.urlopen( url )

except:
    print( "\n[!] - IP not found! - [!]\n" )

infoList = json.load(getInfo)

def whoisIPinfo(ip):

    try:

        myComand = "whois " + getIP
        whoisInfo = os.popen( myComand ).read()
        return whoisInfo

    except:

        return "\n [!] -- Error -- [!] \n"

    
print( "-" * 60 )

print( "IP: ", infoList["ip"] )
print( "City: ", infoList["city"] )
print( "Region: ", infoList["region"] )
print( "Country: ", infoList["country"] )
print( "Hostname: ", infoList["hostname"] )

print( "-" * 60 )
print( whoisIPinfo ( getIP ) )
print( "-" * 60)

Посмотреть вложение 20352

[2] - Пробиваем номер сотового.

Здесь, все строиться практически на таком же алгоритме. За исключением whois))) В число интересующей нас информации входит город, страна, сотовый оператор.
Брать информацию мы будем в виде JSON. Для начала, посмотрим на ее "внешний вид". Для этого пропишите какой-либо номер используя следующий URL.

Код:
https://htmlweb.ru/geo/api.php?json&telcod=<ТЕЛЕФОН>

Я возьму телефон с ресурса onlinesim.

Посмотреть вложение 20356

Думаю, что при конвертации этого из JSON получится многомерный словарь)) Т.е. нужно будет использовать ключи 2 раза. Например словарь[key1][key2]
Приступим конечно же к кодингу. Ничего не меняется, мы импортируем все те же библиотеки, за исключением os.

Код:
import urllib.request
import json

Далее, запрашиваем у пользователя номер сотового телефона

Код:
phone = input("Enter phone: ")

Формируем URL для запроса

Код:
getInfo = "https://htmlweb.ru/geo/api.php?json&telcod=" + phone

Запрашиваем у ресурса информацию о сотовом в json формате

Код:
try:
    infoPhone = urllib.request.urlopen( getInfo )
except:
    print( "\n[!] - Phone not found - [!]\n" )

Из полученной информации, которая храниться в виде json создаем многомерный словарь)

Код:
infoPhone = json.load( infoPhone )

И, конечно, красиво выводим все полученную информацию.

Код:
print( u"Номер сотового --->", "+" + phone )
print( u"Страна ---> ", infoPhone["country"]["name"] )
print( u"Регион ---> ", infoPhone["region"]["name"] )
print( u"Округ ---> ", infoPhone["region"]["okrug"] )
print( u"Оператор ---> ", infoPhone["0"]["oper"] )
print( u"Часть света ---> ", infoPhone["country"]["location"] )

На вход программе давайте номер сотового, но без +

Посмотреть вложение 20363

А на этом, друзья, все)

P.S: А не начать ли нам, в следующей части, писать свой сканер web - ресурсов, для сбора информации?
Больше спасибо, я только начал изучать Python. Очень познавательно.
 

Johan Van

Green Team
13.06.2020
352
662
BIT
167
всем привет. я не понял, как вы смоги достать эту json ссылку?
Доброго времени суток. У них на сайте есть небольшая документация, где написано, что для приложений, которые пытаются получить доступ к информации об адресе существует конструкция, в которой добавляется json к url. По сути, согласно их документации, можно получить доступ даже не ко всем параметрам сразу, а к каждому по отдельности. Вот пример из их документации, где в запросе получается только город: . Конечно же, для того, чтобы получить отдельный параметр, вам нужно предварительно знать структуру получаемого в запросе json. Ну и согласно документации запрос должен выглядеть примерно так: . Но, именно с помощью этой конструкции вы получите информацию о том IP, с которого и переходите по адресу. А вот, для того, чтобы получить инфу о требуемом IP, как раз и нужно добавить его в адрес перед json ( ) :cool:

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

Мне кажется, что в учебно курсе должно быть все максимально правильно и по феншую. Почему автор не использовал .format()?
В итоге получилось бы
Python:
url = "https://ipinfo.io/{}/json".format(getIp)
Ciao, дорогие участники нашего форума) Давненько от меня не выходило статей. Но это все по тому, что я совместно с @BadBlackHat и @r0hack создаем курс по веб пентесту. Думаю вам понравится. А теперь перейдем непосредственно к сути. Сегодня, мы напишем 2 не больших скрипта на Python, которые не много облегчат вам сбор информации. Первый скрипт получает информацию об IP, а второй не много о номере сотового.

[1] - Сбор информации об IP.

Для начала определимся с тем, какую информацию хотим получить. В основном, это будет город, страна, континент (а вдруг) и провайдер. Также не плохо было бы получить информацию whois. Для написания нашего скрипта, я составил простенький алгоритм.

Код:
1. Взять на вход IP адрес
2. Составить URL адрес по типу: http://ipinfo.io/<IP>/json
3. Запросить JSON данные обратившись по этому адресу
4. Изменяем из JSON формата в словарь на языке Python
5. По средством Python выполним команду в терминале whois <IP>
6. Прочтем данные из пункта выше
7. В читабельном виде выведем полученную информацию

Для начала разберемся с сервисом ipinfo.io - он предоставляет нам информацию об указанном вами IP адресе. Но что же такое JSON? Это всего то один из способов ранения данных. Мы же этот способ переформируем в словарь. Чтобы лучше понять, давайте пропишем в адресной строке вашего браузера следующий URL

Код:
https://ipinfo.io/101.50.1.2/json

Прописав этот URL, вы как будто говорите серверу "Предоставь мне информацию об IP адресе 101.50.1.2 в виде JSON". Данный IP является прокси сервером.

Посмотреть вложение 20343

Так вот, когда мы из JSON переформируем данные в словарь, то чтобы получить, например информацию о городе, существует ключ "city". Более обширная информация о регионе, то ключ "region". Надеюсь, что на этом моменте все понятно. Приступим к написанию непосредственно кода.

Первым делом импортируем необходимые библиотеки. Мы воспользуемся библиотеками json - для обработки информации, urllib.request - для отправки запросов на ресурс и получении данных и os - для выполнения команд в терминале Linux.

Python:
import urllib.request
import json
import os

Теперь же, нам необходимо запросить у пользователя IP адрес, о котором собственно и будет собрана информация.

Код:
getIP = input("[+] Enter IP --> ")

Составляем необходимый URL, дабы в дальнейшем запросить с него информацию.

Код:
url = "https://ipinfo.io/" + getIP + "/json"

Запрашиваем информацию и записываем ее в переменную getInfo. Но, для выявления ошибок, заключаем наш запрос в конструкцию try --> except

Код:
try:
    getInfo = urllib.request.urlopen( url )
except:
    print( "\n[!] - IP not found! - [!]\n" )

Как раз, после выполнения данной строки, если IP был найден в базе сайта и мы корректно подключились к нему, нужно преобразовать данные из JSON в словарь. Для этого воспользуемся опять таки одной строкой))

Код:
infoList = json.load(getInfo)

Данные получены, но не спешите выводить всю информацию, это мы сделаем в последнюю очередь. А теперь получаем whois информацию. Здесь все еще проще.

Код:
myComand = "whois " + getIP
whoisInfo = os.popen( myComand ).read()

После того, как мы собрали всю информацию, нам необходимо красиво вывести ее.

Код:
print( "-" * 60 )

print( "IP: ", infoList["ip"] )
print( "City: ", infoList["city"] )
print( "Region: ", infoList["region"] )
print( "Country: ", infoList["country"] )
print( "Hostname: ", infoList["hostname"] )

print( "-" * 60 )
print( whoisInfo )
print( "-" * 60)

Код я не много видоизменил и "продекорировал". Вот, что получилось в итоге

Код:
import urllib.request
import json
import os

getIP = input("[+] Enter IP --> ")
url = "https://ipinfo.io/" + getIP + "/json"

try:
    getInfo = urllib.request.urlopen( url )

except:
    print( "\n[!] - IP not found! - [!]\n" )

infoList = json.load(getInfo)

def whoisIPinfo(ip):

    try:

        myComand = "whois " + getIP
        whoisInfo = os.popen( myComand ).read()
        return whoisInfo

    except:

        return "\n [!] -- Error -- [!] \n"

    
print( "-" * 60 )

print( "IP: ", infoList["ip"] )
print( "City: ", infoList["city"] )
print( "Region: ", infoList["region"] )
print( "Country: ", infoList["country"] )
print( "Hostname: ", infoList["hostname"] )

print( "-" * 60 )
print( whoisIPinfo ( getIP ) )
print( "-" * 60)

Посмотреть вложение 20352

[2] - Пробиваем номер сотового.

Здесь, все строиться практически на таком же алгоритме. За исключением whois))) В число интересующей нас информации входит город, страна, сотовый оператор.
Брать информацию мы будем в виде JSON. Для начала, посмотрим на ее "внешний вид". Для этого пропишите какой-либо номер используя следующий URL.

Код:
https://htmlweb.ru/geo/api.php?json&telcod=<ТЕЛЕФОН>

Я возьму телефон с ресурса onlinesim.

Посмотреть вложение 20356

Думаю, что при конвертации этого из JSON получится многомерный словарь)) Т.е. нужно будет использовать ключи 2 раза. Например словарь[key1][key2]
Приступим конечно же к кодингу. Ничего не меняется, мы импортируем все те же библиотеки, за исключением os.

Код:
import urllib.request
import json

Далее, запрашиваем у пользователя номер сотового телефона

Код:
phone = input("Enter phone: ")

Формируем URL для запроса

Код:
getInfo = "https://htmlweb.ru/geo/api.php?json&telcod=" + phone

Запрашиваем у ресурса информацию о сотовом в json формате

Код:
try:
    infoPhone = urllib.request.urlopen( getInfo )
except:
    print( "\n[!] - Phone not found - [!]\n" )

Из полученной информации, которая храниться в виде json создаем многомерный словарь)

Код:
infoPhone = json.load( infoPhone )

И, конечно, красиво выводим все полученную информацию.

Код:
print( u"Номер сотового --->", "+" + phone )
print( u"Страна ---> ", infoPhone["country"]["name"] )
print( u"Регион ---> ", infoPhone["region"]["name"] )
print( u"Округ ---> ", infoPhone["region"]["okrug"] )
print( u"Оператор ---> ", infoPhone["0"]["oper"] )
print( u"Часть света ---> ", infoPhone["country"]["location"] )

На вход программе давайте номер сотового, но без +

Посмотреть вложение 20363

А на этом, друзья, все)

P.S: А не начать ли нам, в следующей части, писать свой сканер web - ресурсов, для сбора информации?

На самом деле, сайт, с которого вы получаете информацию по IP довольно нервный :) Да и отдает он в JSON гораздо меньше информации, чем показывает на сайте. Решил поковыряться в коде. Нашел GET-запрос, но меня туда не пустили. Сказали 404 тебе. Тогда я решил, что можно попробовать использовать Selenium. Ввести IP, получить инфу и спарсить то, что нужно. Но, не тут то было. Пока экспериментировал, меня снова послали. Сказали, что я слишком много хочу знать. И количество запросов с моего IP достигло дневного лимита :) Так и ушел с него, не солоно хлебавши. Ибо пользовать ради сомнительного удовольствия прокси - ну, такое себе... :)

А как пример для обучения, это хороший материал. (Но, маленькое но .... действительно, лучше сразу учить тех, кто только вообще начинает в питоне правильно писать код. По себе могу сказать, что как подхватил привычку писать код неправильно в видео с тытрубки, так сложно от нее избавиться. То неправильно пути к папкам указываю, через f-строку, хотя надо было бы по правильному через os.path.join(), то еще что. Понятно, что когда вижу, то пытаюсь исправить. Но, порою исправлять лень просто ))) Поэтому, думаю, что лучше учить сразу же правильно.). А так, все круто! Спасибо за статью!
 
Последнее редактирование:
  • Нравится
Реакции: Treangl

ivansh_v

New member
15.04.2022
3
0
BIT
0
Ну что позволю себе покритиковать. Статейка конечно имеет право на жизнь. Но уровень, дернуть апи сервиса и вывести результат на экран такой себе. Далее по IP, надеюсь все понимают, что вы пробиваете локацию провайдера из информации whois? Определялка телефонов тоже так себе. Лучше уж подключился бы к базе get_contact. Посмотреть вложение 20385

Итог. Как бы хекерского в этой статье я ничего не увидел. Пробива как такого тоже.
Подскажи, пожалуйста, как к ним подключится
 
Мы в соцсетях:

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