前言
编译server时,会报错
fatal error: bits/libc-header-start.h: 没有那个文件或目录
可以通过以下命令完善lib
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
这个时候可以成功编译server了
Task 1
首先为 touchstone 程序添加 setuid root 权限,并执行
在/tmp目录下创建test.txt文件,并将其 owner 改成 root
touch /tmp/test.txt
sudo chown root /tmp/test.txt
接下来修改exploit代码,需要修正lib的地址和一些函数的偏移地址
其中frame pointer的值server已经给出(非常节约任务量)
修改后的exploit代码如下(记得把ul_arg取消注释)
运行python3 exploit-template.py 127.0.0.1 80
,/tmp目录下的test.txt成功删除!
Task 2
修改server程序,添加chroot支持(记得重新编译)
使用chroot-setup.sh
改变root directory为/jali
,并在jali中启动server
chmod +x chroot-setup.sh chroot-copy.sh
sudo ./chroot-setup.sh
cd /jail
sudo ./touchstone
执行chroot-setup.sh
脚本,注意这里如果系统选的中文,那么需要注释掉sh脚本中的开始的特权级判断
#!/bin/sh -x
# if id | grep -qv uid=0; then
# echo "Must run setup as root"
# exit 1
# fi
运行touchstone程序,并更新exploit程序中的lib基地址(因为用到的lib已经复制到了jail目录下,位置已经发生改变)和frame base
# 查看基地址
ps -ef | grep banksv
sudo gdb
attach xxxx # banksv's pid
info proc mappings
再次执行攻击,发现无法删除/tmp下的test.txt文件
Task 3
修改server源码,在提示的三个地方使用setresuid(1000,1000,1000)
设置为普通用户权限.重新编译
修改exploit代码中的framebase和基地址,执行攻击。发现无法删除root用户的test.txt文件
Task 4
首先安装seccomp库
sudo apt install libseccomp-dev libseccomp2 seccomp
sudo apt-get install libseccomp-dev:i386
默认拒绝 显示允许
修改banksv.c
代码如下,添加如下代码。实现系统调用的默认拒绝,以及对于unlink的显式允许。
void Seccomp(){
// init seccomp
scmp_filter_ctx ctx;
// 默认拒绝
ctx = seccomp_init(SCMP_ACT_KILL);
// permit unlink
int rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW,SCMP_SYS(unlink), 0);
seccomp_load(ctx);
seccomp_release(ctx);
}
修改Makefile中编译banksv的选项,添加-l seccomp
重新编译后,可以看到bansv的动态库使用的是i386的文件,这个时候可以按照Task 1的思路重新确定exploit代码中的各个偏移。
修改exploit脚本并运行,/tmp下的test.txt成功删除!
默认允许 显示拒绝
修改banksv.c
代码如下。实现系统调用的默认允许,以及对于unlink的显式拒绝。
再次使用exploit脚本进行攻击,发现无法删除test.txt
Task 5
首先安装apparmor拓展
sudo apt install apparmor-utils
允许server,并使用aa-genprof
为banksv
生成profile
重新加载配置文件
sudo systemctl reload apparmor.service
通过aa-status
指令可以看到刚刚给banksv创建的profile成功被加载
执行exploit脚本,无法删除文件,并且通过dmesg
打印系统消息可以看到banksv的行为被apparmorDENIED
,无法删除test.txt