Как сделать словарь c

Добавил пользователь Евгений Кузнецов
Обновлено: 10.09.2024

У меня есть сгенерированный файл с тысячами строк, например:

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

При выполнении некоторого анализа файла я написал следующий цикл, чтобы прочитать файл в словаре:

. это нормально и делает именно то, что я хочу ( print - просто тривиальный пример).

Однако для меня это не особенно "pythonic", а строка:

Что просто чувствует "неуклюжим" (сколько раз он перебирает поля?).

Есть ли лучший способ сделать это в Python 2.6 с помощью стандартных модулей?

ОТВЕТЫ

Ответ 1

В Python 2 вы можете использовать izip в модуле itertools и магию объектов генератора, чтобы написать свою собственную функцию, чтобы упростить создание пар значений для dict записей. Я получил идею для pairwise() из одноименного (но функционально отличающегося) рецепта в документах по Python 2 itertools .

Чтобы использовать подход в Python 3, вы можете просто использовать обычный zip() поскольку он делает то, что izip() делал в Python 2, что приводит к последнему удалению из itertools - приведенный ниже пример решает эту itertools и должен работать в обеих версиях.

Который может использоваться следующим образом в вашем файле for чтения цикла:

Но подождите, там больше!

Можно создать обобщенную версию, которую я назову grouper() , которая снова соответствует itertools , но функционально отличающемуся рецептуру itertools (который приведен ниже в pairwise() ):

Который может быть использован следующим образом в вашем цикле for :

Конечно, для конкретных случаев, подобных этому, легко использовать functools.partial() и создать аналогичную функцию pairwise() (которая будет работать как в Python 2, так и в 3):

постскриптум

Если не существует действительно большого количества полей, вы можете вместо этого создать фактическую последовательность из пар строк (вместо использования выражения-генератора, которое не имеет len() ):

Это преимущество заключается в том, что это позволит группировать с помощью простой нарезки:

Ответ 2

Не намного лучше, чем просто более эффективно.

Ответ 3

Ответ 4

Если мы все равно будем абстрагировать его на функцию, писать "с нуля" не так сложно:

У меня есть Словарь имен студентов. и я хотел бы присвоить этому другой словарь.

Мой ввод похож на этот

Студент 1: математика, 9 естественных наук, 5 английский язык, 2

Студент2: математика, 9 естественных наук, 10 английский язык, 7

Я попытался создать класс под названием Info, и вот мой код

И вот еще одна попытка:

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

Как улучшить код, чтобы различать курсы? Или как сделать название курса еще одним ключом?

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

Этичный хакинг и тестирование на проникновение, информационная безопасность

Оглавление

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

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

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

Азы генерации словарей

Атака на основе правил

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

Самый простой способ - использовать программу с графическим интерфейсом Mentalist, инструкция: Генерация и модификация словарей по заданным правилам.


Атака на основе правил в John the Ripper намного мощнее чем в hashcat, для данной атаки из этих двух программ рекомендую выбирать именно John: Полное руководство по John the Ripper. Ч.5: атака на основе правил

Генерация словарей на основе информации о человеке

Если пароль составлен на основе данных пользователя, например, комбинация имени, фамилии, даты рождения, именах детей, номера телефона, этих же данных ближайших родственников, то такой пароль можно считать слабым. Рассмотренные выше инструменты не очень подходят для составления подобных словарей, основанных на информации о пользователе - разве что, комбинаторная атака в Hashcat, но она за раз принимает только 2 словаря.

Именно эту проблему решает утилита CUPP.

Установка CUPP в Kali Linux

Установка CUPP в BlackArch

Запустите программу в интерактивном режиме и введите известные данные пользователя:


Пример сгенерированных паролей:


Если вам нужен перевод задаваемых вопросов, то вы найдёте его на странице карточки программы.

Составление списков слов и списков имён пользователей на основе содержимого веб-сайта

