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

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Soft Identifier - VK OSINT TOOL

Приветствую всех обитателей данного форума! Сегодня я поведаю вам о таком инструменте как "Identifier", он нужен для анализа странички в соц.сети ВК.

Что делает этот инструмент? Создает отчет где: записываются данные друзей человека, кол-во мужчин/женщин у человека в друзьях, его предположительный пол (определяется на основе соотношения мужчин/женщин в друзьях у человека), предполагаемый возраст (определяется по среднему значению возраста друзей человека), предполагаемые города, где проживает человек (определяется по 3-ем самым часто встречающимся городам у друзей), возможные увлечения человека (определяется по 3-ем самым часто встречающимся тематикам групп, на которые подписан человек)

*Код инструмента прикреплен внизу
Приступим к установке. Для работы инструмента вам понадобится , установить библиотеку requests python -m pip install requests, токен вконтакте, получить его можно .
Токен вставляем в 169 строку, в переменную access_token. Теперь нам надо запустить инструмент python имя файла.py

После запуска инструмента вводим id страницы, посмотреть его можно в адресной строке браузера.

Screenshot_1.png

рис. 1 "id страницы"

Подождем пока инструмент обработает данные.

Screenshot_2.png

рис. 2 "Вывод инструмента"


Screenshot_3.png

рис.3 "файл report.txt"

Python:
import requests
import datetime
from collections import Counter

def banner():
    print('''\nd888888b d8888b. d88888b d8b   db d888888b d888888b d88888b d888888b d88888b d8888b.
  `88'   88  `8D 88'     888o  88 `~~88~~'   `88'   88'       `88'   88'     88  `8D
   88    88   88 88ooooo 88V8o 88    88       88    88ooo      88    88ooooo 88oobY'
   88    88   88 88~~~~~ 88 V8o88    88       88    88~~~      88    88~~~~~ 88`8b  
  .88.   88  .8D 88.     88  V888    88      .88.   88        .88.   88.     88 `88.
Y888888P Y8888D' Y88888P VP   V8P    YP    Y888888P YP      Y888888P Y88888P 88   YD
                                                                           
                                                                            Made by @Tayrus
                                                                                ver 0.1dev    
                                                                                     ''')



def analysis_gender(male_count, female_count):
    if male_count > female_count:
        verdict = 'мужчина'
   
    if female_count > male_count:
        verdict = 'женщина'

    if male_count == female_count:
        verdict = 'n/a'

    return verdict

def analysis_age(current_year, person_year):
    person_year =  person_year.split('.')
    age = current_year - int(person_year[2])
   
    #Отсееваем тех, кто указал не настоющую дату, например 100 лет
    if age >=60:
        age = 45

    return age

def make_report(count,dic):
    male_count = 0
    female_count = 0
    handle = open('report.txt','w')
    now = datetime.datetime.now()
    current_year = now.year
    sum_age = 0
    count_person_with_age = 0
    frequent_cities = []
    hobbies_list = []

    for x in range(0,count):
            person_id = dic['response']['items'][x]['id']
            person_first_name = dic['response']['items'][x]['first_name']
            person_last_name = dic['response']['items'][x]['last_name']
            person_sex = dic['response']['items'][x]['sex']
           
            try:
                if person_sex == 2:
                    person_sex = 'мужской'
                    male_count += 1
                if person_sex == 1:
                    person_sex = 'женский'
                    female_count +=1

                try:
                    person_bdate = dic['response']['items'][x]['bdate']
                except KeyError:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - n/a /пол - {person_sex}\n')
                    continue

                try:
                    age = analysis_age(current_year,person_bdate)
                    sum_age += age
                    count_person_with_age +=1
                except:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - n/a /пол - {person_sex}\n')
                    continue
               
                try:
                    person_city = dic['response']['items'][x]['city']['title']
                    frequent_cities.append(person_city)
                except KeyError:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - {age}/пол - {person_sex}/город - n/a\n')
                    continue

                try:
                    person_phone = dic['response']['items'][x]['mobile_phone']
                except KeyError:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - {age}/пол - {person_sex}/город - {person_city}/моб.номер - n/a\n')
                    continue

                handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - {age}/пол - {person_sex}/город - {person_city}/моб.номер - {person_phone}\n')
            except UnicodeEncodeError:
                continue

    #Часто встречающийся пол друзей  
    verdict_gender = analysis_gender(male_count, female_count)
   
    #Среднее значение возраста друзей
    estimated_age = int(sum_age/count_person_with_age)
   
    #Часто встречающиеся города друзей
    frequent_cities = Counter(frequent_cities)
    one_city, two_city, three_city = frequent_cities.most_common(3)
    one_city = one_city[0]
    two_city = two_city[0]
    three_city = three_city[0]

    #Увлечения
    groups = get_user_group(id)
   
    for group_id in groups:
        try:
            hobbies_list.append(get_group_activiti(group_id))
        except KeyError:
            continue
   
    group_counter = Counter(hobbies_list)
    one_hobbie, two_hobbie, three_hobbie = group_counter.most_common(3)
    one_hobbie = one_hobbie[0]
    two_hobbie = two_hobbie[0]
    three_hobbie = three_hobbie[0]



   
   
    handle.write('Итого:')
    handle.write(f'\n\nМужчин - {male_count}/Женщин - {female_count} \nпредположительно объект - {verdict_gender} \nпредпологаемый возраст - {estimated_age}\nвозможный город - {one_city}/{two_city}/{three_city}\nвозможные увлечения - {one_hobbie}/{two_hobbie}/{three_hobbie}')
    handle.close()

