20253302 实验四《Python程序设计》实验报告
20253302 2025-2026-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2533
姓名: 王紫晗
学号:20253302
实验教师:王志强
实验日期:2026年5月17日
必修/选修: 公选课
1.实验内容
基于 CVE-2026-31431(CopyFail)的自动化渗透测试工具设计与实现
- 综合运用 Python 网络编程、异常处理、模块化设计、命令行参数解析等技术,开发一个完整的渗透测试工具。
- 华为云服务器进行漏洞环境搭建
- 理解漏洞(CVE-2026-31431)的原理,并通过命令注入和内核漏洞利用演示完整的攻击链。
- 将普通脚本扩展为可调用的渗透测试工具,对功能进行增强
2. 实验设计、过程及结果
2.0设计
- 为什么选择网络安全方向?
我是通信工程的学生,我喜欢网络安全,跟大二的去打过CTF,觉得很好玩,很有意思。做漏洞利用主要是前两天看到了那个CVE-2026-31431的漏洞发布嘛,觉得有意思就做了(截至到现在,这个漏洞原理造成的恶意代码已经有4个了)。做远程攻击纯粹是因为我的WEB题没做对过(,想模拟一次作对的感觉。 - CVE-2026-31431 漏洞介绍
CVE-2026-31431(Copy Fail)是 Linux 内核中的一个本地权限提升漏洞。攻击者利用该漏洞可向内存页缓存写入恶意数据,从而将用户权限提升至root。该漏洞影响内核版本4.14至6.18.22。 - 攻击方法
1.通过网页漏洞执行命令
目标网站是一个 Ping 工具,我输入8.8.8.8; whoami,它就会把分号后面的 whoami 当成系统命令执行(从sql注入的原理想到的思路)。因为网站是用 nobody 这个低权限用户运行的,所以我现在只能以 nobody 的身份操作。
2.上传并运行提权代码
把核心的漏洞利用代码,通过同样的方式注入到服务器上,让它跑起来。
3.验证是否提权成功
提权代码运行后,会自动把 id 命令的结果写入 /tmp/pwned 文件。我再用网页漏洞执行 cat /tmp/pwned,如果看到里面有 uid=0(root),就证明攻击成功,已经拿到了服务器的最高权限。
验证是否提权成功
提权代码运行后,会自动把 id 命令的结果写入 /tmp/pwned 文件。我再用网页漏洞执行 cat /tmp/pwned,如果看到里面有 uid=0(root),就证明攻击成功,我已经拿到了服务器的最高权限。
2.1服务器购买并进行手动降核至漏洞影响范围
在华为云购买一台弹性云服务器 ECS,选择 Ubuntu 22.04 操作系统,安全组配置(开放 5000 端口)。通过 SSH 连接到服务器,将内核手动降级至 5.15.0-24-lowlatency,使其处于 CVE-2026-31431 漏洞影响范围内。


2.1.2在服务器部署web服务并启动
创建vuln_ping.py,并安装flask,启动web服务,这个web服务的代码实现的功能是ping功能。


2.1.3服务端代码设计
1.网页模板部分
是一个ping的服务

2.漏洞核心:命令拼接
代码不对用户输入做任何过滤或转义,用户输入什么就会写命令里。本来输入8.8.8.8,执行的命令是ping -c 2 8.8.8.8。但输入8.8.8.8; whoami,执行的命令就变成了ping -c 2 8.8.8.8; whoami,所以whoami也会被系统执行。

2.2从github上找到732字节的copy-fail核心代码并将其加工成工具

自己的脚本代码总共尝试23版,最终可行代码又进行迭代4次,最终实现如下功能
1.环境检测:添加对目标 Web 服务可达性、命令注入漏洞、内核版本、algif_aead 模块加载状态的自动检测,检测结果以表格形式输出。
2.内核判断:根据获取到的内核版本字符串,自动分析是否处于 CVE-2026-31431 的影响范围(4.14 至 6.18.22),并给出明确提示。
3.漏洞利用:攻击的发送与验证。
4.信息收集:获取目标主机名、当前用户、内核详细信息、IP 地址,并特别添加 /tmp/pwned 内容作为提权证据展示项。
5.痕迹清理模块:删除攻击过程中产生的临时文件/tmp/pwned。
6.报告生成:支持将检测结果、利用状态、后渗透信息整合为 JSON 格式文件,通过 --report 参数指定保存路径。
7.命令行参数系统:实现 -t(目标 URL)、--check(检测)、--exploit(利用)、--post(后渗透)、--full(完整攻击链)、--clean(清理)、--report(生成报告)等参数,支持自由组合调用。
还有锦上添花的输出美化:使用 ANSI 彩色输出、状态符号(✔/✘)、表格边框、emoji 图标等提升终端可读性。
2.2.1第一代my_copy_fail
这一代的代码只是一个脚本,只能攻击我在代码内置的ip,不能像sqlmap一样自己根据攻击设置url,而且像图片一样,没有对该服务器是否开启进行测试,如果失败会返回报错,但是如果服务器压根没有开启会一直等待,不会报错。


2.2.2第二代my_copy_fail
这一代代码也只能算一个脚本,不能自己设置url,但是开启了超时后的检测,如果超时会自动返回网络错误。

2.2.3第三代my_copy_fail
这一代代码开始算一个工具,能自己设置url,开启了超时后的检测。

2.2.4第四代my_copy_fail
这是最后一代,在完善功能的基础上进行了输出美化并加入了等待动画。

2.3工具的部分代码截图及介绍
1.--check功能部分代码介绍

内核版本判断

核心模块是否开启判断

check功能总共测试服务器4个功能(Web 服务、命令注入、内核版本、algif_aead模块)是否开启或是否满足渗透条件,并准确判断哪个没有开启
2.--exploit功能部分代码介绍
run_exploit() 函数先把提权代码转成十六进制字符串,再拼接到 python3 -c "exec(bytes.fromhex('...').decode())" 这条命令里,上传给目标服务器执行。verify_exploit() 函数则再次发送请求,执行 cat /tmp/pwned,检查文件里有没有uid=0字样,有就说明提权成功。

exploit把攻击代码发过去并检查是否拿到了 root 权限。
3.--post功能部分代码介绍
post收集目标服务器的信息,有主机名、当前用户、提权证据、内核版本、IP 地址,并变成类似表格的形式展示给用户。

4.--full功能部分代码介绍
依次调用环境检测 、漏洞利用、后渗透收集三个模块。实现完整的链路攻击

full一键全自动攻击,检测——提权——收集信息
5.--clean功能部分代码介绍
它定义了一个文件列表,包括 /tmp/pwned 和其他测试留下的临时文件,然后逐个发送 rm -f 命令删除它们。

clean清理攻击痕迹,把服务器上留下的临时文件删干净,恢复原样。
6.--report功能部分代码介绍
使用两个函数,generate() 把环境检测结果、漏洞利用状态、后渗透信息打包成一个字典,save() 把这个字典转成 JSON 格式写入文件。JSON 报告里还带有时间戳和目标 URL。

report 把整个攻击过程的结果保存为JSON文件
2.4成功实现注入

2.5程序运行视频
2.6代码托管到gitee上
3. 实验过程中遇到的问题和解决过程
- 问题1:我注入总是发生失败,显示无法提权
![注入失败]()
- 问题1解决方案:发现是有超时检测,如果超过5秒自动断联,所以将5秒限制删去。
![超时]()
- 问题2:验证提权结果时仍显示 nobody
- 问题2解决方案:直接求助22级的大佬以及强哥,发现是因为使用了两次shell。最初在提权后直接注入
whoami验证,但每次命令注入都启动独立shell进程,无法保留上一次的root权限。改为让提权代码自行执行whoami > /tmp/pwned写入证据文件,再由另一次注入读取该文件,验证逻辑修正后成功。
![image]()
对全课进行总结,课程感想体会、意见和建议
总结:本学期python课挺丰富的,对python有了一些基本的概念,了解了IDE和解释器分别是什么,搭建了python开发环境,学会了一些基础语法和python的具体应用,比如用套接字实现通信和网络爬虫。除了理论,还有编码的时候的具体操作,比如异常处理和程序调试。在python的具体编写中,我对python的字符串怎么用,输入输出,函数怎么定义和调用,什么是面向对象,正则表达式,类,对象分别是什么。还有怎么用python写数据库的调用方法。
感想:我印象最深的是网络爬虫那一节课。因为这部分最接近现实,对实践有很大的作用。从此我也理解了为什么在ctf里面python是最重要的,因为真的可以直接应用,在c语言或者c++部分我并没有学会和现实生活很相关的部分,但是在python里,我找到了很多相关点,可以应用到现实和比赛中去。
建议:其实写代码花的时间其实没有很多,但是排查哪里出现问题的时候花的时间最多,如果能专门安排一节课讲解错误信息分析,无论是语法错误还是逻辑错误我觉得对学python都有帮助。




浙公网安备 33010602011771号