通过windows注册表定位

通过windows注册表定位

注册表中分析无线接入点

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

使用WinReg读取Windows注册表

注册表存储的网关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

使用Mechanize将MAC地址提交都Wigle

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

你可能感兴趣的:(web)