Базовые техники и утилиты, облегчающие работу пентестера. Часть 1

Базовые техники и утилиты, облегчающие работу пентестера. Часть 1

Знания пентестера, в общем и целом, можно разделить на две категории: значимые и незначительные. Эти области знаний, соответственно, также можно разделить на непостоянные и постоянные.

Автор: Martin Murfitt

Знания пентестера, в общем и целом, можно разделить на две категории: значимые и незначительные. Эти области знаний, соответственно, также можно разделить на непостоянные и постоянные. Однако следует отметить, что это альтернативное разделение не является взаимозаменяемым; то есть незначительные знания не обязательно постоянные, а значимые не обязательно непостоянные, и может случиться так, что в той или иной ситуации значимые знания стали постоянными, а то, что считалось непостоянным, оказалось незначительным. Если вы немного запутались, то я раскрою свою мысль более подробно: постоянные знания становятся незначительными лишь при отсутствии условий применимых к любому значимому (или непостоянному) знанию. Также неоспорим и тот факт, что незначительные знания, о которых мы поговорим далее, сами по себе не могут привести к успешному проникновению в сеть и, следовательно, поэтому они и называются незначительными, поскольку они не имеют абсолютно ничего общего с незащищенностью системы. С другой стороны, без незначительных знаний, значимые знания намного менее эффективны – следовательно, как всегда, определение «незначительности» ограничено набором условий, целями и задачами. Приведем аналогию на примере сжатого воздуха: хранилище сжатого воздуха абсолютно бесполезно на поверхности земли, когда речь идет о возможности дышать (за исключением случаев, когда вокруг вас ядовитый газ или вы на вершине Эвереста), однако чрезвычайно полезно под водой. Хотя если говорить о космической орбите, где также существует недостаток воздуха, то хранилище с воздухом также бесполезно, поскольку без специального костюма вы замерзнете или сгорите под воздействием лучей солнца и не сможете сделать ни единого вдоха.

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

Дыры в безопасности системы исправляются: либо в коревой системе, либо во всех системах, находящихся под угрозой возможного заражения. По этой причине территория заражения ограничивает скоростью появления вторичных систем. В этом и есть суть непостоянства значимой информации, которая используется во время пентеста. Пентестер может работать весьма эффективно, имея в наличии недавний список уязвимостей. У уязвимостей с большим сроком давности весьма высока вероятность быть неактуальными и, следовательно, незначительными. С другой стороны, игнорирование древних уязвимостей может также привести к тому, что система будет находиться под угрозой проникновения извне и, исходя из этого, пентестеру следует начинать изучение всего этого хозяйства все более погружаясь вглубь истории. Подобная работа поистине колоссальна и мы, чтобы избежать быстрого устаревания информации, сосредоточились на изложении незначительных и постоянных знаний, которыми читатель, возможно, еще не обладает. Мы будем рассказывать о навыках и приемах, неподвластных времени и не имеющих прямого отношения к уязвимостям в системе, которые повышают эффективность работы во время пентестов. Эти приемы являются как бы платформой для поддержания постоянной боевой готовности в эпоху быстрого устаревания знаний. Само собой, данный подход также можно охарактеризовать как «сверху вниз», хотя также применим и термин «упрощенное обобщение», так как понятие «уязвимость» весьма неоднозначно. Конечно, с точки зрения пентестера многие интересные области исследования и аспекты безопасности не имеют номеров в справочнике CVE, а связаны со стандартными настройками, которые не изменялись со времени настройки системы на стороне различных поставщиков. Так почему же некоторые постоянные знания, имеющие отношение к безопасности весьма вероятно являются незначительными? По той же самой причине, почему многие из нас не умеют охотиться при помощи копья. Многие навыки и знания устарели и в основном не применимы в современном мире. Тем не менее, многие опытные пентестеры, например, еще не забыли, как эксплуатировать двойное декодирование в IIS 4.0. Сегодня мы, конечно, можем использовать это знание без привязки к историческим обстоятельствам и находить чрезвычайно полезные возможности. Например, размышляя о том, что атаки связанные с обходом директорий все еще встречаются в наши дни в «дикой» природе.

Однако мы немного отвлеклись и теперь вернемся к нашим так называемым «незначительным» знаниям, без которых вы не сможете стать хорошим пентестером. Хороший специалист по безопасности должен обладать множеством универсальных навыков, связанных с организацией и обработкой данных. Именно этому и посвящена эта серия статей – освоению постоянных навыков, не имеющих прямого отношения к безопасности, однако закладывающих хороший базис, отталкиваясь от которого вы уже сможете проводить полноценные пентесты. Ноль и единица всегда были неизменны, даже задолго до появления цифр, и всегда будут оставаться неизменными.

Вводное слово

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

В процессе повествования мы будем говорить об утилитах, идущих в составе пакета «Keystone», который доступен по адресу https://github.com/SpiderLabs/Keystone.

Сортировка по IP-адресу

Проводя пентесты по самым разным причинам нам часто нужно отсортировать IP-адреса в правильном порядке. Рассмотрим перечень неотсортированных IP-адресов:

192.168.1.2
192.168.1.1
2.10.3.8
192.168.1.100

Если мы попытаемся отсортировать их при помощи UNIX-утилиты «sort», то получим следующее:

192.168.1.1
192.168.1.100
192.168.1.2
2.10.3.8

Для начала неплохо, однако если сортировать по октетам, IP-адрес, начинающийся с «2» должен находится в начале списка, а IP-адрес, заканчивающийся на «100» должно стоять после IP-адреса, заканчивающегося на «2». Попытаемся использовать команду «sort -n» для числовой сортировки:

2.10.3.8
192.168.1.1
192.168.1.100
192.168.1.2

Еще лучше, однако 3-я и 4-я строка должны быть поменяны местами. Поиск в интернете помог нам сформировать команду, которая позволяет отсортировать так, как мы хотим:

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4

После выполнения команды получаем правильно отсортированный список:

2.10.3.8
192.168.1.1
192.168.1.2
192.168.1.100

Также можно смастерить простенький скрипт с именем «ipsort»:

#!/bin/sh
if [ -r $1 ]
then
sort -f $1 -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
else
sort -f - -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
fi

Теперь мы можем сортировать IP-адреса так:

ipsort <file>

либо так:

cat <file> | ipsort

Однако этот скрипт корректно работает не во всех случаях.

Ограничение 1 – информация в файлах может быть в другом формате

Скрипт работает некорректно в тех случаях, когда IP-адреса «разбавлены» другой информацией, содержащей точки:

1.1) 192.168.1.2
1.2) 192.168.1.1
1.3) 2.10.3.8
1.4) 192.168.1.100

Если вы попробуйте отсортировать IP-адреса, показанные выше, их порядок не изменится. Такое происходит потому, что порядок строк удовлетворяет условиям сортировки, а сам скрипт не в состоянии отличить октеты IP-адресов от других чисел.

Ограничение 2 – иногда нам нужно отбросить всю информацию, кроме IP-адресов

Часто помимо сортировки IP-адресов нам нужно сделать нечто большее: например, нужно получить перечень IP-адресов, отбросив всю остальную информацию. Рассмотрим следующий случай:

Nmap scan report for 192.168.1.2
Nmap scan report for 192.168.1.1
Nmap scan report for 2.10.3.8
Nmap scan report for 192.168.1.100

В данном случае сортировка прошла успешно, поскольку в строках отсутствуют точки, не относящиеся к IP-адресам:

Nmap scan report for 2.10.3.8
Nmap scan report for 192.168.1.1
Nmap scan report for 192.168.1.2
Nmap scan report for 192.168.1.100

Хотя префикс «Nmap scan report for» нам мало интересен, поскольку он мешает в дальнейшем производить сколь-нибудь полезные манипуляции с данными. Чтобы убрать лишнее, нам нужно использовать команду cut -f 5 -d ' ' (или нечто подобное).

Решение – улучшение скрипта ipsort

Давайте напишем более гибкую версию ipsort, используя Perl. В интернете существует несколько функций сортировки, и мы напишем обертку для одной из них:

#!/usr/bin/perl
sub ip {
@oa=split /\./, $a;
@ob=split /\./, $b; #/

$oa[0] <=> $ob[0]
or
$oa[1] <=> $ob[1]
or
$oa[2] <=> $ob[2]
or
$oa[3] <=> $ob[3]
}

while (<>) {
/(\d{1,3}\.){3}\d{1,3}/ or next;
push @ips, $&;
}

print join("\n",sort ip @ips)."\n";

Этот скрипт более эффективен, поскольку изначально происходит извлечение IP-адреса из каждой строки файла, а остальная информация отбрасывается. Если мы подадим на вход скрипта логи полученные от nmap, показанные выше, то получим список отсортированных IP-адресов. Более мощная версия этого скрипта, у которой уже есть несколько опций (которые, например, позволяют извлекать несколько IP-адресов из одной строки, или сортировать уникальные IP-адреса) можно найти в пакете Keystone на GitHub.

Преимущества от использования обновленной версии «ipsort» очевидны. Мало того, что мы можем искать IP-адреса в файле и извлекать их, мы также можем запускать фукнцию «ipsort» использую стандартные методы UNIX при помощи труб внутри любого другого процесса обработки данных – даже используя возможности на уровне команды grep с последующей автоматической сортировкой. Такая возможность чрезвычайно полезна.

Корректное сравнение списков IP-адресов

Возможно, многие из вас знакомы с UNIX-утилитой comm. Если коротко, то она позволяет сравнивать два файла, информация в которых отсортирована лексически. Пентестеру часто бывает необходимо сравнить два файла, содержащие IP-адреса. Существую различные ситуации, когда это может быть необходимо. Например, представим такую ситуацию, когда у нас есть два файла: в первом перечень IP-адресов с открытым 80 портом, во втором - перечень IP-адресов с открытым 443 портом. Наша задача: найти IP-адреса у которых открыт только 80 порт, только 443, а также IP-адреса у которых открыто оба порта. Мы можем сделать это визуально, если файлы небольшого объема. Однако при больших объемах выполнить эту операцию вручную весьма затруднительно.

Если мы попытаемся использовать отсортированный список IP-адресов, команда comm не будет работать должным образом. В качестве напоминания: первая колонка отображает строки уникальные для первого файла, вторая – для второго и третья отображает общие строки для обоих файлов. Вы также можете исключить любую колонку, используя параметры -1 -2 или -3 или любую их комбинацию.

cat list1.txt
2.10.3.8
192.168.1.1
192.168.1.2
192.168.1.100
$

Во второй файл мы добавляем еще один IP-адрес:

$ cat list2.txt
2.10.3.8
2.10.3.9
192.168.1.1
192.168.1.2
192.168.1.100
$

Запускаем команду comm:

$ comm list1.txt list2.txt
2.10.3.8
192.168.1.1
192.168.1.2
192.168.1.100
2.10.3.9
192.168.1.1
192.168.1.2
192.168.1.100

Очевидно, что результаты работы бессмысленны, поскольку строки идут в не лексикографическом порядке. Для того чтобы решить эту проблему изначально мы должны отсортировать их лексически. Команда sort без параметров позволяет решить эту задачу:

$ sort list1.txt | tee list1-lexical.txt
192.168.1.1
192.168.1.100
192.168.1.2
2.10.3.8
$

$ sort list2.txt | tee list2-lexical.txt
192.168.1.1
192.168.1.100
192.168.1.2
2.10.3.8
2.10.3.9
$

$ comm list1-lexical.txt list2-lexical.txt
192.168.1.1
192.168.1.100
192.168.1.2
2.10.3.8
2.10.3.9
$

Теперь мы получили корректный результат. Все строки кроме последней находятся в обоих файлах. Последняя строка (2.10.3.9) принадлежит только второму файлу (list2-lexical.txt).

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

В составе пакета Keystone есть утилита «scomm», которая упрощает решение этой задачи, но в этой статье не приводится процесс ее создания. Достаточно сказать, что утилита обладает в точности тем же самым функционалом, что и comm, за тем лишь исключением, что перед запуском происходит сортировка информации внутри файла. Теперь нам не нужно беспокоиться о порядке следования строк, и мы можем сосредоточиться на основной функции comm, которая заключается в том, чтобы показать нам, какие строки разные, а какие общие для двух файлов. Теперь вы никогда не будете использовать comm.

На этом я заканчиваю первую статью из этой серии. Во второй части мы поговорим об использовании grep во время пентестов. 

Ваш провайдер знает о вас больше, чем ваша девушка?

Присоединяйтесь и узнайте, как это остановить!