V0W's Blog

2018-hgame CTF week1

字数统计: 1,517阅读时长: 7 min
2018/01/01 Share

原题链接
由于开放时间短,不知道什么时候结束。我会将题目的大致内容以图片形式down下来。

web?


1 Are you from Europe?

mark
URL http://123.206.203.108:10001/European.html
mark
一看题,就感觉想是用burp抓包做,来自欧洲,就想到改语言,accept-langue字段。
但是,我试了en,gk等等值,并没有什么卵用。而且发现动态调用是用js实现的也就是说,没有调用服务的数据。

于是想到可能是在js里设了坑。

查看源码:
mark
发现猫腻eval, 于是换成alert ,查看函数内容:
mark

1
2
3
4
5
6
function soHappy(){var buy=confirm("SSR!欧洲人,你愿意献祭你全部的 SSR 来获取 flag 吗?");
if(!$("#serv5").html()&&!$("#craft5").html()){alert("你根本不是欧洲人。");return}
var flag="";flag+="";flag+="";flag+="";flag+="hgame";flag+="{";flag+="T";flag+="h";
flag+="3";flag+="_";flag+="C";flag+="h";flag+="0";flag+="s";flag+="e";flag+="N";flag+="_";
flag+="0";flag+="n";flag+="E";flag+="!";flag+="}";if(buy){$("#serv5").remove();$("#craft5").remove();
alert("兑换成功。flag: "+flag)}else{alert("你失去了唯一的机会。")}}

相信大家的机智,都看到flag了。

flag: hgame{Th3_Ch0seN_0nE!}

知识点: js审计

反思: 这题容易被题目本身带到抓包http协议的道上,但是这是错的。本身网页只是js动态,没有服务器请求。

2 special number

mark
URL http://118.25.18.223:10001
进url,是一段php源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
include_once("flag.php");
if(isset($_GET['key'])){
$pattern = '/^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{7,}$/ ';
$key = $_GET['key'];
if(preg_match($pattern,$key)===0){
echo "格式错误";
}else{
$lock="******************";
$b = json_decode($key);
if($b==$lock)
echo $flag;
else
echo "this is no special number";
}
}

下面开始审计:

  1. 读懂这段正则
    1
    $pattern = '/^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{7,}$/ ';

(?=.[0-9].) 包含0-9任意字符
(?=.[a-zA-Z].) 包含a-zA-Z任意字符
{7,} 7位以上

  1. json_decode
    用于将json字符串,解密成对象或数组。
  2. $lock是不知道的,但是由于用的是==,不对类型做比较,因此需要做的是绕过!!!
  3. 关于php弱类型,一篇很好的总结
    1
    2
    3
    4
    5
    6
    7
    <?php
    var_dump("admin"==0); //true
    var_dump("1admin"==1); //true
    var_dump("admin1"==1) //false
    var_dump("admin1"==0) //true
    var_dump("0e123456"=="0e4456789"); //true
    ?> //上述代码可自行测试

因此,可以利用0==”string”,来绕过。

payload: key=0e1233248
flag: hgame{pHp_w34k_typing_s000_e4sy}

知识点: php弱类型,正则

反思: 我一开始,被json_decode 带跑了,试了各种
?key={“key”:0}
?key={“b”:0}
但是都不对,感觉这个json_decode 没什么用,尽迷惑人。

3. can u find me?

mark
意思明显,这题是关于robots协议的,robots协议是规定爬虫限制的。
查看robots协议,加上/robots.txt即可。
mark
看到disallow,不被允许爬取的页面是/f1aaaaaaaag.php

但是我可以访问呀!
mark

下面容易想到了: Burp修改请求的字段值
mark
guest-> admin 即可。

知识点: robots协议,http请求

flag: hgame{78e01ee77a39ef4e}

4. tell me what you want

mark
URL: http://123.206.203.108:10001/
BP改就行了,一步步来,一开始Burp改POST,发现一直不对,hin烦。后来用hackbar改就行了,抓包貌似没什么区别。。。

知识点: http请求
flag: hgame{For9e_hTTp_iS_N0T_HArd}

5.

我们不一样
描述
知识点:PHP弱类型
URL http://118.25.18.223:10002/
基准分数 50
当前分数 50
完成人数 189

