宣告
本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整程式碼,抓包內容、敏感網址、資料介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關!
本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權,請在公眾號【小馬哥逆向】聯絡作者立即刪除!
瑞數介紹
瑞數動態安全 Botgate(機器人防火牆)以“動態安全”技術為核心,透過動態封裝、動態驗證、動態混淆、動態令牌等技術對伺服器網頁底層程式碼持續動態變換,增加伺服器行為的“不可預測性”,實現了從使用者端到伺服器端的全方位“主動防護”,為各類 Web、HTML5 提供強大的安全保護。
瑞數 Botgate 多用於政企、金融、運營商行業,曾一度被視為反爬天花板,隨著近年來逆向大佬越來越多,相關的逆向文章也層出不窮,真正到了人均瑞數的時代了,這裡也感謝諸如 Nanda、懶神等逆向大佬,揭開了瑞數神秘的面紗,總結的經驗讓後來人少走了不少彎路。
過瑞數的方法基本上有以下幾種:自動化工具(要隱藏特徵值)、RPC 遠端呼叫、JS 逆向(硬扣程式碼和補環境),本文介紹的是 JS 逆向硬扣程式碼,儘可能多的介紹各種細節。
目標網站
aHR0cDovL3d3dy5mYW5nZGkuY29tLmNuL25ld19ob3VzZS9uZXdfaG91c2VfZGV0YWlsLmh0bWw=
網站分析
https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/J9LnWNk86QN8lvDe/img/5e9e3567-86ba-4e43-ba28-6d1766dcb647.jpeg
可見首先這是個 202 請求,其次set-cookie: FSSBBIl1UgzbN7N80S。
其次他自返回了一個cookie: FSSBBIl1UgzbN7N80S
並且的話還生成了一個 js c.FxJzG50F.dfe1675.js。
第二次
第二次需要攜帶第一次的請求 已經一個新的 cookie 才能返回正常的頁面。如下圖
逆向流程分析
首先過掉無限 debugger(過不過其實無所謂,後面的分析其實這個基本上沒影響),直接右鍵 Never pause here
永不在此處斷下即可
定位 Cookie,首選 Hook 來的最快,透過 Fiddler 等抓包工具、油猴指令碼、瀏覽器外掛等方式注入以下 Hook 程式碼:
# hook cookie
(function() {
// 嚴謹模式 檢查所有錯誤
'use strict';
// document 為要hook的物件 這裡是hook的cookie
var cookieTemp = "";
Object.defineProperty(document, 'cookie', {
// hook set方法也就是賦值的方法
set: function(val) {
// 這樣就可以快速給下面這個程式碼行下斷點
// 從而快速定位設定cookie的程式碼
console.log('Hook捕獲到cookie設定->', val);
debugger;
cookieTemp = val;
return val;
},
// hook get 方法也就是取值的方法
get: function()
{
return cookieTemp;
}
});
})();
Hook 發現會有生成兩次 Cookie 的情況,斷下之後往上跟棧,可以看到組裝 Cookie 的程式碼,類似如下結構:
其實 我覺得補環境和正常分析區別很大。
我們不需要了解瑞數中的真假 cookie。
只需要定義出一個函式,去接受和返回 docuement.cookie即可。
在正式分析以前。我們需要固定一份靜態程式碼。因為瑞數的網站返回的內容每次都是動態的,不方便我們除錯。後續我們把這份靜態程式碼放到 node 裡就能慢慢的去補了。
這裡補環境的話需要四部分內容,如上圖 紅圈中圈中的三個。以及生成的虛擬機器程式碼。這四部分程式碼可以生成FSSBBIl1UgzbN7N80T
這裡簡單說明一下他們的作用
-
meta 標籤中的內容:(即 content 中的內容)會在後續的 eval 中用得到
-
外鏈的 js :c.FxJzG50F.dfe1675.js這部分程式碼。下面的那個自執行函式會解密這個 js 從而生成虛擬機器程式碼
-
自執行函式:解密外鏈 js。生成虛擬機器程式碼。並且新增屬性
-
生成的虛擬機器程式碼。生成新的 cookie
我們需要把這三段程式碼,放到一個檔案中
生成的虛擬機器檔案不需要,他會自己生成的。
分析程式碼,扣程式碼
由扣出的程式碼可見,主要執行步驟在最下邊的while 控制流,以及最後一個函式內部的多個控制流:
1、缺window,補個 window=global;
2、缺document,補個document={}
3、需要document.scripts,定位到瀏覽器程式碼,檢視長度需要是3,補個document.scripts = [1, 2, 3]
(暫時)
4、再執行程式碼,就大功告成了?不! 並沒有,我們在介面上斷住這行程式碼,發現直到最後都斷不住到這裡,所以感覺還是缺點是什麼。
我是透過在控制流斷點和webstorm斷點單步除錯找到的區別,是因為少了一個檔案
把這裡 程式碼拿出來 補進去,成功執行 列印 window.$_ts,202介面載入的 主要函式就出來了
ret=.call(*, **)
列印出來,就是瑞數的除錯邏輯程式碼(具體操作js基本知識)
結果驗證
如果整個流程沒問題,程式碼也扣得正確,攜帶正確的 Cookie 和正確的字尾,就能成功訪問: