前言
编译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

评论