Linux PAM&&PAM后门

Linux PAM&&PAM后门

我是壮丁 · 2014/03/24 11:08

0x00 PAM简介



PAM (Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。

0x01 PAM工作流程



0x02 PAM配置文件语法


module-type
control-flagmodule_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 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁。 
[[email protected] pam.d]# cat sshd
#%PAM-1.0
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

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 修改源代码


1

2

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 编译源代码

解决依赖性


1

2

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 优化一下下


1

vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c


1

vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/support.c

登录测试后的日志

一致了,o(∩_∩)o

0x05g 还有一种猥琐的方法,直接修改/etc/pam.d/sshd文件,输入什么都能登录的

正常日志

PS:为什么能登录,好好看前面的基础部分就知道了

时间: 2025-01-02 03:11:47

Linux PAM&&PAM后门的相关文章

Linux中pam认证详解(下)

Linux中pam认证详解(下) 在上一篇中详细的介绍了pam的介绍.pam认证原理.pam认证构成以及pam验证控制类型,下面向大家详细介绍一下常用的pam服务模块,以及pam认证的应用. 一.常用的pam服务模块 下面是Linux提供的PAM模块列表(只是其中一部分),这其中包含模块文件.模块功能描述和相关配置文件,具体如下: pam_access 提供logdaemon风格登录控制 /etc/security/access.conf pam_chroot 提供类似chroot命令的功能 p

linux中pam模块

一.pam简介 Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式. 换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制. 这种方式下,就算升级本地认证机制,也不用修改程序. PAM使用配置/etc/pam.d/下的文件,来管理对程序的认证方式.应用程序 调用相应的配置文件,从而调用本地的认证模块.模块放置在/lib/security下,以加载动态库的形式进,像我们使用su命令时,系统会提示你输入root

Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]

问题描述: 我的 Arch Linux 已经用了快半年多,由于 Arch Linux 的滚挂问题,我从没有直接升级过系统.软件版本以及库自然落后了一些. 就在我准备需要用到 NFS 时,挂载网络文件系统时由于 librpc 太旧而失败了.所以看来我得更新 librpc 了.用 yaourt -Ss 查看了一下源上的版本. 最新的 NFS 需要 libtirpc.so.3 而我的却是 libtirpc.so.1 .最后安装了 libtirpc-1.0.1-2 后.悲剧发生了.任何用到 sudo ,

Linux下pam密码复杂度限制

linux系统是如何实现对用户的密码的复杂度的检查的呢?系统对密码的控制是有两部分组成:1 cracklib2 /etc/login.defs pam_cracklib.so 才是控制密码复杂度的关键文件/lib/security/pam_cracklib.soredhat公司专门开发了cracklib这个安装包来判断密码的复杂度 # rpm -qa | grep cracklibcracklib-2.8.9-3.1 \\检查软件是否安装cracklib-dicts-2.8.9-3.1 \\密码

Linux下PAM模块学习总结

在Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合一定的要求之后才允许执行,例如login, su等.在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性. 一.PAM模块介绍 Linux-PAM(即linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式.换句话说,不用

linux系统pam配置

摘自:https://blog.csdn.net/jhcsdb/article/details/15780433 PAM--- Pluggable Authentication ModuleLinux下可扩展的鉴权模块,用户进程服务某服务进程,服务进程先把请求送到PAM模块进行鉴权,PAM根据服务名从/etc/pam.d/目录选择一个服务文件,根据服务文件的配置内容进行鉴权. 通过ldd命令查看服务名,确定服务是否使用pam功能(pam服务对应libpam*.so库文件):ldd /usr/sb

Linux下各种后门和日志工具详解

攻入Linux系统后,很多入侵者往往就开始得意忘形了.这其中还有一个原因,就是技术性也要求更高了.下面,我们来看看一些常用的经典工具. 1.从这里延伸:后门和连接工具 (1)Httptunnel Tunnel的意思是隧道,通常HTTPTunnel被称之为HTTP暗道,它的原理就是将数据伪装成HTTP的数据形式来穿过防火墙,实际上,它是在HTTP请求中创建了一个双向的虚拟数据连接来穿透防火墙.说得简单点,就是说在防火墙两边都设立一个转换程序,将原来需要发送或接受的数据包封装成HTTP请求的格式骗过

Linux服务器安全策略配置-PAM身份验证模块(二)

○ 本文导航 关于PAM PAM身份验证配置文件 PAM配置文件语法格式 PAM模块接口 PAM控制标志 PAM配置方法 PAM身份验证安全配置实例 - 强制使用强密码(用户密码安全配置) - 用户SSH登录失败尝试次数超出限制后锁定账户(帐户锁定/解锁和时间设置) - 允许普通用户使用sudo而不是su(限制普通用户登录到root用户) - 禁止直接使用root用户通过SSH登录 pwgen复杂密码随机生成工具 关于PAM Linux-PAM (Pluggable Authentication

基于Pam的Google双重验证实现

1.下载Google Authenticator源码 wget https://github.com/google/google-authenticator/tree/master/libpam 打开https://github.com/google/google-authenticator/blob/master/libpam/pam_google_authenticator.c,查找到pam_get_item(pamh, PAM_AUTHTOK, &password),修改PAM_AUTHT