TeamT5 杜浦數位安全專精於亞太地區網路威脅研究,並提供資安事件應變服務,團隊具備超過 20 年的資安威脅調查、分析的經驗。本次深度分享在 Linux 環境中,常見的惡意手法。
Linux 軟體及指令多數都是開源的,豐富程度遠超 Windows,因此攻擊者常常使用內建 (built-in) 功能或是相關套件 (package),來持續維持存取權限。
權限提升
Windows 主機存取最常用的方式是 RDP(3389),Linux 則是 SSH(22)。早期因為 Bot/Scanner 會在 Internet 上掃描,使用 root 當帳號進行猜測成功後登入,後來 sshd_config 裡面預設禁止 root 帳號登入。
/etc/ssh/sshd_config
PermitRootLogin prohibit-password/no
PermitRootLogin prohibit-password/no
參數 | 說明 |
---|---|
yes | 允許 |
no | 不允許 |
prohibit-password | 禁止以輸入密碼的方式登入 |
forced-commands-only | 只允許用公鑰授權登入 |
Windows 存取 RDP 時,該 User 必需在 Administrators 或 Remote Desktop Users 的群組裡,而 Linux 一般 User 也可以進行登入,只要 /etc/passwd 帳號裡面有設定執行 shell。
/etc/passwd, /etc/shadow
攻擊者有時會修改檔案權限(File Permission),這裡引用 @sysxplore 所整理的 Linux file permissions cheatsheet。
可得知分別為 type | user | group | other 四個部份,可以檢視下面二種權限會存在什麼問題?個別需要怎麼利用?
┌──(kali㉿kali)-[~]
└─$ ll /etc/passwd
-rw-r--rw- 1 root root 3626 Jan 10 05:46 /etc/passwd
*因為 other 設 w 所以大家都可以對它做寫入,所以可以建立帳號。
┌──(kali㉿kali)-[~]
└─$ ll /etc/passwd
-rw-rw-r-- 1 root root 3626 Jan 10 05:46 /etc/passwd
*因為 group 設 w 所以 root 群可以對它做寫入,所以只需要將 /etc/group 的 root 群多加帳號(root:x:0:kali),使用 kali 可以建立帳號。
正常情況下 /etc/passwd 所設的檔案權限:
┌──(kali㉿kali)-[~]
└─$ ll /etc/passwd
-rw-r--r-- 1 root root 3235 Oct 6 11:05 /etc/passwd
再談 /etc/passwd 的檔案內容,可以看到內容的格式為:
格式 |
---|
使用者名稱 |
加密的密碼 |
使用者 ID 號碼 (uid) |
使用者的群組 ID 號碼 (gid) |
使用者的完整名稱 (gecos) |
使用者起始目錄 |
登入 shell |
可以看到 root 的 uid=0,所以只要將帳號的 uid 改為 0,此帳號就會變成 root 了,而帳號後的密碼欄位,大多都是 x 是因為後來的密碼,都被移到 /etc/shadow 裡面,所以就都設為 x (相關說明)。
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
systemd-coredump:x:993:993:systemd Core Dumper:/:/usr/sbin/nologin
openldap:x:132:142:OpenLDAP Server Account,,,:/var/lib/ldap:/bin/false
qoo:$1$SY5WcHLA$QCf.I6R2F2FPFa/9Ln2Es/:0:0:root:/root:/usr/bin/zsh
如果想自己產一組密碼,可以使用 openssl 產生密碼,填入 x 後,就不用再去 /etc/shadow 取密碼了。
┌──(kali㉿kali)-[~]
└─$ openssl passwd -6 -salt 'SaltQQ' '1234'
$6$SaltQQ$Q2SKpm12cbmN40aDpgEBhDoupRHqeBF4wtmOuHowNzxbNEYavqHp5bUxj.z5MO19syGO3R881h01UMMh66sAU0
┌──(kali㉿kali)-[~]
└─$ openssl passwd -1 '1234'
$1$zG9mHyJ8$QHFuEgbeBw5O8Ecc/a./O0
知道 UID 改為 0 可以變 root 後,就可以來檢查那些是危險帳號。
awk -F : '($3==0)' /etc/passwd
關於密碼這裡也可以看到 /etc/shadow 的格式:
格式 |
---|
登入名稱 (login name) |
加密密碼 (encrypted password) |
上次密碼變更日期 (date of last password change) |
密碼最短使用期限 (minimum password age) |
密碼最長使用期限 (maximum password age) |
密碼過期警告期限 (password warning period) |
密碼暫停使用期間 (password inactivity period) |
帳號過期時間 (account expiration date) |
保留欄位 (reserved field) |
如果加密密碼欄位是空的(不是!或*),那這個帳號就不需輸入密碼。
root:*:19500:0:99999:7:::
kali:$y$j9T$dl4ti9p1KPx6HrZ59TPMJ/$drMOLlRW8BZmsDQ0riDlPnUDsfyIvRL4qfgODnuZVz4:19500:0:99999:7:::
nobody:*:19500:0:99999:7:::
nopass::19500:0:99999:7:::
了解可以將帳號設為空密碼後,可以使用下列指令找出來。
sudo awk -F : '($2=="")' /etc/shadow
Set UID / sudo
在 @sysxplore 的圖中,可以看到 chmod 為 4 個 8 進位(平常使用 3個),最前面數字是設 user / group / other ,與權限 x 一樣用到 bit 0(LSB),如果 bit 0 無設定,會以大寫方式呈現;如果被設定,會以小寫方式。
┌──(kali㉿kali)-[~]
└─$ cp /usr/bin/sh .
┌──(kali㉿kali)-[~]
└─$ sudo chown root:root sh
┌──(kali㉿kali)-[~]
└─$ sudo chmod 7000 sh
┌──(kali㉿kali)-[~]
└─$ ll sh
---S--S--T 1 root root 125640 Jan 11 03:27 sh
┌──(kali㉿kali)-[~]
└─$ sudo chmod 7111 sh
┌──(kali㉿kali)-[~]
└─$ ll sh
---s--s--t 1 root root 125640 Jan 11 03:27 sh
在執行 sh -p 後,可以看到會有 euid,egid=0,這表示執行的當下,是以 root 權限在執行。
┌──(kali㉿kali)-[~]
└─$ ./sh -p
# id
uid=1000(kali) gid=1000(kali) euid=0(root) egid=0(root) groups=0(root),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),111(bluetooth),114(scanner),137(wireshark),140(kaboxer),1000(kali)
假設今天被設 suid/sgid 的程式有弱點,又是以 root 身份執行,就能逹到提權的目的,可以使用 find 指令來查看 suid/sgid,執行時的權限,取決於 user/group 設定是什麼。
find / -perm -u=s -type f
find / -perm -04000 -type f -ls 2>/dev/null
find / -perm /4000 -ls
find . -perm /2000 -ls
早期 Linux 還沒有 sudo 的功能,所以做很多事都是以 root 身份執行,但有了 sudo 後,還是會遇到 sudo rm -fr / 天真浪漫的行為。
從這邊可以知道 sudo 也是一個群組,如果被加到該群組的使用者,可以使用 sudo 切換權限。
┌──(kali㉿kali)-[~]
└─$ cat /etc/group | grep sudo
sudo:x:27:kali
而 sudo 的相關設定是在下列路徑
/etc/sudoers
/etc/sudoers.d
可以看到 sudo 的格式
格式 |
---|
使用者或群組 |
主機 |
授權身分 |
執行指令清單 |
可以看到 /etc/sudoers 本身設定了一些使用者,像是 kali 可以不用輸入密碼以 root 的身份執行 docker、openvpn 指令,而最後還會 includedir /etc/sudoers.d 目錄下的檔案,可以看到如果被加到 kali-trusted 群組可以執行任何指令,並且不用輸入密碼。
┌──(kali㉿kali)-[/etc/sudoers.d]
└─$ sudo cat /etc/sudoers
...
# User privilege specification
root ALL=(ALL:ALL) ALL
kali ALL=(ALL) NOPASSWD:/usr/bin/docker, /usr/sbin/openvpn
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
@includedir /etc/sudoers.d
┌──(kali㉿kali)-[/etc/sudoers.d]
└─$ sudo cat kali-grant-root
# Allow members of group kali-trusted to execute any command without a
# password prompt
%kali-trusted ALL=(ALL:ALL) NOPASSWD: ALL
使用者空間 (user space) 大多數都是 Set UID/GID 或是 sudoers ,又或是服務 (Apache, MySQL, etc.) 弱點。如果都沒使用上述服務,就只能往核心空間 (kernel space) 去找相關權提漏洞利用了。
遠端存取
~/.ssh/authorized_keys
可以使用 ssh-keygen 來產生 key pair,產生出來的檔案會在 .ssh 的目錄下。
┌─[✗]─[parrot@parrot]─[~]
└──╼ $ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/parrot/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/parrot/.ssh/id_rsa
Your public key has been saved in /home/parrot/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:1boh4rkgN+zbx7EudESHWEeoIZmrG5y6F4rxTQH9Bm4 parrot@parrot
The key's randomart image is:
+---[RSA 3072]----+
| . o o.+o |
| . * o +... |
| o = + .. . |
| E + .. . |
| . + o..S o |
|. *....oo. o |
|.=.*=.oo o. |
|+ ++.+..+ |
|.o o.o+. |
+----[SHA256]-----+
┌─[✗]─[parrot@parrot]─[~/.ssh]
└──╼ $ls -alt
total 12
drwx------ 1 parrot parrot 54 1月 14 14:03 .
-rw------- 1 parrot parrot 2602 1月 14 14:03 id_rsa
-rw-r--r-- 1 parrot parrot 567 1月 14 14:03 id_rsa.pub
drwxr-xr-x 1 parrot parrot 666 1月 14 13:55 ..
-rw-r--r-- 1 parrot parrot 222 1月 14 13:55 known_hosts
如果想使用 ssh-copy-id 複製到 root 目錄的話,需要 /etc/ssh/sshd_config 的 PermitRootLogin 設成 yes; 補充說明,預設是 prohibit-password,所以無法使用密碼輸入,所以在密碼錯誤後會出現錯誤。
┌─[✗]─[parrot@parrot]─[~]
└──╼ $ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
[email protected]: Permission denied (publickey,password).
無法使用 root 密碼登入的情況,也可以使用 sudo cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys 將 public key 加到 authorized_keys 裡面。
最後可以使用 ssh -i 進行登入。
inetd
inetd(InterNET service Daemon) 又稱 Internet 超級伺服器 (super-server daemon),是早期4.3BSD的產物,現在多數的systemd已不使用,所以需要另外安裝,裝完之後會有一個/etc/inetd.conf的設定檔,可以多加一筆記錄,這裡的daytime服務使用Port 13。
當連到該主機的 Port 13 將可以取得一個 root 身份的 shell。
xinetd
xinetd 為 Extended Internet Service Daemon,是 inetd 的擴展版本,一樣在 systemd 的環境下,已經不存在了,需要另行安裝。
這邊也可以發現原本 inetd 的設定是一個 /etc/inetd.conf 檔案,而 xinetd 的組態檔可以獨立組成每一個檔案。
新增一個 xinetd 服務在 /etc/xinetd.d 目錄下。
直接連線主機的 5900 可以取得一個 root 的 shell。
pam.d (auth pam_access.so)
/etc/pam.d/sshd 裡面會使用到 pam_access.so 的模組,而這個模組的組態會去讀取 /etc/security/access.conf 的設定。
幾乎所有的服務都會載入 common-auth,在他之前多加一行 auth [success=done default=ignore] pam_access.so 之後再到 /etc/security/access.conf 多加一組帳號。
使用免密碼登入,讓要將 /etc/ssh/sshd_config 裡面的 PermitEmptyPasswords 必需設為 yes (允許空密碼)。
之後登入 abc 帳號時,就可以不用輸入密碼。
結語
本文分享 Linux 攻擊場域的常見惡意手法「權限提升」、「遠端存取」的實務技巧,協助資安防禦方藉此洞悉攻擊者手法,增進防禦能量。
更多惡意手法分析、資安技術分析,歡迎訂閱我們的電子報。
TeamT5 杜浦數位安全提供資安事件應變服務,自主研發之威脅鑑識分析平台 ThreatSonar 可為客戶精準鎖定資安事件受害範圍。我們的團隊具備超過 20 年的資安威脅調查、分析的經驗, 並為國際最大資安事件應變組織 FIRST 的成員。現已協助政府、金融業、科技業、製造業等廣大客戶群,迅速且有效應對資安威脅或駭客攻擊,以最小化的損失來保護關鍵資訊資產;並提供資安強化建議與事件相關威脅情資,以「知己知彼,百戰百勝」的核心概念,有效協助企業提升面對資安事件的應處能力,減少資訊系統與網路服務中斷時間,維持各項服務連續性,確保業務正常運作。歡迎聯絡我們,了解您的企業如何進行資安防禦最佳化。 https://teamt5.org/tw/contact-us/
Related Post
技術分析
2023.12.17
Linux 攻擊場域:SSH 登入攻擊手法初探
incident response