国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在瀏覽器中快速探測IP端口是否開放

jlanglang / 650人閱讀

摘要:探測端口開放原理就是向目標發送請求,看是否有回應。端口判定為不通。掃描批量目標掃描批量目標使用的并發隊列功能,去執行的執行單個任務,在掃描前做了一些額外的工作把瀏覽器屏蔽的端口過濾掉了,收到的狀態就是。

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

相關文章

  • 覽器快速探測IP端口是否開放

    摘要:探測端口開放原理就是向目標發送請求,看是否有回應。端口判定為不通。掃描批量目標掃描批量目標使用的并發隊列功能,去執行的執行單個任務,在掃描前做了一些額外的工作把瀏覽器屏蔽的端口過濾掉了,收到的狀態就是。 0×00 前言 前兩天 freebuf上的的XSS到內網的公開課很受啟發,從一個頁面到局域網,威力著實增強不少 公開課上檢測內網 IP 實現方式用的是 img 標簽,加載網站的 fav...

    jackwang 評論0 收藏0

發表評論

0條評論

jlanglang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<