繁体   English   中英

如何在UNIX的udp套接字上获取icmp

[英]how to get icmp on udp socket on UNIX

获取原始套接字需要root特权,而tcp / udp没有root特权,因此我需要知道如何获取udp套接字并获取icmp数据。 编程语言是C,操作系统是类似BSD的。

(换句话说,我想写一个没有root权限的ping命令)

您可以编写没有root特权的UDP ping。

启用IP_RECVERR选项时,所有错误都存储在套接字错误队列中,并且可以通过设置了MSG_ERRQUEUE标志的recvmsg (2)来接收。

请参见UDP手册。

我假设伪造和发送例程已经在SOCK_DGRAM套接字上实现。 然后,访问ICMP消息的源地址:

  • 设置套接字选项以接收错误(IP_RECVERR)
  • 在错误队列(MSG_ERRQUEUE)上调用recvmsg()
  • 解析返回的结构(msghdr和iovec),其中包含ICMP颁发者的源地址。

UDP是OSI第四层协议,ICMP也是。 因此,您无法在UDP套接字上实现ICMP,因为它的第四层协议已固定到UDP。 您可以考虑编写一个需要特权来打开原始套接字的实现。 然后,您可以为应用程序或帐户赋予适当的功能,或者翻转可执行文件SUID位以使其以root用户身份运行。

所以,呃,绕过这个要求很简单,您认为它还会存在吗?

这是为了提供一定的安全性,所以四处走动并非易事。

我认为这是不可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM