Когда я думал над дальнейшим вектором развития 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)


  1. Crandel
    20.07.2017 19:09
    +2

    Лучше начинать скрипт не


    #!/usr/bin/python

    а


    #!/usr/bin/env python

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


    1. isox
      20.07.2017 19:12
      +1

      Спасибо!
      Поправлю при обновлении.


    1. isox
      20.07.2017 19:50
      +1

      Двойной формат — проглядел.
      Fixed.


      1. goiliago
        21.07.2017 14:53

        Также я бы посоветовал для форматирования строк использовать не %, а .format. Поддерживается начиная с 2.6 (https://docs.python.org/2.6/library/string.html#string.Formatter.format)


    1. CrazyOpossum
      21.07.2017 14:53

      Раз уж на то пошло, то лучше ещё python2/python3 сразу указывать, потому что в разных дистрах всё ещё разная дефолтная версия.


      1. Crandel
        21.07.2017 15:03

        В принципе не важно, там как раз весь набор проверок присутствует, проблем не будет


  1. Sleuthhound
    20.07.2017 20:26
    +1

    Отличная утилита, спасибо!
    Пользуюсь Vulners каждый день.


  1. hydr0gen
    21.07.2017 14:53

    Надо добавить возможность искать базу по месту расположения скрипта, а не папки откуда скрипт запускается. Если сделать символическую ссылку на скрипт в /usr/local/bin то при обновлении или попытке получить доступ к базе, он будет пытаться создать/искать базу в /usr/local/bin/getsploit.db.zip. Разумеется ни прав доступа, ни базы там не будет


    1. isox
      21.07.2017 14:54

      Упс) Действительно, в таком виде будет беда. Поправлю, спасибо!


      1. Crandel
        21.07.2017 15:06

        Еще желательно в .gitignore добавить *.db так как при создании базы она помечается как новый файл в репозитории