Javascript 使用WEBRTC进行端口扫描

Javascript 使用WEBRTC进行端口扫描,javascript,browser,port,Javascript,Browser,Port,我试图在本地主机上使用JS从浏览器运行端口扫描。 我尝试了各种方法,包括超时检查,正如许多帖子推荐的那样 我知道有一种方法可以使用WebRTC扫描主机上的特定端口,但找不到任何相关文档 有人能帮忙吗 谢谢。没有这种方法。WebRTC使用STUN获得同意,并避免构建端口扫描程序。请参见有几种方法可以完成基于浏览器的端口扫描。通常情况下,这是一种定时攻击,让浏览器加载一些不存在的资源并测量响应。这里有一些例子。一个使用img标记,另一个使用webrtc 在这里,我们将使用假img标记方法: /*扫

我试图在本地主机上使用JS从浏览器运行端口扫描。 我尝试了各种方法,包括超时检查,正如许多帖子推荐的那样

我知道有一种方法可以使用WebRTC扫描主机上的特定端口,但找不到任何相关文档

有人能帮忙吗


谢谢。

没有这种方法。WebRTC使用STUN获得同意,并避免构建端口扫描程序。请参见

有几种方法可以完成基于浏览器的端口扫描。通常情况下,这是一种定时攻击,让浏览器加载一些不存在的资源并测量响应。这里有一些例子。一个使用img标记,另一个使用webrtc

在这里,我们将使用假img标记方法:

/*扫描器需要这些全局变量才能进行丑陋的破解*/
var last_scanobj_指数=0;
var scanobjs={};
功能端口扫描程序(ip,端口){
this.ip=ip;
this.port=端口;
this.on\u open\u或\u closed=null;
this.on_sealthed=null;
this.start_time=null;
this.timed_out=null;
this.total_time=null;
this.run=函数(){
/*检查客户是否给了我们所有需要的回电*/
if(this.on\u open\u或\u closed==null){
警报(“请设置打开或关闭回调!”);
}
if(this.on_sealthed==null){
警报(“请设置开启隐藏回调!”);
}
/*将此对象保存在全局目录中(丑恶黑客)*/
var our_scanobj_指数=最后一个_scanobj_指数;
last_scanobj_index++;
scanobjs[我们的scanobj_索引]=这个;
/*记录开始时间*/
this.start_time=(new Date()).getTime();
/*创建div以加载图像,将对象的索引传递到
全局目录,以便可以检索它*/
document.getElementById(“testdiv”).innerHTML='';
//XXX:在JS中,正确的方法是什么?
var thiss=这个;
设置超时(
函数(){
/*如果事件尚未触发,则该值将为非null*/
if(scanobjs[我们的scanobj\u索引]){
scanobjs[our_scanobj_index]=null;
thiss.timed_out=真;
这是我的秘密;
}
},
10000
);
}
}
函数错误\u处理程序(索引){
/*取回PortScanner对象*/
var thiss=scanobjs[index];
/*如果为空,则扫描超时*/
如果(thiss==null){
返回;
}
/*将其设置为null,以便超时知道我们处理了它*/
scanobjs[index]=null;
thiss.timed_out=false;
/*测量负载发生故障所需的时间*/
thiss.total_time=(new Date()).getTime()-thiss.start_time;
/*调用相应的回调函数*/
如果(总时间<1500){
这是开的还是关的;
}否则{
这是我的秘密;
}
}
功能自定义扫描(表格){
var ip=form.custom\u ipaddr.value;
var port=form.custom\u port.value;
变量ip地址=/^(\d{1,3})\(\d{1,3})\(\d{1,3})\(\d{1,3})\(\d{1,3})$/;
变量匹配=ip地址执行器(ip);
if(match==null){
警报(“该地址不是有效的IPv4地址”);
返回;
}
如果(匹配[1]>255 | |匹配[2]>255 | |匹配[3]>255 | |匹配[4]>255){
警报(“该地址不是有效的IPv4地址”);
}
端口=parseInt(端口);
如果(isNaN(端口)| |端口<0 | |端口>65535){
警报(“错误端口号”);
}
document.getElementById(“自定义按钮”).disabled=true;
document.getElementById(“自定义结果”).innerHTML=“扫描…这将花费10秒。”;
var scanner=新端口扫描器(ip,端口);
scanner.on_隐身=函数(){
如果(扫描仪超时){
document.getElementById(“自定义结果”).innerHTML=“案例2(10秒后无响应)”;
}否则{
document.getElementById(“自定义结果”).innerHTML=“案例2”(+this.total_time+“ms”);
}
document.getElementById(“自定义按钮”).disabled=false;
}
scanner.on_open_或_closed=函数(){
document.getElementById(“自定义结果”).innerHTML=“打开(“+this.total\u time+”毫秒)。”
document.getElementById(“自定义按钮”).disabled=false;
}
scanner.run();
}
/*此变量跟踪下一步要扫描的192.168.1 IP*/
无功电流_八位组;
var停止;
功能局域网扫描(表格){
document.getElementById(“lan_按钮”).disabled=true;
document.getElementById(“lan按钮停止”).disabled=false;
/*跳过.1,因为它可能会明显提示输入密码*/
电流_八位组=2;
停止=错误;
var scanner=新端口扫描器(“192.168.1.”+当前八位字节,80);
scanner.on_隐身=lan_on_隐身;
scanner.on\u open\u或\u closed=lan\u on\u open\u或\u closed;
scanner.run();
document.getElementById(“lan_结果”).innerHTML=“扫描…
”; } 功能lan_停止(表格){ 停止=真; document.getElementById(“lan_按钮”).disabled=false; document.getElementById(“lan按钮停止”).disabled=true; } 功能lan_on_隐身(){ var res_div=document.getElementById(“lan_结果”); res_div.innerHTML+=“192.168.1.”当前_八位组+”:“; 如果(此.超时){ res_div.innerHTML+=“关闭(10秒后无响应)。
”; }否则{ res_div.innerHTML+=“已关闭”(+this.total_time+“ms)。
”; } 电流_八位组+=1; 如果(停止| |当前八位字节>=255){ res_div.innerHTML+=“完成。
”; document.getElementById(“lan_按钮”).disabled=false; document.getElementById(“lan按钮停止”).disabled=true; 返回; } var scanner=新端口扫描器(“192.168.1.”+当前八位字节,80); scanner.on_隐身=lan_on_隐身; 扫描仪打开或_