Познакомимся с ещё одним инструментом - CeWL. Эта программа обходит указанный сайт (можно указать глубину обхода) и все найденные на страницах сайта слова сортирует в порядке частоты их использования. Зачем нужен такой словарь? Автор предлагает использовать его для брут-форса. К тому же, программа умеет искать e-mail адреса, а также извлекать имена создателей офисных документов - поддерживаются файлы Word и PDF. Эти данные можно использовать для составления списка имён пользователей.

Ещё в комплекте с программой идёт утилита FAB, которая извлекает из уже скаченных документов Word и PDF имена авторов - их тоже можно использовать в качестве имён пользователей для брут-форса.

Установка CeWL в Kali Linux

Программа предустановлена в Kali Linux.

В минимальных версиях программа устанавливается следующим образом:

Установка в BlackArch

В карточке программы описаны дополнительные нюансы установки - рекомендуется ознакомиться.

Примеры запуска CeWL


Запуск FAB, при котором будут проверены все документы *.doc в директории /home/mial/Downloads/, из метаинформации этих документов будет извлечено поле, содержащее имя автора документа, данные будут выведены на экран:


Как создать словарь по маске с переменной длиной

Рассмотрим генерацию списков слов различной длины на примере Hashcat и maskprocessor.

Удлиняющиеся пароли в Hashcat

Для того, чтобы генерировались пароли различной длины, имеются следующие опции:

Опция -i является необязательной. Если она используется, то это означает, что длина кандидатов в пароли не должна быть фиксированной, она должна увеличиваться по количеству символов.

Опция --increment-min также является необязательной. Она определяет минимальную длину кандидатов в пароли. Если используется опция -i, то значением --increment-min по умолчанию является 1.

И опция --increment-max является необязательной. Она определяет максимальную длину кандидатов в пароли. Если указана опция -i, но пропущена опция --increment-max, то её значением по умолчанию является длина маски.

Правила использования опций приращения маски:

  • перед использованием --increment-min и --increment-max необходимо указать опцию -i
  • значение опции --increment-min может быть меньшим или равным значению опции --increment-max, но не может превышать его
  • длина маски может быть большей по числу символов или равной числу символов, установленной опцией --increment-max, НО длина маски не может быть меньше длины символов, установленной --increment-max.

Итак, команда запуска для генерации паролей, которые имеют длину от шести до десяти символов:

hashcat -a 3 -i --increment-min=6 --increment-max=10 --stdout ?l?l?l?l?l?l?l?l?l?l

Удлиняющиеся пароли в maskprocessor

В maskprocessor имеется следующая опция приращения:

Следующая команда составит словарь из чисел от 1 до 9999:

Когда о пароле ничего не известно (все символы)

Про нюансы я уже писал, здесь только примеры команд.

Если нужно запустить полный перебор, когда в пароле могут быть большие и маленькие латинские буквы, а также цифры и длина пароля от 1 до 12, то нужно использовать следующие опции и маску:

Чтобы вывести все кандидаты в пароли или сохранить их в словарь:

Чтобы вывести все кандидаты в пароли или сохранить их в словарь:

Создание словарей, в которых обязательно используется определённые символы или строки

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

Рассмотрим несколько примеров.


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

Ещё один вариант - искомое слово может быть в любом регистре, но точно расположено в начале пароля:

Кстати, последний пример не особенно удачный - поскольку нам известно, что вначале возможны только 2 символа - „A“ или „a“, то лучше использовать пользовательский набор символов, включающих эти два символа. Аналогично и для других - хотя бы четырёх известных символов (по количеству возможных пользовательских наборов).

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

Количество искомых строк может быть любым:

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

Как создавать комбинированные словари

Суть в том, что к каждому слову из первого словаря, добавляется каждое слово из второго словаря.

Словарь 1 (dict1.txt)

Словарь 2 (dict2.txt)

Запуск комбинаторной атаки (-a 1):

Мне почему-то казалось, что слова должны объединятся ещё и в обратном порядке (то есть первым идёт слово из второго словаря), но как вы можете убедиться, это не происходит. Поэтому для получения описанного эффекта, нужно запустить атаку ещё раз, поменяв словари местами:

Как комбинировать более двух словарей

