Я хочу добавить несколько правил или загрузить несколько готовых правил для обнаружения DoS-атак при декодировании метки DNS (перекрестная ссылка при декомпрессии DNS). Кто-нибудь может знать, как я могу это сделать?
Мне не известны какие-либо известные DoS-атаки на трюк декодирования / сжатия меток, который использует DNS (возможно, ссылки?). Тем не менее, вы можете разработать правило для обнаружения наличия указателя сжатия, используя byte_test
в качестве таких: byte_test:2,&,0xc000,0;
. Здесь используется побитовое И, чтобы замаскировать все, кроме двух старших битов, и посмотреть, равны ли они оба '11', что является маркером для указателя сжатия (оставшиеся 14 битов определяют смещение от начала полезной нагрузки до указанного DNS метка). Если этот byte_test возвращает true, вы обнаружили такой указатель и можете построить на его основе остальную часть правила. Вам решать, как пройти по пакету DNS, пока не достигнете места, где, как вы ожидаете, существует такой указатель.
Просмотрите протокол DNS, чтобы узнать о дополнительных странностях этого умного трюка.
Редактировать:
Размышляя об этом, я думаю, что это действительно возможно только со вторым байтом пакета. К сожалению, Snort сбрасывает doe_ptr
в начало полезной нагрузки с каждым новым параметром правила, если вы не укажете relative
любому из byte_*
варианты (я считать). Я не верю, что однобайтовая опция может относиться к предыдущей байтовой опции, только к совпадениям содержимого.
Итак, учитывая, что 99% ваших DNS-пакетов никогда не будут использовать оставшиеся 6 бит второго старшего байта, вы можете начать с поиска шестнадцатеричного значения 0xc0
, который в двоичном формате 11000000
. Это может заменить первый byte_test
.
alert udp any 53 -> any 1024: (msg:"DNS recursive Ptr test"; content:"|c0|"; byte_extract:1,0,dns_comp_ptr,relative,little; byte_test:1,=,dns_cmp_ptr,dns_comp_ptr,little; sid:12345; rev:1; classtype:yadda-yadda;)
Для того, чтобы:
content:"|c0|";
- Найдите указатель сжатия.byte_extract:1,0,dns_comp_ptr,relative,little;
- взять следующий байт и сохранить его в переменной dns_comp_ptr
(не проверено! Мое смещение может быть неправильным - возможно, потребуется добавить +1).byte_test:1,=,dns_cmp_ptr,dns_comp_ptr,little;
- проверьте один байт и посмотрите, равен ли он значению, хранящемуся в dns_comp_ptr
, после скачком значения, обозначенного dns_comp_ptr
, в формате с прямым порядком байтов (именно так мы его видим в Wireshark).Если последний byte_test
возвращает истину, тогда остальная часть правила будет проверять и предупреждать. Все в теории, конечно. Полностью непроверенный, и я не даю никаких гарантий, что он будет работать. Но он включает в себя основную идею необходимости проверять каждый указатель сжатия в ответе DNS (с ответом в домене Google, ожидайте несколько из них), чтобы увидеть, указывает ли этот указатель на себя, пройдя по нему хотя бы один раз.
Единственный способ, о котором я могу думать в любом случае, проверить оба байта, - это то, что вам понадобится способ перепрыгнуть через doe_ptr
к байту непосредственно перед указателем сжатия, то есть через содержимое. Snort не имеет опции правила, которая прямо говорит о перемещении doe_ptr
на указанное значение само по себе (хотя это действительно было бы крутой идеей, TBH).
Как только у вас будет doe_ptr
размещен правильно, вы используете byte_test:2,&,0xc000,1,relative,little;
чтобы замаскировать все биты, кроме первых двух, и посмотреть, соответствуют ли они шестнадцатеричному 0xc000
. Тогда ты делаешь byte_extract:2,0,dns_comp_ptr,little,bitwiseand 0x3fff;
затем byte_test:2,=,dns_comp_ptr,dns_comp_ptr,little;
. Опять не проверено, поэтому мои смещения, вероятно, неправильные. Я забыл, как Snort точно вертится с размещением байтов.
Кроме того, что bitwiseand 0x3fff
штуковина - мое собственное творение. byte_extract
в настоящее время нет способа выполнить битовую маску (которая является побитовой операцией И), чтобы извлечь только несколько бит в байте. Я сделал операнд.
PS, у меня нет доступных пакетов, чтобы проверить это. Может быть, в какой-то момент я смогу собрать что-то одно и попробовать.