实现Ping二进制八进制十六进制


Ax Ping Command

ping是我们最熟悉的命令,但在学习ssrf漏洞时,学到了通过ping八进制来绕过,惊讶到我了,就此分享一下。

ICMP(Internet Control Message Protocol)协议是因特网控制报文协议,因特网控制报文协议ICMP(Internet Control Message Protocol)是一个差错报告机制,是TCP/IP协议簇中的一个重要子协议,通常被IP层或更高层协议(TCP或UDP)使用,属于网络层协议,主要用于在IP主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等。这些控制消息虽然并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有至关重要的作用。

阅读文献:RFC2616

ICMP的应用

Ping

今天的主角,我们主要讲这个!

Ping程序是最常见的用于检测IPv4和IPv6网络设备是否可达的调试手段,它使用ICMP的echo信息来确定:

  • 远程设备是否可达;
  • 与远程主机通信的来回旅程(round-trip)的延迟;
  • 报文包的丢失情况。

Tracert

Tracert程序主要用于查看数据包从源端到目的端的路径信息,从而检查网络连接是否可用。当网络出现故障时,用户可以使用该命令定位故障点。

Tracert利用ICMP超时信息和目的不可达信息来确定从一个主机到网络上其他主机的路由,并显示IP网络中每一跳的延迟(这里的延迟是指:分组从信息源发送到目的地所需的时间,延迟也分为许多的种类——传播延迟、传输延迟、处理延迟、排队延迟等)。

NQA

网络质量分析NQA(Network Quality Analysis)是一种实时的网络性能探测和统计技术,可以对响应时间、网络抖动、丢包率等网络信息进行统计。NQA能够实时监视网络服务质量,在网络发生故障时进行有效的故障诊断和定位。

利用不同类型的ICMP报文,NQA实现了Ping和Tracert功能的扩展和增强,可以实现对网络运行状况的准确测试,输出统计信息。比如NQA的ICMP测试、ICMP Jitter测试和Trace测试等。

  • ICMP测试

    ICMP测试是通过发送ICMP Echo请求报文和Echo响应报文来判断目的地的可达性、计算网络响应时间及丢包率,从而清晰地反映出网络性能及畅通情况。ICMP测试提供类似于命令行下的Ping命令功能,但输出信息更为丰富。

  • ICMP Jitter测试

    ICMP Jitter测试是以ICMP报文为承载,通过记录在报文中的时间戳信息来统计时延、抖动、丢包的一种测试方法。Jitter(抖动时间)是指相邻两个报文的接收时间间隔减去这两个报文的发送时间间隔。

  • Trace测试

    NQA的Trace测试用于检测源端到目的端的转发路径,并沿该路径记录源设备到中间各个设备的时延等信息。Trace测试类似于Tracert命令功能,但输出信息更为丰富。每一跳信息中能够显示平均时延、丢包、最后一个包接收时间等信息。

Bx Ping Decimalism

语法

ping [decimal numeral]

不过,你需要将我们的IP地址转换成十进制数,因为IP地址是点分十进制

转换工具:http://www.jsons.cn/ipnum/

例如ping 220.181.38.251,百度的IP地址为例。转换成十进制后为3702859515

原理

IP地址换换成数字地址的方法如下:

例子:219.239.110.138

具体计算过程如下:

219*2563+ 239*2562+110*2561+138*2560=3689901706

219.239.110.138–>3689901706

转换后的3689901706即为ip 219.239.110.138的数字地址

示例

ping 3702859515

Cx Ping Octal

语法

ping 0[Octal number]

首先将点分十进制转为十进制,然后再转为八进制,在八进制前添加一个0标识为八进制即可

示例

ping 033455223373

Dx Ping Hexadecimal

语法

ping 0x[hexadecimal number]

同样将IP地址转为十进制,再转为十六进制,然后使用0x标识为十六进制。

示例

ping 0xDCB526FB

Ex Ping Binary

ping二进制数似乎是被禁止的,我尝试了多种方法都无法实现。

既然如此,那就要使用一些shell的思想了,首先我们要对二进制进行转换成任意进制,因为目前就剩下二进制无法实现。

首先CMD肯定是无法实现进制转换的(反正我没找到二进制相关命令,八进制十六进制是可以使用set /A的)。

所以使用Powershell的进制转换工具来实现。

Powershell Conversion

语法

[System.Convert]::ToInt64([binary number],2)

示例

发现报错了,经过测试,删除四位后,成功。在数字大小上受到了限制。

分离

解决思路,分段拼接。

百度的IP地址为:219.239.110.138

转为十进制:3702859515

转为二进制:11011100101101010010011011111011

分段为两部分:37028 | 59515

二进制:1001000010100100 | 1110100001111011

拼接

$a=([System.Convert]::ToInt64(1001000010100100,2));$b=([System.Convert]::ToInt64(1110100001111011,2))

示例

怎么感觉还是挺费劲的,转场Linux吧,走走走

Linux Shell Conversion

思路也是同样的思路,先转换进制赋值给变量,再使用Ping命令。

示例

Fx Ping Other

不仅可以ping二级制,十进制,十六进制,八进制,其实使用点分十进制的时候,也可以单个转换。

示例

ping 110.1.1.0130

这个IP地址合法吗,合法。

0130是八进制的表示,也就是说,ping命令在识别到0开头的数字时会降为八进制数,那么ping这个地址,130会变成88。

混和

让我们分别用二级制、十进制、十六进制、八进制来结合一下。

补充

这样的设计不知道是缺陷还是Bug还是漏洞还是正常功能,虽然不影响使用,但是如果我们需要精确匹配正常的IP地址的话,我们需要使用正则,语法如下:

25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])

Gx References

[1] https://www.bbsmax.com/A/n2d9lomv5D/

[2] https://www.rfc-editor.org/rfc/rfc777.txt

[3] https://info.support.huawei.com/info-finder/encyclopedia/zh/ICMP.html

[4] https://docs.microsoft.com/zh-cn/dotnet/api/system.convert.toint64?view=net-6.0


文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录