Далее показан пример комбинации трёх словарей - суть в том, что каждое новое полученное слово состоит по одному слову из каждого из трёх словарей:

Как комбинировать подобным образом 4 и более словарей? Мне трудно представить, что это может пригодиться в реальной ситуации, но для этого скорее всего придётся писать свой скрипт для автоматизации показанного выше алгоритма. Если вы знаете программы, которые умеют это делать, то пишите в комментариях.

И… в этом месте я вспомнил о программе combinator3. Она поставляется в пакете hashcat-utils. Эта команда служит для комбинации трёх словарей (для комбинации двух словарей используйте combinator).

Эта программа умеет комбинировать по 3 указанных словаря, но опять же - если словарь идёт третьим, то слова из него всегда будут в конце.

Чтобы получить все возможные комбинации из трёх слов в любом порядке, то нужно использовать следующие команды:

Как создать все возможные комбинации для короткого списка строк

Утилита combipow создаёт все “уникальные комбинации” из короткого списка ввода. Эта программа также включена в hashcat-utils.

Пример содержимого словаря с именем wordlist:

Запуск combipow с этим словарём:

Даст следующие результаты:

Комбинирование по алгоритму PRINCE

Программа princeprocessor реализует алгоритм PRINCE. Подробнее об этом алгоритме вы можете узнать на странице карточки программы. Там же описана суть работы программы и её опции.

Примеры использования princeprocessor.

Чтобы создать все возможные цепи из содержимого файла dict1.txt:


Используя слова из указанного словаря (dict1.txt) составить цепи минимальной длиной 2 элемента (--elem-cnt-min=2) и максимальной длиной 2 элемента (--elem-cnt-max=2), то есть в каждой цепи будет только по 2 слова:


Гибридная атака - объединение комбинаторной атаки и атаки по маске

Эта атака совмещает атаку по словарю и атаку по маске - она принимает на входе словарь и маску и выдаёт гибридный пароль.

Если ваш example.dict содержит:

генерируют следующие кандидаты в пароли:

Это работает и в противоположную сторону!

генерируют следующие кандидаты в пароли:

Все возможности гибридной атаки можно реализовать с помощью Атаки на основе правил - поэтому если она вам нравится больше, то используйте её.

Как создать комбинированный словарь, содержащий имя пользователя и пароль, разделённые символом

Теперь возвращаемся к комбинированным словарям, содержащим одновременно имя пользователя и пароль.

В качестве примера посмотрите на фрагмент словаря (файл auth_basic.txt) программы Router Scan by Stas'M - в нём учётные данные разделены символом табуляции:

А это пример комбинированного словаря, в котором имя пользователя и пароль разделены двоеточием:

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

  • users.txt и passwords.txt - словари, из которых будут взяты имена пользователей и пароли и будут составлены все возможные комбинации.
  • РАЗДЕЛИТЕЛЬ - символ, которым будут разделены логин и пароль

Например, в следующей команде разделителем является двоеточие:


Кстати, если в качестве разделителя нужно вставить символ табуляции, то нажмите Ctrl-v + Tab:


Кстати, если вы попытаетесь разобраться в приведённой выше команде hashcat, то выясните, что одновременно используется Комбинаторная атака и добавлено правило из Атаки на основе правил.

Рассмотрим частный случай: как создать файл парный словарь логинов и паролем такого типа: логин всегда постоянный, затем табуляция и пароль.

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

  • superadmin — строка, которую нужно вставить перед каждым паролем
  • \t — символ табуляции, который будет разделять логин и пароль
  • pass.txt — файл, откуда считывать пароли
  • login_pass.txt — новый файл, куда будут сохранены пароли

Если не хотите создавать новый файл, а хотите изменить имеющийся, то уберите перенаправление и добавьте опцию -i:

Как извлечь имена пользователей и пароли из комбинированного словаря в обычные словари

Если из комбинированного словаря нам нужно извлечь только имена пользователей и/или только пароли. Для этого мы воспользуемся (тоже мощнейшей) программой awk.

