熟練運用命令列介面對於資安人員至關重要,能以更底層的方式執行複雜任務。本文將探討如何使用 bash shell 和 Linux 命令強化網路安全防護技能,特別著重於資料收集、分析和滲透測試等技術。文章內容涵蓋 bash 基礎、命令列操作、輸入輸出重定向、管道運用、背景執行程式管理等,並提供如何在 Windows 系統上透過 Git Bash、Cygwin、WSL 等方式執行 Linux 命令和 bash 指令碼的教學,適合已具備基本資安知識和命令列操作經驗的工程師閱讀,幫助讀者更有效率地運用 bash 進行安全防護工作。

使用bash進行網路安全防護

從命令列出發:攻擊、防禦與分析

在現代網路安全領域,命令列介面(CLI)的重要性常被新手安全從業者所忽略,他們往往被圖形化介面(GUI)工具所吸引。然而,對於經驗豐富的安全從業者來說,命令列提供了一種強大且靈活的方式來執行複雜的安全任務。

本篇文章將重點介紹如何利用bash shell和Linux命令來提升網路安全從業者的技能。透過學習這些技能,讀者將能夠快速建立和原型化複雜的安全功能,即使只使用單行命令或管線命令。

為何選擇bash?

bash shell及其相關命令起源於Unix和Linux作業系統,但現在已廣泛應用於各種環境中,包括Linux、Windows和macOS。因此,掌握bash和相關命令可以讓安全從業者在不同作業系統之間輕鬆切換和應用相關技術。

本篇適合的讀者

本篇主要針對希望在網路安全領域中掌握命令列介面的讀者。目標不是要取代現有的工具,而是教導讀者如何利用命令列來增強現有的安全能力。文章中的範例將聚焦於安全技術,例如資料收集、分析和滲透測試,以展示命令列的能力,並讓讀者瞭解高階工具所使用的基本技術。

基本要求

閱讀本篇的讀者需要具備基本的網路安全知識、命令列介面經驗、程式設計概念,以及Linux和Windows作業系統的基礎知識。雖然具備bash的先備知識會有所幫助,但並非必要。

指令碼的強健性

本篇中的範例指令碼旨在闡述和教授概念,而非設計為企業級佈署所需的效率和強健性。如果讀者選擇在實際環境中使用這些指令碼,請務必遵循最佳程式設計實踐,並在佈署前進行充分測試。

練習與資源

每章末尾都提供了引人深思的問題和練習題,以幫助讀者建立安全、命令列和bash技能。部分練習的解答和額外資源可於網路安全作業網站上找到。

探討bash

在整篇文章中,我們採用小寫字母「b」來指代bash shell,除非它出現在句首或指代Windows程式Git Bash。這一慣例根據bash軟體目前維護者Chet Ramey提供的指導。

本文使用慣例

本文採用以下印刷慣例:

字型樣式規範

  • 斜體:用於表示新術語、網址、電子郵件地址、檔案名稱及副檔名。
  • 等寬字型:用於程式清單,以及在段落中參照程式元素,如變數或函式名稱、資料函式庫、資料型別、環境變數、陳述式和關鍵字。
  • 等寬粗體:顯示使用者應逐字輸入的命令或其他文字。
  • 等寬斜體:顯示應由使用者提供的值或由上下文決定的值所取代的文字。

提示與注意事項

提示:此元素表示提示或建議。 注意:此元素表示一般性註解。 警告:此元素表示警告或注意事項。

致謝

我們要感謝兩位主要的技術審閱者,他們為我們提供了寶貴的見解,幫助我們確保本文的準確性和對讀者的最大價值。Cylance Inc. 的高階技術總監 Tony Lee 是一位安全愛好者,他經常在 LinkedIn 和 SecuritySynapse 上分享知識。Case Western Reserve University 資訊技術服務部門的高階技術架構師 Chet Ramey 是目前 bash 的維護者。

同時,我們也要感謝 Bill Cooper、Josiah Dykstra、Ric Messier、Cameron Newham、Sandra Schiavo 和 JP Vossen 的指導和評論。

免責宣告

本文中表達的意見僅代表作者個人觀點,不代表美國政府的觀點。

第一部分:基礎篇

「給我六小時砍倒一棵樹,我會花前四個小時磨利斧頭。」——無名氏

在第一部分中,我們將從命令列、bash shell 和正規表示式的基礎開始,並回顧網路安全的基本原理。

第1章:命令列基礎

電腦的命令列介面讓您與其作業系統(OS)建立了密切的聯絡。在作業系統內,存在著大量經過數十年使用和開發而精進的功能。可悲的是,使用命令列與作業系統互動的能力正迅速成為一種失傳的藝術。它已被圖形使用者介面(GUI)所取代,後者往往以犧牲速度和靈活性為代價來提高易用性,並讓使用者遠離底層功能。

命令列的定義

在本文中,術語「命令列」用於指代作業系統安裝的所有非GUI可執行檔,以及shell中可用的內建命令、關鍵字和指令碼功能,即其命令列介面。

為了有效地使用命令列,您需要了解兩件事:一是現有命令的功能和選項,二是如何使用指令碼語言將命令組合在一起。

在本文中,我們介紹了40多個跨越Linux和Windows作業系統的命令,以及各種shell內建命令和關鍵字。大多數介紹的命令源自Linux環境,但正如您將看到的,在Windows平台上執行它們有多種方法。

為什麼選擇 Bash?

在指令碼編寫方面,我們選擇使用 bash shell 和命令語言。bash shell 已經存在數十年,幾乎在每個版本的 Linux 中都可用,甚至已經滲透到 Windows 作業系統中。這使得 bash 成為安全操作的理想技術,因為這些技術和指令碼是跨平台的。bash 的普遍存在也為攻擊性操作員和滲透測試人員提供了特殊的優勢,因為在許多情況下,目標系統上不需要安裝額外的支援基礎設施或直譯器。

命令列範例

本文大量使用命令列範例。單行命令範例將顯示如下:

ls -l

如果單行命令範例還顯示輸出,則將顯示如下:

$ ls -l
-rw-rw-r-- 1 dave dave 15 Jun 29 13:49 hashfilea.txt
-rwxrw-r-- 1 dave dave 627 Jun 29 13:50 hashsearch.sh

內容解密:

  • $ 符號不是命令的一部分,而是用來代表 shell 命令列的簡單提示符號。
  • 用於區分命令(您輸入的內容)和命令輸出到終端機的內容。
  • 在這些範例中,命令和輸出之間的空白行不會在您執行命令時出現,這是用來區分命令和輸出的。

在 Windows 上執行 Linux 和 bash

bash shell 和我們討論的命令預設安裝在幾乎所有 Linux 發行版上,但在 Windows 環境中則不然。幸運的是,有多種方法可以在 Windows 系統上執行 Linux 命令和 bash 指令碼。我們在這裡介紹四種選擇:Git Bash、Cygwin、Windows Subsystem for Linux 和 Windows 命令提示字元及 PowerShell。

Git Bash

如果您安裝了 Git,可以在 Windows 環境中執行許多標準的 Linux 命令和 bash shell。Git Bash 是本文中範例的選擇方法,因為它很流行,並且能夠執行標準的 Linux 和 bash 命令,以及呼叫許多原生的 Windows 命令。

Cygwin

Cygwin 是一個功能齊全的 Linux 模擬器,也包括安裝各種套件的功能。它與 Git Bash 相似,除了允許呼叫許多原生的 Windows 命令外,還允許呼叫標準的 Linux 命令。可以從專案網站下載 Cygwin。

Windows Subsystem for Linux

