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

1.1   起因

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

1
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;

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

首先测试一下这个命令:

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

1
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;

在B机器SSH登录A机器,输入任意密码,成功登录。
先理解这条命令主要在做什么:
首先,做一个软链接,结果在/tmp/su  参数的意义: -o option  -p port
这样就开启了一个端口为5555的服务:

测试过程中发现,只允许命名为su,命名其他尝试登录都不成功(/tmp/xxx)。

于是看了一下sshd相关的log,发现如下:

发现是基于pam认证的,使用了pam中的su,为了区分是否和/bin/中的su是否相关,做了测试如下:


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

1
cp /etc/pam.d/su /etc/pam.d/xxx

在此执行:

1
ln -sf /usr/sbin/sshd /tmp/xxx; /tmp/xxx -oPort=5555;

成功登录,根据日志和实践现在确认调用的是/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
pam_rootok(su:auth): authentication succeeded

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

Linux的一个后门引发对PAM的探究的更多相关文章

  1. Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology

    catalog . 引言 . Pam后门 . SSH后门 . Hijacking SSH . Hijacking SSH By Setup A Tunnel Which Allows Multiple ...

  2. 【C/C++】Linux下system()函数引发的错误

    http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食  恋恋美食 发布时间: 2012/04/21 11:3 ...

  3. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  4. Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  5. Spring之LoadTimeWeaver——一个需求引发的思考---转

    原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver——一个需求引 ...

  6. linux下一个有意思的问题(文件名以短划线或空格开头)

    linux下一个有意思的问题(文件名以短划线开头) 这本是无意中的一个发现. 在linux下,文件名中含有 - 是没有问题,但是如果文件名是以-作为第一个字符的,那么就比较麻烦了. 问题演示 看这里, ...

  7. Linux 下一个很棒的命令行工具

    导读 Taskwarrior 是 Ubuntu/Linux 下一个简单而直接的基于命令行的 TODO 工具.这个开源软件是我曾用过的最简单的基于命令行的工具之一.Taskwarrior 可以帮助你更好 ...

  8. Linux查看一个文件夹大小

    1.Linux查看一个文件夹大小: du -sh /home/yangkun [yangkun@sg1 bin]$ du -sh /home/yangkun/ 164M /home/yangkun/ ...

  9. Linux下一个简单的日志系统的设计及其C代码实现

    1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...

随机推荐

  1. mysql 日期字符串互转

    字符串转日期select str_to_date('2008-4-2 15:3:28','%Y-%m-%d %H:%i:%s');select str_to_date('2008-08-09 08:9 ...

  2. vscode 遇到 TabError: inconsistent use of tabs and spaces in indentation

    Python开发,全靠缩进来控制Scope.缩进搞错了,代码也就有问题了.所以写着代码的时候,总是会遇到一个非常常见的问题.TabError: inconsistent use of tabs and ...

  3. 巨丑vue

    <template> <div> <div class="demo-type" align="right" style=" ...

  4. H5最佳格式

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  5. Leetcode题目94.二叉树的中序遍历(中等)

    题目描述: 给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 思路解析: 1 ...

  6. mysql if--else

    SQL之case when then用法 case具有两种格式.简单case函数和case搜索函数. --简单case函数 case sex when '1' then '男' when '2' th ...

  7. 对 Python 迭代的深入研究

    在程序设计中,通常会有 loop.iterate.traversal 和 recursion 等概念,他们各自的含义如下: 循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如 Pyt ...

  8. 用PHP自带函数对二维数组进行排序

    经常会面临这样的需求,虽然有时候我们可以在数据库查询的时候,直接对数据进行排序,但还是无法满足日益复杂的业务需求. 这里边会用到两个函数 一个是array_column()函数,这个函数接受三个参数. ...

  9. linux下如何更新当前的容器镜像?

    docker commit <container_id> <container_image_name>

  10. Tomcat安装应用部署及配置文件解读

    Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomcat和Nginx,APa ...