Как взломать сервер centos

Обновлено: 06.07.2024

Примерно два года назад я арендовал у одного немецкого хостера не очень мощный сервер на базе Centos 5.2. На нём живут несколько вебпроектов, приносящих некоторую прибыль, и поэтому, я стараюсь присматривать за ним по мере возможности.
На Centos есть стандартный анализатор логов Logwatch, который запускается ежедневно по крону, анализирует содержимое /var/log, делает сводный отчет и присылает его по электропочте. В один прекрасный день я обнаружил в этом отчете запись:

В тот момент меня она очень смутила, так как в предыдущий день на сервер я не логинился и тем более ничего не устанавливал. Первое, что пришло в голову — сервер был скомпроментирован. Себя я считал уверенным пользователем Linux, однако я растерялся. Благо в тот момент в icq был мой бывший коллега, лучший системный администратор, которого я знаю, и просто очень хороший человек.
Он помог быстро проверить систему. В результате у меня сформировалось краткое HowTo о том, как быстро проверить свой сервер на предмет взлома. Уверен, что многим Храброчитателям оно будет полезно. Предполагается, что пользователь знаком с консолью Linux/Unix.

Итак, первым делом меняем рутовый пароль:

Далее сканируем хост на предмет подозрительных открытых портов. Сделать это можно, например, с другой юниксовой машины с помощью утилиты nmap:

В этом списке подозрительно выглядели 111 и 620 порты, поэтому далее смотрим, кто их слушает:

Тут оказалось всё в порядке, так как это были компоненты nfs. Далее проверяем UDP соединения:

Тут тоже всё оказалось в порядке. Попасть на сервер, скорее всего могли не через консоль, так как при логине на сервер Centos писал, что последний логин был с моего IP. Поэтому следующим пунктом нужно проверить фолдер /root/.ssh, туда могли положить ключ для ssh-клиента каким-либо образом.

Здесь оказался только файл с ключами, который я переименовал сразу после передачи хоста провайдером. Далее нужно проверить файл /etc/passwd. В нём не должно быть пользователей с uid=0, кроме root:

И тут тоже было всё окей. Финальным аккордом являлась проверка хоста на установленные руткиты. Для этого можно использовать бесплатную утилиту rkhunter. Скачиваем архив с последней версией, распаковываем его и запускаем инсталлер. Далее делаем его обновление и запускаем проверку:

Rkhunter в начале проверят важные системные файлы, затем ищет руткиты. После происходит проверка на различные vulnerabilities. В конце программа проверяет версии популярных продуктов, таких как Apache, OpenSSH и т.п. на предмет последних версий.

Результаты своей работы rkhunter выдает в консоль, а также формирует консолидированный лог /var/log/rkhunter.log. Можно запускать данный антируткит каждый день по крону и получать отчет о сканировании по электронной почте.

К счастью, rkhunter не обнаружил на моём сервере никаких зловредов, это позволило успокоиться и подумать, что же за странные инсталлы произошли на сервере. И тут я вспомнил, что сразу после получения сервера, я установил и сконфигурировал на этом сервере VPN сервер. Видимо, произошла какая-то ошибка в Logwatch и он добавил в отчёт данные двухлетней давности.

Разумеется, если злоумышленники всё сделают грамотно, то Logwatch никаких следов не обнаружит и хозяин сервера долго ни о чём не будет подозревать. Однако, шаги, описанные в данном HowTo, если проводить их регулярно, помогут уберечь ваши сервера от компроментации.

Сброс пароля root CetnOS 7 и CetnOS 6

Как сбросить пароль root в CetnOS 6

Пока весь мир производит установку Windows 10 1703, а затем лечит синий экран dpc watchdog violation, мы будем ломать пароль root-а в операционной системе CentOS 6, привожу шестую версию, потому, что в ней в отличии от седьмой версии все иначе делается. Перезагружаете вас сервер с CentOS 6 и ждете когда появится экран с обратным отчетом к загрузке, нажимаете любую клавишу, чтобы попасть в меню загрузки.

centos 6 сброс пароля root-1

В итоге вы попадете в GNU GRUB меню, у вас тут будут перечислены все ваши загрузки. Самым первым пунктом идет основное ядро загрузки, его и оставляете, затем вы нажимаете клавишу "e", для того чтобы попасть в меню редактирования с командной строкой.