Смотрите также: Уроки по Awk

Для извлечения имён пользователей:

Для извлечения паролей:

В этих командах:

В принципе, команды только различаются в $1 (первое поле до разделителя) и $2 (второе поле после разделителя).

Как при помощи Hashcat можно сгенерировать словарь хешей MD5 всех шестизначных чисел от 000000 до 999999

Hashcat может делать радужные таблицы, но только для Wi-Fi.

Зато с помощью PHP эту задачу можно решить несколько строк:

Время выполнение — 1-4 секунды. За это время будут сгенерированы все md5 хеши для строк 000000…999999.

Сохраните приведённый выше код в файл md5-rb-gen.php, запускать так:

Чтобы сохранить полученные хеши в файл:

Интересное наблюдение о скорости достижения задачи.

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

Но на среднем компьютере выполнение команд займёт до часа. PHP оказался быстрее, чем нативные Linux команды…

Удвоение слов

Как создать словарь 12 символьных слов, состоящих только из десятичных цифр (?d) формата abcdefabcdef, т.е шестизначное число написано два раза?

Можно использовать Атаку на основе правил, а можно написать небольшой скрипт Bash (все слова в из файла user.txt пишутся по 2 раза):

Применительно к нашему заданию — удвоение шестизначных чисел, можно использовать следующую команду, которая сгенерирует числа из шести цифр и дважды запишет каждое число:

Как создать словарь со списком дат

Как создать список дат по шаблону ДД-ММ-ГГГГ, то есть соответствущий маске ?d?d-?d?d-?d?d?d?d но чтобы перебор был не в диапазоне 00-99, а 01-31, 01-12 и 1900-2021 соответственно?

Такие словари умеет создавать программа pydictor.

Но ещё проще словарь сделать следующим образом (он будет сохранён в файл dates.txt):

Если хотите обойтись без создания словаря, то передавайте вывод предыдущие команды на стандартный ввод hashcat:

Как разбить генерируемые словари на части

Можно ли как-то в maskprocessor разделить выходящий генерируемый словарь на несколько частей? Например, частями по 1Гб.

Да, вы можете разделить вывод maskprocessor, а также готовые словари на части. В Linux для этого удобно воспользоваться утилитой split, например:

Заключение

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

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

Связанные статьи:

факультете информационной безопасности от GeekBrains? Комплексная годовая программа практического обучения с охватом всех основных тем, а также с дополнительными курсами в подарок. По итогам обучения выдаётся свидетельство установленного образца и сертификат. По этой ссылке специальная скидка на любые факультеты и курсы!

скажем, в моем методе у меня есть Dictionary > dictionary; , где ключи dictionary - названия стран, а значения-списки названий провинций/Штатов. Как я должен переименовать dictionary ?

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

  • CountryToStatesDictionary
  • CountryToStatesMap
  • CountryToStatesMapping

мне нравится XtoYMap или YFromX .

именование всегда контекстно. Поэтому в этом конкретном случае уместно какое-то имя, указывающее страну для отображения состояния.

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

ProvincesByCountry недостаточно ясно, так как это звучит как отображение стран в провинции один к одному. При доступе ProvincesByCountry["Германия"] Я бы предположил, что одно значение-это объект, а не список объектов.

мой личный шаблон похож:

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

в вашем случае получается:

рассказывает, что это такое с научной точностью.

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

и, наконец, последний маленький штрих здесь. Если такой словарь сопоставляет свойства объекта и сами объекты, то я опускаю слово, описывающее объект в ключевом разделе. Вот что я имею в виду:

Я использую этот шаблон безоговорочно, что хорошо, поскольку он не оставляет абсолютно никакого места для догадок. Con - это иногда генерирует довольно длинные имена. Но я понятия не имею как всегда явно, но всегда короткие имена. Вы всегда должны идти на компромисс. И это конечно дело вкуса.

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

провинциях, provinceMap, provinceDictionary

все приходит на ум. Мне нравится быть самим собой. Если это поле-член, я бы добавил префикс "m_", как в"m_provinceMap".

Читайте также: