Linux PAM&&PAM後門

wyzsk發表於2020-08-19
作者: 我是壯丁 · 2014/03/24 11:08

0x00 PAM簡介


PAM (Pluggable Authentication Modules )是由Sun提出的一種認證機制。它透過提供一些動態連結庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程式,同時也便於向系統中新增新的認證手段。PAM最初是整合在Solaris中,目前已移植到其它系統中,如Linux、SunOS、HP-UX 9.0等。

0x01 PAM工作流程


NewImage

0x02 PAM配置檔案語法


module-type
control-flagmodule_path
optional  

/etc/pam.d/下的檔案中,與服務名稱相對應的檔案,為該服務的pam驗證檔案,例如服務為sshd,則在/etc/pam.d下存在sshd這個檔案,裡面包含sshd驗證規則。其中有個一特殊的檔案為other,如果有的服務與之沒有向對應的檔案,則對應other。

module-type

服務型別,即 auth、account、session 或 password。

驗證模組(auth)用於驗證使用者或設定/銷燬憑證。  
帳戶管理模組(account)將執行與訪問、帳戶及憑證有效期、密碼限制/規則等有關的操作。  
會話管理模組(session)用於初始化和終止會話。
密碼管理模組(passwd)將執行與密碼更改/更新有關的操作。 

control-flag

用於指明在確定服務的整合成敗值過程中模組所起的作用。有效的控制標誌包括 include、optional、required、requisite 和 sufficient。

required 表示本模組必須返回成功才能透過認證,但是如果該模組返回失敗的話,失敗結果也不會立即通知使用者,而是要等到同一stack 中的所有模組全部執行完畢再將失敗結果返回給應用程式。可以認為是一個必要條件。  
requisite 與required類似,該模組必須返回成功才能透過認證,但是一旦該模組返回失敗,將不再執行同一stack內的任何模組,而是直 接將控制權返回給應用程式。是一個必要條件。  
sufficient 表明本模組返回成功已經足以透過身份認證的要求,不必再執行同一stack內的其它模組,但是如果本模組返回失敗的話可以 忽略。可以認為是一個充分條件。  
optional表明本模組是可選的,它的成功與否一般不會對身份認證起關鍵作用,其返回值一般被忽略。 

enter image description here

module-path

用於實現服務的庫物件的路徑,一般都只寫庫名,庫的路徑一般為/lib/security(32位),/lib64/security(64位)

module-options

傳遞給服務模組的選項,可選。

幾個公用的引數:

debug 該模組應當用syslog( )將除錯資訊寫入到系統日誌檔案中。  
no_warn 表明該模組不應把警告資訊傳送給應用程式。  
use_first_pass 表明該模組不能提示使用者輸入密碼,而應使用前一個模組從使用者那裡得到的密碼。  
try_first_pass 表明該模組首先應當使用前一個模組從使用者那裡得到的密碼,如果該密碼驗證不透過,再提示使用者輸入新的密碼。  
use_mapped_pass 該模組不能提示使用者輸入密碼,而是使用對映過的密碼。  
expose_account 允許該模組顯示使用者的帳號名等資訊,一般只能在安全的環境下使用,因為洩漏使用者名稱會對安全造成一定程度的威脅。 

0x03 PAM 堆疊工作原理


NewImage

圖1:PAM形成堆疊的過程(solaris,有的linux不包含)

NewImage

圖2:PAM如何確定最終的返回值(solaris)
0x04 常用PAM模組


從官方文件翻譯出來的(/usr/share/doc/pam-1.1.1),翻譯可能有不對的地方

1、pam_securetty.so

型別:auth
作用:只對root有限定,限定root登陸的終端,系統預設的“安全”中斷儲存在/etc/securetty中。

2、pam_access.so

型別:account
作用:基於登入名,主機名或者所屬域,ip地址或者網路
終端編號(類似於/etc/securetty)。預設的配置檔案為/etc/security/access.conf

3、pam_tally2.so

型別:auth 作用:當使用者輸入密碼的錯誤次數超過指定次數時,鎖定賬戶引數:

onerr=[fail|succeed]:

file=/path/to/counter:當登陸超過允許次數時,日誌儲存的地方。預設的為/var/log/tallylog。當開啟的時候,每當登陸失敗一次,則會寫入一次,使用pam_tally2 可以讀出