centos 6 сброс пароля root-2

Далее вы должны выбрать пункт:

kernel /vmlinuz-2.6.32-431.17.1.el6.x86_64 ro root=/dev/mapper/VolGro

И так же нажимаете "e" для редактирования

centos 6 сброс пароля root-3

В открывшемся окне, вам нужно дописать в этой строке через пробел слово single или просто s

centos 6 сброс пароля root-4

В итоге должно получиться вот так и можно жать Enter.

centos сброс пароля root

После чего вы попадаете в меню загрузки, где на kernel /vmlinuz нужно нажать клавишу "b", для загрузки с отредактированным ядром.

centos сброс пароля root-2

В итоге вы загрузитесь в командную строку CentOS 6.

загрузка centos в режиме редактирования ядра

Теперь вводите команду passwd и два раза задаете новый пароль root.

меняем пароль root CentOS 6

Все теперь перезагружаете вашу операционную систему и радуетесь взломанному паролю в CentOS 6.

Как сбросить пароль root в CetnOS 7

В CentOS 7, процедура сброса пароля у любой учетной записи очень простая и похожая на шестую версию. И так при попытке зайти на сервер вы видите надпись "Login incorrect", перезагружаем сервер.

centos 7 сброс пароля root-1

Попадаем в меню выбора загрузчика GRUB, выбираем верхний и нажимаем клавишу "e" для попадания в режим редактирования.

centos 7 сброс пароля root-2

Находим строку linux16 /vlinux и в ней участок с "ro"

centos 7 сброс пароля root-3

ставим после "ro" пробел и пишем init=/sysroot/bin/sh, после чего нажимаем CTRL+X для запуска изменений.

centos 7 сброс пароля root-4

Вы загрузитесь в режиме командной строки.

Как сбросить пароль root в CetnOS 7-1

Чтобы получить права на систему, введите команду chroot /sysroot. После чего вы можете изменить пароль root, для этого введите passwd root и два раза новый пароль. После чего можно перезагрузиться и радоваться жизни.

Как сбросить пароль root в CetnOS 7-2

Как сбросить пароль root через установочный диск CentOS

То же простой способ, в нем вы изменим пароль пользователя root, через установочный диск CentOS 7 (либо загрузочную флешку). Загружаемся с носителя и выбираем режим Troubleshooting.

Как сбросить пароль root в CetnOS 7-3

Далее выбираем пункт Rescue a CentOS Linux System

Как сбросить пароль root в CetnOS 7-4

Дожидаемся загрузки и выбираем первый пункт Continue.

Как сбросить пароль root в CetnOS 7-5

Как сбросить пароль root в CetnOS 7-6

Как видите это ничем не сложнее, чем сбросить пароль администратора в Windows, так что вперед.

Не новость что Linux является очень гибкой и настраиваемой системой. Благодаря этому он получает все большее распространение в сети. Но как и все остальные операционные системы, качество настройки и уровень безопасности системы зависит от квалификации администратора который занимается ее настройкой. Поэтому не редкость наличие различных дыр в системах безопасности. Как правило это простые дыры которые не дают полного доступа к системе. Но приложив усилия мы можем повысить привилегии и взломать Linux и получить ROOT!

Major Sudo flaw in Linux lets hackers run commands as Root | TechGig

В общем случае эскалация привилегий — это получение прав в системе выше, чем у тебя уже есть. Но чаще всего имеется в виду получение доступа к учетной записи root в Linux или system/administrator в Windows.

Почему становится возможным повысить права в системе, казалось бы призванной предотвращать подобное? Причин много. Вот, как мне кажется, основные:

  • уязвимости в приложениях/скриптах;
  • неверная конфигурация ОС и приложений;
  • забытые критически важные данные (пароли, логины, бэкапы и прочее);
  • уязвимости в ядре ОС.

Ну а основная причина всегда одна и та же — людские ошибки. В идеальной вселенной, скорее всего, повысить привилегии не удалось бы. Но человеческий фактор делает это возможным, поэтому наслаждаемся.

С чего начать?

Прежде чем что-то делать, нужно понять, с чем мы будем иметь дело. Конечно, кое-что мы узнаем о системе, изучив ее на этапе проникновения, но теперь нужно подробнее выяснить, что именно нам может помочь подняться до root.

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

