Способов закрепиться на взломанной машине масса. От самых банальных и легко обнаруживаемых (добавить себя в базу пользователей) до сложных модулей ядра, реализующих обратный шелл на удаленную машину. Но есть среди них очень простой в реализации и достаточно скрытный метод, о котором знают на удивление мало людей. Это модификация модулей системы аутентификации PAM, которую используют все современные UNIX-системы.

WARNING

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

Что такое PAM

Подключаемые модули аутентификации (Pluggable Authentication Modules, PAM) — это набор API, необходимых для реализации механизмов аутентификации в различных приложениях.

До появления PAM, чтобы реализовать аутентификацию, скажем, с помощью ключ-карты, разработчикам приходилось вносить код поддержки этих самых ключ-карт в каждый компонент системы, ответственный за аутентификацию пользователя. То есть дописывать и пересобирать приходилось утилиту login, sshd, а также любой другой софт, в который планировалось добавить подобную функциональность.

С появлением PAM ситуация намного упростилась. Теперь, чтобы добавить в систему свой неповторимый самописный протокол аутентификации, достаточно реализовать его в рамках одного-единственного модуля PAM. А все утилиты и приложения, умеющие работать с PAM, подхватят его и смогут использовать для аутентификации пользователя.

На практике это выглядит примерно так: утилита login обращается к PAM, который выполняет все необходимые проверки с помощью указанных в конфигурационном файле модулей и возвращает результат обратно утилите login. Удобно, не правда ли? Однако такой подход содержит в себе возможности, которые мы можем использовать для закрепления в системе.

Стоит сделать небольшую оговорку. Существует три основные реализации PAM:

  • Linux-PAM — основная реализация PAM в любой Linux-системе;
  • OpenPAM — используется в BSD-системах и macOS;
  • JPam — реализация PAM для Java-приложений.

Заострять внимание на какой-то конкретной реализации мы не будем. Основная функциональность везде одинакова.

 

Аспекты закрепления в *nix с использованием PAM

Настройки PAM для каждого приложения ты можешь найти в каталоге /etc/pam.d (Linux) либо в файле /etc/pam.conf. Пример конфигурационного файла для утилиты login в macOS:

auth           optional           pam_krb5.so use_kcminit
auth           optional           pam_ntlm.so try_first_pass
auth           optional           pam_mount.so try_first_pass
auth           required           pam_opendirectory.so try_first_pass
account        required           pam_nologin.so
account        required           pam_opendirectory.so
password       required           pam_opendirectory.so
session        required           pam_launchd.so
session        required           pam_uwtmp.so
session        optional           pam_mount.so

Давай разберемся, какая магия тут происходит.

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

Слева направо: тип модуля, control_flag, имя модуля. Для нас в первую очередь представляет интерес тип модуля auth, именно эти модули ответственны за аутентификацию. Control_flag — это свойство модуля. Оно может принимать значения:

  • requisite (необходимый) — если модуль возвращает положительный ответ, выполняется оставшаяся часть цепочки и запрос удовлетворяется. Если модуль возвращает отрицательный ответ, то запрос немедленно отвергается и любые другие проверки не выполняются;
  • required (требуемый) — точно так же, как и requisite: если ответ положительный, выполняется оставшаяся часть цепочки проверок. С той лишь разницей, что в случае отрицательного ответа цепочка проверок продолжает выполняться, однако запрос отвергается;
  • sufficient (достаточный) — удовлетворяет запрос в том случае, если ни одна из других ранее проведенных по цепочке проверок не отработала отрицательно. В случае если модуль сработал отрицательно, результат игнорируется и цепочка проверок отрабатывается дальше;
  • optional (необязательный) — модуль отрабатывается, однако результат игнорируется.

Уже на этом этапе ты наверняка смекнул, что, внеся небольшие изменения в файл конфигурации, мы можем обеспечить себе успешный вход в систему с любым паролем (достаточно пометить все auth-модули как optional). Но это решение будет работать до тех пор, пока легитимный пользователь или администратор не заметит того, что успешно логинится в систему даже с неверным паролем.

 

Пишем собственный модуль-бэкдор

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

Итак, код (не забудь заменить magic-password на свой «волшебный» пароль):

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


6 комментариев

  1. e6a3dec

    31.01.2017 at 19:25

    А как быть если OpenSSH собран без ключа —with-pam ?

  2. AAPKS

    02.02.2017 at 17:29

    Статья для первоклассников. Если пользователь имеет root-права, то ему уже не надо собирать никакие программы. По правилам, для серьёзных серверов, смотрящих в интернет, никаких компиляторов быть не должно. Сборка модулей на стороне сильно зависит от библиотек на сервере предполагаемой жертвы.

  3. Mr-r00t

    25.02.2017 at 19:17

    Если у тебя уже есть root, то есть более изощренные способы. Против меня такое-бы не прокатило 😉

    • droidlove

      03.12.2017 at 21:02

      Расскажи пожалуйста как защищаешь свои машины? Не сарказм, правда интересно.

  4. alexgk92

    13.06.2017 at 23:06

    Интересно, системы по разному реагируют на замену pam_unix.so? Или в чём проблема? Например в 14 убунте система перестала загружаться, а в 8 дебиане теперь любой пароль подходит)). Это я протестил логирование паролей…

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

Check Also

Кавычкой по «Джумле». Учимся проводить SQL-инъекцию второго порядка на примере уязвимости в Joomla

Joomla — вторая по популярности система управления сайтами после WordPress. Уязвимость, о …