Классика проникновения за 8 шагов. Терминальный доступ через SQL-инъекцию и xp_cmdshellm0r0 (m0r0@inbox.ru) В предыдущей статье было продемонстрировано, как тривиальная инъекция может привести к гибели сервера, а точнее, к получению контроля над ним злоумышленником. Тогда мне в значительной степени повезло, так как доступ к БД через скуль открывал завесу к паролям от FTP. Классика создания сиквела требует сохранить атмосферу и развить сюжет. Поэтому теперь мы научимся работать с xp_cmdshell и преодолевать сопротивление WAF. И все во имя той же цели - заполучить админский доступ к серверу по RDP. Причины кризисаВ первой части я препарировал сайт ism.ws, который сложно отнести к когорте особо интересных. Чтобы у тебя не сложилось впечатления, что все описываемое - полная лажа и применимо только на мелких и заброшенных ресурсах, в качестве цели я выбрал более достойного кандидата. Поверь мне, инъекции и прочие уязвимости есть на ресурсах разного масштаба, включая и очень раскрученные бренды. Надо только уметь их найти и использовать. Итак, знакомимся: герой дня - сайт «National association of federal credit union», или NAFCU, расположенный по адресу www.nafcunet.org (www.nafcu.org) и просто напрашивающийся на детальный анализ. Сайтец сделан довольно прилично, можно даже сказать, радует глаз. Глядя на такие ресурсы, невольно думаешь, что и с безопасностью здесь все в порядке, но реалии упорно твердят об обратном. Перед тем как воспользоваться Гуглом, я решил проявить самостоятельность и провести собственное расследование. Расширения скриптов наводили на мысль, что в качестве движка выступает ColdFusion (после опыта прошлого вторжения это радует). Буквально на третьей же ссылке при подстановке кавычки я увидел ошибку на преобразование типов данных, а уже четвертая исследованная ссылка открыла во всей красе эксплойтабельную инъекцию с выводом ошибок и результатов запросов. Безалаберность и халатность, с которой ведется проектирование и разработка интернет-ресурсов многих финансовых организаций, заставляет задуматься о качестве их работы в целом. Предлагаю всю вину за финансовый кризис возложить на непрофессионализм американских буржуев и перейти к показательной карательной операции на примере NAFCU. Шаг 1. Разведка местностиПо адресу nafcu.org/Template.cfm?Section=What_is_an_FCU_&Template=/ContentManagement/HTMLDisplay.cfm&ContentID=3842 мы имеем классическую инъекцию SQL-запросов. При подстановке кавычки получим невероятно информативный вывод ошибки ColdFusion, в который транслируется ошибка SQL - [Microsoft][ODBC SQL Server Driver][SQL Server]Line 4: Incorrect syntax near. Очевидно, что дело придется иметь с SQL-сервером от мелкомягких. Разведку начнем проводить в направлении определения параметров БД и самого сервера. Для этого прощупаем скрипт запросом вида Все сложилось на редкость удачно - сработала ошибка на преобразование типов, и в результате получена идентификационная информация:
Пользователь sa! Ну, ни фига себе. В одном из изи-хаков я писал о процедуре xp_cmdshell (вернее, о способе ее активации в SQL Server 2005), которая предоставляет возможность работы с ОС от имени учетки SQL-сервера (в большинстве случаев - system). Там же я писал, что приложения, работающие от sa, не так уж и редки. Не поверил тогда - убедись сейчас :). После того, как было получено имя учетки, все мое внимание сосредоточилось вокруг процедуры xp_cmdshell. Шаг 2. Подготовительные действияВозвращаясь к изи-хаку, напомню, что процедура xp_cmdshell в 2005 сервере по умолчанию отключена, но ее можно включить, имея привилегии sysadmin. Для этого нужно лишь воспользоваться процедурой sp_configure. Мы же работаем с сервером 2000, в котором этого функционала нет. Однако xp_cmdshell может быть отключена администратором с помощью процедуры sp_dropextendedproc. Но раз она может быть отключена, значит, мы можем ее и включить. Разницы никакой нет - разрабы накосячили в 2000, накосячили и потом! Сперва я попробовал в лоб: Результат запроса поставил меня в тупик, так как, собственно, никакого результата и не было. Не было вообще ничего, сервер просто сбросил соединение. «Вот те раз», - подумал я. «Вот тебе и два», - ответил сервер при попытке обновить страницу. Видимо, был задействован фаер на уровне приложений, который не пропускал строку xp_cmdshell в запросе. Запрос был тривиальный, так что достаточно было просто представить строки в шестнадцатеричной кодировке: Появилась страничка без всяких ошибок. Это еще ни о чем не говорило, так что я решил продублировать запрос и дико обрадовался: сервер выплюнул ошибку, что объект уже зарегистрирован. Обрати внимание: при вызове sp_addextendedproc я использовал контекст БД master. То же самое я буду делать и при вызове xp_cmdshell. Советую поступать также, в противном случае - пеняй на себя. Шаг 3. Обеспечиваем контроль местностиЗачетная вещь – xp_cmdshell, но работать с ней достаточно сложно, что и отпугивает новичков. В результате, они опускаются до банальных вещей, так и не добиваясь серьезных результатов. Сложность в том, что, инъектируя команду ОС, ты не увидишь никакого результата. Фактически, приходится работать вслепую. Нет никакого вывода команды, и ты даже не поймешь, выполнилась ли она вообще, и не ошибся ли ты в синтаксисе. Но это на поверхности. А если подумать и вкурить в MSDN, можно увидеть, что execute прекрасно уживается с insert и результат выполнения можно занести в таблицу. Прочитать же данные из таблицы, имея принтабельную инъекцию, думаю, труда не составит. Таким образом, для обеспечения вывода результата будем использовать конструкции вида: Где foo - таблица с единственным столбцом типа varchar. Такую таблицу надо создать с помощью команды: Для контроля выполнения команд необходимо получать данные из таблицы foo. В примитивном варианте достаточно смотреть, не изменилось ли количество записей, для чего я держал в лисе отдельную вкладку с заряженной инъекцией: Шаг 4. Обеспечиваем скрытностьВесело открыв очередную банку кефира, я инъектировал код: – и обломался. Все правильно, я забыл про WAF, который нужно как-то обойти. Я попытался заменить все строки на их шестнадцатеричные представления, но из этой затеи ничего не получилось. Не получилось, потому что строка master..xp_cmdshell здесь выступала не в качестве параметра, а в качестве названия функции. «Вот тебе и три», - отвечал WAF на все мои извращенные попытки. Сервер, тихо посмеиваясь, с честным видом выдавал страницы без всякого намека на ошибки. Для реализации задуманного следовало конвертить строку master..xp_cmdshell в nvarchar перед передачей ее на исполнение. После недолгих мыканий родился следующий шаблон: где Проверим на примере того же ipconfig: Смотрим, сколько записей в foo; 10 - то, что надо. Шаг 5. Составляем план действийИтак, я получил способ выполнения команд в обход WAF. Теперь нужно было покреативить и составить план дальнейших действий.
Шаг 6. Внедрение агентаПервым делом следовало залить нужные файлы на сервер. В прошлый раз был доступ к ftp, но здесь такого счастья мне не привалило. Пришлось задуматься над использованием стандартных средств ОС, доступных из командной строки и позволяющих скачивать файлы по сети. Немного подумай… - ну, конечно, это ftp.exe. Продолжая тему сиквела, в качестве ftp-сервера я цинично использовал ism.ws:. Для начала я набросал команды по созданию скриптов. Выполнять каждую по отдельности не хотелось, и я использовал режим последовательного выполнения команд cmd.exe с использованием амперсандов. Так, для скачивания nc.exe нужно было выполнить: По выполнении этой команды в директории %TEMP%\test должен появиться файл nc.exe. После кодирования и подстановки в шаблон был инъектирован код: Для проверки выполняем команду dir %temp%\test:
Все ОК, nc.exe на месте. Точно так же заливаем plink.exe (можно было и в один скрипт засунуть), только директорию создавать уже не надо. Шаг 7. ЗакреплениеДалее нужно было запустить такие милые глазу команды, как net user и net localgroup. Можно все делать через инъекцию, но при наличии netcat это уже не имеет смысла. Поэтому на дедике я запустил nc.exe в режиме прослушивания порта 1234: Для реверс коннекта к деду и проброса шелла следовало выполнить команду: – со стороны сервака. После кодирования имеем следующий инъект: Все прошло как нельзя гладко, и в консоли деда я увидел шелл подопытного сервера. Воспользовавшись консолью, я активировал юзера support_388945a0 и добавил его в группу администраторов: Шаг 8. АтакаГлотнув еще кефира, я запустил на деде SSH-сервер. На автомате в консоли появилась команда для подключения по SSH. Классика проникновения:
Сервак в наших руках, можно подключаться на 127.0.0.1:3990. После ввода логина и пароля я оказался на территории врага. СУБД работала в режиме Windows Authentication, так что получить доступ ко всем БД и слить дампы не составляло труда. Развитие успеха я оставлю за кадром, предлагая включить фантазию. Тяжело в ученииОкучивая NAFCU, я столкнулся со многими, казалось, непреодолимыми трудностями. Это и активация xp_cmdshell, и обход WAF, и заливка файлов, и, конечно, уже классический обход файра с помощью реверс-коннекта по SSH. Однако суть не в этом. Прелесть в том, что это не уникальный баг, а типовая ситуация, и все вышеописанное следует расценивать как методику. Имея в рукаве такие козыри, как инъекция и доступ с правами sa, ты можешь не бояться за исход партии, главное – умело ими воспользоваться. Все описанные действия были совершены под музыку Бетховена. Слушай классику и будь счастлив. Поиск инъекцийПростейший способ определения уязвимых параметров заключается в подстановке кавычек в передаваемые значения. Собственно, таким образом и были обнаружены уязвимости NAFCU. Не стоит зацикливаться исключительно на кавычках. Во-первых, ошибки могут просто не выводиться. В этом случае при подстановке кавычки ты тупо ничего не увидишь. Во-вторых, кавычки могут экранироваться. Ошибки никакой не произойдет, а инъекция, тем не менее, может присутствовать. Так, например, при переполнении целочисленных параметров кавычки и вовсе не нужны. Наконец, параметр может быть уязвим к слепым инъекциям. Подставлять кавычку здесь – это как ядерной боеголовкой по муравейнику. Поэтому помимо кавычек я повсеместно использую конструкции «and 1=1--» и «and 1=0--», добавляя их к основному значению параметра в различных вариациях. Стопроцентной гарантии нет, но в большинстве случаев при наличии инъекции сервер будет возвращать разные результаты. Главное убедиться, что основное значение параметра обеспечивает возврат каких-нибудь данных. Отличие в результатах ты можешь увидеть на глаз. Но можешь и не увидеть, если оно незначительно или не выводится браузером. В любом случае стоит заглядывать в HTM-коды страниц и сравнивать их между собой. Вручную делать это крайне неэффективно, поэтому советую задуматься о разработке средств автоматизации. Заливка по FTPПолучив возможность исполнять команды операционной системы и запускать собственные бинарники, следует позаботиться о способе заливки файлов на целевую систему. В *nix-средах проблема решается просто, так как в большинстве из них по умолчанию доступен wget, а если и нет, то проблемы не составит его доустановить. В винде wget'а нет, а для установки софта нужно сначала залить дистрибутив. Извечная проблема курицы и яйца. К счастью, в штатной поставке есть FTP-клиент, позволяющий работать с внешними скриптами. Для скачки файлов нужно наполнить текстовый файл FTP-командами и скормить его клиенту:
При создании скрипта в большинстве случаев достаточно следующих FTP-команд:
WWWС уважением относись к документации. Большинство проблем, возникающих при проведении инъекций на SQL Server, решаются после обращения к MSDN: msdn.microsoft.com/en-us/library/ms187389.aspx. |