ip定位获取及反向地址解析

前言

最近在运维的时候碰到一些恶意访问,恶意操作的情况,有师傅建议我可以挂个ip追踪的脚本,至少可以定位个大概。

基于百度定位接口的 ip 定位脚本

百度地图什么的都有类似的接口,这里主要利用了 普通ip定位反向地址解析 的接口。

普通 ip 定位

获取 ip 地址的方法很多,这里就不做介绍,得到的 ip 后,就调用定位的接口,先把 ip 所属地进行查询,一般来说与运行商的基站或者宽带的部署有关,接口是:

1
2
http://api.map.baidu.com/location/ip?ak=开发者的AppKey&ip=这里是ip地址&coor=bd09ll //HTTP协议
https://api.map.baidu.com/location/ip?ak=开发者的AppKey&ip=这里是ip地址&coor=bd09ll //HTTPS协议

我们从中主要取经纬度坐标,省份城市信息,和节点的信息,返回的是 json 格式,因此还是需要将数据的结构进行分析。

  • 经度 y 在 contentpointy
  • 经度 x 在 contentpointx
  • 省份城市分别在 contentaddress_detailprovincecontentaddress_detailcity
  • 节点信息直接用 address 里的信息就够了

可以对信息进行输出,然后再把x, y坐标进行存储。

返回的实例 json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{  
address: "CN|北京|北京|None|CHINANET|1|None", #详细地址信息
content: #结构信息
{
address: "北京市", #简要地址信息
address_detail: #结构化地址信息
{
city: "北京市", #城市
city_code: 131, #百度城市代码
district: "", #区县
province: "北京市", #省份
},
point: #当前城市中心点
{
x: "116.39564504", #当前城市中心点经度
y: "39.92998578" #当前城市中心点纬度
}
},
status: 0 #结果状态返回码
}

反向地址解析

反向地址解析其实可以用到很多优秀的解析接口,但是因为麻烦(穷)所以直接使用百度的接口了。

用的 api 里的 ak 是直接网上找的,直接用。

1
http://api.map.baidu.com/geocoder/v2/?ak=36fcc51e203c9958959d419e24238112&callback=renderReverse&location=y, x&output=json&pois=1&qq-pf-to=pcqq.c2c

y 和 x 替换成获取到的坐标,注意有英文逗号分隔。

接下来就是处理 json 数据了,主要数据在 result 里面,其中:

  • 默认有一个格式化的地址,formatted_address
  • 还有一些其它的结果,我也把他们作为一个输出,在 result 里有一个 pois 的 key,是一个列表,我们循环进行输出每个元素的 addr 地址即可。

完整源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env
# encoding=utf-8
import json
import sys
import requests


class SendUrl(object):
def send_url(self, url, headers):
r = requests.get(url, headers=headers)
response = str(r.content, 'utf-8')

js = json.loads(response)

x = js['content']['point']['x']
y = js['content']['point']['y']
print("================================================")
print('location:'+ js['content']['address_detail']['province'] + js['content']['address_detail']['city'])
print('y:'+ js['content']['point']['y'])
print('x:'+ js['content']['point']['x'])
print('node:'+ js['address'])
print("================================================")

Url = "http://api.map.baidu.com/geocoder/v2/?ak=36fcc51e203c9958959d419e24238112&callback=renderReverse&location=" + y + "," + x + "&output=json&pois=1&qq-pf-to=pcqq.c2c"
R = requests.get(Url, headers=headers)
Response = str(R.content, 'utf-8')
index = Response.find("(")
Response = Response[index+1:-1]
js1 = json.loads(Response)
result = js1["result"]

formatted_address = result["formatted_address"]
print(formatted_address)
pois = result["pois"]
for i in pois:
print(i["addr"])


def Main():
# ak 需自行注册
sx = SendUrl()
ip = input("ip:\n")
ak = ''
url = "https://api.map.baidu.com/location/ip?ak=" + ak + "&ip=" + ip + "&coor=bd09ll"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"}
sx.send_url(url, headers)
if __name__ == '__main__':
Main()

效果图:

87Lz0H.png

应该是节点附近的地址,在 ipip 上的结果有时候更加准确,要精确肯定得花钱,穷鬼只能用这个玩玩练手了。

基于 ipip 对 ip 进行具体定位

穷鬼方法:

获取 ip 后直接进行查询,然后从返回的 html 页面进行解析,提取有用数据,当然我觉得有点运气成分,找朋友拿了几个 ip 只定位到县级,但我自己的 ip 给我定位到了我小区(有点吊,不过原理是查库,也不是直接定位。

先挖个坑,脚本以后再写。

土豪方法:

直接买服务,会提供接口,返回的是 json 数据,步骤就和用百度接口一样了,还有一些是更精确定位的,有师傅去尝试完了可以让我蹭一蹭尝尝鲜。

总结

如果发起攻击的话,挂代理或者用代理池是一个很重要的步骤,你不知道对手会怎么获取你的信息。在运维立场的话,可能就得在很多地方放下一些蜜罐,或者记录的程序,果然运维没有睡眠。


ip定位获取及反向地址解析
https://52hertz.tech/2020/03/21/ip_trace/
作者
Ustin1an
发布于
2020年3月21日
许可协议