Windows 10 包含一個原生方法來執行 Linux(以及 bash),如果安裝了 Windows Subsystem for Linux(WSL)。要安裝 WSL,請按照以下步驟:

  1. 點選 Windows 10 搜尋框。
  2. 搜尋控制檯。
  3. 點選程式和功能。
  4. 點選「開啟或關閉 Windows 功能」。
  5. 選擇「Windows Subsystem for Linux」核取方塊。
  6. 重新啟動系統。
  7. 開啟 Windows Store。
  8. 搜尋 Ubuntu 並安裝它。
  9. 安裝 Ubuntu 後,開啟 Windows 命令提示字元並輸入 ubuntu。

Windows 命令提示字元和 PowerShell

安裝 WSL 後,您可以直接從 Windows 命令提示字元和 PowerShell 使用 bash -c 命令執行 Linux 命令和 bash 指令碼。

命令列基礎

命令列是一個通用術語,指在發明 GUI 之前,向互動式電腦系統提供命令的方法。在 Linux 系統上,它是 bash(或其他)shell 的輸入。bash 的基本操作之一是執行命令,即執行另一個程式。當命令列上出現多個單詞時,bash 假設第一個單詞是要執行的程式名稱,其餘單詞是命令的引數。

例如,要讓 bash 執行名為 mkdir 的命令,並將兩個引數 -p/tmp/scratch/garble 傳遞給它,您需要輸入:

mkdir -p /tmp/scratch/garble

按照慣例,程式通常將其選項放在第一位,並以 - 開頭,就像這裡的 -p 選項一樣。這個特定的命令被告知要建立一個名為 /tmp/scratch/garble 的目錄。-p 選項指示使用者選擇特定的行為,即不會報告錯誤,並且會根據需要建立(或嘗試建立)任何中間目錄(例如,如果只有 /tmp 存在,則 mkdir 將首先建立 /tmp/scratch,然後再嘗試建立 /tmp/scratch/garble)。

內容解密:

  • mkdir 是用來建立目錄的命令。
  • -p 選項用於防止錯誤訊息的出現,並根據需要建立中間目錄。
  • 命令列上的第一個單詞是程式名稱,其餘的是引數。

命令、引數、內建指令與關鍵字

在Linux系統中,可執行的命令可能來自檔案、內建指令或關鍵字。檔案可以是編譯後的程式,如/bin/ls,也可以是指令碼檔案,例如使用bash、Python或Perl等語言撰寫的指令碼。內建指令是shell的一部分,不需要額外的檔案來執行,例如pwd指令。關鍵字則是shell語言的一部分,例如if,具有特定的語法結構。

辨識命令型別

可以使用type命令來辨識一個詞彙是關鍵字、內建指令還是可執行檔案。使用-t選項可以簡化輸出結果:

$ type -t if
keyword
$ type -t pwd
builtin
$ type -t ls
file

內容解密:

  1. type -t if:檢查if是否為關鍵字,輸出結果為keyword,表示if是shell語言的關鍵字。
  2. type -t pwd:檢查pwd是否為內建指令,輸出結果為builtin,表示pwd是shell的內建指令。
  3. type -t ls:檢查ls是否為可執行檔案,輸出結果為file,表示ls是一個可執行檔案。

列出可用命令、內建指令和關鍵字

可以使用compgen命令來列出可用的命令、內建指令和關鍵字。使用-c選項列出命令、-b選項列出內建指令、-k選項列出關鍵字:

$ compgen -k
if
then
else
elif
.
.
.

內容解密:

  1. compgen -k:列出所有可用的關鍵字,例如ifthenelse等。
  2. 使用不同的選項,可以列出不同型別的命令,例如-c列出命令、-b列出內建指令。

標準輸入/輸出/錯誤

在Unix/Linux/POSIX環境中,每個行程都有三個輸入/輸出檔案描述符:標準輸入(stdin)、標準輸出(stdout)和標準錯誤(stderr)。預設情況下,stdin來自鍵盤輸入,stdout和stderr輸出到終端畫面。

