转自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. 8.5 JavaScript的BOM(二)

    8.5 JavaScript的BOM 即 浏览器对象模型(Browser Object Model) 浏览器对象包括 一.Window(窗口) 如果需要打开一个新的网站,应该通过超级链接等方式让用户主 ...

  2. 教你快速写一个EventBus框架

    前言EventBus相信大多数人都用过,其具有方便灵活.解耦性强.体积小.简单易用等优点,虽然现在也有很多优秀的替代方案如RxBus.LiveDataBus等,但不可否认EventBus开创了消息总线 ...

  3. 提交本地文件至gitlab已有的项目中(更新gitlab)

    gitlab代码更新 gitlab官网 1.安装git git官网 官网下载安装,安装过程一直next即可(路径自己选) 2.clone至本机 格式:git clone url(可转到指定目录克隆) ...

  4. css3_1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. LC 670. Maximum Swap

    Given a non-negative integer, you could swap two digits at most once to get the maximum valued numbe ...

  6. js实现简单的文件上传

    文件下载:https://www.cnblogs.com/xiaomili/p/10521160.html  html: <form name="form1" id=&quo ...

  7. flutter 常用plugins

    搜索plugins flutter plugins搜索地址 谷歌官方plugins https://pub.dev/packages?q=http 到这个链接里面去搜索 https://github. ...

  8. JSTL优点

    1. 在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植. 2. 简化了JSP和WEB应用程序的开发.3. 以一种统一的方式减少了JSP中的scriptlet代码 ...

  9. Java各种反射性能对比

    对各种方法实现get方法的性能进行了一个测试. 总共有5个测试,,每个测试都是执行1亿次 1. 直接通过Java的get方法 2.通过高性能的ReflectAsm库进行测试 3.通过Java Clas ...

  10. Java Unsigned Bytes

    Having had to use unsigned bytes for the first time, I also had to learn how Java references these d ...