[原創]利用Browser協議探測內網主機操作系統版本(無需端口無視防火牆)


利用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM