前言
最近在运维的时候碰到一些恶意访问,恶意操作的情况,有师傅建议我可以挂个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 在
content
中 point
的 y
里
- 经度 x 在
content
中 point
的 x
里
- 省份城市分别在
content
中 address_detail
的 province
、content
中 address_detail
的 city
里
- 节点信息直接用
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
|
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(): 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()
|
效果图:
应该是节点附近的地址,在 ipip 上的结果有时候更加准确,要精确肯定得花钱,穷鬼只能用这个玩玩练手了。
基于 ipip 对 ip 进行具体定位
穷鬼方法:
获取 ip 后直接进行查询,然后从返回的 html 页面进行解析,提取有用数据,当然我觉得有点运气成分,找朋友拿了几个 ip 只定位到县级,但我自己的 ip 给我定位到了我小区(有点吊,不过原理是查库,也不是直接定位。
先挖个坑,脚本以后再写。
土豪方法:
直接买服务,会提供接口,返回的是 json
数据,步骤就和用百度接口一样了,还有一些是更精确定位的,有师傅去尝试完了可以让我蹭一蹭尝尝鲜。
总结
如果发起攻击的话,挂代理或者用代理池是一个很重要的步骤,你不知道对手会怎么获取你的信息。在运维立场的话,可能就得在很多地方放下一些蜜罐,或者记录的程序,果然运维没有睡眠。