Windows 注册表包含了一个存储操作系统配置设置的层次化数据库。随着无线 网的出现,Windows 注册表存储了与无线连接相关的信息。
从windows vista之后,注册表存储每一个网络信息在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\Curren tVersion\NetworkList\Signatures\Unmanaged
子键值下。从命令提示符下,可以列出每一个网络显示描述GUID,网络描述,网络名称和网关MAC地址。
C:\Windows\system32>reg query
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkList\Signatures\Unmanaged" /s
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkList\Signatures\Unmanaged\010103000F0000F0080000000F0000F04BCC2360E4B8F7DC8BDAFAB8AE4DAD8
62E3960B979A7AD52FA5F70188E103148
ProfileGuid REG_SZ {3B24CE70-AA79-4C9A B9CC83F90C2C9C0D}
Description REG_SZ Hooters_San_Pedro
Source REG_DWORD 0x8
DnsSuffix REG_SZ <none>
FirstNetwork REG_SZ Public_Library
DefaultGatewayMac REG_BINARY 00115024687F0000
注册表存储的网关MAC地址作为REG_BINARY类型。16 进 制\x00\x11\x50\x24\x68\x7F\x00\x00
表示的实际地址为 00:11:50:24:68:7F
。 写一个快速的函数将 REG_BINARY 的值转换为实际的 MAC 地址。
def val2addr(val):
addr = ""
for ch in val:
addr += ("%02x" % ord(ch))
addr = addr.strip("").replace("", ":")[0:17]
return addr
编写一个函数从windows注册表键值中获取每一个列出来的网络的网络名称和MAC地址,利用winreg模块,连接到注册表后,可以使用openkey()函数打开键,并循环获取键下面的网络描述。
对于每一个描述,包含下面子键:ProfileGuid, Description, Source, DnsSuffix, FirstNetwork, DefaultGatewayMac
网络名称和网关MAC地址在注册表键列表中的第四个和第五个。
把所有的组合在一起,有一个脚本将打印存储在注册表中的先前连接的无线网络的信息。
# discoverNetworks.py
# coding = UTF-8
import _winreg
def val2addr(val):
addr = ""
for ch in val:
addr += ("%02x" % ord(ch))
addr = addr.strip("").replace("", ":")[0:17]
return addr
def printNets():
net = "SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkList\Signatures\Unmanaged"
key = _winreg.OpenKey(_winreg.HKEY_LOACL_MACHINE, net)
print('\n[*]Networks You have Joined.')
for i in range(100):
try:
guid = _winreg.EnumKey(key, i)
netKey = _winreg.OpenKey(key, str(guid))
(n, addr, t) = _winreg.EnumValue(netKey, 5)
(n, name, t) = _winreg.EnumValue(netKey, 4)
macAddr = val2addr(addr)
netName = str(name)
print('[+]' + netName + ' ' + macAddr)
_winreg.CloseKey(netKey)
except:
break
def main():
printNets()
if __name__ == "__main__":
main()
在使用管理员权限运行的脚本,可以看到先前连接过的无线网络及其MAC地址。
C:\Users\investigator\Desktop\python discoverNetworks.py
[*] Networks You have Joined.
[+] Hooters_San_Pedro, 00:11:50:24:68:7F
[+] LAX Airport, 00:30:65:03:e8:c6
[+] Senate_public_wifi, 00:0b:85:23:23:3e
WIGLE.net继续允许用户通过无线接入点的搜索物理位置,注册一个账号之后,用户就能通过一个小的python脚本和wigle.net进行交互。
使用WiGLE.Net,用户很快就会意识到为了得到WiGLE必须与第三方的页面进行交互,首先必须打开WiGLE.net 的初始化页面在 https://wigle.net/网页;然后用户必须登陆到 WiGLE 在 https://wigle.net/页面。 最后,用户可以查询特定的无线 SSID 的 MAC 地址在 https://wigle.net/页面。 捕获 MAC 地址查询请求,在请求无线接入点的 GPS 地址的 HTTP POST 请求中 tnetid(网络标识符)包含了 MAC 地址。
POST /gps/gps/main/confirmquery/ HTTP/1.1
Accept-Encoding: identity
Content-Length: 33
Host: wigle.net
User-Agent: AppleWebKit/531.21.10
Connection: close
Content-Type: application/x-www-form-urlencoded
netid=0A%3A2C%3AEF%3A3D%3A25%3A1B
<..SNIPPED..>
//看到从页面响应的数据中包含了GPS坐标,字符串maplat=47.25264359&maplon=-87.25624084 包含了接入点的经度和纬度。
<tr class="search"><td>
<a href="/gps/gps/Map/onlinemap2/?maplat=47.25264359&maplon=-87.25624084&mapzoom=17&ssid=McDonald's FREE
Wifi&netid=0A:2C:EF:3D:
25:1B">Get Mapa>td>
<td>0A:2C:EF:3D:25:1Btd><td>McDonald's FREE Wifitd><
建立一个简单的函数用来返回WiGLE数据库中记录的无线接入点的经度和纬度。使用mechanize模块,mechanize运行通过python进行web状态编程,类似与urllib模块的功能,一旦我们正常的登录到WiGLE服务,就会存储和重用我们的验证cookie
# discoverNetworks.py
# coding = UTF-8
import _winreg
import optparse
import urllib
import re
import mechanize
def val2addr(val):
addr = ""
for ch in val:
addr += ("%02x" % ord(ch))
addr = addr.strip("").replace("", ":")[0:17]
return addr
def wiglePrint(username, password, netid):
browser = mechanize.Browser()
browser.open('http://wigle.net')
reqData = urllib.urlencode({'credential_0': username, 'credential_1': password})
browser.open('https://wigle.net/gps/gps/main/login', reqData)
params = {}
params['netid'] = netid
reqParams = urllib.urlencode(params)
respURL = 'http://wigle.net/gps/gps/main/confirmquery/'
resp = browser.open(respURL, reqParams).read()
mapLat = 'N/A'
mapLon = 'N/A'
rLat = re.findall(r'maplat=.*\&', resp)
if rLat:
mapLat = rLat[0].split('&')[0].split('=')[1]
rLon = re.findall(r'maplon=.*\&', resp)
if rLon:
mapLon = rLon[0].split
print('[-]Lat:' + mapLat + ',Lon:' + mapLon)
def printNets(username, password):
net = "SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkList\Signatures\Unmanaged"
key = _winreg.OpenKey(_winreg.HKEY_LOACL_MACHINE, net)
print('\n[*]Networks You have Joined.')
for i in range(100):
try:
guid = _winreg.EnumKey(key, i)
netKey = _winreg.OpenKey(key, str(guid))
(n, addr, t) = _winreg.EnumValue(netKey, 5)
(n, name, t) = _winreg.EnumValue(netKey, 4)
macAddr = val2addr(addr)
netName = str(name)
print('[+]' + netName + ' ' + macAddr)
wiglePrint(username, password, macAddr)
_winreg.CloseKey(netKey)
except:
break
def main():
parser = optparse.OptionParser("usage%prog -u - p < wigle password > " )
parser.add_option('-u', dest='username', type='string', help='specify wigle password')
parser.add_option('-p', dest='password', type='string', help='specify wigle username')
(options, args) = parser.parse_args()
username = options.username
password = options.password
if username == None or password == None:
print(parser.usage)
exit(0)
else:
printNets()
if __name__ == "__main__":
main()
运行新脚本,可以看到先前连接过的无线网络和物理位置。
C:\Users\investigator\Desktop\python discoverNetworks.py
[*] Networks You have Joined.
[+] Hooters_San_Pedro, 00:11:50:24:68:7F
[-] Lat: 29.55995369, Lon: -98.48358154
[+] LAX Airport, 00:30:65:03:e8:c6
[-] Lat: 28.04605293, Lon: -82.60256195
[+] Senate_public_wifi, 00:0b:85:23:23:3e
[-] Lat: 44.95574570, Lon: -93.10277557