28 марта, 2024

Введение в регулярные выражения

Содержание:

С возвращением, мои хакеры!

Эта тема может показаться немного запутанной, но мы вам обещаем, что эта статья принесет вам пользу не только как хакеру, но и как системному администратору. Мы рассмотрим то, что обычно называют регулярными выражениями, или если кратко regexp — регулярка.

Манипулирование текстом в Linux

Помните, что почти все в Linux — это файл, и большинство этих файлов является простыми текстовыми файлами. В отличие от Windows, где для настройки приложений или серверов используются консоли управления snap-in и MMC, в Linux используются для конфигурации обычные текстовые файлы. Изменяя файл, вы меняете конфигурацию. В результате пионеры Linux разработали довольно продуманные и элегантные способы манипулирования текстом.

Чуть раньше мы рассмотрели несколько простых способов манипулирования текстом, например grep и sed, но при помощи регулярных выражений у нас появится возможность находить текст по более сложным шаблонам.

Например, среди миллиона строк кода нам нужно найти строку, которая начинается с буквы «s», содержит только буквы «sugr», числа 1-5 и оканчивается на «bb». Можем ли мы найти ее, не просматривая эти миллионы строк? Да — с помощью регулярного выражения!

Почему важно изучать регулярные выражения

Регулярные выражения используются в мире информационных технологий везде. Впервые разработанные в 1956 году и примененные Кеном Томпсоном (Ken Thompson) в оригинальной Unix, сейчас они по-своему применяются в Java, Ruby, PHP, Perl, Python, MySQL, Apache, .NET и, конечно же, в Linux.

Без понимания регулярных выражений ваша способность писать код на любом из этих языков будет хромать, и вы не будете уметь делать больше, чем простой и утомительный поиск и замена. Кроме того, многие правила, записанные в Snort и других системах обнаружения вторжений, написаны в регулярных выражениях. При поиске какого-либо вредоносного кода важна способность искать и находить сложные и запутанные текстовые шаблоны.

Читать также:  Как удаленно вести прослушку микрофона на взломанном компьютере

Как регулярные выражения работают в области безопасности

В этой статье мы будем использовать примеры из правил Snort для того, чтобы осветить, как именно регулярные выражения работают в области хакинга и информационной безопасности.

Шаг 1. Правила Snort

Snort является одним из многих приложений и скриптовых языков, которые используют регулярные выражения. Благодаря своей способности обнаруживать практически любой тип атаки, Snort без возможности использования регулярных выражений станет буквально неработающим продуктом. Давайте рассмотрим новое правило, которое появилось всего несколько недель назад для обнаружения атаки Ransomware, следы которой были обнаружены во всем мире.

Правило Snort для обнаружения Ransomware-атаки

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:»MALWARE-CNC Win.Ransomware.PRISM outbound connection attempt — Get lock screen»; flow:to_server,established; content:»GET»; http_method; content:»/page/index_htm_files2/»; nocase; fast_pattern:only;
pcre:»/\x2f((xr)_a-z)|[0-9]{3,}\x2e(css|js|jpg|png|txt)$/U»;
http_uri; metadata:impact_flag red, policy balanced-ips drop, policy security-ips drop, ruleset community, service http; reference:url,http://www.virustotal.com/en/file/417cb84f48d20120b92530c489e9c3ee9a9deab53fddc0dc153f1034d3c52c58/analysis/1377785686/; classtype:trojan-activity; sid:1000033; rev:3;)

Конец правила

Обратите внимание на раздел, который выделен жирным шрифтом. Это часть правила, которая использует pcre для обнаружения Ransomware.

Мы вернемся к этому правилу в следующей статье, а сейчас давайте пока посмотрим на простое правило Snort, использующее регулярное выражение. Если вы пока не знакомы с правилами Snort, то обязательно ознакомьтесь с нашей предыдущей статьей по чтению и написанию правил для Snort.

Для нашего примера используем следующее псевдоправило:

