Пишем элементарный рассылщик

Автор: Topol Суббота, Август 11th, 2012 Нет комментариев

Рубрика: Perl

LWP + HTTP::Request::Common + HTML::Parser

Как считает Ларри Уол — одно из величайших качеств любого прогрммиста — это его лень.
Согласен. Надоели наши каналы, надоело платить деньги за три строки текста, и самое главное -
надоело грузить иксы и Нетскейп что бы бесплатно отправить sms.

Хорошо что этот самый ленивый Уол изобрел perl, а остальые линивцы — модуля.

К делу.
Задача — отправлять sms из командной строки не загружая браузера.
При успешном выполнении — широковещательную неограниченную рассылку (спамом неохота это называть) sms.

1. Ищем подходящий ресурс рассылки. Неоднократно отсылаем sms разным операторам,
Засекаем время доставки и надежность.
2. Смотрим на систему безопасности ресурса и кем предоставлен гейт.
Мне было принципиально важно гейт Киевстара т.к. на него шлю чаще
всего а свою страничку они защитили лучше всего (.gif не разбереш, хотя послушал бы мнения).

По первым двум пунктам мое внимани привлек ресурс «Телекома» http://telecom.com.ua
он не только очень быстро доставляет смс на Киевстар но там жирным светилась надпись
«Программное обеспечение для гейта предоставлено компанией «Киевстар GSM»".
У меня аж ручки зачесались.
Бегло ознакомившись с формой (разлядывая html)- никаких преград. Три параметра запроса:

1. Номер получателя, в форме to_addr.
2. «Щелкунчик» — принимает ли телефон кирилицу, в форме dcs.
3. Собственно сам текст смс, в форме new_body.

вот форма без лишний требухи:

<form name=sms method="post" action="/cgi-bin/sms/sms.pl" onsubmit="return SendForm()"> <input type=text name=to_addr><input type=radio value=1 name=dcs onClick=setLen(this.value)> <input type=radio value=0 name=dcs checked onClick=setLen(this.value)> <textarea name=new_body cols=40 rows=4 wrap=virtual onChange=checkLen(document.forms[0]) onKeyUp=checkLen(document.forms[0])></textarea> <input type=hidden name=kfY value='KLHNcbbv7pPXg7Frdjl9V8SS7bGRDHyOS6bvX3gV'> <!-- <input type=hidden name=no_spam value='YLIQc4jXJZeAdvrtQHoQ'> --> </form>

Неужели все так просто? И тут вижу еще два непонятных параметра
с пометочко hidden: один из них менял свое значение с каждой загрузкой причем
что name что value имели абсолютно умопомрачительные названия кот нормальный
человек в нормальном состоянии никогда бы не придумал.
Второй — типа закоментированный no_spam — из наблюдений и последнего названия делаем вывод:
«кинули» в нас цифровой подписю!
Значит атакой «в лоб» не получится.

Алгоритм прост:
Выгребаем страницу, разбираем, достаем значения динамически изменяемых
параметров подписи как то хеш и саму подпись. Пишем письмо другу,
к нему атачим эти же параметры. Засовываем серверу и пусть жует.
С криком — «Нет преграды патриотам!» достал из CPANа и заточил HTML::Parser.

Вот что получается…

#!/usr/bin/perl warn "Загрузка ...nn"; # модули use strict; use warnings; use LWP; use HTTP::Request::Common; use HTML::Parser; # константы: 1-я адрес странички с формой, 2-я адресс самого скрипта. use constant SMS_CENTER => 'http://telecom.com.ua/smsgate/'; use constant SMS_SCRIPT => 'http://telecom.com.ua/cgi-bin/sms/sms.pl'; ########################### Прием данных для отсылки KOI8-ru ############### print "Kyiv Star 067XXXXXXXn UMC 050XXXXXXXn Goblin Telecom 039XXXXXXn WellCOM 068XXXXXn Номер телефона получателя:n"; my $to_addr = <STDIN>; chomp($to_addr); $to_addr = '0000000000' unless $to_addr; print "Распознает ли получатель кирилицу? (0 - Нет) (1 - Да)n"; my $dcs = <STDIN>; chomp($dcs); $dcs = 0 unless $dcs; print "Текст сообщения:n"; my $new_body = <STDIN>; chomp($new_body); $new_body = 'test message from LWP' unless $new_body; ######################## Отправка данных на сервер ############# ############## Параметры типа браузера (спасибо perl.dp.ua :)  ################## my @ns_headers = ( 'User-Agent' => 'Mozilla/4.76 [ru] (Win98; U)', 'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*', 'Accept-Charset' => 'koi8-ru,*,utf-8', 'Accept-Language' => 'en-US', ); ######################## Подключение к серверу ############# $|=1; ### отключаем буферизацию my $ua = LWP::UserAgent -> new; $ua -> agent(@ns_headers, push@{$ua->requests_redirectable},'POST'); ###### Идем за новой страницей с формой ######### my $request = HTTP::Request -> new(GET => SMS_CENTER); my $parser = HTML::Parser->new(api_version => 3); ### новый обьект разборщика ############# Настройка разборщика ### здесь разбирается название хэша и его значение. Этим займется функция start my ($hash_name,$hash) = $parser ->handler(start => &start, 'tagname,attr'); ### как атрибуты функции передаются имя тега и его значение ### значение цифровой подписи - функция hidden my $cifer = $parser -> handler(comment =>&hidden, 'tagname'); ## тут нам нужно только имя тега my $response = $ua -> request($request, sub{$parser->parse(shift)}); ### получаем страницу и передаем разборщику $parser->eof;### разборщик больше не нужен die $response->status_line unless $response->is_success; ### "умираем" если нет ответа system ('clear'); ### очищаем экран print "Получены данные...n Номер получателя: $to_addrn Получение кирилицы: $dcsn Сообщение: $new_bodyn Данные хэша: $hash_name = $hashn Подпись: $cifernn "; ########### заполняем форму ############### $request = POST(SMS_SCRIPT, Content=>[ to_addr => $to_addr, dcs => $dcs, new_body => $new_body, $hash_name => $hash, no_spam => $cifer ], Referer => SMS_CENTER ); $response = $ua->request($request); ########## Отправляем на сервер die $response->status_line unless $response->is_success; ### если нет ответа - выходим print $response->content;##### получаем (для отладки) ответ сервера ######################## functions ################# ######## Все функции прозрачны если нужно описание будет. sub start{ my ($tag, $attr) = @_; if ($tag eq 'input'){ return unless $attr->{type}; if($attr->{type} eq 'hidden'){ $hash_name=$attr->{name}; $hash = $attr->{value}; return; } } } sub hidden{ my ($tag) = @_; if ($tag =~ m/(input type=hidden name=no_spam value=')(w+)('*)/i){ $cifer = $2; return; } }

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

Сразу предупреждаю, там же стоит вычислялка IP, так что без нормального маскарада все равно не получится отправить больше 5 смс. И этот сервак хреновенько шлет на номера UMC (гейт все таки Киевстаровский). Так что берите другие и долбите. Кстати у UMC все реализовано не сложнее чем у «Телекома». Делайте выводы :)

Удачи.

Источник:  internet-technologies.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты