Как считает Ларри Уол - одно из величайших качеств любого прогрммиста - это его
лень.
Согласен. Надоели наши каналы, надоело платить деньги за три строки
текста, и самое главное -
надоело грузить иксы и Нетскейп что бы бесплатно
отправить 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 все реализовано не сложнее чем у
"Телекома". Делайте выводы :)
Удачи.