玩一玩Rawsocket
ip包与icmp包之间的关系图
什么是rawsocket
我们一般做应用编程的时候其实关注的socket是udpsocket或者是tcpsocket,也就是协议层的东西是确定的
但是rawsocket不是,他可以让你自定义协议层的内容,比如自己顶一个YCPSocket,只要不被路由器丢弃就可以被对方机器接受
操作rawsocket的好玩的事情
因为能够操作到协议层,就能做一些有意思的事情,比如可以探测出从本机到(任意)IP间经过路由器的ip地址,或者是做ICMP攻击用
如何做
比如我可以指定ip包的ttl,使得经过特定次数路由器后包被丢弃,同时丢弃的路由器返回ICMPv4TypeTimeOut的响应,此时就可以获取到RemoteAddr,逐次记录Ip直到返回ICMPv4TypeEchoReply,此时就可以获取到指定IP的完整链路
如果是攻击行为只要将IP协议中的src更改成一个特定地址,则可以是的特定地址的服务器被DDoS攻击
Golang相关
因为要操作的层级很低,这个时候需要有些过程式的说明,
首先要创建RawSocket需要理解,我们其实是要直接向硬件写自己构造的数据,那么在描述的时候这个过程如下
获取操作硬件的指针/句柄/文件地址
将其指针赋予RawSocket,并指定每次操作socket时候写包的参数
创建好socket后就可以直接写我们创建的二进制数据了