=Start=
缘由:
之前对Linux系统的PAM机制和它的作用没有一个比较直观的认识,只是知道有这么个东西起到认证管理的作用,直到后来在「如何监控Linux系统的用户登录情况」一文中了解到PAM机制可以起到的作用,然后就到处去找资料学习、了解PAM机制。
找了一堆资料后发现,除了官方文档之外,中文的就属之前WooYun知识库中的「Linux PAM&&PAM后门」这篇文章写得最为全面和细致了的(此外InfoQ上也有几篇讲PAM内容的文章也很好,详情见最后的参考链接),其它的一般就是针对某个PAM模块的讲解,可以在需要的时候自行参考、学习。
正文:
0x00 PAM简介
PAM (Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。
0x01 PAM工作流程
&
0x02 PAM配置文件语法
module-type control-flag module_path optional
在/etc/pam.d/
下的文件中,与服务名称相对应的文件,为该服务的pam验证文件,例如服务为sshd,则在/etc/pam.d
下存在sshd这个文件,里面包含sshd验证规则。其中有个一特殊的文件为other,如果有的服务与之没有向对应的文件,则对应other。
module-type
服务类型,即 auth、account、session 或 password。
验证模块(auth)用于验证用户或设置/销毁凭证。 帐户管理模块(account)将执行与访问、帐户及凭证有效期、密码限制/规则等有关的操作。 会话管理模块(session)用于初始化和终止会话。 密码管理模块(passwd)将执行与密码更改/更新有关的操作。
control-flag
用于指明在确定服务的集成成败过程中模块所起的作用。有效的控制标志包括 include、optional、required、requisite 和 sufficient。
required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。 requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必要条件。 sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。 optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。
module-path
用于实现服务的库对象的路径,一般都只写库名,库的路径一般为/lib/security(32位),/lib64/security(64位)
module-options
传递给服务模块的选项,可选。
几个公用的参数:
debug 该模块应当用syslog()将调试信息写入到系统日志文件中。 no_warn 表明该模块不应把警告信息发送给应用程序。 use_first_pass 表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。 try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。 use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。 expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁。
0x03 PAM 堆栈工作原理
图1:PAM形成堆栈的过程(solaris,有的linux不包含)
图2:PAM如何确定最终的返回值(solaris)
0x04 常用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。
0x05 PAM后门
测试环境CentOS 6.2 64位
0x05a 查询本机的PAM版本
rpm –aq | grep pam
下载对应的版本
下载地址:
http://www.linux-pam.org/library/ https://fedorahosted.org/releases/l/i/linux-pam/
0x05b 修改源代码
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c 在PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,int argc, const char **argv)中定义FILE *fp;
PS:网上的那种后门补丁也就是修改这些
0x05c 编译源代码
解决依赖性
yum install gcc make flex –y configure&&make
编译出来的pam_unix.so在
/mnt/Linux-PAM-1.1.1/modules/pam_unix/.libs
对/lib64/security中的文件进行替换(32位系统放入/lib/security)
0x05d 登录测试
0x05e 使用touch –r来更改时间
PS:但是两个文件的大小是不同的
对于这种修改的方法,在/var/log/secure中和正常登录的是有差距
0x05f 优化一下下
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/support.c
登录测试后的日志
一致了,o(∩_∩)o
0x05g 还有一种猥琐的方法,直接修改/etc/pam.d/sshd文件,输入什么都能登录的
正常日志
PS:为什么能登录,好好看前面的基础部分就知道了
参考链接:
- http://www.linux-pam.org/Linux-PAM-html/sag-overview.html
- https://zhuanlan.zhihu.com/p/19710725
- http://drops.wooyun.org/tips/1288
- http://anquan.us/static/drops/tips-1288.html
- https://wiki.archlinux.org/index.php/PAM_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
- https://linux.die.net/man/8/pam
- http://www.infoq.com/cn/articles/wjl-linux-pluggable-authentication-module
=END=
《 “Linux的PAM相关知识学习” 》 有 18 条评论
利用PAM中的部分模块做的一些安全设置
http://www.cyberciti.biz/tips/how-to-linux-prevent-the-reuse-of-old-passwords.html
http://www.cyberciti.biz/tips/linux-pam-configuration-that-allows-or-deny-login-via-the-sshd-server.html
http://www.cyberciti.biz/tips/lock-unlock-set-number-of-login-attempts.html
http://www.cyberciti.biz/tips/rhel-centos-fedora-linux-log-failed-login.html
http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html
http://linux.die.net/man/8/pam_exec
https://linux.die.net/man/8/pam_cracklib
https://linux.die.net/man/8/pam_faillock
PAM的原理与应用
http://blog.csdn.net/shenlan211314/article/details/6569592
了解和配置 PAM
https://www.ibm.com/developerworks/cn/linux/l-pam/
Linux可插拔认证模块的基本概念与架构
http://www.infoq.com/cn/articles/wjl-linux-pluggable-authentication-module
Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
http://www.infoq.com/cn/articles/linux-pam-one
Linux-PAM系统管理指南
http://zqdevres.qiniucdn.com/data/20090317165633/index.html
linux – PAM介绍及双因子认证
http://xiaodong.space/2016/06/20/linux-pam-intro/
一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh登录
(3)图形界面登录
这三种情况,都有自己的方式对用户进行认证。
(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
(2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。
Linux 的启动流程
http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html
一条命令引发的思考
https://xianzhi.aliyun.com/forum/mobile/read/790.html
改造Nginx,让邮件系统也支持双因子验证
http://www.freebuf.com/articles/network/135640.html
https://github.com/idapro123/mail_protector
如何为 Linux 系统中的 SSH 添加双重认证
https://linux.cn/article-3725-1.html
http://xmodulo.com/2014/07/two-factor-authentication-ssh-login-linux.html
利用系统特性伪装成一个免密登陆后门
http://www.freebuf.com/articles/system/138753.html
`
# ln -sf /usr/sbin/sshd /tmp/su;nohup /tmp/su -oPort=2022 &
上面的后门运行的进程名是su,当用户登录的时候,会去/etc/pam.d/下寻找su文件(其实这里不一定要是su文件,只要/etc/pam.d 目录下存在和后门的进程名同名的文件,则系统在认证的时候就会去读取这个文件内容进行认证),内容参考如下:
#
# The PAM configuration file for the Shadow ‘su’ service
#
# This allows root to su without passwords (normal operation)
auth sufficient pam_rootok.so
sufficient 表示只要这行满足,直接返回登录成功
pam_rootok.so这个模块是检查你的UID是否为0,然后return pam的结果(0就ok,其他就不OK)。所以只要后门进程是以uid为0的用户运行,那么什么用户都可以免密登陆。
`
渗透基础-SSH后门分析总结
https://www.secpulse.com/archives/69093.html
Linux的PAM是什么
https://mp.weixin.qq.com/s/vqGghZ1V9SSn5phZGe_PFg
`
PAM是什么
为什么使用PAM
PAM是如何工作的
如何自己开发PAM模块
配置PAM
在程序中使用PAM进行验证
基于PAM认证体系,我们可以根据自己的需求任意的扩展linux账户,linux下的pbis-open,就是基于PAM扩展出来的一个AD域登录模块,它提供了一个pam_lsass.so的文件,来进行账户的验证。我们也可以自己设计一套认证流程,只需要满足上面的接口要求就可以。
提供机制,而非策略
`
Pam-Python实现SSH的短信双因素认证
http://www.freebuf.com/articles/web/165139.html
Linux下PAM模块学习总结
http://www.cnblogs.com/kevingrace/p/8671964.html
`
一、PAM模块介绍
二、PAM的配置文件说明
三、PAM模块的工作原理和流程
四、常用的PAM模块介绍
五、PAM模式使用说明
总结几个PAM模块比较常见的实操案例:
1)怎样才能强迫用户设置的密码不能与过去3次内的密码重复?(特别注意:/etc/pam.d/system-auth下的配置针对的是普通用户,在root用户下是无效的)
2)如何要求用户设置的密码必须至少包含5个数字和3个特殊符号?
3)如何限制kevin用户最多同时登陆4个?(同时可以限制root用户)
4)某用户连续登陆失败2次就锁定该账号,禁止登陆?(默认只能尝试登录三次,由retry=N决定的)
5)如何限制root只能从kevin.com这台计算机使用ssh远程登陆?
`
开源SSH双因素登陆认证系统JXOTP了解一下
http://www.freebuf.com/sectool/178161.html
https://github.com/jx-sec/jxotp
`
这就是个新的轮子,技术上没有大的创新,只是更好用一些。SSH双因素认证的开源方案有挺多的,但是实践应用中发现有三个问题,让推广的情况不是很好。
以google otp为例:
1、需要安装APP
2、需要修改客户端ssh的登陆方式
3、无法集中管理
第三点先不谈,因为跟用户没啥关系。前面两点对于运维人员还好说,但是对于其他的人来说就不是那么友好,特别是第二个步骤引起的问题就比较多,比如不同软件不同的配置方式等。
所以优化的思路就是尽量透明化,越方便越好。
`
修改 PHP 扩展作为持久后门
https://x-c3ll.github.io/posts/PHP-extension-backdoor/
Linux下使用pam_python实现SSH的双因子认证登录
http://www.ipcpu.com/2016/04/linux-pam-python/
2-factor authentication & writing PAM modules for Ubuntu
http://ben.akrin.com/?p=1068
http://ben.akrin.com/2FA/2ndfactor.c
pam_python
http://pam-python.sourceforge.net/doc/html/
https://linux.die.net/man/3/pam_sm_authenticate
Pam-Python实现SSH的短信双因素认证
http://www.freebuf.com/articles/web/165139.html
Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
http://www.infoq.com/cn/articles/linux-pam-one
PAM 的应用开发和内部实现源码分析
https://blog.csdn.net/chenyulancn/article/details/8023431
Linux系统安全之pam后门安装使用详解
https://blog.csdn.net/androidstar_cn/article/details/52987308
http://www.androidstar.cn/linux%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E4%B9%8Bpam%E5%90%8E%E9%97%A8%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/
Python 实现SSH 双因子认证
https://www.secpulse.com/archives/4606.html
使用两步验证(2FA)保护你的SSH连接
https://paper.tuisec.win/detail/4d7a6cd3bebc96f
https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-16-04
https://xz.aliyun.com/t/5249
OpenSSH/Logging and Troubleshooting
https://en.wikibooks.org/wiki/OpenSSH/Logging_and_Troubleshooting
sshd(8) – Linux man page
https://linux.die.net/man/8/sshd
sshd — OpenSSH daemon
http://man.openbsd.org/sshd.8
`
-E log_file #Append debug logs to log_file instead of the system log.
-e #Write debug logs to standard error instead of the system log.
`
pamspy – Credentials Dumper for Linux using eBPF
https://hakin9.org/pamspy-credentials-dumper-for-linux-using-ebpf/
https://github.com/citronneur/pamspy
`
简而言之就是借助 eBPF 来hook住 pam_get_authtok 这个函数实现获取用户凭证的功能。
# How does It works?
pamspy will load a userland return probe eBPF program to hook the pam_get_authtok function from libpam.so. PAM stands for “Pluggable Authentication Modules”, and have a flexible design to manage a different kind of authentication on Linux.
Each time an authentication process tries to check a new user, It will call pam_get_authtok, and will be here to dump the content of the critical secrets!
# Function
pamspy leverage eBPF technologies to achieve an equivalent work of 3snake.
It will track a particular userland function inside the PAM (Pluggable Authentication Modules) library, used by many critical applications to handle authentication like:
* sudo
* sshd
* passwd
* gnome
* x11
* and many other …
`