Linux的一個后門引發對PAM的探究
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的機器上執行了如下命令:
在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
轉載自http://www.91ri.org/16803.html