nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

Bash 破壳漏洞Shellshock (CVE-2014-6271)赛博复现分析

前言

参考博主https://www.mi1k7ea.com/

搭建环境

https://www.cnblogs.com/Cl0ud/p/14248937.html
看着教程都复杂,就不想复现了,因为自己搭了很久的环境,也没搭明白,cccc这里自己就简单理解一下这个漏洞是什么意思

别人复现过程

大部分都是直接抄原文,原文讲得很good

首先了解一下漏洞的原理

该Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以(){开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。
没有理解,没关系,我也是理解了™一个下午,2024-01-30T06:21:30.png就是你以(){开头定义的环境变量在命令ENV后,bash命令没有结果,可以用来执行命令,比如图片就是进行执行echo ....

bash的父子进程

我们先看一个实列2024-01-30T06:24:54.png
我们先定义一个变量,在父进程中成功输出,bash进入子进程,发现输出没有结果,说明$springbird变量没有继承到子进程中来,我们就遇到一个问题:
那么我们怎么样才能在子进程中使用父进程的变量呢?
可以将变量存储到环境变量中,这样就可以在父子进程中一起使用该变量了
我们使用export命令将其设置为环境变量
2024-01-30T06:28:36.png
可以看到设置环境变量后子进程也能够使用该变量了
这个时候我们设置一个函数作为环境变量
x(){ echo "test"; }
2024-01-30T06:31:35.png
可以看到子进程中也能成功执行该函数
如果我们把它设置为字符串
2024-01-30T06:31:52.png
父进程当作字符串处理,不能识别命令,而子进程可以
注意:
()和{之间有空格

可以看到我们创建的字符串变量被设置成环境变量后在子进程解释成了函数执行,成功读取了 /etc/passwd
所以触发并利用破壳漏洞的所需要的几点:

被攻击的bash存在漏洞(版本小于等于4.3)
攻击者可以控制环境变量
新的bash进程被打开触发漏洞并执行命令
从上面的分析中可以看出,漏洞的根本原因存在于Bash的ENV命令实现上,因此漏洞本身是不能够直接导致远程代码执行的。如果要达到远程代码执行的目的,必须借助第三方服务程序作为媒介才能够实现,第三方服务程序也必须要满足众多条件才可以充当此媒介的角色。

一些问题

2024-01-30T06:34:02.png
我们实际去完成paylod的传入,是我们从User-agent里面打过去的,为什么能够生效呢?
这时候我们就有用到cgi了,关于cgi,以前也说过了,网上很多,都知道cgi每次去处理数据,都会重新初始化,当一个CGI脚本未被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制,当这个CGI脚本被HTTP服务器调用时,它的环境变量就会增加关于HTTP服务器,客户端,CGI传输过程等条目

也就是说,每当CGI脚本接收到一次HTTP请求,它的环境变量就会新增一些条目,比如User-agent,Connection等信息

所以这里我们通过修改User-Agent来修改CGI环境变量

学习结束,启动

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » Bash 破壳漏洞Shellshock (CVE-2014-6271)赛博复现分析

评论