0x01 前言:
我们在进行渗透的时候可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,
当我们想具体到街道甚至门牌号,该怎么办???
0x02:环境:
偶然间发现百度地图有高精度IP定位API的接口,通过该接口我们可以通过IP地址定位到具体的地理位置,甚至能精确到门牌号及周围的标志性建筑。该接口的说明地址为:
http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip
若想要使用该接口进行查询,必须先申请一个密钥(AK),如下图:
点击申请密钥(AK)。登陆你的百度账号,
ip白名单选项,格式: 202.198.16.3,202.198.0.0/16 填写IP地址或IP前缀网段,英文半角逗号分隔如果不想对IP做任何限制,请设置为0.0.0.0/0 这里我们建议设置成0.0.0.0/0毕竟我们不是专业的,只是玩玩而已,点击提交。
申请完成后,这里就是你的专属AK啊·
百度官方的DOC
开放平台提供HTTP/HTTPS类型的API服务接口,开发者通过上传待定位IP,返回该IP对应地址信息,包括经纬度、地址信息(省、市、区、街道等)、周边POI信息、当前位置描述信息等。
目前相关参数如下:
成功率:综合定位成功率 65%
精度:90% 误差 80m 以内;95% 误差 350m
如果高精度定位失败的话,直接返回普通IP定位结果。
高精度IP定位服务和普通IP定位服务并存,两个服务的配额不同,定位效果也不同,请开发者结合自身业务合理选择
接口参数说明
注:暂不支持SN类型的校验。
参数 | 含义 | 说明 |
---|---|---|
qcip | 待定位IP | 可选,如果为空,则针对定位服务的IP进行定位 |
ak | 开发者密钥 | 必填,进行AK鉴权及配额控制 |
qterm | 待定位终端类型 | 必填,mb:终端定位设备类型为移动设备 pc:终端定位设备类型为固定设备 |
extensions | 返回结果扩展设定 | 可选,0(默认):只返回基础定位结果 1:返回基础定位结果+地址信息 2:返回基础定位结果+周边POI信息 3:返回基础定位结果+地址信息+POI信息 |
coord | 返回坐标类型 | 可选,bd09(默认):百度墨卡托坐标 bd09ll:百度经纬度坐标 gcj02:国测局经纬度坐标 |
coding | 返回结果编码类型 | 可选,utf-8(默认):返回UTF-8类型 gbk:返回GBK类型 |
callback_type | 回调方式选择 | 必选,json(默认):json方式 jsonp:jsonp方式,需设置callback参数 |
callback | jsonp回调函数 | 当callback_type=jsonp时,必填,取值为开发者所设置回调函数名 |
0x03 接口示例:
1、代码接口示例(callback_type = json)
服务示例:
http://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&qterm=pc&ak=请输入您的AK&coord=bd09ll
或
https://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&qterm=pc&ak=请输入您的AK&coord=bd09ll
返回值:
{
content: {
location: {
lat: 40.047726,#纬度
lng: 116.313304 #经度
},
locid: "8b1bf81d208bc2ce657fb6e6c270de66",#定位结果唯一ID
radius: 30, #定位结果半径
confidence: 1 #定位结果可信度
},
result: {
error: 161,#定位结果状态码
loc_time: "2016-08-23 15:14:12"#定位时间
}
}
2、代码接口示例(callback_type = jsonp)
服务示例:
http://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&qterm=pc&ak=请输入您的AK&coord=bd09ll&callback_type=jsonp&callback=test
或
https://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&qterm=pc&ak=请输入您的AK&coord=bd09ll&callback_type=jsonp&callback=test
返回值:
test
({"content":{
"location":{
"lat":40.047726,
"lng":116.313304
},
"locid":"d5ce5ea49ab1efa5a1f2296404b3e7f9",
"radius":30,"confidence":1.0},
"result":{"error":161,
"loc_time":"2016-08-23 14:32:19"
}
})
实战
在地址栏输入:
http://api.map.baidu.com/highacciploc/v1?qcip=125.43.69.132&qterm=pc&ak=请输入你的AK&coord=bd09ll&extensions=3
这是我的的ip地址(好吧,暴露了什么)
此时我们可以把pois字段也提取出来,值得注意的是pois为数组,我们可以遍历数组数据。
通过上面的分析,用python简单的写了一个脚本,具体代码如下:
0x04:代码:
#这个Python脚本是在2.7下运行的,
# -*- coding:utf-8 -*-
import sys
import urllib2
import json
def get_ip_information(ip):
url='http://api.map.baidu.com/highacciploc/v1?qcip='+ip+'&qterm=pc&ak='你的密钥(AK)'&coord=bd09ll&extensions=3'
poiss=''
request = urllib2.Request(url)
page = urllib2.urlopen(request, timeout=10)
data_json = page.read()
data_dic = json.loads(data_json)
if(data_dic.has_key("content")):
content=data_dic["content"]
address_component=content["address_component"]
formatted_address=content["formatted_address"]
print "该IP地址的具体位置为:"
print address_component["country"]
print formatted_address
if (content.has_key("pois")):
print "该IP地址附近POI信息如下:"
pois = content["pois"]
for index in range(len(pois)):
pois_name = pois[index]["name"]
pois_address = pois[index]["address"]
print pois_name, pois_address
else:
print 'IP地址定位失败!!!'
if __name__ == '__main__':
get_ip_information('183.55.116.95')