Создаем уязвимые виртуальные машины в два счета с SecGen +26




Сегодня я хочу обратить ваше внимание на интересный проект SecGen при помощи которого становится возможным иметь каждый день новый Metasploitable или другую виртуальную машину для изучения основ этичного хакинга.

Все происходит в автоматическом режиме, нужно лишь установить фреймворк. Начинаем!

Как это работает?


SecGen представляет из себя скрипт, написанный на ruby. В основе его работы лежат Vagrant и Puppet.

Напомню, что Vagrant — это инструмент, позволяющий быстро и удобно разворачивать целые инфраструктуры из виртуальных машин, используя гипервизоры VirtualBox, VM Ware локально или облачный сервис Amazon AWS. Вы можете описать все настройки будущей виртуальной машины в специальном файле Vagrantfile. И вам не придется скачивать ISO-образы ОС, т.к. Vagrant уже предлагает множество готовых образов виртуальных машин (box), которые можно скачать из специального каталога.

А Puppet — средство автоматизации настройки машин, пришедшее на замену bash скриптам. Puppet имеет понятный язык описания конфигураций. Скрипты хранятся в файлах с расширением .pp. Puppet может установить определенный софт на машину, прежде проверив, что система удовлетворяет требуемым условиям, выполнить его настройку, задать переменные окружения и многое другое.

Таким образом SecGen нужно лишь выбрать какой box скачать и развернуть при помощи Vagrant, какой софт установить и настроить при помощи Puppet и сгенерировать флаги, которые нужно найти пентестеру в процессе эксплуатации.

SecGen имеет модульную структуру и каждый модуль представляет из себя дистрибутив с уязвимым приложением, его настройки, puppet-скрипты и некоторые дополнительные файлы для его корректной обработки SecGen.

Установка


Официально тестирование проводится на дистрибутиве Ubuntu и процесс установки описан на официальном github. Я буду использовать 64-битную Ubuntu 16.04.3, которая сама является виртуальной машиной с 2.5 ГБ RAM.

Устанавливаем требуемые пакеты

sudo apt-get install ruby-dev zlib1g-dev liblzma-dev build-essential patch virtualbox ruby-bundler vagrant imagemagick libmagickwand-dev exiftool

Также вам (возможно) потребуется установить еще один пакет, не указанный на официальном сайте

sudo apt-get install libpq-dev

Теперь клонируем репозиторий github

git clone https://github.com/cliffe/SecGen.git

Переходим в созданный каталог и выполняем установку всего необходимого

cd SecGen
bundle install

Начнут устанавливаться необходимые библиотеки Ruby



Проверяем, что скрипт работает

ruby secgen.rb --help

И видим доступные опции



Создаем свою первую машину со случайным набором уязвимостей


Это базовый режим работы SecGen, если никакие ключи не задавать. Выполняем команду

ruby secgen.rb run

Начнется скачивание Vagrant box-а, который для нас автоматически выбрал SecGen



Когда Vagrant образ виртуальной машины скачался и был импортирован, происходит запуск виртуальной машины



Автоматически настраивается форвард SSH для доступа к машине на порт 2222. Генерируется ключ, SecGen подключается к машине, устанавливает rsync и производит установку и настройку всего необходимого.



Обратите внимание, что если у вашей хостовой машины нет прямого доступа к репозиториям, а вы работаете, например, через прокси, то процесс установки прервется, так как гостевая виртуальная машине не сможет установить rsync. В таком случае вам нужно будет получить прямой доступ к репозиториям, удалить виртуальную машину и снова запустить SecGen с ключом build-vms.

Будут выполнены все необходимые Puppet скрипты



И в конце концов вы увидите сообщение в консоли



И при помощи команды virtualbox можете убедиться, что машина действительно запущена



Анатомия


В каталоге SecGen, помимо прочих, есть директории projects, scenarios и modules.

Проекты

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

ruby secgen.rb --project home/user/SecGen/projects/SecGen20170920_1154 build-vms

Чтобы получить список проектов, нужно выполнить команду

ruby secgen.rb list-projects

И получим результат



Аналогично есть ключ build-project, задав который будут созданы конфигурационные файлы для Vagrant и Puppet, но виртуальные машины созданы не будут.

Сценарии

SecGen при запуске без ключе создаст для нас виртуальную машину со случайным набором уязвимостей, но мы можем повлиять на их характер при помощи сценариев. Они хранятся в каталоге scenarios в виде XML файлов и разбиты на категории. По умолчанию используется default_scenario.xml и выглядит он следующим образом

<?xml version="1.0"?>

