摘要:探測端口開放原理就是向目標發送請求,看是否有回應。端口判定為不通。掃描批量目標掃描批量目標使用的并發隊列功能,去執行的執行單個任務,在掃描前做了一些額外的工作把瀏覽器屏蔽的端口過濾掉了,收到的狀態就是。
0×00 前言
前兩天 freebuf上的的XSS到內網的公開課很受啟發,從一個頁面到局域網,威力著實增強不少
公開課上檢測內網 IP 實現方式用的是 img 標簽,加載網站的 favicon.ico 圖標,然后監聽 onload 事件,看圖片能不能加載成功簡單易用,就是太慢了 --
0×02 分析瀏覽器有幾秒的嘗試容錯時間,對于媒體資源,瀏覽器限制同一域名并發請求為個位數(一般為 6 個),也就是說,把圖片全放到頁面上,也不能同時開始檢測,只能一點一點來,掃端口的時候會非常慢。
管理員在內網搭建的東西也可能沒有圖標。。。
探測 IP 端口開放原理就是向目標發送請求,看是否有回應。在上面的 img 中是在加載成功和失敗體現出來的。img 嫌慢也可以試試別的嘛,經過一番搜索找到了這個,這個和這個。
document.getElementById("testdiv").innerHTML = "";
是通過加載單個 img,使用的 onerror 事件,10 秒以內觸發判斷為 open。html 頁面不能解析為圖片格式,所以也會觸發 onerror。
switch(port){ case 21: src = "ftp://" + this.id() + "@" + host + "/"; break;//ftp case 25: src = "mailto://" + this.getid() + "@" + host ; break;//smtp ** case 70: src = "gopher://" + host + "/"; break;//gopher case 119: src = "news://" + host + "/"; break;//nntp ** case 443: src = "https://" + host + "/" + this.getid() + ".jpg"; default: src = "http://" + host + ":" + port + "/" + this.getid() + ".jpg";// getid is here to prevent cache seekings; } // ports 19,70,110,143 always return up in IE // ** if outlook is the default mail client and default newsreader in IE the request does not return anything img.src = src; setTimeout(function () { if (!img) return; img = undefined; callback( host, port, "down",id); }, timeout);
功能比第一個多不少,嘗試多種協議,80 端口可以探測出來77,79 被瀏覽器屏蔽,馬上觸發事件,所以誤報了。
用 websocket 準確率很好,特殊端口做過處理沒有誤報,作者還有一篇筆記,就是 js 和 html 耦合嚴重,不好提取出來用,趁著放假干脆造了個新輪子。
0×03 構架最終選用的 WebSocket,聽著就高大上,非 http 的端口也能探測,文檔看的 ruanyifeng 和 MDN 查到 websocket 并發連接 挺高的 (255 in Chrome and 200 in Firefox),加入了一個隊列模塊
js 如下:
js.later.js 簡單的包裝了 setInterval,超時檢測全靠它
js.queue.js 隊列和并發控制
js.portscan.js端口掃描的邏輯都在這
前端界面用的是 semantic-ui 和 Vue
介紹
js.later.js 作用比較簡單,在這里就是一個 setTimeout 的用法,就不多寫了。
js.queue.js 結合 websocket 的高并發,很給力,可以動態調整并發數量,鼠標鍵盤沒反應人離開后多跑點任務加快效率
使用示例(可以在演示頁面測試)
var q = new Queue(function(task, next, timer) { // 跳過部分任務,不執行next,模擬超時 if (task % 5 === 0) return; //模擬延遲異步任務 $.get("https://httpbin.org/delay/1", function() { console.log(task); //此任務完成,繼續下一個 next(); }); }, 3); //3個并發請求 for (var i = 0; i < 15; i++) { q.push(i); } q.timeout = 10000; q.onTimeout = function(task) { console.warn("queue:timeout:" + task); } q.onfinish = function() { console.info("隊列執行完畢"); } q.start();
js.portscan.js 有三種掃描方式:
scan_single 掃描單個目標
scan_batch 掃描一個數組
scan_range 生成列表并掃描以上三個接口都可以直接使用 scan,根據傳入參數不同自動選擇對應的方法去執行。
var ps = new PortScan(); ps.onscan = function(flag, task){ alert(task + "掃描完成,狀態為:" + flag) } ps.onopen = function(task){ prompt("開放端口", task) } ps.onfinsh = function(){ alert("scan完成") } // 分別執行以下三個方法 // 探測單個目標 ps.scan("baidu.com"); // 批量探測 ps.scan(["baidu.com:22", "baidu.com:443", "baidu.com:1024"]) // 生成一段地址并探測 ps.scan("baidu.com:*", 75, 85)
使用 WebSocket 發送請求的核心方法:
// 使用websocket探測端口 PortScan.prototype.wscan = function (target, callback) { var _this = this; var ws = new WebSocket(this.wsprotocol + target); ws.onerror = ws.onopen = function (e) { stopTimer(); _this.portstate("open", target, callback); } var workerkiller = function (flag) { stopTimer(flag); ws.onerror = null; ws.close(); // 如果是隊列控制超時此處就不再執行next callback = flag === "worker_timeout" ? null : callback; _this.portstate(flag, target, callback); } var stopTimer = this.timeoutexit(workerkiller); return workerkiller; }
wscan接收兩個參數,target 是目標地址,callback 是回調方法,請求結束后會把掃描結果傳入此方法。新建 WebSocket 請求后,在 ws 對象上設置了 ws.onerror 和 ws.onopen 事件。
想要成功建立連接需要服務器端先回應HTTP/1.1 101 Switching Protocols,如果被掃描的端口開放并且返回了數據,數據格式和 WebSocket 不一致會觸發 onerror 事件,成功建立連接后則觸發 onopen。
workerkiller 方法用來在超時后停止當前這個請求繼續等待端口響應,首先清空 onerror 事件,然后執行 ws.close() 關閉連接。
var stopTimer = this.timeoutexit(workerkiller);timeoutexit 調用的是 js.later.js 里的方法。根據設置的超時時間(默認設置的 5 秒),啟動 workerkiller 停止此請求。端口判定為不通。
_this.portstate("open", target, callback);portstate 是 PortScan 對象提供的一個方法,請求結束傳入open或是timeout,在 portstate 內部會觸發掃描事件。在 ws 的 onerror 觸發能觸發,說明服務端有回應數據,狀態是open,ps.onopen 就會被調用,上面例子中 ps.onopen 彈出的 prompt 窗口顯示掃到的開放端口就是由 portstate 去執行的。
// 掃描批量目標 PortScan.prototype.scan_batch = function (tasks, onfinish, onscan, isonopen_onopen) { this.setEvents(onfinish, onscan, isonopen_onopen); var _this = this; var q = this.queue = new Queue(this.scan_single, this.portscan_concurrence); q.tasks = tasks; q.onfinish = function () { _this.onfinish && _this.onfinish(_this.opentarget); } q.start(); return q; }
掃描批量目標使用 js.queue.js 的并發隊列功能,去執行的 scan_single 執行單個任務,scan_single 在掃描前做了一些額外的工作:把瀏覽器屏蔽的端口過濾掉了,ps.onscan 收到的狀態就是blocked。
scan_range 遍歷指定的范圍,host.replace("*", i),生成目標地址,最后調用 scan_batch。
0×04 測試上面搞那么復雜就是為了 PortScan 的代碼用起來簡單靈活。
var ps = new PortScan(); ps.onfinsh = function(opentarget){ alert(opentarget); // opentarget是所有探測到端口開放的IP地址,花費時間大約10秒多 // 探測到目標后可接Black-Hole思路,自動化檢測cms,根據相關漏洞getshell繼而漫游內網 } // webrtc獲得內網網段參見 http://zone.wooyun.org/content/24219 ps.scan("192.168.0.*", 1, 254); // 加端口號也可以 "192.168.0.*:8080"
http://js-port-scan.sec.dog/
-
(上個月寫的,有些地方描述不夠詳細準確,有空了再更新,那三個js,在demo頁面上 - 2016)
(demo鏈接已更新,代碼略有改動,修復了ie下運行的bug,增加了ws,ajax,video,image等請求方式,ps.use("websocket") - 2017-02-10 )
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11183.html
摘要:探測端口開放原理就是向目標發送請求,看是否有回應。端口判定為不通。掃描批量目標掃描批量目標使用的并發隊列功能,去執行的執行單個任務,在掃描前做了一些額外的工作把瀏覽器屏蔽的端口過濾掉了,收到的狀態就是。 0×00 前言 前兩天 freebuf上的的XSS到內網的公開課很受啟發,從一個頁面到局域網,威力著實增強不少 公開課上檢測內網 IP 實現方式用的是 img 標簽,加載網站的 fav...
閱讀 634·2021-09-22 10:02
閱讀 6326·2021-09-03 10:49
閱讀 565·2021-09-02 09:47
閱讀 2151·2019-08-30 15:53
閱讀 2929·2019-08-30 15:44
閱讀 900·2019-08-30 13:20
閱讀 1812·2019-08-29 16:32
閱讀 889·2019-08-29 12:46