Когда я думал над дальнейшим вектором развития Vulners, я обратил внимание на наших старших братьев — базу данных Exploit-DB. Одной из основных утилит в их арсенале является searchsploit. Это консольная утилита, которая позволяет искать эксплойты по пользовательским поисковым запросам и сразу же получать их исходные коды. Она является базовой частью Kali Linux и оперирует данными по эксплойтам из базы Exploit-DB. Что самое "вкусное", что утилита умеет работать с локальной базой и ты можешь всегда взять ее с собой. Так чем же мы хуже? Мы собрали в Vulners не только коллекцию эксплойтов из Exploit-DB, но и Packet Storm, 0day.today, Seebug, Zero Science Lab и многих других. Что же, давайте изобретем новый велосипед с преферансом и поэтессами.
Смотрим внимательнее на searchsploit
И видим внутри bash скрипт длиною 711 строчек. Он скачивает с публичного репозитария exploit-database копию данных и ищет уже по ней. Но где же Google-style синтаксис и прочие прелести современного поиска? Увы, в их подходе нашлись и плюсы и минусы. Плюсы оказались в том, что они способны находить эксплойты по критериям применимости. Минусы — довольно бедный функционал для неточного поиска. На этом идея интегрироваться с ним была отброшена и решение писать свой форк стала доминирующей.
Что должен делать getsploit?
Начнем с того, что определимся с функциональностью.
- Поиск эксплойтов по всей коллекции Vulners с применением Full Text Search и Lucene
- Сохранение исходных кодов эксплойтов на диск
- Offline-поиск с локальной базой данных
- Кроссплатформенность и минимум зависимостей
- Быть Open source
Let there be code
В итоге утилита была реализована на Python с совместимостью от Python 2.6 до Python 3.6. Основные ключи я постарался сохранить идентичными searchsploit для того, что бы не приходилось привыкать заново.
isox$ git clone https://github.com/vulnersCom/getsploit
isox$ cd getsploit
isox$ ./getsploit.py -h
usage: Exploit search and download utility [-h] [-t] [-j] [-m] [-c COUNT] [-l]
[-u]
[query [query ...]]
positional arguments:
query Exploit search query. See https://vulners.com/help for
the detailed manual.
optional arguments:
-h, --help show this help message and exit
-t, --title Search JUST the exploit title (Default is description
and source code).
-j, --json Show result in JSON format.
-m, --mirror Mirror (aka copies) search result exploit files to the
subdirectory with your search query name.
-c COUNT, --count COUNT
Search limit. Default 10.
-l, --local Perform search in the local database instead of
searching online.
-u, --update Update getsploit.db database. Will be downloaded in
the script path.
Основная механика поиска строится на базе Vulners API. Таким образом вы всегда получите актуальные данные на момент "здесь и сейчас". Что же, поищем эксплойты под Wordpress?
Довольно неплохо, да? Попробуем теперь ограничить нас только коллекцией Packet Storm. Синтаксис выражений полностью совпадает с поисковой строкой сайта и его можно подглядеть на страничке help.
Так, нужные нам эксплойты найдены. Теперь их нужно сохранить для последующего использования. Для этого нужно использовать ключик "-m". После этого утилита создаст папку с вашим поиском и загрузит эксплойты туда.
Но что же делать, если у нас нет онлайн подключения к интернету? Вспомнить об этом пока он еще доступен и сделать "--update"!
isox$ ./getsploit.py --update
Downloading getsploit database archive. Please wait, it may take time. Usually around 5-10 minutes.
219686398/219686398 [100.00%]
Unpacking database.
Database download complete. Now you may search exploits using --local key './getsploit.py -l wordpress 4.7'
При таком запросе getsploit скачает SQLite базу данных со всей коллекцией эксплойтов. Это порядка 594 мегабайт данных на момент написания статьи.
Обратите внимание, что если у вас Python скомпилирован без поддержки sqlite3 (что в принципе редкость), то локальная база, увы, работать не будет.
Здесь пришлось пожертвовать совместимостью ради скорости работы и возможности полнотекстового поиска с FTS4 модулем SQLite.
Но все не так плохо, основная масса сборок Python по умолчанию идет с модулем sqlite3. Попробуем найти эксплойты локально?
Отлично! Теперь можно взять с собой всю коллекцию эксплойтов с Vulners и использовать ее в оффлайне без регистрации и смс.
Ну и конечно же, исходные коды лежат на нашем GitHub.
Pull-request'ы крайне приветствуются.
Комментарии (10)
hydr0gen
21.07.2017 14:53Надо добавить возможность искать базу по месту расположения скрипта, а не папки откуда скрипт запускается. Если сделать символическую ссылку на скрипт в /usr/local/bin то при обновлении или попытке получить доступ к базе, он будет пытаться создать/искать базу в /usr/local/bin/getsploit.db.zip. Разумеется ни прав доступа, ни базы там не будет
Crandel
Лучше начинать скрипт не
а
Тогда и питон можно будет собрать с sqlite3 и подсунуть через переменную окружения, если надобность возникнет.
Не очень понятен смысл двойного формата тут, можете пояснить?
Ну и все урлы лучше вынести как константы в начало файла, но это уже так, мелочи
isox
Спасибо!
Поправлю при обновлении.
isox
Двойной формат — проглядел.
Fixed.
goiliago
Также я бы посоветовал для форматирования строк использовать не %, а .format. Поддерживается начиная с 2.6 (https://docs.python.org/2.6/library/string.html#string.Formatter.format)
CrazyOpossum
Раз уж на то пошло, то лучше ещё python2/python3 сразу указывать, потому что в разных дистрах всё ещё разная дефолтная версия.
Crandel
В принципе не важно, там как раз весь набор проверок присутствует, проблем не будет