Чтение онлайн

ЖАНРЫ

Защита от хакеров корпоративных сетей

авторов Коллектив

Шрифт:

Взлом паролей

Инструменты, такие как dsniff и Ettercap, перехватывают не только пароли, но также и зашифрованные пароли. В теории перехват зашифрованных паролей бесполезен. Однако люди выбирают слабые пароли, такие как слова из словаря. Нарушителю требуется всего несколько секунд перебрать словарь из 100 000 слов, сравнивая зашифрованную форму слова из словаря с зашифрованным паролем. Если совпадение найдено, нарушитель подобрал пароль. Данные программы для взлома паролей уже существуют. Инструменты, такие как dsniff and Ettercap, легко выдают зашифрованные пароли в виде, читаемом этими программами.

Обман коммутаторов

Коммутаторы вошли в моду несколько лет назад, и много людей считают, что если у них есть сеть с коммутатором, то это делает невозможным для нарушителя использовать анализатор трафика для перехвата информации из нее. Пришло время развеять данное заблуждение, как вы убедитесь в этом, когда мы рассмотрим методы прослушивания сетевого трафика в коммутируемых сетях.

ARP Spoofing

В процессе попытки прослушивания сетевого трафика в коммутируемых сетях вы столкнетесь с серьезной проблемой: коммутатор ограничит трафик, проходящий в вашем сегменте сети. Коммутатор содержит внутренний список MAC-адресов хостов, находящихся на каждом порту. Трафик посылается на порт только в том случае, если хост назначения прописан и присутствует на этом порте. Существует возможность перезаписать ARP-кэш

на многих операционных системах, что позволит вам ассоциировать свой MAC-адрес с IP-адресом шлюза по умолчанию. Это приведет к тому, что весь исходящий трафик от хоста будет передаваться вам. Вам понадобится убедиться, что вы вручную добавили запись в таблицу ARP для настоящего шлюза, для того чтобы трафик передавался ему, и также убедиться, что IP-ретрансляция включена.

Также было обнаружено, что сети на кабельных модемах тоже уязвимы для данного типа атаки, поскольку они по существу являются сетями Ethernet, в которых модемы играют роль мостов. В двух словах: на данный момент не существует решения для защиты от данного вида атак, и новые сети на кабельных модемах будут использовать альтернативные механизмы подключения пользователей к сети.

Анализатор трафика dsniff для данной атаки включает в себя программу arpspoof (некогда arpredirect).

arpspoof переадресовывает пакеты от хоста (или всех хостов) в локальной сети, предназначенные для другого хоста в локальной сети поддельными ARP-ответами. Это является чрезвычайно эффективным способом прослушивания сетевого трафика на коммутаторе. – dsniff FAQ

MAC Flooding

Для выполнения своих задач коммутатор хранит таблицу всех MAC(Ethernet-адресов хостов на каждом порту. Если большое количество адресов фигурирует на одном порте, заполнение таблицы адресов на коммутаторе приводит к тому, что коммутатор уже не имеет записи, к какому порту соединяется MAC-адрес жертвы. Та же ситуация имеет место, когда новая машина впервые соединяется к коммутатору, и он должен узнать, где адрес расположен. Во время этого коммутатор должен посылать копии кадров для этого MAC-адреса всем портам, на практике это известно как flooding.

Анализатор сетевого трафика dsniff включает в себя программу macof, которая облегчает волновое распространение пакетов (flooding) для коммутатора случайными MAC-адресами:

macof наполняет локальную сеть случайными MAC-адресами (вызывая тем самым падение коммутатора в открытый режим ретрансляции, облегчающий прослушивание сетевого трафика). Прямая Сипортация оригинального Perl Net::RawIP, программа macof написана Яном Витеком (Ian Vitek) <ian.vitek@infosec.se>. – dsniff FAQ

Игры маршрутизации

Данный метод обеспечивает то, что весь сетевой трафик будет проходить через ваш хост, посредством изменения таблицы маршрутизации того хоста, который вы собираетесь прослушивать. Это возможно осуществить, посылая поддельное сообщение объявления маршрутизации посредством протокола информации маршрутизации (RIP) и провозглашая себя шлюзом по умолчанию. В результате весь трафик будет маршрутизироваться через ваш хост. Убедитесь, что вы включили ретрансляцию IP и ваш шлюз по умолчанию настроен на реальный сетевой шлюз. Весь исходящий трафик с хоста будет проходить через ваш хост на реальный сетевой шлюз. Вы не сможете получить входящий трафик, разве только если у вас есть возможность изменить таблицу маршрутизации на шлюзе по умолчанию для перемаршрутизации всего входящего трафика обратно вам.

Исследование программных интерфейсов приложений операционных систем

Операционные системы предоставляют или не предоставляют интерфейсы с уровнем сетевых соединений. Рассмотрим несколько операционных систем, для того чтобы определить, как они взаимодействуют с их уровнем сетевых соединений.

Linux

Linux предоставляет интерфейс с уровнем сетевых соединений посредством интерфейса сокета. Он является одним из самых простых интерфейсов, предоставляемых любой операционной системой. Следующая программа иллюстрирует, насколько он прост. Программа открывает указанный интерфейс, устанавливает «безразличный» режим и далее приступает к чтению Ethernet-пакетов из сети. Когда пакет прочитан, в дополнение к типу пакета запоминаются MAC-адреса источника и получателя.

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <linux/if_arp.h>

#include <linux/if_ether.h>

#include <linux/sockios.h>

#include <net/ethernet.h>

int open_interface(char *name)

{

struct sockaddr addr;

struct ifreq ifr;

int sockfd;

/* open a socket and bind to the specified interface */

sockfd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL));