audit:如果使用者找不到,則把此使用者名稱記錄到日誌中
silent:不輸出任何資訊
no_log_info:不進行日誌記錄

deny=N:當使用者連續輸錯n次是,在第n+1次鎖定該使用者,沒有 設定解鎖解鎖時間,則鎖定之後需要手工解鎖。

pam_tally.so  -u username --reset

lock_time=n:當輸入密碼錯誤一次時,在N秒內不能再次登陸該賬戶。 

unlock_time=n:解鎖時間,當賬戶被鎖定時,過n秒時,該賬戶 被接觸鎖定(清空/var/log/tallylog中的相關資訊),配合deny引數使用 magic_root:當uid=0時,不會往/var/log/tallylog中寫入計 數,即這個PAM不生效 even_deny_root:對root使用者生效(不加magic_root引數,對 root也是不處理的) root_unlock_time=n:是針對even_deny_root的,root使用者的解鎖時間 每當使用者成功登陸過一次後,/var/log/tallylog中關於這個用 戶的記錄就會清空

4、pam_cracklib

型別:password
作用:限定更改密碼的長度,複雜度等等。
引數:

dubug:把修改密碼的行為記錄到日誌中  
retry=N:修改密碼時,允許錯誤的次數,預設是1次  
difok=N:新密碼與舊密碼不同的位數。如果超過一半不同,則透過驗證,則忽略difok的設定  
minlen=N:密碼的最短長度  
dcredit=N:至少有N的數字  
ucredit=N:至少有N的大寫字碼  
lcredit=N:至少有N個小寫字母  
ocredit=N:至少有N個特殊字元  
minclass=N:密碼組成的範圍(數字,大小寫字母,特殊字元)  
maxrepeat=N:最多與上一個密碼重複 

5、pam_limits.so

型別:session
作用:限制資源的使用,預設的配置檔案為/etc/security/limits.conf是全域性的,/etc/security/limits.d/下存放各個子檔案

6、pam_listfile

型別:auth
作用:驗證使用者是否能夠登陸
引數:

item=[tty|user|rhost|ruser|group|shell]:控制的物件  
sense=[allow|deny]:控制的方法  
file=/path/filename:檔案的路徑,每個佔一行  
onerr=[succeed|fail]:指定某類事件發生時的返回值。  
例項:  
authrequired pam_listfile.soonerr=succeed item=user sense=deny file=/etc/ftpusers  
儲存在/etc/ftpusers中的使用者,是不允許的。  

7、pam_nologin.so

型別:auth
作用:用於拒絕除root外的不同使用者的登陸(當/etc/nologin存在,或者重新制定file的情況下)
引數:auth
file=/path/nologin:如果檔案存在,當拒絕使用者登陸的時候,同時會輸出該檔案中儲存的內容。預設檔案為/etc/nologin。

0x05 PAM後門


測試環境CentOS 6.2 64位

0x05a 查詢本機的PAM版本

rpm –aq | grep pam

NewImage

下載對應的版本
下載地址:

http://www.linux-pam.org/library/  
https://fedorahosted.org/releases/l/i/linux-pam/

NewImage

0x05b 修改原始碼

#!bash
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c
在PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,int argc, const char **argv)中定義FILE *fp;

NewImage

PS:網上的那種後門補丁也就是修改這些

0x05c 編譯原始碼

解決依賴性

#!bash
yum install gcc make flex –y  
configure&&make  

編譯出來的pam_unix.so在

/mnt/Linux-PAM-1.1.1/modules/pam_unix/.libs  

對/lib64/security中的檔案進行替換(32位系統放入/lib/security)

0x05d 登入測試

NewImage

0x05e 使用touch –r來更改時間

NewImage

PS:但是兩個檔案的大小是不同的

對於這種修改的方法,在/var/log/secure中和正常登入的是有差距

NewImage

0x05f 最佳化一下下

#!bash
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c

NewImage

#!bash
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/support.c

NewImage

登入測試後的日誌

NewImage

一致了,o(∩_∩)o

0x05g 還有一種猥瑣的方法,直接修改/etc/pam.d/sshd檔案,輸入什麼都能登入的

NewImage

正常日誌

NewImage

PS:為什麼能登入,好好看前面的基礎部分就知道了

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章