Или о процессоре:

Можно, конечно, и дальше собирать информацию с помощью терминала, но это долго. Гораздо проще и эффективнее использовать специальные тулзы. Самые распространенные из них:

Все они работают примерно по одному принципу: последовательно запускают команды bash или короткие скрипты, а вывод отправляют в stdout или лог-файл в зависимости от параметров.

Так примерно выглядит вывод подобной тулзы.

LinEnum

LinEnum

Куда смотреть?

Давай теперь разберем несколько примеров уязвимостей и посмотрим, как можно их эксплуатировать.

Всякое забытое

Первое, что стоит проверить, — это забытые критические данные. Ничего не стоит заглянуть в домашние папки юзеров и посмотреть, не хранит ли кто-то на рабочем столе файл с паролем или ключами от чего-нибудь нужного. Это случается редко, но все же случается. Иногда учетные данные хардкодят в скриптах и конфигах. Стоит также проверить историю шелла, там тоже могут найтись длинные команды, содержащие учетные данные. А иногда бывает, что пользователь набрал пароль, когда консоль его не запрашивала, и он тоже сохранится в истории.

SUID/GUID

Флаги setuid и setgid позволяют пользователю запускать программы от имени владельца. Например, когда надо запускать программу от рута, а пользователь рутом не является. Чаще всего встречается SUID. Устанавливается этот бит легко:

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

В первую очередь нас интересуют файлы, владелец которых — root. Найти их можно руками, такой командой:

Как вариант — можно поискать в выводе тулз, которые я перечислил выше. Так или иначе, если найдешь файлы с подобными разрешениями, значит, у тебя есть шанс подняться до максимальных привилегий.

Вот вывод таких файлов из LinEnum.sh .


Из интересных файлов — find . LinEnum даже услужливо его подсветил отдельно.


Это позволит довольно легко получить привилегии.


Linux capabilities

Так как предыдущий способ дает избыточные права файлам, в 1997 году была придумана идея дополнительных разрешений — linux capabilities. Если коротко, то идея состоит в том, чтобы давать не полные привилегии, а только часть, необходимую для выполнения задачи.

Как это используется? Для начала найдем подобные файлы в системе.

А вот результат.


Классический пример иллюстрации — это исполняемый файл tar с разрешением cap_dac_read_search+ep , которое позволяет ему читать любой файл в системе. Это означает, например, возможность получить архив с файлом /etc/shadow , который от лица обычного пользователя недоступен на чтение. Доступ к этому файлу даст нам хеши паролей, в том числе от root, который мы можем попробовать сбрутить.

Еще встречается пустое разрешение =ep . Когда выставлено такое разрешение (есть знак «равно» в начале, и не перечислен список разрешений), это значит, что файлу предоставлены все возможные разрешения. В примере такие разрешения есть у файла openssl .

Этот пример позволит нам прочитать файл /etc/shadow .



И прочитаем файл.


Далее мы можем просто сгенерить новый shadow и перезаписать им системный. Создадим новый хеш, заменим им хеш (в примере — восклицательный знак) и подготовим файл для заливки.



Копируем его в /etc/shadow и логинимся.


Cron — это служба Unix, которая используется для периодического выполнения скриптов. Действия описываются в файле /etc/crontab и в специальных каталогах (например, /etc/cron.daily ).


Скрипты используются для самого широкого спектра задач — от создания бэкапа по расписанию до очистки директории /tmp .

Если у таких скриптов неаккуратно выставлены привилегии, то это может стать находкой для атакующего. Когда администратор ставит привилегии как попало, «просто чтобы работало», он вполне может написать chmod 777 , что позволит нам отредактировать вызываемый по расписанию скрипт. Поскольку cron запускает файлы от имени root, ничто не мешает вызывать рутовый шелл заодно со скриптом.

Программа sudo позволяет выполнять команды от имени суперпользователя (либо других пользователей системы). Ее конфиг находится в /etc/sudoers , и, как правило, ошибки в этом конфиге открывают возможности эскалации привилегий. Сценариев использования — множество, можно выбирать по ситуации. Один из таких вариантов ниже.

Проверяем, какие есть разрешения у sudo .


Здесь редактор vi можно открыть без пароля, и он запустится от имени root. В этом случае проще всего выполнить шелл через редактор, который тоже запустится от рута.


