在CTF Pwn下使用AppArmor做权限隔离

最近接触了下AppArmor以及刚好最近部署某比赛,突然不想用docker做权限隔离,所以做了个记录

AppArmor

安装

sudo apt-get install apparmor-profiles apparmor-utils

创建配置文件

在生成配置文件前,需要做个软连接,因为aa-autodep是通过Path去寻找目标程序的。所以我这里先

sudo ln -s /home/binfile /usr/local/bin/binfile

然后..

1
2
cd /etc/apparmor.d/
sudo aa-autodep binfile

此刻 /etc/apparmor.d 目录下就会生成一个 home.binfile 的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
# Last Modified: Tue Aug  6 18:49:37 2019
#include <tunables/global>

/home/binfile flags=(complain) {
#include <abstractions/base>

/home/binfile mr,
/lib/x86_64-linux-gnu/ld-*.so mr,

}

切换为 Complain 模式

sudo aa-complain home.binaryname

紧接着正常运行程序以及exploit

配置规则

sudo aa-logprof 生成记录运行过程中的正常日志

生成的规则如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Last Modified: Tue Aug  6 19:39:38 2019
#include <tunables/global>

/home/hub flags=(complain) {
#include <abstractions/base>

/bin/dash cx -> /bin/dash,
/bin/dash mr,
/home/hub mr,
/lib/x86_64-linux-gnu/ld-*.so mr,


profile /bin/dash flags=(complain) {
#include <abstractions/base>

/bin/cat mrix,
/bin/dash mr,
/bin/ls mrix,
/home/ r,
/home/* r,
/lib/x86_64-linux-gnu/ld-*.so mr,

}
}

由于自动生成配置文件并不是那么完美,因此我们要手动修改。

  1. 由于远程需要,需要加上network inet stream
  2. 我仅仅需要读取 flag,因此需要修改可读文件目录

最后修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <tunables/global>

/home/hub {
#include <abstractions/base>

network inet stream,
/bin/dash mrix,
/bin/bash mrix,
/bin/cat mrix,
/bin/ls mrix,
/usr/bin/id mrix,
/lib/x86_64-linux-gnu/ld-*.so mr,
/tmp/server mr,
/tmp/ r,
/tmp/flag r,


^/bin/bash {
}
}

当修改完配置文件,我们需要将它导入内核使用:

apparmor_parser -r /etc/apparmor.d/home.hub

或者

aa-enforce /etc/apparmor.d/home.hub

其实说来这个配置文件就是一个白名单,意味着如果一些内容多写进到白名单里,可能会造成权限配置不当。

与xinetd 合用

配置文件

由于用来配置 ctf pwn,所以我们还需一个守护进程,这里我选择xinetd,配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
service pwn_server
{
socket_type = stream
protocol = tcp
user = root
group = root
server = /home/limit.sh
wait = no
per_source = 50
banner = /home/banner
}

limit.sh

1
2
3
4
5
#! /bin/sh
ulimit -u 10000
ulimit -c 0
ulimit -v 7340032
/home/hub

并在 /etc/services 加上相应的服务名称与端口,例如:

1
2
3
4
pwn_server      12435/tcp
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp

最后 service xinetd start 启动即可。

冲!XD