Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #90, ИЮНЬ 2006 г.

HACK-FAQ

1dt.w0lf

Хакер, номер #090, стр. 090-062-2


A: Расскажите про уязвимость socket hijacking

Q: Уязвимость socket hijacking, она же захват службы или сокета, заключается в следующем. Многие службы в дефолтовых настройках при открытии портов биндят сокет таким образом, чтобы слушать все интерфейсы, что в выводе netstat выглядит, как 0.0.0.0:порт или *.*.*.*:порт. Это позволяет службе обрабатывать запросы, пришедшие на заданный порт, вне зависимости от сетевого интерфейса машины, на который пришел пакет. Также если в системе созданы несколько сокетов, один из которых слушает все интерфейсы на определенном порту, а другой слушает определенный интерфейс, например 192.168.0.1, на том же порту, что и предыдущий, то при переходе запроса на 192.168.0.1 он будет обрабатываться сокетом, забинденным на этот интерфейс, а не сокетом на все интерфейсы. Естественно, просто так использовать порт, уже занятый системой, не получится. Для того чтобы отобрать себе порт, нужно воспользоваться опцией сокета O_REUSEADDR. Она позволяет с помощью функции bind связаться с портом, даже если существуют ранее установленные соединения, использующие его в качестве своего. Параметр SO_REUSEADDR позволяет множеству экземпляров одного и того же сервера запускаться на одном и том же порте, если все экземпляры связываются с различными локальными ip-адресами. Из всего вышеперечисленного следует, что если атакующий, используя опцию SO_REUSEADDR, создаст сокет на определенном локальном интерфейсе с портом, совпадающим с номером порта, запущенного в системе демона, то он сможет перехватывать запросы, идущие к демону. Для большинства служб, таких как http, ftp, etc, это не составит проблемы, поскольку они связываются с привилегированным портом, меньшим 1024, для использования которых необходимы права root-пользователя. Следовательно, любой процесс, пытающийся завладеть этим портом, также требует прав привилегированного пользователя. В большинстве нормальных операционных систем для использования уже связанных непривилегированных портов также требуются права пользователя, от которого запущен уже работающий сервис. Все описанное справедливо для большинства систем, но не для всех. В Windows-системах, например, захват порта является вполне тривиальной задачей. Для иллюстрации всего вышеописанного можно воспользоваться небольшим кодом на перле:

#!/usr/bin/perl

use IO::Socket;

$|++;

if(@ARGV < 2) { print "Usage $0 <IP> <PORT>\n"; exit(); }

print "Try create socket ...";

$sock = IO::Socket::INET->new( Listen => 20,

Назад на стр. 090-062-1  Содержание  Вперед на стр. 090-062-3
Hosted by uCoz