Иногда админы дают разрешение на запуск обычных скриптов sh, и те остаются доступными для записи. Их, конечно же, можно использовать для получения шелла и любых других действий.

Еще один способ абьюзить sudo — возможность внедряться в процесс с действующим токеном.

Эксплоиты для ядра

Как и в любой другой программе, в ядре Linux тоже есть уязвимости. Иногда эти уязвимости позволяют подняться до рута. Как и в остальных способах, здесь не существует универсального рецепта и успешная эксплуатация зависит от многих факторов: версии ядра, наличия необходимых разрешений или файлов и даже наличия нужного железа (например, уязвимого перед Meltdown процессора).

На скриншоте ниже — поиск эксплоитов для ядра Linux в Kali.


При многообразии вариантов эксплуатации не все они окажутся рабочими. Может не быть эксплоита под конкретное ядро, либо версия ядра правильная, но оно уже пропатчено. Некоторые эксплоиты работают нестабильно. И так далее.

Наверняка многие помнят уязвимость в ядре, известную как Dirty COW. Баг позволяет спровоцировать состояние гонки, а это приводит к тому, что пользователь без привилегий получает доступ на запись к memory mappings (хотя доступ должен быть только на чтение) и может повысить свои привилегии.

Существует несколько эксплоитов для этой уязвимости.


На конкретной системе будут работать не все из них, так что всегда есть смысл перебирать разные варианты.

Другие примеры уязвимостей для повышения привилегий:

Заключение

Способов стать рутом в Linux — множество, и я здесь прошелся только по самым очевидным и распространенным. Тем, что встречаются и в реальной жизни, и на CTF, и на экзаменах.

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

На сайте GTFOBins есть отличная подборка способов использовать разные популярные утилиты для повышения привилегий. Но помни: этот список на самом деле значительно больше, просто нам еще пока не все известно!

Надеюсь, Вам понравилось взламывать. Мы смогли получить рут-права на атакуемой машине, основываясь только на использование сканера nmap. В этом уроке мы будем разбирать информацию, которая была получена сканером Nessus, чтобы также получить рут-права. Рассмотрим самую первую уязвимость, которая была обнаружена сканером Nessus:

уязвимость, обнаруженная сканером nessus

Нас будет интересовать текущая уязвимость, которая называется: «Уязвимость генератора случайных чисел OpenSSH/OpenSSL». Также Nessus обозначает нам, какой протокол и порт подвержен данной уязвимости, а также ip-адрес, и дополнительную справочную информацию:

Уязвимость генератора случайных чисел OpenSSH/OpenSSL

Давайте погуглим информацию об этой уязвимости:

И первая ссылка в поиске ведет нас на ресурс GitHub:

GitHub

Как видим, существует несколько эксплойтов на разных языках программирования. Выберем эксплойт, который написан на Python, но можно выбрать любой из них. Я выбрал данный эксплойт, не потому что он написан на питоне, а потому, что автор добавил подробную инструкцию по его установке, что сильно упрощает работу:

www.exploit-db.com

Видим, что для запуска эксплойта нужны три шага. Сначала нужно скачать архив, с помощью команды «wget». Для этого нужно проскроллить страницу в самый верх и найти вкладку Download. Далее нажать правой кнопкой мыши и выбрать «Copy Link Location»:

copy link location

Переходим в терминал и вводим команду «wget адрес ссылки на эксплойт»:

Загрузка прошла успешно. Далее нужно запустить наш скрипт:

запуск скрипта python 5720

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

скачивание одного из двух файлов

Выбираю второй файл. Перед тем, как скачивать что-либо, я хочу немного рассказать об этой уязвимости, и как она работает. Вы уже видели, как настроить ssh-сервер. Также мы знакомились с подменой дефолтных ключей шифрования на новые, чтобы Вы могли на нем авторизироваться.

Если не углубляться в шифрование, и особенности его работы, можно рассматривать этот ключ как пароль, который позволяет пройти авторизацию. Это не совсем так, но Вы можете рассматривать его именно в этом ключе для упрощения. В более старых версиях Debian был проблемы с генерированием подобных ключей. Помните, когда мы настраивали ssh, то устанавливали новые ключи. Дело в том, что при установке нового образа системы, у нас по-дефолту стоят стандартные ключи, которые легко подробрать. В данной версии Debian, при создании ключей есть баг, который ограничивает максимально возможное количество сгенерированных ключей, т.е. вместо огромного количества ключей этот баг ограничивал количество созданных ключей, а это значит, что кто-то мог написать скрипт и подобрать комбинацию Ваших ключей.

Сейчас мы используем именно этот эксплойт. Файл, который я собираюсь скачать, содержит диапазон всех возможных ключей, и один из них точно подойдет, и мы сможем пройти ssh авторизацию.

Чтобы скачать этот файл, достаточно перейти по ссылке на второй файл, и затем перейти на кнопку Download, правой кнопкой мыши скопировав адрес ссылки:

скачивание файла по ссылке

Переходим в терминал и также скачиваем файл с помощью команды «wget»:

скачивание файла с помощью wget

Обратите внимание, что это tar.bz2, который ранее мы уже рассматривали.

Представим ситуацию, что мы не знаем, что такое tar и bz2. Для начала выполним команду «file»:

commands file

bzip2 --help

Как видим опция –d распаковывает этот файл. Запишем команду: «bzip2 –d ebian_ssh_rsa_2048_x86.tar.bz2»:

bzip2 –d ebian_ssh_rsa_2048_x86.tar.bz2

Выводим содержимое директории Metasploitable2, и теперь у меня есть файл с расширением .tar:

файл с расширением .tar

Мы уже рассматривали то, как извлечь информацию из tar файла, но, допустим, мы не знаем, как это делать.

Мы можем указать команду «file» перед файлом:

команда file перед файлом

И мы видим, что это архив tar.

Далее нам нужно выполнить команду: «tar xvf debian_ssh_rsa_2048_x86.tar»:

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

У нас появилась новая директория «rsa/». Можно проверить ее содержимое:

новая директория rsa/

Нам нужно запустить наш эксплойт. Сначала нужно прописать исполнение самого эксплойта, затем путь до ключей, после этого указать ip-адрес нашей цели, и указать номер порта. Команда будет выглядеть как: «python 5720 rsa/2048 192.168.119.130 root 22 10»:

python 5720 rsa/2048 192.168.119.130 root 22 10

Обратите внимание на номер порта, который я указал, а именно 22. Имейте ввиду, что разные сервера ftp могут быть запущены на разных портах. В большинстве случаев это будет именно так, и если, на атакуемой машине есть другой ssh-сервер, который использует другой порт, то нужно указывать его.

Итак, подбор ключей завершился успешно, и автор эксплойта добавил фичу в свой скрипт, а именно, можно выполнять готовую команду для взлома сервера по ssh:

успешное завершение подбора ключей

Нужно скопировать команду: «ssh -lroot -p22 -i rsa/2048/57c3115d77c56390332dc5c49978627a-5429 192.168.119.130», и вставить ее в терминале:

ssh -lroot -p22 -i rsa/2048/57c3115d77c56390332dc5c49978627a-5429 192.168.119.130

Отлично, я авторизирован как рут-пользователь. Мы нашли еще один способ, как попасть в систему. Для того, чтобы завершить соединение, нужно просто выполнить команду «exit»:

завершение соединения

Я хочу скопировать эти ключи, и сохранить в отдельную директорию, потому что помимо подходящих ключей, есть тысячи других, которые мне не нужны. Как мне найти ключи среди тысячи остальных? Все просто, нам нужно воспользоваться техниками, которые мы уже изучили. Нужно скопировать первые несколько символов ключа «57c3115», и создать директорию «keys», в которой и будут располагаться данные ключи:

mkdir keys/

Для поиска нужных ключей в исходном файле нужно выполнить команду: «ls rsa/2048/ | grep 57c3115»:

ls rsa/2048/ | grep 57c3115

Вывод ключей прошел успешно, и мы получили то, что хотели. Теперь мне нужно скопировать выведенные ключи в директорию «keys». Команда будет выглядеть как: «cp rsa/2048/ 57c3115d77c56390332dc5c49978627a-5429* keys/»:

cp rsa/2048/ 57c3115d77c56390332dc5c49978627a-5429* keys/

Проверим вывод ключей, с помощью команды: «ls keys/»:

ls keys/

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

Читайте также: