2017 美亚柏科邀请赛 writeup

一个辣鸡随手写的writeup

Posted by Les1ie on December 27, 2017

拿flag是不可能的了,这辈子都不可能拿flag的。 题目又不会,只能看看各位神仙师傅的wp才能勉强说是我是搞安全的。 逛大佬的博客就像是回了家一样,这里的师傅都好有才,说话又好听,我超喜欢这里的。

web2

题目

1
login as webmaster

打开是一个登录框

看起来像是一个爆破或者登录绕过。

拿出了1w的字典,php万能密码爆破许久,试过了root, admin,administartor, webmaster, manager等用户均无法登录,登录的结果给出的回显包括

1
2
bad request. 
login failed

或者

1
login failed
1
2
3
login failed
bad request. 
login failed

一些师傅说的会有法语的报错,我没看到

后来问了隔壁的师傅,他们说payload 是数组绕过

emmm mdzz

payload

1
user[]=admin&pass[]=a&submit=submit

web4

题目

1
你能找得到flag吗

打开提示 你会sql注入吗, 还有中文的验证码

试了下验证码是没有验证的

过滤了空格

回显放到了cookie里面。

具体参考厦大的神仙们的wp

web5

打开提示需要接收四个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Hello hacker! Do you want the flag?<br>
<!--
	$k1=$_GET['key1'];
	$k2=$_GET['key2'];
	if(file_get_contents($k1)==="Hello hacker!"){
		echo 'welcome! Hacker!<br>';
	}
-->
<!--
		if(md5($k2)>666666*666666)
		{
			include('ctf.php'); 
		}
-->
<!--
		$k3=$_GET['key3'];
		$k4=$_GET['key4'];
		if(intval($k3)<666)
		{
			if($k3==666)
			{
				echo 'Come on, flag is coming<br>';
				if($k4>0)
				{
					if(intval($k3+$k4)<666)
						echo $flag;
				}
			}
		}
-->

每次修改传参,循序渐进即可拿到flag, 花式绕过php的各种限制 首先需要满足key1, key1 会使用file_get_contents()函数去取网页的内容,注意到Headers是这个样子的

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 08:21:16 GMT
Server: Apache
luck: hellohacker.php
Content-Length: 545
Connection: close
Content-Type: text/html

里面有一行luck: hellohacker.php, 打开看就是他需要file_get_contents获取到的文本的内容,最开始包含这个文件,始终不行,看下源码可以知道后面还有一个注释233333, 那么可以试试文件包含暴力把需要的文本放进去,直接用data:text/plain传过去,因为有符号之类的会比较麻烦,所以base64之后传进去, 过key1的payload如下

1
/index.php?key1=data:text/plain;base64,SGVsbG8gaGFja2VyIQ==

厦大的师傅们用的php://input传字符串进去

根据回显可以得知需要传key2了,要求是key2的md5的值要大于666666*666666,我的思路是 那么直接找一个字符串,散列值全是数字的即可,写一个python脚本跑了一下, 找到了1518375, md5散列值为93240121540327474319550261818423 传进去即可。厦大的师傅们用了字符串skwerl11, 他的md5值是1e21ff98693770b768e4a1a4a704811b, 1e是科学计数法,php在比较字符串和数字的时候会把字符串转化为数字,直到遇到不是0-9的值就会停止,所以这里会转化成1e21也就是 1*10^21,要找到这个字符串只有php能最快搞定, py是不懂php的黑了

key2 的payload如下

1
/index.php?key1=data:text/plain;base64,SGVsbG8gaGFja2VyIQ==&key2=1518375

下面是key3, 他是需要key3的值转换成int之后小于666, 同时需要原始的值等于666, 自然想到了精度绕过,于是传了个665.99999记不清有多少个9了,由于的传的9不够,所以没过,厦大师傅是用的精度绕过,传值665.99999999999999

机智的misc手说可以用16进制,然后输入了0x29a,搞定key3

key3的payload如下

1
/index.php?key1=data:text/plain;base64,SGVsbG8gaGFja2VyIQ==&key2=1518375&key3=0x29a

最后一个是key4, 之前在文档看到了intval的表达范围是有限制的,取决于操作系统,所以用了溢出,溢出的结果参考这里

所以最终payload如下

1
/index.php?key1=data:text/plain;base64,SGVsbG8gaGFja2VyIQ==&key2=1518375&key3=0x29a&key4=999999999999999999999999999999999999999999999999996666

misc3 什么也看不到

感谢同济大学的神仙们提供的思路

打开是一个图片,丢进HxD看到尾部有一段字符串,把FF D9之后的部分复制出来

1
KA2DAMBQGAYDATRVGAYDCMBQGAYTAMBQGAYDAMBQGA3DANJQJ42DANJRGAZVCUZSHA4DSNKPGAYTCU2SGEYDGUKTGI4DQOJVJ4YDCMKTKIYTAM2RKMZDQOBRHEZTAOBUKAZTAMBYGEYDAMJQGAYDAMBQGAYDAMBQGAZDAMCOGA2DOOBXGQ3VEMRXGYYTMUBWGY3DAMBQGAYDAMBQGAYDAMBQGAYDEMBQGAYDAMBQGAYDAMBQGAYDIMRQGA4DAMBQGAYDAMBWGIYDAMBQGAYDMMSPGJHE6OCRHA2E6NBRGNITOOJVGAYDQMBQGA4TAMBQGQYTAMCTGEZDAMJQJ42DANJRGBHDMUJQKE4FCMBTHEZDSMRVGM2VAMBSGVIFAM2RGM4VANCQHAZE6MZQGUZVENCRGRHDINJTG4ZTIM2SGQ3DGMJTGQZVCNCQGQ3U6NRTKNHFANBZGRHVATZUGQ3TQNZUG5JDENZWGE3FANRWGYYDAMBQGAYDQMBQGAYDAMBQGYZDAMBQGAYDANRSJ4ZE4TZYKE4DITZUGEZVCNZZGUYDAOBQGAYDAMBQGA2DCNBQGMYE6NBQGU======

base32 decode之后

1
P4000000N500100010000000006050O405103QS28895O011SR103QS28895O011SR103QS288193084P30081001000000000000200N0478747R27616P6660000000000000002000000000000004200800000006200000062O2NO8Q84O413Q79500800090004100S12010O40510N6Q0Q8Q039292535P025PP3Q39P4P82O3053R4Q4N4537343R4631343Q4P47O63SNP494OPO4478747R27616P666000000800000006200000062O2NO8Q84O413Q7950080000000414030O405

这是一个看起来是有很多的0的但是有NOPQRS这种是不应该出现在16进制字符串的东西,同济大学的神仙们把NOPQRS替换成了ABCDEF,现在他就是一个十六进制字符串了

1
C4000000A500100010000000006050B405103DF28895B011FE103DF28895B011FE103DF288193084C30081001000000000000200A0478747E27616C6660000000000000002000000000000004200800000006200000062B2AB8D84B413D79500800090004100F12010B40510A6D0D8D039292535C025CC3D39C4C82B3053E4D4A4537343E4631343D4C47B63FAC494BCB4478747E27616C666000000800000006200000062B2AB8D84B413D7950080000000414030B405

这还没完,神仙们还注意到这个是B405结尾的,于是反序一下

1
504B0304140000000800597D314B48D8BA2B260000002600000008000000666C61672E7478744BCB494CAF36B74C4D3431364E3437354A4D4E3503B28C4C93D3CC520C535292930D8D0D6A01504B01021F00140009000800597D314B48D8BA2B2600000026000000080024000000000000002000000000000000666C61672E7478740A00200000000000010018003C480391882FD301EF110B59882FD301EF110B59882FD301504B050600000000010001005A0000004C

这个是一个肉眼可见的zip压缩包的十六进制了,于是写入一个二进制文件,解压提示有密码

然后修改14 00 09 0014 00 00 00 解压即可得到flag

1
flag{79ea433a752ece633a25cf6d1ddcc130}

misc4 Misc_Flow

解压提示可以看到一个rar和一个Hint.txt, 压缩包是有密码的,Hint.txt内容如下

1
2
3
Blasting code???
No No No!
There is another txt file.

自然想到了交换数据流,用工具查看但是始终找不到哪里有附加流,Hint.txt后面没有, flag.rar后面也没有,flag.rar里面有个flag.png, 但是需要解压密码,于是猜想需要搞定这个rar,然后在flag.png里面查看交换流。

比赛结束后请教了下复旦的师傅,师傅说交换流是在最外层的压缩包,就是主办方给的题目打包后面,用7z打开就能看到…..2333333

我和我们的misc手都默认第一层是打包题目用的,压缩包的里面某个文件放着交换数据流文件,解压的时候我都是直接右键,选择解压到xxx, 所以自然看不到藏在后面的东西。

