1.1 原由html
今天在搜索關於Linux下的後門姿式時,發現一條命令以下:
軟連接後門:linux
1
|
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;
|
經典後門。直接對sshd創建軟鏈接,以後用任意密碼登陸便可。
ssh root@x.x.x.x -p 5555這個是你們也常常會用到的命令,可是在好奇心的驅使下,爲何任意密碼就能夠了?
因而搜索了相關的資料,發現都是執行了這條命令就能夠免密碼登陸了,可是爲何卻沒有一篇詳細的解答。
1.2 調查git
首先測試一下這個命令:github
在A的機器上執行了以下命令:centos
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是否相關,作了測試以下:session
把/bin/su 從新命名爲其餘文件,發現依然可以任意密碼登陸,又作了測試以下:ssh
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/suui
1.3 疑問spa
如今確認了是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_rootokhttps://fossies.org/dox/Linux-PAM-1.3.0/pam__rootok_8c_source.htmlhttps://fossies.org/dox/Linux-PAM-1.3.0/pam__succeed__if_8c.htmlhttps://fossies.org/dox/Linux-PAM-1.3.0/pam__succeed__if_8c_source.htmlhttp://man7.org/linux/man-pages/man2/getuid.2.htmlhttp://www.tuxradar.com/content/how-pam-workshttp://www.centoscn.com/CentOS/help/2014/0504/2899.html