背景與問題
Linux 提權(quán)(Privilege Escalation)是指攻擊者或惡意用戶從低權(quán)限賬號獲取更高權(quán)限的過程。在實際的安全事件中,攻擊者很少能直接獲得 root 權(quán)限,更多的情況是首先通過某個漏洞或配置錯誤獲得普通用戶權(quán)限,然后通過各種提權(quán)技術(shù)獲得 root 權(quán)限。
對于運維工程師來說,了解提權(quán)風險是至關(guān)重要的。一方面,服務(wù)器可能被攻擊者入侵,攻擊者會嘗試提權(quán);另一方面,公司內(nèi)部的普通用戶也可能嘗試提權(quán)到 root 權(quán)限,執(zhí)行未授權(quán)的操作。運維人員有責任確保系統(tǒng)配置安全,防止提權(quán)發(fā)生。
本文詳細介紹 Linux 系統(tǒng)中常見的提權(quán)風險點:危險的 SUID 程序、內(nèi)核漏洞利用、sudo 配置錯誤、計劃任務(wù)(cron)漏洞、密碼和密鑰管理、容器逃逸風險等。通過了解這些風險點,運維人員可以有針對性地進行安全加固。
1 SUID 程序提權(quán)
1.1 SUID 機制原理
SUID(Set User ID)是 Linux 的一種特殊權(quán)限機制。當可執(zhí)行文件設(shè)置了 SUID 位時,任何用戶執(zhí)行該文件都會以文件所有者的身份運行,而不是執(zhí)行者的身份。
例如,/usr/bin/passwd文件設(shè)置了 SUID 位且所有者是 root,所以任何用戶執(zhí)行passwd命令時,都會以 root 身份運行,從而能夠修改/etc/shadow文件。
# 查看設(shè)置了 SUID 位的文件
find / -perm -4000 -typef 2>/dev/null
# 查看具體的 SUID 程序及其權(quán)限
ls -la /usr/bin/passwd
# -rwsr-xr-x 1 root root 23272 Jan ... /usr/bin/passwd
# ^
# 注意 s 代替了 x,表示 SUID 位已設(shè)置
# 查看所有 SUID 程序
find /usr -perm -4000 -typef -execls -la {} ;
1.2 危險的 SUID 程序
并非所有 SUID 程序都是必需的,也不是所有 SUID 程序都是安全的。以下是常見的潛在危險 SUID 程序:
# nmap(舊版本可以執(zhí)行任意命令) find / -perm -4000 -typef -name"nmap"2>/dev/null # bash(如果設(shè)置了 SUID,可以直接獲得 root shell) find / -perm -4000 -typef -name"bash"2>/dev/null # python/perl/ruby 等腳本解釋器(如果設(shè)置了 SUID) find / -perm -4000 ( -name"python*"-o -name"perl*"-o -name"ruby*") 2>/dev/null # find 命令(-exec 選項可以執(zhí)行任意命令) find / -perm -4000 -typef -name"find"2>/dev/null # vim/vi(可以讀取和修改任意文件) find / -perm -4000 -typef ( -name"vim"-o -name"vi"-o -name"nano") 2>/dev/null
1.3 SUID 提權(quán)示例
了解攻擊者如何利用 SUID 程序提權(quán),有助于我們更好地防御:
# bash SUID 提權(quán) # 如果 bash 設(shè)置了 SUID,可以直接獲得 root shell bash -p # nmap 提權(quán)(舊版本 interactive 模式) nmap --interactive !sh # find 命令提權(quán) find . -exec/bin/sh -p ; -quit # vim 提權(quán) vim -c':!/bin/sh' # perl 提權(quán) perl -e'exec "/bin/sh";' # python 提權(quán) python -c'import os; os.system("/bin/sh")'
1.4 SUID 安全加固
原則:盡量減少 SUID 程序的數(shù)量;定期檢查新出現(xiàn)的 SUID 程序;移除不必要的 SUID 位。
# 查找系統(tǒng)上所有的 SUID 程序,評估每個是否必要 find / -perm -4000 -typef 2>/dev/null > /tmp/suid_files.txt cat /tmp/suid_files.txt # 移除不必要的 SUID 位 chmod u-s/usr/bin/nmap # 移除 nmap 的 SUID chmod u-s/usr/bin/bash # 移除 bash 的 SUID(如果設(shè)置了) # 只對必要的程序保留 SUID # 常見的必要 SUID 程序:passwd, su, sudo, pkexec, crontab, at, gpasswd, mount, umount, suidmanager
2 Sudo 配置錯誤提權(quán)
2.1 sudo 權(quán)限配置錯誤
sudo 配置不當是另一種常見的提權(quán)途徑。運維人員有時為了"方便",會給用戶分配過寬的 sudo 權(quán)限。
# 查看當前用戶的 sudo 權(quán)限 sudo -l # 查看所有用戶的 sudo 權(quán)限(需要 root) cat /etc/sudoers cat /etc/sudoers.d/* # 常見的危險 sudo 配置: # 允許執(zhí)行任意命令 username ALL=(ALL) ALL %groupname ALL=(ALL) ALL # 允許執(zhí)行任意 shell 命令 username ALL=(root) /bin/bash # 允許無密碼 sudo(自動化腳本常用,但風險很高) username ALL=(ALL) NOPASSWD: ALL # 允許用戶修改 sudoers 文件 username ALL=(ALL) /usr/sbin/visudo username ALL=(ALL) /bin/chmod 777 /etc/sudoers # 允許用戶以 root 身份執(zhí)行任何命令(可以用 vim 提權(quán)) username ALL=(root) /usr/bin/vim
2.2 利用 sudo 權(quán)限提權(quán)
# 如果 vim 可以 sudo 執(zhí)行
sudo vim
# 在 vim 中
:!/bin/sh
# 如果 less 可以 sudo 執(zhí)行(less 可以調(diào)用 shell)
sudo less /etc/passwd
# 在 less 中
!sh
# 如果 find 可以 sudo 執(zhí)行
sudo find . -exec/bin/sh -p ; -quit
# 如果 wget 可以 sudo 執(zhí)行(可以覆蓋 /etc/shadow 或 /etc/sudoers)
sudo wget -F /etc/shadow
# 但這個例子不完整,實際操作很復(fù)雜
# 如果 python 可以 sudo 執(zhí)行
sudo python -c'import os; os.system("/bin/sh")'
2.3 sudo 安全配置
# /etc/sudoers 配置示例 # 遵循最小權(quán)限原則 username ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart php-fpm # 禁止危險命令 username ALL=(root) ALL, !/bin/bash, !/usr/bin/vim, !/usr/bin/less # 使用 sudoers.d 目錄管理 # /etc/sudoers.d/custom # 每行一個配置,避免修改主配置文件 # 記錄所有 sudo 操作 Defaults logfile="/var/log/sudo.log"
3 計劃任務(wù)(Cron)提權(quán)
3.1 Cron 任務(wù)配置錯誤
系統(tǒng)或用戶的 cron 任務(wù)如果配置不當,可能被攻擊者利用提權(quán)。
# 查看系統(tǒng) cron 任務(wù) ls -la /etc/cron.d/ ls -la /etc/cron.daily/ ls -la /etc/cron.hourly/ cat /etc/crontab # 查看當前用戶的 cron 任務(wù) crontab -l # 查看其他用戶的 cron 任務(wù)(需要 root) crontab -u username -l # 檢查 cron 任務(wù)的權(quán)限 ls -la /etc/cron.d/
3.2 Cron 提權(quán)風險點
風險一:cron 任務(wù)執(zhí)行的腳本可以被普通用戶修改。
# 如果 cron 任務(wù)執(zhí)行的是一個普通用戶有寫權(quán)限的腳本 # 該用戶可以修改腳本內(nèi)容,以 root 身份執(zhí)行任意命令 # 檢查 cron 腳本的權(quán)限 ls -la /etc/cron.daily/mybackup.sh # -rwxrwxrwx 1 root root ... /etc/cron.daily/mybackup.sh # 如果普通用戶對此腳本有寫權(quán)限,就存在風險
風險二:cron 任務(wù)使用的腳本路徑?jīng)]有使用絕對路徑。
# 不安全的 cron 任務(wù) @hourly /home/user/backup.sh # 如果 /home/user 在 PATH 中 # 安全的 cron 任務(wù) @hourly /usr/local/bin/backup.sh # 使用絕對路徑
風險三:環(huán)境變量問題導致的安全漏洞。
# cron 任務(wù)可能繼承不安全的 PATH # 如果 PATH 包含用戶可寫的目錄 # 查看 cron 的環(huán)境 cat /etc/pam.d/cron
3.3 Cron 安全加固
# 確保 cron 任務(wù)腳本權(quán)限正確 chmod 755 /etc/cron.daily/myscript.sh chown root:root /etc/cron.daily/myscript.sh # 使用絕對路徑 */5 * * * * /usr/local/bin/check_service.sh # 限制可寫的環(huán)境變量 CRON_TZ=UTC PATH=/usr/bin:/bin # 記錄 cron 執(zhí)行日志 # /etc/rsyslog.conf 或 /etc/rsyslog.d/50-default.conf cron.* /var/log/cron.log systemctl restart rsyslog
4 密碼和密鑰提權(quán)
4.1 密碼哈希提取
如果攻擊者能夠讀取/etc/shadow文件(需要 root 權(quán)限才能寫入,但可能有讀取權(quán)限配置錯誤),可以嘗試離線破解密碼哈希。
# 檢查 /etc/shadow 權(quán)限 ls -la /etc/shadow # -rw-r----- 1 root shadow ... /etc/shadow # 如果普通用戶可以讀取 /etc/shadow,就是嚴重漏洞 # 檢查權(quán)限配置 grep shadow /etc/group # 檢查是否有文件意外設(shè)置了讀取權(quán)限 find / -perm -004 -name"shadow"2>/dev/null
4.2 SSH 密鑰提權(quán)
如果攻擊者能夠讀取用戶的 SSH 私鑰,可以利用該私鑰訪問其他服務(wù)器。
# 查找 SSH 私鑰 find / -name"*.pem"-o -name"id_rsa"-o -name"id_ed25519"-o -name"id_ecdsa"2>/dev/null # 檢查私鑰權(quán)限 ls -la ~/.ssh/id_rsa # 私鑰應(yīng)該是 600 權(quán)限 # 檢查是否有密鑰被錯誤地設(shè)置了過寬的權(quán)限 find /home -name"*.pem"-perm 0777 2>/dev/null
4.3 密碼安全加固
# 設(shè)置強密碼策略 # /etc/pam.d/common-password 或 /etc/pam.d/system-auth password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 # 參數(shù)說明: # minlen=12 - 最小長度 12 字符 # dcredit=-1 - 至少 1 個數(shù)字 # ucredit=-1 - 至少 1 個大寫字母 # lcredit=-1 - 至少 1 個小寫字母 # ocredit=-1 - 至少 1 個特殊字符 # 限制密碼歷史(防止重復(fù)使用) password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5 # 設(shè)置密碼過期策略 # /etc/login.defs PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_WARN_DAYS 14 # 對已有用戶設(shè)置密碼過期 chage -M 90 -m 7 -W 14 username
5 內(nèi)核和軟件漏洞提權(quán)
5.1 內(nèi)核漏洞
內(nèi)核漏洞是提權(quán)最直接的途徑。著名的 Dirty COW(CVE-2016-5195)、Spectre/Meltdown 等都允許普通用戶提權(quán)到 root。
# 查看內(nèi)核版本 uname -a cat /proc/version # 檢查已知內(nèi)核漏洞 # 使用 linux-exploit-suggester 工具 wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh chmod +x linux-exploit-suggester.sh ./linux-exploit-suggester.sh # 或者使用 ike wget https://raw.githubusercontent.com/InteliSecure/Linux_Exploit_Suggester/master/les.pl perl les.pl
5.2 Sudo 和其他軟件漏洞
# 檢查 sudo 版本是否有已知漏洞 sudo -V | head -3 # 檢查其他常用軟件版本 openssl version nginx -v apache2 -v mysql --version php -v # 使用包管理器檢查安全更新 apt list --upgradable 2>/dev/null | grep -i security yum updateinfo list security 2>/dev/null
5.3 安全更新流程
# Debian/Ubuntu apt update apt list --upgradable apt-get upgrade apt-get dist-upgrade # 包含內(nèi)核更新 # RHEL/CentOS yum check-update yum update yum update --security # 只安裝安全更新 # 定期執(zhí)行安全更新 # 添加到 cron 或使用 unattended-upgrades 包 apt-get install unattended-upgrades dpkg-reconfigure unattended-upgrades
6 容器逃逸提權(quán)
6.1 Docker 容器提權(quán)風險
在容器化環(huán)境中,容器逃逸是一種特殊的提權(quán)方式。如果容器配置不當,容器內(nèi)的用戶可能獲得宿主機的 root 權(quán)限。
# 檢查當前是否在容器中 cat /proc/1/cgroup | grep -i docker ls /.dockerenv 2>/dev/null # 檢查 Docker socket 是否掛載到容器中 ls -la /var/run/docker.sock 2>/dev/null # 如果存在,說明容器配置不安全
6.2 容器提權(quán)方式
如果 Docker socket 被掛載到容器中,容器內(nèi)的用戶可以控制宿主機上的 Docker,進而獲得宿主機 root 權(quán)限:
# 在容器中如果能訪問 /var/run/docker.sock docker -H unix:///var/run/docker.sock run -v /:/host ubuntu chroot /host bash # 這會以 root 身份在宿主機上執(zhí)行命令
6.3 容器安全加固
# 不要在容器中掛載 Docker socket # Kubernetes 中使用安全上下文 securityContext: privileged:false readOnlyRootFilesystem:true # Docker 運行參數(shù) docker run --rm --cap-drop ALL --read-only nginx # 不要使用 --privileged 標志 docker run --privileged nginx # 危險 # 使用 AppArmor 或 SELinux 限制容器 apparmor=unconfined selinux enabled # 定期更新容器基礎(chǔ)鏡像 docker pull ubuntu:22.04
7 文件權(quán)限提權(quán)
7.1 NFS 和文件共享提權(quán)
通過網(wǎng)絡(luò)文件系統(tǒng)共享的文件,如果權(quán)限配置不當,可能導致提權(quán)。
# 檢查 NFS 導出 cat /etc/exports showmount -e localhost # 檢查 NFS 掛載 mount | grep nfs # 檢查可寫的 NFS 導出(no_root_squash) # 如果某個導出是 no_root_squash,在客戶端的 root 可以變成服務(wù)端的 root
7.2 敏感文件權(quán)限
# 檢查關(guān)鍵系統(tǒng)文件的權(quán)限 ls -la /etc/passwd /etc/shadow /etc/group /etc/gshadow # /etc/passwd 應(yīng)該可讀但不可寫 chmod 644 /etc/passwd # /etc/shadow 應(yīng)該只能被 root 讀取 chmod 600 /etc/shadow chown root:shadow /etc/shadow # /etc/sudoers 應(yīng)該只能被 root 修改 chmod 440 /etc/sudoers chown root:root /etc/sudoers # 檢查是否存在任何可寫的 /etc/cron.d find /etc/cron.d -typef -perm -002 2>/dev/null
7.3 計劃任務(wù)目錄權(quán)限
# cron 目錄應(yīng)該是 root 所有且不可被其他用戶寫入 ls -la /etc/cron.d/ # 應(yīng)該是 dr-xr-xr-x root root # /etc/cron.deny 和 /etc/at.deny # 應(yīng)該只有 root 可寫 chmod 600 /etc/cron.deny /etc/at.deny
8 通用的提權(quán)防御策略
8.1 最小權(quán)限原則
所有賬號和服務(wù)都應(yīng)該只擁有完成任務(wù)所需的最小權(quán)限。
# 定期審查用戶和組 cat /etc/passwd cat /etc/group # 刪除不必要的賬號 userdel username # 刪除不必要的組 groupdel groupname # 審查 sudo 權(quán)限 visudo # 移除所有不必要的 sudo 權(quán)限
8.2 定期安全審計
# 使用 Lynis 進行安全審計 apt-get install lynis lynis audit system # 使用 chkrootkit 檢查 rootkit apt-get install chkrootkit chkrootkit # 使用 rkhunter 檢查 rootkit apt-get install rkhunter rkhunter --check
8.3 文件完整性監(jiān)控
# 使用 AIDE 進行文件完整性監(jiān)控 apt-get install aide aideinit aide --check # 配置 AIDE 定期檢查 # /etc/cron.daily/aide #!/bin/bash /usr/bin/aide --check
8.4 入侵檢測
# 安裝 OSSEC 或類似的主機入侵檢測系統(tǒng) # 監(jiān)控文件修改、用戶添加、權(quán)限變更等 # 使用 auditd 監(jiān)控關(guān)鍵目錄 auditctl -w /etc/passwd -p wa -k passwd_changes auditctl -w /etc/shadow -p wa -k shadow_changes auditctl -w /etc/sudoers -p wa -k sudoers_changes auditctl -w /usr/bin -p x -k execution # 查詢審計日志 ausearch -k passwd_changes | tail -20
9 快速安全檢查腳本
#!/bin/bash # privilege_escalation_check.sh - Linux 提權(quán)風險快速檢查腳本 echo"=== Linux Privilege Escalation Check ===" echo"" # 1. 檢查 SUID 程序 echo"[1] SUID Programs:" find / -perm -4000 -typef 2>/dev/null | head -20 # 2. 檢查 sudo 權(quán)限 echo"" echo"[2] Current User Sudo Permissions:" sudo -l 2>/dev/null # 3. 檢查 cron 任務(wù) echo"" echo"[3] Cron Tasks:" ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ 2>/dev/null | grep -v"^total" # 4. 檢查 /etc/passwd 可寫性 echo"" echo"[4] /etc/passwd Writable:" ls -la /etc/passwd if[ -w /etc/passwd ];thenecho"WARNING: /etc/passwd is world-writable!";fi # 5. 檢查 /etc/shadow 權(quán)限 echo"" echo"[5] /etc/shadow Permissions:" ls -la /etc/shadow if[ -r /etc/shadow ];thenecho"NOTE: /etc/shadow is readable by all";fi # 6. 檢查 Docker socket echo"" echo"[6] Docker Socket:" ls -la /var/run/docker.sock 2>/dev/null ||echo"Docker socket not found" # 7. 檢查內(nèi)核版本 echo"" echo"[7] Kernel Version:" uname -a # 8. 檢查可寫的 /etc 文件 echo"" echo"[8] Writable /etc files:" find /etc -typef -perm -002 2>/dev/null | head -10 # 9. 檢查 SSH 密鑰權(quán)限 echo"" echo"[9] SSH Keys:" find /home -name"*.pem"-o -name"id_*"2>/dev/null | xargs ls -la 2>/dev/null # 10. 檢查服務(wù)配置 echo"" echo"[10] Running Services:" systemctl list-units --type=service --state=running | head -20 echo"" echo"=== Check Complete ==="
10 結(jié)論
Linux 提權(quán)是運維安全的重要組成部分。了解常見的提權(quán)途徑和防御方法,是每個運維工程師的必修課。
本文介紹的主要提權(quán)風險點:SUID 程序提權(quán);sudo 配置錯誤提權(quán);cron 任務(wù)配置錯誤提權(quán);密碼和 SSH 密鑰泄露;內(nèi)核和軟件漏洞;容器逃逸;文件權(quán)限配置錯誤。
防御的核心原則:最小權(quán)限原則——不給用戶或服務(wù)分配超過需要的權(quán)限;縱深防御——多層安全防護,單點失效不會導致全面淪陷;持續(xù)監(jiān)控——記錄和監(jiān)控關(guān)鍵操作,及時發(fā)現(xiàn)異常。
運維工程師應(yīng)該定期進行安全審計,檢查系統(tǒng)配置是否仍然安全,及時修補發(fā)現(xiàn)的漏洞和錯誤配置。
參考資料:
Linux Privilege Escalation - PayloadsAllTheThings
GTFOBins - https://gtfobins.github.io/
man chmod、man chown、man visudo
CIS Benchmarks for Linux
NSA/CISA Linux Hardening Guide
-
Linux
+關(guān)注
關(guān)注
88文章
11812瀏覽量
219515 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
616瀏覽量
30138 -
文件
+關(guān)注
關(guān)注
1文章
598瀏覽量
26113
原文標題:Linux 提權(quán)風險怎么防?初中級運維必須知道的幾個高危點
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何使用環(huán)境變量進行Linux提權(quán)的方法詳細資料概述
關(guān)于linux系統(tǒng)中提權(quán)的那些技巧
linux系統(tǒng)中常見注冊函數(shù)的使用方法
Linux系統(tǒng)中常見的壓縮命令工具概述
香港云服務(wù)器寶塔windows面板提權(quán)獲取系統(tǒng)管理員權(quán)限
Linux內(nèi)核提權(quán)攻擊研究
Linux系統(tǒng)中常見的提權(quán)風險點總結(jié)
評論