shellshock

0x01 简介

Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行任意的shell命令,甚至完全控制目标系统。

1
2
3
#payload:
env x='() { :; }; echo shellshocked' bash -c "echo 1"
#存在漏洞时输出有shellshock(注意加必要的空格)

漏洞核心原理:类似代码注入,父进程中的特殊变量字符串(这里指字符串内容为函数)成为环境变量后,在子进程中调用该字符串时将其理解为函数执行,本质上是bash代码本身对于处理该类环境变量时的不合理

0x02 (前置知识) 环境变量&bash

1、shell变量:

image.png

子进程不继承普通shell变量

2、shell环境变量:

image.png

子进程可以继承环境变量

3、shell函数变量:

image.png

子进程不继承普通函数变量

4、环境变量版函数变量:

image.png

子进程会继承环境变量版函数变量

5、字符串版 函数环境变量(漏洞点1)

image.png

将函数声明当作字符串赋值给环境变量时,子进程会错误的把普通环境变量当作函数变量执行!

对比没有漏洞的kali:
image.png

6、字符串定义一次性版 函数环境变量:

image.png

env定义一次性环境变量,之后可加被作用的命令语句

对比没有漏洞的kali:
image.png

7、字符串定义版 函数环境变量注入:

image.png

启动bash子进程时居然执行了一次在函数定义语句后方的注入代码!
具体原因后文探讨

小总结

触发shellshcok:

  1. 存在子进程对字符串环境变量的解析错误(解析为函数变量),得以获得有问题的函数变量
  2. bash未对函数变量做明确的界定、截取,导致结尾处代码注入(具体原因后文探讨)

0x03 漏洞成因

1、bash对于函数变量的解析

image.png

新的bash进程会重新加载环境变量,此时解析器若发现括号和花括号时就会认定它是函数定义
这就是子进程错把字符串形式的变量解析为函数变量的原因

2、尾部代码注入

关于为什么bash把函数体解析完之后会去执行后面的注入语句:

有漏洞的bash的源码:

image.png

简单分析源码,Bash初始化时调用了builtins/evalstring.c里的parse_and_execute函数。是的,就等于Bash初始化环境时调用了类似其他高级语言中的eval函数,它负责解析字符串输入并执行。但是又未对变量进行截取、过滤,导致读到后括号 } 时没有结束!

其实Bash本身其实是想在启动时初始环境变量以及定义一些函数,而初始的方式就是去把 变量名=值 这样的赋值语句用eval去执行一次,如果出现了函数定义,就把它转变成函数,除此之外就不想让它干其他的了,可偏偏它在扫描到函数定义时,把它转变成函数的过程中不小心执行了后面的命令,这其实不是eval的错,这是做语法解析时没考虑严格,所以补丁加了这么一句话来判断函数体合法性:

1
if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)

image.png

0x04 漏洞利用

payload

经典payload:

1
env c='() { :;}; echo 1' bash -c 'echo 2'

image.png

image.png

定义一个字符串型函数环境变量,尾部注入检测点echo 1,最后启动一个新bash触发被注入代码
注意空格之类的细节

攻击suid程序本地提权

将system中写死命令的执行点利用shellshock进行转移外带

image.png

假设现在有这样一个有s位的可执行文件,由root编译且setuid,system中的命令写死/bin/ls,即不能执行其他命令,且因为写死了/bin也不能劫持ls,此时便可用shellshock转移外带出执行点!

1、将/bin/sh软链接到存在漏洞的bash

1
ln -sf /bin/bash /bin/sh

因为system底层使用的是/bin/sh,并非bash
此时执行文件已可以启动有漏洞的bash

2、导入永久型函数环境变量、执行s位文件

1
2
export test='() { :;};/bin/bash -p'
./exp

此时只要启动bash就会加载一次环境变量test、执行一次被注入的语句(可以是反弹shell),从而转移出命令执行点,由于最初的触发点是root的s位,所以拿到的会是root shell

注意:做题时一定注意反编译出的可执行文件有没有setuid0(设置进程uid为root),若没有就是虚假的s位文件,无法利用!(即需要同时设置文件的suid和进程的suid,才真正有root权限)

攻击ssh

image.png

先来看openssh的阻止特定用户ssh登录功能:

image.png

1
2
3
4
5
6
ssh -i identity_file shocker@140.20.11.30
The authenticity of host '140.20.11.30 (140.20.11.30)' can't be established
...
Enter passphrase for key 'identity_file':
welcome
Connection to 140.20.11.30 closed.

对比两种方式:
image.png
个人理解:forcecommand由操作系统完成,用户配置文件的command和客户端ssh链接时携带的命令属于同一类型

接下来来看openssh提供的客户端可携带命令的功能:

1
2
3
$ ssh -i identity_file test@140.20.11.30 'echo USER=$USER and SHELL=$SHELL'
Enter passphrase for key 'identity_file':
USER=test and SHELL=/bin/bash

openssh允许用户在登录语句携带命令,登录成功后执行,但优先级低于两种command,即若服务端主动关闭连接就会无法执行

漏洞产生:

当客户端提供使用 ssh 命令运行的命令时,sshd 会将其复制到 SSH_ORIGINAL_COMMAND 变量中,但仅运行强制命令。尽管如此,由于 SSH_ORIGINAL_COMMAND 是一个环境变量,我们可以通过传递以 Bash 函数开头的命令来利用 Shellshock,这为我们提供了一种绕过施加限制的方法

一句话概括:登陆语句携带的命令会寄存在这个环境变量中,此时若服务器存在bashshock,即可完成shellshock所需的环境变量注入,从而执行任意命令,如反弹shell,最后获得稳定shell

image.png

1
2
3
4
ssh -i identity_file shocker@140.20.11.30 '() { :;}; echo USER=$USER and SHELL=$SHELL'
Enter passphrase for key 'identity_file':
USER=shocker and SHELL=/bin/bash
welcome

例题:vulnhub的tr0ll2

攻击cgi程序

前置知识:

image.png

原理:

image.png

利用条件:
1、启用cgi,且可以访问到cgi-bin下的cgi程序
2、bash版本存在shellshock

image.png

例题:vulnhub pwnos1

攻击dhcp

当攻击者拿下dhcp服务器时,可攻击存在shellshock的客户机,利用114号option会作为额外option注入客户端环境变量,达成对客户端的rce

dhcp服务器的处理流程:

  1. DHCP Discover和Offer
    • Linux Client发送DHCP Discover报文以请求IP地址和其他网络配置信息。
    • DHCP服务器接收到Discover报文后,根据配置构建Offer报文,并包含IP地址、子网掩码等参数,以及额外Option中的114号参数,该参数代表Url参数,后续会被添加如环境变量。
  2. DHCP Request和Ack
    • Linux Client接收到DHCP服务器发送的Offer报文后,可能会发送DHCP Request报文以确认所提供的网络配置。
    • DHCP服务器接收到Request报文后,如果同意提供配置,将发送DHCP Ack报文确认。
    • Linux Client在接收到Ack报文后,将配置应用到其网络接口。
  3. Client调用Bash对端口以相关参数赋值
    • 一旦Linux Client成功获得IP地址和其他网络配置,会调用Bash脚本对网络接口进行配置,并将DHCP服务器提供的参数作为环境变量传递给该脚本,其中就包括114号参数

image.png

当client请求dhcp服务器时触发shellshock反弹出客户机shell

0x06 参考资料

Bash 3.0-4.3命令执行漏洞分析 - 知道创宇 (knownsec.com)
Shellshock漏洞回顾与分析测试 - Debug_Orz (wooyun.js.org)
什么是ShellShock攻击? (zhihu.com)
Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析 - 春告鳥 - 博客园 (cnblogs.com)
Shellshock(软件错误) - 维基百科,自由的百科全书 — Shellshock (software bug) - Wikipedia
[ShellShock 攻击实Shellshock (Bash CVE-2014-6271) 威脅仍在擴大中,但無需過度恐慌 | DEVCORE 戴夫寇爾
关于ShellShock对企业网络服务器的攻击以及防范手段-阿里云开发者社区 (aliyun.com)
bash - shellshock DHCP 漏洞利用 - 信息安全堆栈交换 — bash - shellshock dhcp exploitation - Information Security Stack Exchange
https://www.zhihu.com/tardis/zm/art/35579956?source_id=1005
https://www.cnblogs.com/Cl0ud/p/14248937.html
https://zhuanlan.zhihu.com/p/21365920
 https://en.wikipedia.org/wiki/Shellshock_(software_bug)
https://www.freebuf.com/articles/system/279713.html
https://wooyun.js.org/drops/Shellshock%E6%BC%8F%E6%B4%9E%E5%9B%9E%E9%A1%BE%E4%B8%8E%E5%88%86%E6%9E%90%E6%B5%8B%E8%AF%95.html


shellshock
https://fyhypo.github.io/blog/vuln/vuln shellshock/
作者
FYHypo
发布于
2024年4月6日
许可协议