logo

K8哥哥

没有绝对安全的系统

基于Browser协议探测内网主机

本文于 1497 天之前发表

利用Browser协议可获取机器IP、MAC、机器名、操作系统、域,如图

浏览

在SMB协议中,计算机为了访问网络资源,就需要了解网络上存在的资源列表(例如在Windows下使用网络邻居查看可以访问的计算机),这个机制就被称为浏览(Browsing)。虽然SMB协议中经常使用广播的方式,但如果每次都使用广播的方式了解当前的网络资源(包括提供服务的计算机和各个计算机上的服务资源),就需要消耗大量的网络资源和浪费较长的查找时间,因此最好在网络中维护一个网络资源的列表,以方便查找网络资源。只有必要的时候,才重新查找资源,例如使用Windows下的查找计算机功能
但没有必要每个计算机都维护整个资源列表,维护网络中当前资源列表的任务由网络上的几个特殊计算机完成的,这些计算机被称为Browser,这些Browser通过记录广播数据或查询名字服务器来记录网络上的各种资源。
Browser并不是事先指定的计算机,而是在普通计算机之间通过自动进行的推举产生的。不同的计算机可以按照其提供服务的能力,设置在推举时具备的不同权重。为了保证一个Browser停机时网络浏览仍然正常,网络中常常存在多个Browser,一个为主Browser(Master Browser),其他的为备份Browser。

工作组和域

工作组和域这两个概念在进行浏览时具备同样的用处,都是用于区分并维护同一组浏览数据的多个计算机。事实上他们的不同在于认证方式上,工作组中每台计算机都基本上是独立的,独立对客户访问进行认证,而域中将存在一个(或几个)域控制器,保存对整个域中都有效的认证信息,包括用户的认证信息以及域内成员计算机的认证信息。浏览数据的时候,并不需要认证信息,Microsoft将工作组扩展为域,只是为了形成一种分级的目录结构,将原有的浏览和目录服务相结合,以扩大Mircrosoft网络服务范围的一种策略。  工作组和域都可以跨越多个子网,因此网络中就存在两种Browser,一种为Domain Master Browser ,用于维护整个工作组或域内的浏览数据,另一种为Local Master Browser,用于维护本子网内的浏览数据,它和Domain Master Browser通信以获得所有的可浏览数据。划分这两种Browser 主要是由于浏览数据依赖于本地网广播来获得资源列表,不同子网之间只能通过浏览器之间的交流能力,才能互相交换资源列表。
但是,为了浏览多个子网的资源,必须使用NBNS名字服务器的解析方式,没有NBNS的帮助,计算机将不能获得子网外计算机的NetBIOS名字。Local Master Browser也需要查询NetBIOS名字服务器以获得Domain Master Browser的名字,以相互交换网络资源信息。
由于域控制器在域内的特殊性,因此域控制器倾向于被用做Browser,主域控制器应该被用作Domain Master Browser,他们在推举时设置的权重较大。

Browser发包时间

去年无意发现browser协议中含有机器名、系统版本,发包时间随机,有些2分钟、5分钟、甚至12分钟等才发

几分钟甚至于10几分钟才有一条,其它数据包每分钟几百条,可能很多人长时间抓包,也未能发现关键信息

不单只是很长时间才发,而且也不一定每个包里面都含有机器名,或许这就是一直以来把Browser忽略的真相

如图所示,出现13机器ID为6247数据包,出现15机器已达到2万多,出现10机器已7万多个包(这鬼才能发现)

所以为了能够获取到内网机器信息,我们需要不停的监视Browser包,从中提取有效机器名与系统版本

 无视防火墙

虽然属于SMB协议,但把文件和共享前的勾去掉依旧可获取,该报文是由目标机器向外发送,所以445关闭也不影响

在目标开启防火墙的情况下也可获取,这与cping通过445端口或ICMP探测主机方式不一样。
另外发现NBNS也含有机器名和域名,但无系统版本,如下图

操作系统、域机器判断

除了XP和WIN8.1特别一点以外,其它系统

0x00000002 Request XP名称第3位开始  Win8.1也是 无法判断系统版本
0x0000000c Domain  域内机器
其它 of o1 local

by K8哥哥 2018.11.26

 利用代码

暂时没时间用其它语言编写,先用python的scapy框架来实现,如果要编译成可执行文件可能会很大,可能还要安装相关依赖

 

# -*- coding: UTF-8 -*-
#author: k8gege
#https://github.com/k8gege/K8tools/blob/master/K8getPC.py
#https://www.cnblogs.com/k8gege
import sys
import queue
from scapy.all import *
from pprint import pprint

def search(data, key):
#print “data: “ + data
i=data.find(key)
if i > -1:
masterType = “617574686F723A206B3867656765”
masterType = data[i+len(key):i+len(key)+2]
if masterType==”02”:
return data[i+len(key)+4:i+len(key)+34],masterType,data[i+len(key)+44:i+len(key)+48]
return data[i+len(key)+12:i+len(key)+42],masterType,data[i+len(key)+44:i+len(key)+48]
return “”

def getver(data):
if data==”0500”:
return “Win2000”
elif data==”0501”:
return “WinXP”
elif data==”0502”:
return “Win2003”
elif data==”0600”:
return “Vista”
elif data==”0601”:
return “Win7_2008”
elif data==”0602”:
return “Win8_2012”
elif data==”0603”:
return “Win8.1”
elif data==”0a00”:
return “Win10_2016”
return data

def packet_callbacke(packet):
#print(packet.show())
try:
data=packet.load.encode(‘hex’)
osname,masterType,osver = search(data, “5c4d41494c534c4f545c42524f57534500”)
if (osname!=””):
if masterType==”0c”:
print packet.getlayer(IP).src+”\t”+packet.src+”\t”+osname.decode(‘hex’)+”\t[Domain]”
else:
print packet.getlayer(IP).src+”\t”+packet.src+”\t”+osname.decode(‘hex’)+”\t[“+getver(osver)+”]”
except:
pass

print “IP\t\tMAC\t\t\tOSname\t\tOSver”

try:
sniff(iface = sys.argv[1],filter=””, prn=packet_callbacke)
except:
pass

下载:

https://github.com/k8gege/K8tools/blob/master/K8getPC.py

https://github.com/k8gege/k8getPC

 

相关文章:

Cscan 获取内网主机开放Web、Banner、标题信息

https://www.cnblogs.com/k8gege/p/10519321.html

Cping 获取内网存活主机-MAC地址-主机名--操作系统--SMB漏洞

https://www.cnblogs.com/k8gege/p/10367844.html

扫码加入K8小密圈