alert tcp any any -> any 80 ( pcre:»/\/foo.php?id=[0-9]{1,10}/»;)

Первая часть этого правила должна быть нам знакома. Она говорит: «Отправить предупреждение (alert), когда к нам попадает пакет через проводное соединение, используя tcp-протокол с любого IP-адреса, с любого порта, на любой IP-адрес на 80-й порт». Это то, что идет сразу после заголовка этого правила, которое является для нас пока новым и странным.

Читать также:  Использование Raspberry Pi в роли Dead Drop для анонимного офлайнового общения

Теперь наша задача — выяснить, что же ищет это правило.

Шаг 2. Немного базового синтаксиса

Прежде чем мы попытаемся расшифровать, что же собственно ищет это правило, давайте рассмотрим основной синтаксис регулярных выражений и их правила.

  • / — Начинает и заканчивает регулярное выражение.
  • . — Означает любой символ.
  • [] — Соответствует одному символу в скобках.
  • [^] — Соответствует всему, кроме того, что находится между скобками (и после знака ^).
  • [x-y] — Соответствует любому символу или числу, находящемуся между x и у (например: [ad] будет соответствовать буквам a, b, c или d, а [2-7] будет соответствовать номерам 2,3,4,5, 6 и 7. По умолчанию они чувствительны к регистру и могут быть объединены любым образом, как вам нравится. Например, чтобы получить соответствие любому буквенно-цифровому символу, вы можете использовать [A-Za-z0-9]).
  • ^ — Начало строки.
  • * — Соответствует предшествующему символу или группе (от ноля раз и более).
  • $ — Конец строки.
  • () — Определяет выражение или группу.
  • {n} — Соответствует предшествующему символу, повторенному n раз (например: {5} требует, чтобы предшествующий символ или группа повторялись 5 раз).
  • {m, n} — Соответствует предшествующему элементу не менее m раз и не более n раз (например: {2,4} требует, чтобы предшествующий символ или группа отображались от 2 до 4 раз подряд).
  • | — Соответствует символу или группе либо до или (OR) после |.

Шаг 3. Интерпретация правила

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

pcre:«/\/foo.php?id=[0-9]{1,10}/»;
  • pcre: — говорит движку Snort использовать регулярные выражения Perl Compatible Regular для всего, что последует за ним.
  • « — означает начало содержимого.
  • / — Указывает на начало подвыражений, по которым ищет PCRE.
  • \ — Это escape-символ — он говорит: «Не используйте специальное значение, которое есть у последующего символа в pcre», но вместо этого рассматривай его как буквенный символ.
  • /foo.php?id= — Это простой текст — правило ищет этот набор символов.
  • [0-9] — Это выражение означает, что ищутся любые цифры в диапазоне от 0 до 9.
  • {1,10} — Фигурные скобки говорят о том, что предшествующие цифры должны повторяться от 1 до 10 раз.
  • / — Завершить выражение, по которому осуществляется поиск.
Читать также:  Основы Linux. Часть 19 (создание ссылок на файлы)

Таким образом, мы могли бы интерпретировать это правило на человеческом языке следующим образом: «Ищите предположительно URL-адрес, который заканчивается на «foo.php?id=», а затем идет одна цифра от 0 до 9 и эта цифра может повториться от 1 до 10 раз».

Это правило будет перехватывать пакеты такого вида:

  • foo.php?id=1
  • foo.php?id=3
  • foo.php?id=33
  • foo.php?id=333333

Но будут проходить вот такие пакеты:

  • bar.php?id=1 — bar вместо foo
  • foo.php?id= — должен иметь хотя бы одну цифру
  • foo.php?id=A — должен иметь цифру, а не букву
  • foo.php?id=11111111111 — должен иметь только от 1 до 10 цифр после знака =

На этом мы завершаем наше введение в регулярные выражения, но мы скоро вернемся к этой теме и углубимся в этот мощный, но загадочный язык для того, чтобы вы могли читать регулярное выражение так же свободно, как вы читаете эту страницу.

Добавить комментарий