Скажи мне, друг-сосиска: какой метод авторизации ты используешь, когда логинишься на почтовый сервак? Что я слышу? Plain text?! Иными словами, ты вводишь (а точнее, твой почтовик вводит) стандартные USER и PASS и получаешь данные о почтовом ящике.
Согласен, так делают большинство пользователей. И это плохо, потому как тебя могут запросто заснифать, то есть утащить твой пароль на почту (а
за ним и на шелл, FTP и т.п.). Чтобы этого не случилось, тебе предоставляется возможность авторизации с помощью шифрования MD5. Если почитать RFC, то мы отыщем там инфу о том, что в хеш заносятся следующие данные: баннер почтовика (тот, что в "<>" скобках), а также пароль на почту. Эта последовательность криптуется md5-алгоритмом и отправляется на сервер командой APOP. У команды два обязательных параметра - имя пользователя и MD5-хэш. Именно его ловят сниферы в момент прослушивания твоего интерфейса. Расшифровать этот хэш
вряд ли удастся по нижеследующей причине.

Баннер состоит из следующих частей: <уникальный_id.текущее_время@хост.машины>. К примеру, мой почтовик выдает следующий заголовок: "+OK POP3 Server 3.5.9 ready <14.1061593825@kamensk.net.ru>". Теперь ты понимаешь всю сложность шифрования? Мало того, что данные динамические, так они еще и MD5 шифруются! Хакеры отдыхают.

Для того, чтобы обезопасить себя, просто выбери вкладку Transport в настройках ящика твоего любимого The Bat. Затем нажми на кнопку Pop3 Autentification и выбирай тип MD5-APOP. Теперь ты в безопасности.

Хочешь большего? Тогда читай дальше. Теперь я научу тебя составлять хэши и
защищать твои шелл-скрипты от хакеров. Итак, чтобы составить md5-хэш, достаточно выполнить команду md5 -s 'строка'. К примеру, зашифруем последовательность '<14.1061593825@kamensk.net.ru>mypassword':

[forb@ruhost4 work]$ md5 -s '<14.1061593825@kamensk.net.ru>mypassword'
MD5 ("<14.1061593825@kamensk.net.ru>mypassword") = 58a6bc47c74f5913f1b207c2bc4795d8.

Что хотели, то и получили. Следующий способ более универсален, так как реализован он будет на Perl. Для этого заюзаем модуль Digest::MD5.

#!/usr/bin/perl

use Digest::MD5;
$salt=Digest::MD5->new; ##
Новый метод для MD5
$pass='mypassword'; ##
Заносим наш пароль
chomp($banner=<STDIN>); ##
Запрашиваем баннер
$hash = $salt->add($banner,$pass); ##
Формируем хэш
$passwd=$hash->hexdigest; ##
Шифруем методом ASCII-HEX
print "salt is: $passwd\n"; ##
Пишем полученный хэш

Остается запустить и проверить работу скрипта...

[root@ruhost4 forb]# perl md5.pl
<14.1061593825@kamensk.net.ru>
salt is: 58a6bc47c74f5913f1b207c2bc4795d8

Как видим, хэш совпадает с предыдущим, значит сценарий работает как надо.

Вернемся же к проблеме с почтой. Вышеизложенный алгоритм юзается в известном модуле Net::POP3. Мы не будем изобретать велосипед, а применим именно его. Точнее, напишем мини-скрипт, встречающийся у большинства на шеллах - сценарий будет коннектится к почтовому серверу, и, в случае наличия сообщения, дампить его в файл. Функция MD5-авторизации в перловом модуле называется apop(), а передать ей надо лишь логин и пароль.

#!/usr/bin/perl

use Net::POP3;

$host='mail.ru'; ## Почтовый сервер
$user='forb_mail'; ##
Логин для соединения
$pass='mypassword'; ##
Пароль
$log='message'; ##
Файл, куда будет скидываться последнее сообщение при его наличии

$pop=Net::POP3->new($host) || die print "cannot make connection\n"; ## Создаем новый объект $pop, который соединяется с сервером.
$mess=$pop->apop($user,$pass); ##
Авторизуемся. Функция apop() возвращает "0E0", если сообщений нет, undef - если произошла неудача, а в остальных случаях вернет количество мессаг в маилбоксе.
if (!defined $mess || $mess eq "0E0") { ##
Если результат функции был "0E0: или undef
$mess ne "0E0" ? $reason = "Wrong password" : $reason = "No messages"; ##
В первом случае, причина выхода - неверный пароль, во втором - отсутствие сообщений.
$pop->quit(); ##
Корректно выходим.
exit print "$reason\n"; ##
Пишем результат...
}
$message=$pop->get($mess); ##
Если функция вернула число - вытягиваем последнее сообщение. Функция get() вернет ссылку на массив, в котором будет письмо.
print "total: $mess\n"; ##
Дебаг может пригодиться...
open(LOG,">$log") || die print "Cant open log"; ##
Откроем логфайл.
print LOG @$message; ##
Пишем туда сообщение (не забудем
разыменовывать ссылку).

close(LOG); ##
Закроем файл.
$pop->delete($mess); ##
Удалим сообщение.
$pop->quit; ##
И завершим скрипт.

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

Советую включить авторизацию и в SMTP, это делается аналогично POP3. С шелл-скриптами помогать не буду =) - там другие модули и принцип авторизы - читай RFC и ты все поймешь. Удачи!

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии