zoukankan      html  css  js  c++  java
  • 一条命令引发的思考

    Author:Sevck

    1.1   起因

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

    软链接后门:

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

    经典后门。直接对sshd建立软连接,之后用任意密码登录即可。

    ssh root@x.x.x.x -p 5555

    这个是大家也经常会用到的命令,但是在好奇心的驱使下,为什么任意密码就可以了?

    于是搜索了相关的资料,发现都是执行了这条命令就可以免密码登录了,但是为什么却没有一篇详细的解答。

    1.2   调查

    首先测试一下这个命令:

     

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

    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 重新命名为其他文件,发现依然能够任意密码登录,又做了测试如下:

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

     

    在此执行:

    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:

     

    第一条:

    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

  • 相关阅读:
    yii 引入文件
    CodeForces 621C Wet Shark and Flowers
    面试题题解
    POJ 2251 Dungeon Master
    HDU 5935 Car(模拟)
    HDU 5938 Four Operations(暴力枚举)
    CodeForces 722C Destroying Array(并查集)
    HDU 5547 Sudoku(dfs)
    HDU 5583 Kingdom of Black and White(模拟)
    HDU 5512 Pagodas(等差数列)
  • 原文地址:https://www.cnblogs.com/sevck/p/6495884.html
Copyright © 2011-2022 走看看