重定向輸入/輸出/錯誤

可以使用重定向符號來改變輸入/輸出的來源和目的地。例如:

handywork < data.in > results.out 2> err.msgs

內容解密:

  1. handywork < data.in:將data.in檔案的內容作為handywork命令的輸入。
  2. > results.out:將handywork命令的標準輸出重定向到results.out檔案。
  3. 2> err.msgs:將handywork命令的標準錯誤重定向到err.msgs檔案。

合併標準輸出和標準錯誤

可以使用以下語法將標準錯誤合併到標準輸出:

handywork < data.in > results.out 2>&1

或者使用簡寫方式:

handywork < data.in &> results.out

內容解密:

  1. 2>&1:將標準錯誤(2)重定向到與標準輸出(1)相同的目的地。
  2. &>:簡寫方式,將標準輸出和標準錯誤都重定向到同一個檔案。

丟棄標準輸出

可以將標準輸出重定向到/dev/null來丟棄輸出:

handywork < data.in > /dev/null

內容解密:

  1. > /dev/null:將標準輸出重定向到/dev/null,丟棄輸出。

同時顯示和儲存輸出

可以使用tee命令同時顯示輸出和儲存到檔案:

handywork < data.in | tee results.out

內容解密:

  1. | tee results.out:將handywork命令的輸出透過管道傳遞給tee命令,顯示輸出並儲存到results.out檔案。

管道和重定向的高階用法

附加到檔案

可以使用雙重大於符號(»)附加到檔案,而不是覆寫它:

handywork < data.in >> results.out

內容解密:

  1. >> results.out:將標準輸出附加到results.out檔案,而不是覆寫它。

合併標準輸出和標準錯誤並附加到檔案

可以使用以下語法合併標準輸出和標準錯誤並附加到檔案:

handywork < data.in &>> results.out

內容解密:

  1. &>> results.out:將標準輸出和標準錯誤合併並附加到results.out檔案。

背景執行指令與指令碼基礎

在探討指令碼編寫之前,瞭解如何在背景執行指令和指令碼至關重要。某些指令碼可能需要相當長的時間來執行,因此使用背景執行功能可以避免長時間等待。

使用 & 運算元將任務送到背景

使用 & 運算元可以將任何指令或指令碼放到背景執行。這樣一來,指令碼會繼續執行,同時可以使用 shell 發出其他指令或執行其他指令碼。例如,將 ping 指令放到背景執行並將標準輸出重新導向到檔案,可以使用以下指令:

ping 192.168.10.56 > ping.log &

內容解密:

  • ping 192.168.10.56:傳送 ICMP ECHO_REQUEST 封包到指定的 IP 地址。
  • > ping.log:將標準輸出重新導向到 ping.log 檔案。
  • &:將指令放到背景執行。

建議同時重新導向標準輸出和標準錯誤到檔案,以避免任務繼續在螢幕上列印輸出,幹擾其他作業:

ping 192.168.10.56 &> ping.log &

內容解密:

  • &>:同時重新導向標準輸出和標準錯誤到指定的檔案。

管理背景任務

使用 jobs 指令可以列出目前在背景執行的任務:

$ jobs
[1]+ Running ping 192.168.10.56 > ping.log &

使用 fg 指令加上對應的任務編號,可以將任務帶回前景:

$ fg 1
ping 192.168.10.56 > ping.log

內容解密:

  • jobs:列出背景任務及其狀態。
  • fg %1:將任務編號 1 帶回前景繼續執行。

如果任務目前在前景執行,可以使用 Ctrl-Z 暫停該行程,然後使用 bg 繼續在背景執行該行程:

$ ping 192.168.10.56
^Z
$ bg

內容解密:

  • Ctrl-Z:暫停目前在前景執行的任務。
  • bg:將暫停的任務放到背景繼續執行。