资讯专栏INFORMATION COLUMN

在浏览器中快速探测IP端口是否开放

jackwang / 1980人阅读

摘要:探测端口开放原理就是向目标发送请求,看是否有回应。端口判定为不通。扫描批量目标扫描批量目标使用的并发队列功能,去执行的执行单个任务,在扫描前做了一些额外的工作把浏览器屏蔽的端口过滤掉了,收到的状态就是。

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 )

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79712.html

相关文章

  • 览器快速探测IP端口是否开放

    摘要:探测端口开放原理就是向目标发送请求,看是否有回应。端口判定为不通。扫描批量目标扫描批量目标使用的并发队列功能,去执行的执行单个任务,在扫描前做了一些额外的工作把浏览器屏蔽的端口过滤掉了,收到的状态就是。 0×00 前言 前两天 freebuf上的的XSS到内网的公开课很受启发,从一个页面到局域网,威力着实增强不少 公开课上检测内网 IP 实现方式用的是 img 标签,加载网站的 fav...

    jlanglang 评论0 收藏0
  • 第四章网络安全学习笔记(超详细)

    摘要:网关欺骗主要是局域网与外界通信时,伪造假。因不在同网络,无法使用嗅探工具获得数据包,,存在盲目性。 ---------------------------网络安全-...

    techstay 评论0 收藏1
  • 经典利用永恒之蓝漏洞对Windows操作系统进行攻击

    摘要:利用永恒之蓝对进行攻击环境搭建,其中为靶机。命令有很多,想使用什么命令可以百度,我这里使用一些进行演示的命令就可以了。一般权限不够命令无法执行,这里简单介绍提权,提权方法百度多的很。至此本次利用永恒之蓝攻击漏洞拿到权限结束。 ...

    不知名网友 评论0 收藏0
  • 关于Nmap的学习记录

    摘要:一检验域名是否存在域名二确定主机是否在线用扫描若禁止用这个比较隐蔽扫描不太懂可能有些主机禁止就用这个,可穿透防火墙,并直接将主机视为开机状态,很好用,但无法确定其是否在线三端口扫描一个端口或一个范围内的端口指 ...

    Donald 评论0 收藏0
  • 使用cs与msf进行内网横向移动

    摘要:使用与进行内网横向移动目标系统为跳板主机为一,使用探测内网,将目标上线至,使用探测内网信息查看当前目标系统网络情况,确认目标系统所在内网网段,使用的功能对内网进行扫描可以看到目标开放了端口二,内网横向移动对当前目标系 ...

    luffyZh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<