def get_user_group(id):
    r = requests.get(f'https://api.vk.com/method/groups.get?user_id={id}&access_token={access_token}&v=5.103')
    groups = r.json()['response']['items']
   
    return groups

def get_group_activiti(id):
    r = requests.get(f'https://api.vk.com/method/groups.getById?group_id={id}&fields=activity&access_token={access_token}&v=5.103')
   
    return r.json()['response'][0]['activity']

def resolve_id(id):
    r = requests.get(f'https://api.vk.com/method/utils.resolveScreenName?screen_name={id}&oath=0&access_token={access_token}&v=5.103')
   
    return r.json()['response']['object_id']

def get_friends_info(id):
    r = requests.get(f'https://api.vk.com/method/friends.get?user_id={id}&fields=sex,bdate,city,contacts&order=name&access_token={access_token}&v=5.103')
    data = r.json()
    count = int(data['response']['count'])
   
    make_report(count,data)

def get_user_input():
    user_id  = input('Введите id страницы: ')
    try:
        int(user_id)
    except:
        user_id = resolve_id(user_id)
   
    return user_id


if __name__ == '__main__':
    try:
        banner()
        access_token = '' #Вставьте сюда ваш токен

        if access_token == '':
            print('Токен не обнаружен, запишите его')
            exit()

        id = get_user_input()
        get_friends_info(id)
        print('\n[+] Отчет сгенерирован ./report.txt')
    except KeyboardInterrupt:
        print('\n\n[+] Выходим...')
        exit()
 

Вложения

  • Screenshot_2.png
    Screenshot_2.png
    4,6 КБ · Просмотры: 691
Последнее редактирование:

komodikus

Green Team
06.01.2017
40
79
BIT
0
Не одобряю так сказать, есть же четкие характеристики профиля такие как : Мужчина/Женщина, Дата рождения, Город, Увлечения
Зачем делать медианную выборку для получения данных характеристик если они есть в явном виде, просто спарсил и все, или даже лучше воспользоваться апи для получения данных

И если ты пишешь скрипт для использования не самолично, думаю правильно сделать хоть какой юзер интерфейс
python3 -m my-module --auth_token=999999 ----КАК ПРИМЕР


Beautiful is better than ugly.
Simple is better than complex.
 

Co.lure.c

One Level
30.10.2016
4
1
BIT
0
Выдает:
Traceback (most recent call last):
File "wow.py", line 176, in <module>
get_friends_info(id)
File "wow.py", line 154, in get_friends_info
make_report(count,data)
File "wow.py", line 101, in make_report
estimated_age = int(sum_age/count_person_with_age)
ZeroDivisionError: division by zero
 

Tayrus

Red Team
13.04.2017
365
787
BIT
6
Не одобряю так сказать, есть же четкие характеристики профиля такие как : Мужчина/Женщина, Дата рождения, Город, Увлечения
Зачем делать медианную выборку для получения данных характеристик если они есть в явном виде, просто спарсил и все, или даже лучше воспользоваться апи для получения данных

И если ты пишешь скрипт для использования не самолично, думаю правильно сделать хоть какой юзер интерфейс
python3 -m my-module --auth_token=999999 ----КАК ПРИМЕР


Beautiful is better than ugly.
Simple is better than complex.
Конечно можно было спарасить то, что указано на странице у пользователя, но вдруг он указал не те данные? Инструмент выясняет это за счет друзей, задумка такая )
PS Аргументы добавлю в обнове

Выдает:
Traceback (most recent call last):
File "wow.py", line 176, in <module>
get_friends_info(id)
File "wow.py", line 154, in get_friends_info
make_report(count,data)
File "wow.py", line 101, in make_report
estimated_age = int(sum_age/count_person_with_age)
ZeroDivisionError: division by zero
Что-то не так с возрастом у пользователя, кого ты сканируешь. Исправлю в обнове
 

SooLFaa

Platinum
15.07.2016
898
1 559
BIT
19
Очень отрадно, что кто то тоже интересуется этой темой. Весьма перспективное направление в ОСИНТе. Мой бот уже умеет строить карту отношений и зависимостей друзей. По лайкам и коментам и т.п. Давным давно начинал с того же. Возраст пол увлечения работа школа университет. Кстати рекомендую добавить эти пункты. Как гласит народная мудрость: "Скажи мне, кто твой друг и я скажу, кто ты"
 

komodikus

Green Team
06.01.2017
40
79
BIT
0
Конечно можно было спарасить то, что указано на странице у пользователя, но вдруг он указал не те данные? Инструмент выясняет это за счет друзей, задумка такая )
PS Аргументы добавлю в обнове
Если есть предположение что человек указал неактуальную информацию, то почему ты его не распостраняешь на его друзей?)
Тоесть его друзья тоже могут указать не актуальную информацию и поитогу ты получишь вообще кашу)
 

SooLFaa

Platinum
15.07.2016
898
1 559
BIT
19
Если есть предположение что человек указал неактуальную информацию, то почему ты его не распостраняешь на его друзей?)
Тоесть его друзья тоже могут указать не актуальную информацию и поитогу ты получишь вообще кашу)
Исключено!
 
Мы в соцсетях:

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