<scenario xmlns="http://www.github/cliffe/SecGen/scenario"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.github/cliffe/SecGen/scenario">

	<!-- an example remote storage system, with a remotely exploitable vulnerability that can then be escalated to root -->
	<system>
		<system_name>storage_server</system_name>
		<base platform="linux" type="server"/>

		<vulnerability privilege="user_rwx" access="remote" />
		<vulnerability privilege="root_rwx" access="local" />

		<service/>

		<network type="private_network" range="dhcp"/>
	</system>

</scenario>

Здесь сказано, что будет создана виртуальная машина с ОС Linux, содержащая две уязвимости типов remote и local. Т.е. сначала нужно будет попасть на сервер через одну уязвимость и потом проэксплуатировать вторую локально.

Обычно из названия сценария становится ясно, какую машину создаст SecGen, например сценарий any_random_vulnerability.xml. Рекомендую ознакомиться с примерами в каталоге scenarios/examples.

Есть довольно сложные сценарии в каталогах scenarios/security_audit и scenarios/ctf.
Для CTF предлагается воспользоваться фронтендом от разработчиков SecGen.

Модули

Из описания сценариев становится ясно, что модули делятся на категории. Все модули собраны в каталоге modules и разбиты на

  • bases
  • build
  • encoders
  • generators
  • networks
  • services
  • utilities
  • vulnerabilities

В свою очередь в каждой из групп есть подгруппы, вроде smb, webapp, bash, ftp и т.п.

Каждый модуль имеет примерно следующую структуру



Файл secgen_metadata.xml подробно описывает модуль. Это необходимо для корректной работы сценариев и выбора этого модуля для подходящего случая

Часть файла

<?xml version="1.0"?>
<vulnerability xmlns="http://www.github/cliffe/SecGen/vulnerability"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.github/cliffe/SecGen/vulnerability ">
  <name>chkrootkit 0.49 privilege escalation</name>
  <author>Thomas Shaw</author>
  <module_license>MIT</module_license>
  <description>
    chkrootkit 0.49 and earlier contain a local privilege escalation vulnerability allowing a non-root user to place a
    script in /tmp that will be executed as root when chkrootkit is run. This module adds a cronjob to run chkrootkit
    periodically for exploitability.
  </description>

  <type>privilege_escalation</type>
  <privilege>root_rwx</privilege>
  <access>local</access>
  <platform>linux</platform>
...

Каталог manifes содержит puppet скрипты configure.pp, init.pp и install.pp
Каталог files содержит необходимые дистрибутивы. В данном случае один файл chkrootkit-0.49.tar.gz

Детали проекта

Когда проект создан, вы можете найти в нем файл scenario.xml, описывающий, какие уязвимости были использованы и как вообще получить флаги.

Например в нашем проекте мы можем найти два XML тега vulnerability, указывающие на модули
modules/vulnerabilities/unix/misc/distcc_exec с описанием «Distcc has a documented security weakness that enables remote code execution» и modules/vulnerabilities/unix/desktop/xfce_lightdm_root_login с описанием «Configures XFCE w/ LightDM to automatically login as root without a password\.»

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

Так же в каталоге проекта есть скрытая директория .vagrant, в которой, в частности, содержится приватный ключ для доступа к серверу по протоколу SSH под пользователем vagrant. Файл private_key.

Таким образом подключиться к виртуальной машине можно следующим образом

ssh vagrant@127.0.0.1 -p 2222 -i private_key



команда ifconfig выдаст нам следующий результат

eth0      Link encap:Ethernet  HWaddr 08:00:27:86:1c:fb  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe86:1cfb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:125254 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13570 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:177651061 (169.4 MiB)  TX bytes:1034124 (1009.8 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:83:ea:5e  
          inet addr:172.28.128.3  Bcast:172.28.128.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe83:ea5e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3130 (3.0 KiB)  TX bytes:2304 (2.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Тестируем


IP адрес мы выяснили и теперь можешь провести тестирование на проникновение. Проверим доступность виртуальной машины с хоста



Сканируем и обнаруживаем следующие открытые порты

sudo nmap -n -Pn -p- 172.28.128.3



Далее при помощи вашего любимого дистрибутива для тестирования на проникновение можно начинать эксплуатацию distcc.

Единственное что, по умолчанию виртуальная машина имеет два интерфейса в режимах NAT и Host-Only, так что получать доступ к ней с внешней машины можно или через настройку проброса портов в NAT интерфейсе.



Или перенастроить машину, которая является точкой входа на использование другого типа интерфейса Virtualbox, доступного извне.

Можно изменить тип интерфейса Host-Only на Bridged, перезапустить машину и назначить статический IP адрес, если в вашей инфраструктуре нет DHCP. И не забыть задать маршруты через мост.

В заключении


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




К сожалению, не доступен сервер mySQL