Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
rndis-co — CVE-2022-25375 - Демо-эксплойт RNDIS USB Gadget | Kitploit
Инструменты/GitHubGitHub/szymonh/rndis-co
Криминалистика памятиАнализ уязвимостейЭксплуатацияАппаратная БезопасностьЭксплуатация Бинарных Файлов
GitHubszymonh/rndis-co

rndis-co

CVE-2022-25375 - Демо-эксплойт RNDIS USB Gadget

Репозиторий
8214 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

RNDIS-CO

Краткое описание

USB-гаджет RNDIS может быть использован для дампа содержимого адресного пространства ядра через механизм обновления пакетного фильтра.

Описание

Обработчик управляющего запроса USB RNDIS_MSG_SET — rndis_set_response — вызывает gen_ndis_set_resp, передавая указатель на буфер, смещённый на BufOffset + 8. Переменная BufOffset берётся из RNDIS-сообщения и не проверяется на соответствие границам буфера. Следовательно, манипулируя четырёхбайтовым полем InformationBufferOffset структуры rndis_set_msg_type, атакующий может сместить фактический буфер на величину до 0xffffffff байт.

rndis.c — rndis_msg_parser

root@kitploit:~
	case RNDIS_MSG_QUERY:
		return rndis_query_response(params,
					(rndis_query_msg_type *)buf);

	case RNDIS_MSG_SET:
		return rndis_set_response(params, (rndis_set_msg_type *)buf);

rndis.c — rndis_set_response

root@kitploit:~
 static int rndis_set_response(struct rndis_params *params,
			      rndis_set_msg_type *buf)
{
	u32 BufLength, BufOffset;
	rndis_set_cmplt_type *resp;
	rndis_resp_t *r;

	r = rndis_add_response(params, sizeof(rndis_set_cmplt_type));
	if (!r)
		return -ENOMEM;
	resp = (rndis_set_cmplt_type *)r->buf;

	BufLength = le32_to_cpu(buf->InformationBufferLength);
	BufOffset = le32_to_cpu(buf->InformationBufferOffset);

#ifdef	VERBOSE_DEBUG
	pr_debug("%s: Length: %d\n", __func__, BufLength);
	pr_debug("%s: Offset: %d\n", __func__, BufOffset);
	pr_debug("%s: InfoBuffer: ", __func__);

	for (i = 0; i < BufLength; i++) {
		pr_debug("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
	}

	pr_debug("\n");
#endif

	resp->MessageType = cpu_to_le32(RNDIS_MSG_SET_C);
	resp->MessageLength = cpu_to_le32(16);
	resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
	if (gen_ndis_set_resp(params, le32_to_cpu(buf->OID),
			((u8 *)buf) + 8 + BufOffset, BufLength, r))
		resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
	else
		resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);

	params->resp_avail(params->v);
	return 0;
}

Далее код, отвечающий за обработку OID RNDIS_OID_GEN_CURRENT_PACKET_FILTER, устанавливает текущий пакетный фильтр в значение, на которое указывает указатель buf. С применённым смещением это позволяет прочитать два байта по заданному адресу и сохранить значение в пакетном фильтре.

rndis.c — gen_ndis_set_resp

root@kitploit:~
	switch (OID) {
	case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:

		/* these NDIS_PACKET_TYPE_* bitflags are shared with
		 * cdc_filter; it's not RNDIS-specific
		 * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in:
		 *	PROMISCUOUS, DIRECTED,
		 *	MULTICAST, ALL_MULTICAST, BROADCAST
		 */
		*params->filter = (u16)get_unaligned_le32(buf);
		pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER %08x\n",
			__func__, *params->filter);

Следующий шаг — получение значения пакетного фильтра с помощью комбинации USB_CDC_SEND_ENCAPSULATED_COMMAND с RNDIS_MSG_QUERY для OID RNDIS_OID_GEN_CURRENT_PACKET_FILTER и управляющих запросов USB_CDC_GET_ENCAPSULATED_RESPONSE.

Повторение операций установки/получения пакетного фильтра с увеличенным InformationBufferOffset в RNDIS-запросе позволяет извлекать до 0xffffffff байт памяти ядра по два байта за раз. Для больших объёмов данных процесс довольно медленный, но всё же эффективный.

root@kitploit:~
 $ sudo python3 rndisco.py -v 0x1b67 -p 0x400c -l 0x3fffc > /tmp/rpi_rndis.dmp
 strings /tmp/rpi_rndis.dmp -n8 | tail -n 6
 stp_proto_unregister
 <30>Jan 27 14:39:48 dhcpcd[486]: usb0: IAID be:53:70:24
 <30>Jan 27 14:39:46 dhcpcd[486]: usb0: IAID be:53:70:24
 <30>Jan 27 14:39:46 dhcpcd[486]: usb0: adding address fe80::6f70:c737:89e:697a
 <30>Jan 27 14:39:40 dhcpcd[486]: usb0: carrier lost
 <30>Jan 27 14:39:48 dhcpcd[486]: usb0: adding address fe80::6f70:c737:89e:697a

Воздействие

Устройства Linux, предоставляющие USB-гаджеты RNDIS, могут быть использованы для извлечения конфиденциальной информации.

CVE

CVE-2022-25375

Патч

  • usb: gadget: rndis: check size of RNDIS_MSG_SET command
  • ChangeLog-5.16.10
Скачать инструмент