zoukankan      html  css  js  c++  java
  • Linux的一个后门引发对PAM的探究

    转自http://www.91ri.org/16803.html

    1.1   起因

    今天在搜索关于Linux下的后门姿势时,发现一条命令如下:
    软链接后门:

    经典后门。直接对sshd建立软连接,之后用任意密码登录即可。
    ssh root@x.x.x.x -p 5555这个是大家也经常会用到的命令,但是在好奇心的驱使下,为什么任意密码就可以了?
    于是搜索了相关的资料,发现都是执行了这条命令就可以免密码登录了,但是为什么却没有一篇详细的解答。
    1.2   调查

    首先测试一下这个命令:

    自动草稿

    在A的机器上执行了如下命令:

    在B机器SSH登录A机器,输入任意密码,成功登录。
    先理解这条命令主要在做什么:
    首先,做一个软链接,结果在/tmp/su  参数的意义: -o option  -p port
    这样就开启了一个端口为5555的服务:
    自动草稿
    测试过程中发现,只允许命名为su,命名其他尝试登录都不成功(/tmp/xxx)。
    自动草稿
    于是看了一下sshd相关的log,发现如下:
    自动草稿
    发现是基于pam认证的,使用了pam中的su,为了区分是否和/bin/中的su是否相关,做了测试如下:

    自动草稿
    把/bin/su 重新命名为其他文件,发现依然能够任意密码登录,又做了测试如下:

    自动草稿

    在此执行:

    自动草稿

    成功登录,根据日志和实践现在确认调用的是/etc/pam.d/su

    1.3   疑问

    现在确认了是pam中的su导致的,为什么就不需要密码就可以登录?
    简单的diff了一下pam中的sshd和su的区别:
    自动草稿
    这里需要了解一下PAM中的控制标记:
    自动草稿
    sshd的pam认证使用了required和include,su使用了sufficient,在此就可以看出二者的区别了。
    我们发现su的认证使用了pam_rootok.so,他是如何验证的,为什么导致我们输入任何密码就通过。
    于是查了下pam_rootok.so的相关信息:
    自动草稿

    他的认证模块是认证你的UID是否为0,他会return pam的结果。
    再去看一下pam_rootok.so的源码,发现:
    自动草稿

    他先会调用getuid(),如果get的uid为0,他会检查selinux的root是否为0或是否启用selinux下为0,返回认证成功,否则认证失败。
    那么getuid()是从哪里来的,查一下官网:
    自动草稿
    是根据进程来取得的,根据pam_rootok的文档,我们也可以对su进行调试:
    自动草稿
    pam_rootok.so返回成功,依次向下执行so,都会成功,建立会话。
    查看log:
    自动草稿

    第一条:

    1.4   真相

    至此也终于清楚了为什么就可以输入任意密码进行登录。
    我们重新捋一捋:
    自动草稿

    1.5   彩蛋

    实际的真相就是在pam中的pam_rootok模块,pam_rootok通过了认证还会一次向下执行,但是下面的都会依赖于pam_rootok的认证,auth =>account =>session:
    自动草稿

    通过查找其实不单单是su存在pam_rootok,只要满足了上述的三个条件都可以进行”任意密码登录”。

    1.6   参考资料

    https://linux.die.net/man/8/pam_rootok
    https://fossies.org/dox/Linux-PAM-1.3.0/pam__rootok_8c_source.html
    https://fossies.org/dox/Linux-PAM-1.3.0/pam__succeed__if_8c.html
    https://fossies.org/dox/Linux-PAM-1.3.0/pam__succeed__if_8c_source.html
    http://man7.org/linux/man-pages/man2/getuid.2.html
    http://www.tuxradar.com/content/how-pam-works
    http://www.centoscn.com/CentOS/help/2014/0504/2899.html

  • 相关阅读:
    day50——前端简介、标签分类、常用标签
    day46——约束条件、表与表建 关系、修改表的完整语法
    day45——存储引擎、数据类型、约束条件
    day44——存储数据的发展、数据库分类、mysql
    Ⅰ:计算机核心基础
    Ⅶ:基本数据类型及内置方法
    Ⅶ:作业
    Ⅵ:深浅copy
    Ⅵ:流程控制
    Ⅳ:运算符
  • 原文地址:https://www.cnblogs.com/likaiming/p/11007919.html
Copyright © 2011-2022 走看看