1
2
3
4
5
6
7
8
9
10
include_once("flag.php");
if(isset($_POST['str1'])&&isset($_POST['str2'])){

if ($_POST['str1']!=$_POST['str2']&&strcmp($_POST['str1'],$_POST['str2'])==0) {
echo "flag is:".$flag;
exit();
} else{
echo "Something wrong..";
}
}

这里考的是php弱类型,php中内置函数strcmp有不合理的地方:

strcmp()函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ) ,需要给strcmp()传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。

如果传入给出strcmp()的参数是数字呢?

1
2
$array=[1,2,3];
var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false

payload:str1[]=[1,2,3]&str2=123
知识点: php弱类型
flag: hgame{g3t_f14g_is_so0000_ez}

msic


白菜1

描述
白菜1,希望大家多多关注国漫
知识点:图片隐写lsb
URL http://p1kaloi2x.bkt.clouddn.com/flag.png
mark
提示很清楚了,LSB隐写。看到PK,保存为zip,7-zip打开。即看到flag。

白菜2

描述
还是我老婆hhh
知识点:初识文件结构
URL http://p1kaloi2x.bkt.clouddn.com/misc2.jpg
mark

由于是jpg,联系文件结构,容易想到图种。

pacp1

wireshark 打开, 搜索hgame,即得。

crypto

easy Caesar

mark
vuoas{Hvs_ei8qy_pf7kb_1l_xIadg_cjSf_o_Zo9m_rCu}
凯撒加密,python脚本解密即可,注意数字又要进行移位。
flag: hgame{The_qu1ck_br0wn_4x_jUmps_ovEr_a_La2y_dOg}

Polybius

mark
hgame{FDXDGDADDG_FXXFAAXFAG_GDFXFFXFFXADXFDA_GDAD}
棋盘密码,我是手解的。
mark

flag: hgame{fritz_nebel_invented_it}

confusion

mark

密文: –/.-./.-../-/-.-/-…./-.-/-..-/-./…-/–../-..-/–.-/.–/-…/…/-./.-/..—/..-./…/..-/..—/–./–./-…/…/.–/….-/…../-…/…/.-../.-/–../..-./..-/-…./…/…-/.—/-…/-./-../.-/–../…/.-./…./..-/-…./–.-/-…-/-…-/-…-/-…-

混合了很多种加密,但是不难看出:

第一个是莫尔斯电码;
解得MRLTK6KXNVZXQWBSNA2FSU2GGBSW45BSLAZFU6SVJBNDAZSRHU6Q;
由于数字只有2-6,容易猜测是base32;
解得:dW5yWmsxX2h4YSF0ent2X2ZzUHZ0fQ==
由于有大小写,推测是base64;
解得:unrZk1_hxa!tz{v_fsPvt}
容易想到栅栏密码。
转换为utnzr{Zvk_1f_shPxvat!}

简单的凯撒密码:
hgame{Mix_1s_fuCking!}

虽然不难,还是很想fuc*

Hill

希尔密码(Hill Cipher),是运用基本矩阵论原理的替换密码,每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果mod26。用作加密的矩阵(即密匙)必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。
https://www.cnblogs.com/xdjun/p/7472735.html

一步步计算,就可以了。
我找到了一个站,有更详细的介绍和脚本。
www.practicalcryptography.com/ciphers/hill-cipher/

baby step

mark
pow(0x1111111111,flag,0x976693344d) = 0x7ac21f64ed

不会,查了很多资料才知道BSGGS算法。python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
from math import ceil, sqrt

def bsgs(g, h, p):
N = ceil(sqrt(p - 1))
tbl = {pow(g, i, p):i for i in range(N)}
c = pow(g, N * (p - 2), p)
for j in range(N):
y = (h * pow(c, j, p)) % p
if y in tbl:
result=(j * N + tbl[y])
print(hex(result))
return None
print(bsgs(0x1111111111, 0x7ac21f64ed , 0x976693344d))

flag : x1337

mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark

CATALOG
  1. 1. web?
    1. 1.1. 1 Are you from Europe?
    2. 1.2. 2 special number
    3. 1.3. 3. can u find me?
    4. 1.4. 4. tell me what you want
    5. 1.5. 5.
  2. 2. msic
    1. 2.1. 白菜1
    2. 2.2. 白菜2
    3. 2.3. pacp1
  3. 3. crypto
    1. 3.1. easy Caesar
    2. 3.2. Polybius
    3. 3.3. confusion
    4. 3.4. Hill
    5. 3.5. baby step