if (sockfd < 0)

return -1;

memset(&addr, 0, sizeof(addr));

addr.sa_family = AF_INET;

strncpy(addr.sa_data, name, sizeof(addr.sa_data));

if (bind(sockfd, &addr, sizeof(addr)) != 0) {

close(sockfd);

return -1;

}

/* check to make sure this interface is ethernet, otherwise

exit */

memset(&ifr, 0, sizeof(ifr));

strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));

if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {

close(sockfd);

return -1;

}

if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {

close(sockfd);

return -1;

}

/* now we set promiscuous mode */

memset(&ifr, 0, sizeof(ifr));

strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));

if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {

close(sockfd);

return -1;

}

ifr.ifr_flags |= IFF_PROMISC;

if (ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0) {

close(sockfd);

return -1;

}

return sockfd;

}

/* read ethernet packets, printing source and destination

addresses */

int read_loop(sockfd)

{

struct sockaddr_in from;

char buf[1792], *ptr;

int size, fromlen, c;

struct ether_header *hdr;

while (1) {

/* read the next available packet */

size = recvfrom(sockfd, buf, sizeof(buf), 0, &from,

&fromlen);

if (size < 0)

return -1;

if (size < sizeof(struct ether_header))

continue;

hdr = (struct ether_header *)buf;

/* print out ethernet header */

for (c = 0; c < ETH_ALEN; c++)

printf(“%s%02x”,c == 0 ? “” : “:“,hdr-

>ether_shost[c]);

printf(“ > ”);

for (c = 0; c < ETH_ALEN; c++)

printf(“%s%02x”,c == 0 ? “” : “:”,hdr-

>ether_dhost[c]);

printf(“ type: %i\n”, hdr->ether_type);

}

}

int main(int argc, char **argv)

{

int sockfd;

char *name = argv[1];

if (!argv[1]) {

fprintf(stderr, “Please specify an interface name\n”);

return -1;

}

if ((sockfd = open_interface(name)) < 0) {

fprintf(stderr, “Unable to open interface\n”);

return -1;

}

if (read_loop(sockfd) < 0) {

fprintf(stderr, “Error reading packet\n”);

return -1;

}

return 0;

}

BSD

Операционные

системы, основанные на BSD, такие как OpenBSD, FreeBSD, NetBSD и BSDI, предоставляют интерфейс к канальному уровню посредством размещенного в ядре драйвера Berkeley Packet Filter (BPF). BPF располагает несколькими очень хорошими отличительными особенностями, которые чрезвычайно эффективны в обработке и фильтрации пакетов.

Драйвер BPF имеет в ядре механизм фильтрации. Он представляет собой встроенную виртуальною машину, состоящую из нескольких очень простых байтовых операций, позволяющих обследование каждого пакета посредством маленькой программы, загруженной в ядро пользователем. Всякий раз, когда пакет получен, данная программа оценивает его и определяет, следует ли предать его для приложения на стороне пользователя. Выражения компилируются в простой байт-код на стороне пользователя и далее загружаются в драйвер посредством вызова ioctl

Libpcap

libpcap не является интерфейсом операционной системы, точнее, он является переносимой межплатформенной библиотекой, которая значительно облегчает сетевой доступ к канальному уровню во множестве операционных систем. Библиотека libpcap первоначально была разработана в Lawrence Berkeley Laboratories (LBL). Ее целью является абстрагировать интерфейс канального уровня на различных операционных системах и создать простой стандартизованный программный интерфейс приложения (API). Это позволяет создать портативный код, который может быть написан для использования одного интерфейса вместо многочисленных на множестве операционных систем. Данный факт значительно упрощает технику написания анализаторов сетевого трафика в сравнении с объемом работ, необходимых для выполнения такого кода на разнообразных операционных системах.

Исходная версия от LBL была значительно улучшена с ее последнего официального релиза. Она имеет лицензию системы с открытым кодом (лицензия BSD) и, следовательно, может быть использована в коммерческом программном обеспечении, а также позволяет неограниченные модификации и редистрибуцию.

Исходная LBL-версия может быть найдена на ftp://ftp.ee.lbl.gov/libpcap.tar.Z. Команда tcpdump.org, принявшая разработку TCPDump, также приняла разработку libpcap. Свежая версия libpcap может быть найдена на www.tcpdump.org.

По сравнению с анализатором сетевого трафика, написанного под операционную систему Linux, используется «родной» интерфейс, анализатор сетевого трафика для Linux, использующий libpcap, намного проще, как показано далее:

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <net/ethernet.h>

#include <pcap/pcap.h>

pcap_t *open_interface(char *name)

{

pcap_t *pd;

char ebuf[PCAP_ERRBUF_SIZE];

/* use pcap call to open interface in promiscuous mode */

d = pcap_open_live(name, 1600, 1, 100, ebuf);

f (!pd)

return NULL;

return pd;

}

int read_loop(pcap_t *pd)

{

const unsigned char *ptr;

int size, c;

struct pcap_pkthdr h;

struct ether_header *hdr;

while (1) {

/* read the next available packet using libpcap */

ptr = pcap_next(pd, &h);

if (h.caplen < sizeof(struct ether_header))

continue;

hdr = (struct ether_header *)ptr;

/* print out ethernet header */

for (c = 0; c < ETH_ALEN; c++)

printf(“%s%02x”,c == 0 ? “” : “:”,hdr-

>ether_shost[c]);

printf(“ > ”);

for (c = 0; c < ETH_ALEN; c++)

printf(“%s%02x”,c == 0 ? “” : “:”,hdr-

>ether_dhost[c]);

printf(“ type: %i\n”, hdr->ether_type);

}

}

int main(int argc, char **argv)

{

pcap_t *pd;

char *name = argv[1];

if (!argv[1]) {

fprintf(stderr, “Please specify an interface name\n”);

return -1;

}

pd = open_interface(name);

if (!pd) {

fprintf(stderr, “Unable to open interface\n”);

return -1;

}

if (read_loop(pd) < 0) {

fprintf(stderr, “Error reading packet\n”);

return -1;

}

return 0;

}

Windows

К сожалению, операционные системы семейства Windows не предоставляют функциональной возможности доступа к сети на канальном уровне. Мы должны приобрести и установить пакет драйвера стороннего производителя для получения доступа к данному уровню. До недавнего времени не существовало общедоступных драйверов, для которых не нужна лицензия. BPF-образный драйвер на данный момент уже написан и поддерживает BPF-механизм фильтрации в ядре. Также существует портация библиотеки libpcap, которая в сочетании с драйвером предоставляет интерфейс, такой же простой его UNIX, как аналог. Драйвер, портация libpcap, так же как и Windows-версия TCPDump, доступны на http://netgroup-serv.polito.it/windump.

Защитные меры

Итак, вы, наверное, думаете, что все потеряно и вы не можете ничего сделать для предотвращения прослушивания сетевого трафика вашей сети, правильно? Не все потеряно, вы убедитесь в этом в данном разделе.

Обеспечение шифрования

К счастью, для состояния сетевой безопасности шифрование (используемое должным образом) является «серебряной пулей», которая делает пакетные анализаторы бесполезными. Зашифрованная информация, полагая, что механизм шифрования является эффективным, разрушит все попытки нарушителя пассивно прослушивать вашу сеть.

Многие существующие сетевые протоколы имеют аналоги, которые полагаются на стойкие алгоритмы шифрования и всеобъемлющие механизмы, такие как IPSec, предоставляют это для всех протоколов. К сожалению, IPSec не используется широко в Интернете вне частных корпораций.

Secure Shell (SSH)

Secure Shell является криптографически стойкой заменой rlogin, rsh и rcp команд стандартного Telnet. Она состоит из клиента и сервера, которые используют криптографию с открытым ключом для обеспечения шифрования сессии. Secure Shell также предоставляет возможность ретрансляции произвольных портов через шифрованные соединения, являющиеся очень удобными для ретрансляции X11 Windows и других соединений.

SSH получила широкое признание как безопасный механизм для интерактивного доступа к удаленным системам. SSH зародилась и первоначально разрабатывалась финским разработчиком Тату Ялоненом (Tatu Ylonen). Оригинальная версия SSH стала коммерческой, и, несмотря на то что первоначальная версия до сих пор бесплатна, лицензия стала более ограничительной. Была создана общедоступная спецификация, результирующая разработку некоторого числа разных версий программного обеспечения SSH-клиента и сервера, не содержащих данных ограничений (в большинстве те, которые запрещают коммерческое использование).

Оригинальная версия SSH, написанная Тату Ялоненом, доступна на ftp://ftp.cs.hut.fi/pub/ssh/. Новая коммерческая SSH может быть приобретена у компании SSH Communications Security (www.ssh.com), которая предоставляет коммерческие версии бесплатно для общепризнанных университетов.

Полностью бесплатная версия SSH-совместимого программного обеспечения, OpenSSH, разработанного проектом операционной системы OpenBSD (как показано на рис. 10.8), может быть получена на www.openssh.com.

Поделиться с друзьями: