0.题前提示
ping是什么?
ping (Packet Internet Groper),是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 其原理是向特定的目的主机发送 ICMP,回显请求报文,并根据回复的ICMP回显应答消息(Echo Reply),测试目的站是否可达并获取连接的丢包率和平均往返时间等有关状态信息。
关于ping命令的更多内容,可以参考这个帖子。
我们创建实例,得到了如下的页面:
可以看到,这个网站想让我们发送一个ping命令。
我们先输入一个网址,得到了这样的结果。
我们得到了一份回显请求报文。这里不细究报文内容。我们只知道这个网站能够让我们对其他网站发送ping命令就好。
但是,ping命令只能让我们得到连通性信息和目标主机的相关信息(部分)。这于我们的解题无益。
这个可以发送ping的命令行,本质上仍然是一个命令行,只不过它的前面强制地加上了“ping”。因此,我们这里介绍一个十分有用的方法:命令执行绕过。
在 CTF(Capture The Flag)竞赛的 Web 安全等相关题目中,命令执行是一个重要的考点。当存在一个存在命令执行漏洞的应用程序时,开发者或竞赛出题者通常会设置一些过滤规则来防止恶意用户直接执行危险命令。而命令执行绕过就是攻击者(参赛者)使用各种技巧来突破这些过滤机制,成功执行被禁止或限制的命令,以获取系统权限、敏感信息等目标。
我们在这里介绍一种最简单的方法:管道操作符。
管道操作符(|,竖斜杠)是一种在编程和数据处理中广泛使用的操作符。它的主要作用是将左边命令的输出作为右边命令的输入,从而形成一个连续的数据处理管道。也常用于在Linux命令行等场合。
如果要在这里应用这种方法,我们应该在左边输入一个无法执行的命令,在右边输入我们真正要执行的命令。
那么,我们真正要执行什么呢?有了。要想查看一个网站的“底细”,最好的办法就是查看根目录。网站根目录包含了构建网站的基本文件和文件夹结构,查看根目录可以帮助我们了解网站结构根目录展示了网站各种资源(如图片、脚本、样式表等)的存放位置。
我们在框内输入127.0.0.0| ls /。然后点击"Ping",得到了这样的界面:
这个命令实际上是 “ping 127.0.0.0| ls /” 。127.0.0.0显然是本地的预留地址,所以这个ping命令无效(大部分情况下)。系统会直接执行后面的命令,为我们调出网页的根目录。
(扩展:为何不输入一个无效的网址(如0.0.0.0)?因为这样会报错,无法执行。)
我们注意到这根目录中有两个“异样”的文件夹:flag和hint(提示)。这里是出题人手下留情了。既然如此,我们便直接执行:127.0.0.0| cat flag。
0.题前提示
ping是什么?
ping (Packet Internet Groper),是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 其原理是向特定的目的主机发送 ICMP,回显请求报文,并根据回复的ICMP回显应答消息(Echo Reply),测试目的站是否可达并获取连接的丢包率和平均往返时间等有关状态信息。
关于ping命令的更多内容,可以参考这个帖子。
我们创建实例,得到了如下的页面:
可以看到,这个网站想让我们发送一个ping命令。
我们先输入一个网址,得到了这样的结果。
我们得到了一份回显请求报文。这里不细究报文内容。我们只知道这个网站能够让我们对其他网站发送ping命令就好。
但是,ping命令只能让我们得到连通性信息和目标主机的相关信息(部分)。这于我们的解题无益。
这个可以发送ping的命令行,本质上仍然是一个命令行,只不过它的前面强制地加上了“ping”。因此,我们这里介绍一个十分有用的方法:命令执行绕过。
在 CTF(Capture The Flag)竞赛的 Web 安全等相关题目中,命令执行是一个重要的考点。当存在一个存在命令执行漏洞的应用程序时,开发者或竞赛出题者通常会设置一些过滤规则来防止恶意用户直接执行危险命令。而命令执行绕过就是攻击者(参赛者)使用各种技巧来突破这些过滤机制,成功执行被禁止或限制的命令,以获取系统权限、敏感信息等目标。
我们在这里介绍一种最简单的方法:管道操作符。
管道操作符(|,竖斜杠)是一种在编程和数据处理中广泛使用的操作符。它的主要作用是将左边命令的输出作为右边命令的输入,从而形成一个连续的数据处理管道。也常用于在Linux命令行等场合。
如果要在这里应用这种方法,我们应该在左边输入一个无法执行的命令,在右边输入我们真正要执行的命令。
那么,我们真正要执行什么呢?有了。要想查看一个网站的“底细”,最好的办法就是查看根目录。网站根目录包含了构建网站的基本文件和文件夹结构,查看根目录可以帮助我们了解网站结构根目录展示了网站各种资源(如图片、脚本、样式表等)的存放位置。
我们在框内输入127.0.0.0| ls /。然后点击"Ping",得到了这样的界面:
这个命令实际上是 “ping 127.0.0.0| ls /” 。127.0.0.0显然是本地的预留地址,所以这个ping命令无效(大部分情况下)。系统会直接执行后面的命令,为我们调出网页的根目录。
(扩展:为何不输入一个无效的网址(如0.0.0.0)?因为这样会报错,无法执行。)
我们注意到这根目录中有两个“异样”的文件夹:flag和hint(提示)。这里是出题人手下留情了。既然如此,我们便直接执行:127.0.0.0| cat flag。
发生了什么?我们毫无理由地被骂了一通,这说明:我们被拦截了。某些软件或脚本可能会拦截特定的命令。我们只能使用通配符绕过的方法。
通配符是什么?通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件。当查找文件夹时,可以使用它来代替一个或多个真正字符。
我们可以通过使用通配符代替字母的方法来绕过拦截。
关于Linux通配符的更多知识可以参考这里。
由于我们不确定出题人到底是对命令中的什么部分做出了限制,因此最稳妥的方法就是全部替换。
我们把cat替换为 “ca\t” 。这是因为我们要绕过系统对“cat”命令的拦截。我们也可
以用两个单引号(’ '),两个反撇号绕过。
(更多信息参考这里)
我们再把“flag”替换成
“ /f* ”
(在前面加上斜杠的目的是标出文件的位置,否则命令会因为找不到文件而无法执行。)
这样,整个命令就变成了
“127.0.0.1|ca\t /f* ”
这样,我们得到了flag的前半段。
我们如法炮制,输入“127.0.0.0|ca\t /h*”以访问hint文件夹。得到了这样的页面:
根据页面的提示。我们把命令改成
127.0.0.1|ca\t /.f*
随后我们得到了这样的页面:
所以,完整的flag就是
Redrock{Y0u_ar3_rea1ly_good_a7_Pinging!}
对ping的补充解释
ping的本质是远程命令执行。和我们在02中接触到的eval(远程代码执行)同属于RCE漏洞。具体而言,只要开发者向用户暴露了接口(哪怕是限制了功能的接口),就有可能受到远程的恶意代码注入。
关于RCE漏洞及其防御的更多内容,还可以参考这个帖子。
学到了什么?
- ping是什么;
- 命令执行绕过是什么;
- 利用管道操作符绕过;
- 利用通配符替换绕过;
这道题题目为ping,事实上却没有用到ping;这也表明,竞赛通常会设下种种幌子,引诱我们走向歧途,我们应该擦亮眼睛,从题目中学习套路。从而实现夺旗。