1
$ notepad Misc_Flow:password.txt

打开就是rar的密码,

1
c1d6159d94cc00dfeafde4f5ff7639ade491f7639ade4f5ff7639ade491feaf5ff7639ad

解压可得flag

misc5

打开是一个pcapng 数据包,能看到里面有大量的tls数据包和icmp数据包

icmp数据包有明显的人为成分, 里面有自定义的大量的aaaaaa字符串

请教了复旦大学的师傅们,师傅说根据每个icmp包的a的数量,依次记下来,然后转成ascii, 再凯撒就搞定了

太麻烦了,眼花, 没有去做一遍了

神仙的思考方式和我这个凡人就是不一样

音频

MISC手au打开,一段音频,然后放弃

参考厦大师傅推荐的wp

反正本辣鸡看不懂

树莓派

扫一波,开了三个端口 21,22, 3xxxx,顺手一个admin admin进了ftp, 下载了一个server可执行文件下来,然后用admin admin登录进去了ssh, history一下,有一个sudo su -, 然后调用摄像头拍照的命令

自己试了下,发现没在sudo组里面,意思是需要pwn掉这个server, 我们队伍没有pwn手,所以弃疗

比赛结束问了隔壁的师傅,师傅说登进去,下载下来,pwn掉,就是root权限了

师傅们一帆风顺的走过了我们的拦路虎哈哈哈哈

wp 没有,再见

干货

第二天的分享会,企业的工作人员给我们分享了一些过防火墙的一些经验,值得注意得是,安全狗是他们公司的产品,所以狗有没有这些bug是很明显的了

安全狗: 听说你们想过我?

下面是分享的内容:

  1. 找源ip
    • 找历史解析地址
    • github源码
    • 子站ssrf
  2. 资源限制
    • 大的post包只检查前面几个字节
  3. 协议绕过 使用form-data上传而不是x-www-form-urlencode 一般不会检测前者
  4. 协议解析不一致 文件名包含换行符, 绕过waf 多个comtent waf会检测第一个,服务器会解析所有
    • http允许上传多个文件, waf只会检测第一个文件,可以把自己的payload放到后面的包
    • 空文件名
    • http协议要求文件名 filename=”xxx” 但是tomcat和apache兼容没闭合的,可以绕过waf
    • 空白符绕过,使用正则的waf 的\S mysql 的正则不同,mysql兼容%3c等
    • waf里面用正则的可以考虑用正则回溯拖垮waf
    • 文件包含绕过
    • 相对../检测,waf会检测连续的../,可以用不连续../ 比如插入./绕过
    • 绝对路径文件包含 /etc/././passwd
    • 根据访问频率绕过,使用代理

  • 自己太菜,好好学习

  • 见识到神仙们的厉害了, 以后就吹自己和打过defcon的师傅们同台竞技过

  • 比赛结束的时候天枢的师傅们互相击掌祝贺,我们给各位师傅鼓掌啦啦啦

  • 这次比赛的逆向有点恼火, 我们的re手说: 师傅们都在分享自己如何遇到坑如何爬起来,我们只能分享如何遇到坑并且爬不出来 哈哈哈哈

  • 某师傅说,工控题目,打开了msf, search了一下,然后use, set rhost, 不知道为什么flag就弹回来了,他自己都不知道发生了什么, 大佬们都是随手拿flag的,不得不膜, msf打ctf也是6666

  • 做工控题目的时候扫了1-65535, 没一个端口开了(现在想想,我个zz,忘记加 -P 和 -sU了),当时一脸懵逼, 以为是网络层的题目
  • 搞树莓派的题目的时候,扫了下C段,发现很多题目中没有的ip, 当时以为是题目的一部分,打开下载了一些东西下来,后来放题了发现是我刚刚扫出来的题目 然而并没有什么用,vegatable is still vegatable

  • 请教厦大的师傅web2的时候,师傅说手快一血,我……emmmm

  • 武大的师傅说,要给队友一个肯定的眼神

  • 拿flag是不可能的了,这辈子都不可能拿flag的。 题目又不会,只能看看各位神仙师傅的wp才能勉强说是我是搞安全的。 和神仙们一起打ctf就像是回了家一样,这里的师傅都好有才,说话又好听,我超喜欢这里的。
  • 比赛时间 2017.12.23 , 厦门风景真好,还比成都暖和,厦大也好大呀

以上

2017-12-27 01:13:13