核心模組是 Linux 系統的核心擴充套件機制,允許動態載入和解除安裝功能,無需重新編譯核心。這提供了高度的靈活性,但也伴隨著安全風險。核心模組在底層執行,擁有系統的最高許可權,一旦遭到惡意利用,後果不堪設想。Rootkit 就是一種典型的惡意核心模組,它能隱藏自身的存在,並允許駭客完全控制系統。瞭解核心模組的運作機制對於系統管理員和資安人員至關重要。透過 uname -a 和 /proc/version 可以檢查核心版本,sysctl 則能調整核心引數,例如 IP 轉發,這在網路管理和安全設定中扮演重要角色。不當的 IP 轉發設定可能導致中間人攻擊,使駭客得以竊取或篡改網路流量。管理核心模組需要謹慎,使用 lsmod 可以檢視已載入的模組,modinfo 可取得模組資訊,而 modprobe 提供了安全的載入和移除模組的方式,相較於 insmod 和 rmmod 更能避免因模組依賴性問題導致的系統錯誤。此外,自動化任務排程也是系統管理的重要一環,cron 和 crontab 提供了傳統的排程方式,而 systemd 則更為現代化且功能豐富,能更精細地控制任務的執行時機和條件。
核心模組的威力與安全挑戰
在現代資訊科技的世界中,核心(Kernel)是作業系統的核心部件,負責管理硬體資源、執行使用者應用程式並確保整個系統的穩定執行。然而,核心模組(Kernel Module)不僅提供了靈活性和可擴充套件性,也帶來了潛在的安全風險。本文將探討核心模組的結構、功能及其在安全領域中的影響。
核心模組的基本概念
核心的角色與功能
核心是作業系統的核心部件,類別似於人體的中樞神經系統,負責協調所有硬體和軟體之間的互動。它管理CPU、記憶體和硬碟等硬體資源,並啟動必要的服務。Linux作為一個單一式核心(Monolithic Kernel),允許動態載入和解除安裝模組,這使得系統管理員可以靈活地新增或移除功能。
可載入核心模組(LKM)
可載入核心模組(Loadable Kernel Module, LKM)是指可以在不重新啟動系統的情況下載入到核心中的模組。這些模組通常用於安裝新的裝置驅動程式或系統擴充套件。然而,由於LKM可以直接存取核心的低層級功能,這也使得它們成為駭客攻擊的目標。
核心模組與安全風險
根通訊端(Rootkit)
根通訊端是一種特殊的惡意軟體,它會嵌入到作業系統的核心中,通常透過LKM來實作。一旦惡意軟體嵌入到核心,駭客就能夠完全控制作業系統,甚至篡改系統報告的程式、埠、服務和硬碟空間等資訊。
駭客攻擊案例
如果駭客能夠誘使Linux管理員載入一個包含根通訊端的驅動程式,那麼駭客不僅能夠控制目標系統,還能夠透過操控核心層級來掩蓋自己的存在。這種攻擊方法使得一些最隱蔽且難以發現的根通訊端得以利用Linux和其他作業系統。
管理與除錯核心
檢查核心版本
瞭解當前執行的核心版本是管理和除錯核心的第一步。可以使用以下命令來檢查:
uname -a
此命令會傳回當前系統的Linux發行版本、核心版本、架構等資訊。例如:
Linux Kali 4.6.0-kali-amd64 #1 SMP Debian 4.6.4-kali1 (20160721) x86_64
此外,還可以使用cat /proc/version命令來取得相同資訊:
cat /proc/version
這些資訊在安裝或載入核心驅動程式時可能會很有用。
內容解密:
上述程式碼範例展示瞭如何使用uname -a和cat /proc/version命令來檢查當前執行的核心版本。這些命令提供了關於核心建置、架構和發行版本等詳細資訊。這些資訊對於核心管理和驅動程式安裝非常重要。
調整核心引數
使用sysctl命令可以調整核心引數,例如記憶體分配、網路功能和強化核心防禦。所有透過sysctl進行的更改僅在當前會話中有效,重啟後將失效。要使更改永久生效,需要編輯/etc/sysctl.conf組態檔案。
sysctl -a | less
這個命令會列出所有可調整的核心引數。例如,要啟用IP轉發(用於中間人攻擊):
sysctl -w net.ipv4.ip_forward=1
為了使這個更改永久生效,需要編輯/etc/sysctl.conf檔案:
# 在 /etc/sysctl.conf 中找到並取消註解以下行
net.ipv4.ip_forward = 1
中間人攻擊與IP轉發
中間人攻擊
在中間人攻擊(MITM)中,駭客將自己置於兩個通訊主機之間,攔截並可能修改通訊內容。透過啟用IP轉發,駭客可以實作這種攻擊。
啟用IP轉發
預設情況下,IP轉發是停用的。要啟用它,可以使用以下命令:
sysctl -w net.ipv4.ip_forward=1
這樣就允許核心轉發接收到的資料包。
####### 權證
如何在 Linux 上啟用 IP 轉送
在 Linux 系統中,啟用 IP 轉送是一個常見的需求,特別是在設定路由器或網路橋接時。IP 轉送允許系統轉送來自一個網路介面的封包到另一個網路介面。這裡,玄貓將詳細說明如何在 Linux 上啟用 IP 轉送。
檢查與修改 sysctl.conf
首先,我們需要編輯 /etc/sysctl.conf 檔案來啟用 IP 轉送。這個檔案用於設定系統變數。開啟 /etc/sysctl.conf 檔案並找到以下行:
#net.ipv4.ip_forward=1
這行是被註解掉的,代表 IP 轉送功能尚未啟用。移除這行前面的 # 符號即可啟用 IP 轉送:
net.ipv4.ip_forward=1
應用變更
修改完 sysctl.conf 檔案後,我們需要使用 sysctl -p 命令來應用這些變更。在終端機中輸入以下命令:
sudo sysctl -p
這個命令會重新讀取 sysctl.conf 檔案並應用其中的設定。
內容解密:
- sysctl:這是一個用於動態地修改核心引數的命令。
- /etc/sysctl.conf:這個檔案包含了一系列的核心引數設定,可以在系統啟動時自動載入。
- net.ipv4.ip_forward=1:這個引數啟用了 IPv4 的 IP 轉送功能,允許系統轉發封包。
- sysctl -p:這個命令會重新讀取並應用
/etc/sysctl.conf檔案中的設定。
檢查 IP 轉送狀態
要確認 IP 轉送是否已成功啟用,可以使用以下命令:
sudo sysctl net.ipv4.ip_forward
如果傳回值為 net.ipv4.ip_forward = 1,表示 IP 轉送已成功啟用。
檢查與管理核心模組
除了啟用 IP 轉送外,我們還需要了解如何管理核心模組。Linux 提供了多種方法來管理核心模組,包括 lsmod、insmod、rmmod 和 modprobe 命令。
使用 lsmod 檢查已載入的模組
lsmod 命令可以列出目前已載入的核心模組及其相關資訊:
lsmod
這個命令會顯示所有已載入的模組及其大小和使用情況。
使用 modinfo 取得模組資訊
要取得某個模組的詳細資訊,可以使用 modinfo 命令。例如,要取得關於 Bluetooth 模組的資訊,可以執行:
modinfo bluetooth
這個命令會顯示有關 Bluetooth 模組的詳細資訊,包括版本、描述、作者和依賴項。
新增與移除模組
使用 modprobe 命令可以安全地新增或移除核心模組。例如,要新增某個模組:
sudo modprobe <module_name>
要移除某個模組:
sudo modprobe -r <module_name>
次段落標題:為什麼選擇 modprobe?
modprobe 命令比起傳統的 insmod 和 rmmod 有更多優勢。它能夠自動處理模組之間的依賴關係,並確保在新增或移除模組時不會導致系統不穩定。
控制 ICMP Echo Requests
從硬化作業系統的角度來看,我們可以透過禁止 ICMP Echo Requests(ping 命令)來增加安全性。這樣可以讓攻擊者更難發現和找到我們的系統。要禁止 ICMP Echo Requests,可以在 /etc/sysctl.conf 中新增以下行:
net.ipv4.icmp_echo_ignore_all=1
新增完畢後,執行 sysctl -p 命令應用變更。
Linux 核心模組管理概覽
Linux 提供了多種方法來管理核心模組(Kernel Modules),包括 lsmod、insmod、rmmod 和 modprobe
lsmod:列出已載入的核心模組
使用 lsmod 命令可以列出當前已經載入核心中的所有模組及其詳細資訊:
lsmod
該命令輸出將包括每個模組的名稱、大小、以及該模組是否被其他模組所使用。
modinfo:取得核心模組資訊
如果想了解某個特定核心模組的更多資訊(例如 Bluetooth 模組),可以使用 modinfo 命令:
sudo modinfo bluetooth
該命令將輸出有關 Bluetooth 模組的詳細資訊,例如許可證、版本、描述、作者和依賴項等。
modprobe:安全地新增和刪除核心模組
最現代且推薦使用的是 modprobe 命令。與傳統的 insmod 和 rmmod 不同的是,
此圖示 圖示解說
- 圖示展示了不同核心模組管理工具之間的比較。傳統工具如
insmod和rmmod雖然能夠插入和移除核心模組,但因為缺乏對依賴關係的處理而容易導致錯誤。相比之下,現代工具如modprobe能夠安全地處理依賴關係並減少風險。 - insmod 和 rmmod 是傳統工具,Modprobe 是現代工具。
- Modular Dependencies 是指核心模組之間可能存在的依賴關係。
- Error-prone 意味著容易出錯,Safe Handling 意味著安全處理。
玄貓建議使用 modprobe 進行核心模組管理以確保系統穩定性和安全性。
載入與移除核心模組(Kernel Modules)
在進行載入與移除核心模組(Kernel Modules)的操作之前,讓我們先來瞭解一下核心模組的基本概念。核心模組是可載入或解除安裝的程式碼,可以在不重啟系統的情況下動態地新增到核心中。這對於需要載入特定硬體驅動或擴充套件核心功能的情況非常有用。然而,核心模組也可能成為安全風險,因為它們可以被惡意程式利用來插入潛伏的後門或監控裝置。
安裝與測試新的影片驅動
假設我們剛安裝了一張新的顯示卡,並需要安裝相應的驅動程式。這些驅動通常會直接安裝到核心中,以便獲得必要的存取許可權以正常執行。因此,核心模組成為惡意駭客的潛在目標,因為他們可以利用這些模組插入後門或其他監聽裝置。
假設我們想要載入一個名為 HackersAriseNewVideo 的新影片驅動,以下是操作步驟:
- 使用
modprobe命令來載入新模組:
kali > modprobe -a HackersAriseNewVideo
- 使用
dmesg命令來檢查是否成功載入:
kali > dmesg | grep video
這個命令會列出所有含有 “video” 的核心訊息。如果沒有任何訊息顯示,則表示成功載入。
- 若要移除該模組,可以使用相同的命令但新增
-r選項:
kali > modprobe -r HackersAriseNewVideo
核心模組的安全風險
可載入核心模組(LKMs)對於 Linux 使用者和管理員來說是一種便利,但同時也是一個主要的安全弱點。專業駭客應該熟悉這些弱點,因為 LKMs 可以成為插入後門並控制系統的完美工具。
如果駭客能夠說服系統管理員載入惡意的 LKM,他們就可以完全控制系統,通常系統管理員甚至不知道這一點。因此,管理員必須小心檢查任何試圖載入到核心中的模組。
實務案例:檢查與列出核心模組
以下是一些實務操作:
- 檢查核心版本:
kali > uname -r
- 列出已載入的核心模組:
kali > lsmod
- 啟用 IP 轉發:
kali > sysctl -w net.ipv4.ip_forward=1
- 編輯
/etc/sysctl.conf檔案以啟用 IP 轉發:
# 編輯檔案並新增以下行:
net.ipv4.ip_forward = 1
# 然後重新載入 sysctl 組態:
kali > sysctl -p
- 關閉 IP 轉發:
kali > sysctl -w net.ipv4.ip_forward=0
- 使用
modinfo檢視特定核心模組資訊:
kali > modinfo <module_name>
圖示:核心模組流程
此圖示展示了載入與移除核心模組的基本流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 核心模組:Linux 系統的擴充套件與安全挑戰
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自動化任務排程(Job Scheduling)
每個使用 Linux 的人都會遇到需要定期執行某些任務、指令碼或其他操作的情況。例如,您可能希望自動定期備份系統檔案,或者像第11章中所做的一樣旋轉日誌檔案。相比之下,駭客可能希望每晚或在上班或上學時執行 MySQL 掃描器指令碼。這些都是自動排程工作的例子。
排程定期工作
排程工作允許您在不必考慮它們時執行任務,並且可以排程工作在您不使用系統時執行,以便您擁有足夠的自由資源。Linux 管理員或者說駭客也可能希望在系統啟動時自動啟動某些指令碼或服務。
在本章中,您將瞭解如何使用 crond 守護程式和 crontab 來設定指令碼自動執行,即使在系統無人看管時也是如此。此外還將瞭解如何設定啟動指令碼來自動執行在每次系統啟動時所需的服務。
自動化工具:cron 與 crontab
最常用於排程定期任務的是 cron 和 crontab 。 cron 是一個後台執行的守護程式,它會檢查 crontab 中需要在指定時間執行哪些命令。我們可以修改 crontab 來排程每天、每週或每個月固定日期、時間執行任務。
要排程這些任務或工作,將它們輸入 /etc/crontab 檔案中。crontab 檔案有七個欄位:前五個用於排程執行任務的時間、第六欄位指定使用者、第七欄位是要執行命令的絕對路徑。
每個時間欄位代表不同的一個時間元素:分鐘、小時、月份中的一天、月份和星期中的一天。以下表格總結了這些時間表示法:
| 欄位 | 時間單位 | 說明 | |
- |
- |
- | | 1 | 分 | 0-59 | | 2 | 小時 | 0-23 | | 3 | 月份中的一天 | 1-31 | | 4 | 月份 | 1-12 | | 5 | 星期中的一天 | 0-7(0 和 7 均代表星期日) |
支援工作排程範例
假設我們想要每天午夜執行一個名為 /path/to/script.sh 的指令碼:
0 0 * * * root /path/to/script.sh
每週一凌晨三點執行指令碼範例:
0 3 * * MON root /path/to/weekly_script.sh
自動化工具:systemd 與 timer
現代 Linux 發行版通常使用 systemd 作為初始化系統和服務管理器。Systemd 提供了更多功能和更靈活地組態自動化任務。
以下是 systemd 的 timer unit 用於排定週期性任務範例:
- 建立 timer unit 檔案
/etc/systemd/system/example.timer:
[Unit]
Description=Example Timer
[Timer]
OnCalendar=*-*-* *:00:00;Mon-Fri;* # 每天午夜執行, 僅限星期一至五.
Persistent=true # 若錯過一次排定, 下次會執行.
[Install]
WantedBy=timers.target # 預設啟用時, 加入 timers.target.
- 建立對應 service unit 檔案
/etc/systemd/system/example.service:
[Unit]
Description=Example Service
[Service]
ExecStart=/path/to/your/script.sh # 指定要執行之指令碼.
Type=simple # 指定服務型別, simple 是最簡單形式.
- 啟用並開始 timer unit:
sudo systemctl enable example.timer # 啟用 timer unit.
sudo systemctl start example.timer # 啟動 timer unit.