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