实验三
在我的服务器上安装AFL++
对afl_test进行测试,创建输入输出文件夹:fuzz_in和fuzz_out,用来存放程序的输入和fuzz的输出结果
准备开始对这个有漏洞的c文件进行模糊测试
AFL++ 检测到系统设置中,/proc/sys/kernel/core_pattern
文件的内容会将崩溃的核心转储(core dump)发送到外部程序(通常通过管道 |
指定的路径)。这会导致 AFL++ 在检测崩溃时出现延迟或误判。为了正常运行,AFL++ 要求直接将核心转储写入磁盘。
使用 AFL++ 提供的环境变量来跳过 core_pattern
的检测:
export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
afl-fuzz -i fuzz_in -o fuzz_out ./afl_test
再次开始
几秒钟跑完了…
发现是内存占用太多被OOM鲨了,按gpt说的弄了个啥交换空间
可以去输出目录里看相关情况
对curl进行fuzz
找到了入口程序是src/tool_main.c
将 AFL_INIT(argc, argv);
放在 main()
函数的最开始处,在进行任何其他初始化之前。这样,AFL++ 将能够在程序开始时就对命令行参数进行模糊测试。
处理完依赖问题通过下面的命令,构造makefile,之后make生成curl
CC=afl-gcc ./configure --disable-shared --with-ssl=/usr
提示说gcc过时了让使用clang
CC=afl-clang-fast ./configure --disable-shared --with-ssl=/usr
make得到curl,创建测试参数,只测试-A
echo -en "-A\x00" > ./in/testcase
en 选项用于确保 echo 不添加额外的换行符,并且 \x00 表示字符串的结束符(null 终止符) 开始进行fuzz
afl-fuzz -i ./in -o ./out ../curl/src/curl
通过设置 AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
,可以跳过崩溃信息的收集,避免因外部处理导致的延迟。
跑一晚上看看实力
早上起来看了一眼,好像效果还彳亍
想挂后台
export AFL_AUTORESUME=1
: 该环境变量告诉 AFL 如果它发现输出目录中已有数据(比如之前的 fuzz 数据),则自动恢复并继续从中断的地方开始,而不是从头开始。afl-fuzz -i ./out/default -o ./out/default ../curl/src/curl
: 这个命令会让 AFL 从输出目录./out/default
中加载之前的输入数据和状态,然后继续执行 fuzz 测试。
export AFL_AUTORESUME=1
afl-fuzz -i ./out/default -o ./out/default ../curl/src/curl
不太成功
afl-fuzz -i - -o ./out/default ../curl/src/curl 这个可以/
看了一下引发崩溃的样例,都没什么实际意义貌似,还是转回第一个一开始的程序了
afl-clang-fast -g -fprofile-arcs -ftest-coverage afl_test.c -o afl_test
fprofile-arcs
:生成用于追踪代码覆盖率的附加信息。ftest-coverage
:生成用于后续分析的文件(例如.gcda
文件)。g
:包含调试信息,方便gcov
提供更详细的报告。
使用 -t
参数来限制单个测试用例的最大执行时间,避免程序长时间占用 CPU 资源。afl-fuzz -i ./fuzz_in -o ./fuzz_out -t 1000 ./afl_test
跑了半小时
功保存了 8 个崩溃样本。测试过程中没有超时问题,且当前没有发现 hang(卡死)
实验二 dirty COW
应该不用交报告
修改只读文件/zzz
匹配11123修改为******
运行几秒后ctrl+c,成功(一开始试了几遍11111不知道为什么没成功,可能是因为11111有多个匹配?)
获取root
创建用户test111
尝试将uid从1001修改为0,打开的文件替换为/etc/passwd
好像不能直接写0为什么从1001改成0001了,试一下0000
修改成功
实验一
查看IP地址为192.168.88.142
按要求给出myprog.cgi
给足755权限后curl它输出Hello World
再给出myprog_environ.cgi
使用culr时的-A选项可以更改环境变量HTTP_USER_AGENT
尝试获取/etc/shadow
curl -A “() { echo Shellshock;};/bin/ls -l” http://192.168.88.142/cgi-bin/myprog.cgi
curl -A ”() { echo Shellshock;}; echo Content-type:text/plain; echo; /bin/ls -l” http://192.168.88.142/cgi-bin/myprog.cgi
对两个cgi都行,不过对于第二个cgi攻击成功后不会再打印环境变量
执行cat命令打印、etc/shadow权限不足,
为啥现在不行了
居然是因为大括号后面没有空格,之后再去细看原因吧
另开一台虚拟机,准备远程反向shell,首先确保kail(192.168.88.140)可以访问Ubuntu(192.168.88.142)
方便起见后面都在kali操作了
果然,我是www-data,没有高级权限去直接获取shadow
尝试远程shell
攻击机监听
下面的命令可以建立连接。但是现在还是没有提权
由于是老版本,尝试一下通过内核漏洞提权阿巴
我的虚拟机网络配置还是有问题,之后有时间看看,这次的解决方式是外部下载dirtyCOW的代码zip拖入攻击机后通过在攻击机开通http服务器让反向shell获得的www-data下载pokemon(马上用来提权的内核漏洞代码)到/tmp目录下
给pokemon加一个执行权限
目标机上给sudoers备个份,怕玩坏了
好像不太行。明天再看看
换了个方法,还是内核漏洞,cve-2017-16995
找了个c测试运行的时候被杀掉了,换一个试试
换回dirtycow了
ubuntu靶机打不开了。。
重装了,下次记得点快照,这次不知道怎么不小心点到关机了,当时应该是改变了什么系统设置没保存,还好之前下载了八小时的压缩包没有删除,
重装后的新分配ip是192.168.88.143
重新连接上了,继续试一下dirtycow
将cc1添加到环境变量后编译成功了
好像成了
成不了一点
打开一个伪终端后可以提权,root密码是seedubuntu
,ganjieyoudianmianxiangjieguozhaodaanl
对于bash
-A依旧可以修改,但是不再能成功攻击
- en 选项用于确保 echo 不添加额外的换行符,并且 \x00 表示字符串的结束符(null 终止符) 开始进行fuzz