HeartSky's blog


在渗透之路上渐行渐远


HCTF-GAME week1 writeup

WEB

这TM是啥

题目描述: http://115.28.78.16:13333/web/web1/

打开后在源码里可以发现一大串奇怪的 JS 代码,其实这是 JS FUCK,一种 JS 的混淆方式。
有很多方法能反混淆

知道一种就够了

我是谁我在哪???

题目描述: http://115.28.78.16:13333/web/web2/index.php

302 重定向,flag 在 HTTP 响应头里

不可能拿到的flag

题目描述: http://115.28.78.16:13333/web/web3/

要拿到 flag 要满足两个条件

1
2
$name != $password
sha1($name) === sha1($password)

两个值不相等,sha1 处理后的值却相等,看似是不可能的,但是 sha1 函数是存在漏洞的,它不能处理数组类型,会报错并返回 NULL。所以这里我们只要构造 name[]=1&password[]=2 就可以了。与之类似的还有 md5 函数。

神奇的数字

题目描述: http://115.28.78.16:13333/web/web4/

这题以及下面的 web5 可能很多人都搜到了 get flag 的方式,但不一定明白为什么这样就能拿到 flag 了。我们来分析下,要拿到 flag 需满足三个条件

1
2
3
$number == intval($number)
intval($number) == intval(strrev($number))
$n is not a palindrome number

$n 是一个回文数,又不能是一个回文数。第二个条件都用到了 intval 函数,受上题的启发,可能这里有点问题,我们翻下 php 手册,发现了这么一句话

1
2
返回值
最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval('1000000000000') 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

如果我们构造一个值,它是等于最大值的,只要保证字符串反转后超过了最大值,那它返回的就是最大值,这样就满足所有条件了。但是最大值的回文数没有超过最大值,第二个条件不满足,我们想到可以在前面加 0。

1
number=0009223372036854775807

这题还有其他的解决方法,有兴趣的可以去研究下

php真可怕我要回农村

题目描述: http://115.28.78.16:13333/web/web5/

对于这种题包括前面那道题,最好本地搭建环境试一下
get flag 的条件

1
2
3
4
$b is not a array
$b is not a number
(int)(($a + $b) * 10) == 8
$b[10] == false

php 在进行加法运算时会自动进行类型转换,所以传入 0.7a 就会绕过第二个条件的限制。但是你会发现 $c 是7,这就涉及 php 中浮点数精度的问题。该结果的内部表示其实是这样的

1
2
floor((0.1+0.7)*10)
7.9999999999999991118...

(int) 进行强制类型转换时向下取整,所以是 7
因此构造 b=0.71a 就可以了,第四个条件其实是没用的,如果第 11 位不存在的话,返回的是 NULL,NULL == false

PENTEST

lightless的渗透教室入门篇(一)

题目描述: 115.28.78.16:13333/pentest/01/

1
2
curl http://115.28.78.16:13333/pentest/01/?hacker=HelloGet -d hacker=HelloPost
hctf{PostAndGetIsSoEasy_comeon!}

lightless的渗透教室入门篇(二)

题目描述: 115.28.78.16:13333/pentest/02/

1
curl -H "Referer:http://www.google.com" -H "X-Forwarded-For:127.0.0.1" -H "User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 99_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465 Safari for iPhone" -d hint=1 http://115.28.78.16:13333/pentest/02/

得到提示

1
<!-- flag not in html... -->

不在源码里,那就只能在 HTTP 响应头里了

1
2
curl -H "Referer:http://www.google.com" -H "X-Forwarded-For:127.0.0.1" -H "User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 99_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465 Safari for iPhone" -I http://115.28.78.16:13333/pentest/02/
flag: hctf{h77p_He4dEr_50_E4sy_ANd_fUn_ohhouhou}

lightless的渗透教室入门篇(三)

题目描述: http://115.28.78.16:13333/pentest/03/

在 HTTP 响应头里查找到关于 cookie 的信息

1
cookiecontent: admin=1 and isLogin=true

修改 cookie

1
2
curl --cookie "admin=1;isLogin=true" http://115.28.78.16:13333/pentest/03/
flag: hctf{hao_hao_kan_zi_liao!!!}, 通过伪造cookie,你可以绕过一些限制,或是伪造身份。

lightless的渗透教室入门篇(四)

题目描述: http://115.28.78.16:13333/pentest/04/

有的可能构造对了,但忘记再 URL 编码一次了

1
param1=&lt;script&gt;x=alert;x('lightless');&lt;/script&gt;&param2=%3Cscript%3Ex%3Dalert%3Bx%28%27lightless%27%29%3B%3C/script%3E

就像这样,URL 编码的原因是 param1 中有 &= 等特殊字符,param2 中的 URL 编码在传输时会被自动解码
这里比较坑的是 HTML 实体编码只能用实体名称的形式,不能用实体编号的形式

Crypto

密码学教室入门(一)

题目描述: 这是最著名的一种非对称加密密码体制
学习文档:https://en.wikipedia.org/wiki/RSA_(cryptosystem)
p: 0x9a724c6747de9eadccd33f4d60ada91754b8be8c65590cafe66f69a2f4afbfd359e47ca6fd2dbde8948062dc116bc574f4313ab99b2bb6d8ae47beaa0c1ebeddL
q: 0x8c1c81cc005ce3dd6d684ebb88151dc0c53b1cef8a29b1cb8121860fb57d93117bf449aac4300dc6103ac6211c6f8ae68987d99aff0dd8967a4afa00f2116873L
e: 0x28b95b7e3159a851cbf537e007ae49864b7dbb93fc370a5L
d: 0x190a000845e9c8c2059242835432326369aaf8c7ca85e685bba968b386155a91f1f7ca1019ff23d119222e1f0dfdeb0915d2e97601ef94bf15ca6d9211e984e9038f263f4984355c397ed22d67c26da6d31acfc4d599c70cba80859bee099e5a2dc3ab23aecf58f73f44d07318f70985c623d9612efefb15bf8dab77d5d54e85L
c: 0x23091e42fa7609c73f1941b320fad6d2ff6e47be588d1623f970f1fee7abd221c9834b208f3c888902fe87ca76ec1e1363757d93c6e25c49f1c61c72b141c0b8848b54a117427d8e30eeab89694eb5f849cafecb0e5361b9b2b0e3f89e0fdbcc66a6aad4a1a4a85d828083a01a5d569b7eeb6f9151794453382b524aa52993f9L

私钥给了,就一个公式
\begin{matrix} c^d \equiv m \pmod {n} \ \end{matrix}

密码学教室入门(二)

题目描述: 凯撒加密是一种古老的对称加密算法
学习文档:https://en.wikipedia.org/wiki/Caesar_cipher
mlfrj{Hfjxfw_hnumjw_8x_ozxy_ktw_kzs}

凯撒加密,自己写个脚本解密就好了,不过这迷之数字处理……

密码学教室入门(三)

题目描述: 维吉尼亚密码是最常见的分组密码。将明文对应的书名中的空格换成下划线,在并且加上hgame{}后作为flag
https://en.wikipedia.org/wiki/Vigenère_cipher
ET. RBPHXYF, ZNFYHH BU E IGUS GQU MJU MRQTLWTOOHRY KQ YIG FFTVLPQF, XJTVLJNFU SS FDVSBA’W CGKEQG DX IKV YSKDP. FDVSBA MX THPJBUHH, QQPD VR GF DVWFUWII CJENO OEYFT XMBV HFZ. E OGZ YSKDP CGJMST RR UJH KPNOSBJPJ IBA, ZOFHV OGZ HICUKJT EVTVIKX CA XMF GIKBTJIX CQH B WLNSF MSEKYMIVCO BIQ MX URSS THZJBNHH BU HW. PESFVWI. JH MBF AWJVWIS CQ FDERYSU RJ IKV NNRUMXPPPISU DX UJH MBPGW PH HFSPDC’T IEYIGU FOF LNEFHR JV MS JLW DGOP; FHJFSIH KPWQH JV AMJNH XFCUGMJPJ YIG GJMN HZSKQK UJH XUQUQNOI SK VKI CCVXNMNH.

之前只是知道原理,没有去做过这种题目,花了点时间。
密文保留了原先的标点符号。因此我们可以用词频分析的方法,首先你要知道在一段话中,一般 thea 出现的频率是最高的,所以我写了个 python 脚本计算出出现的所有三字符单词和一字符单词的出现次数,结果如下

1
2
3
[('UJH', 3), ('IKV', 2), ('YIG', 2), ('OGZ', 2), ('HFZ', 1), ('IBA', 1), ('VKI', 1), ('GQU', 1), ('MBF', 1), ('XMF', 1), ('BIQ', 1), ('CQH', 1), ('JLW', 1), ('MJU', 1), ('FOF', 1)]

[('E', 2), ('B', 1), ('T', 1), ('W', 1)]

再与 thea 计算偏移量,再加上比较明显的 's,大致如下(出现的数字都是偏移量)

1
2
3
4
5
6
7
8
9
10
11
THE 
UJH 1 2 3
IKV 15 3 17
YIG 5 1 2
OGZ 21 25 21

'S
4 1

A
4 1

这里是需要猜下的,1 和 4 肯定是有的,然后出现频率较高的两个 the 又含有 2 3 5,大概是 1 2 3 4 5 这样,当然不一定是这个顺序,然后我又验证了下后面出现频率较低的 the,其中两组偏移量是这样的

1
2
2 3 4
4 5 1

这就基本确定了啊,密钥长度为 5,分别为 1 2 3 4 5,而且从上面的偏移来看,顺序就是 1 2 3 4 5,不过第一个偏移不一定是 1,换句话说秘钥是这五个中的一种

1
["ABCDE","BCDEA","CDEAB","DEABC","EABCD"]

把所有情况输出出来就知道了,最后随便拿其中的一句话谷歌下,书名是这个 A Tale of Two Cities

事后和出题人聊了下,应该是先用重合指数攻击算出分组长度,然后分组进行字频分析

密码学教室入门(四)

题目描述: n: 0x81cfc71c44c83faf3c5242fa81ae2e533fc945f3bef30bc13323ea4a55b3debc11301c6a9ecb8f7ef92fa169b157435af728a145497f2cdf75b3007b9732da4c47d67683f09ae1edc8f698f5ec7549593d9f1d06adafae4ad09514928bf0367a2719f7c171580318690dafc6a3d5385b3516b769f529c0a055ce25e68bc21395L
e: 0x01
c: 0x6867616d657b7273615f31735f737469316c5f653473795f6e6f77217dL

e = 1,根据 \begin{matrix} m^e \equiv c \pmod {n} \ \end{matrix}
flag 就是 c

密码学教室番外篇

题目描述: 昨天看大家凯撒密码疯狂试flag,所以yxrdv{uxwupytip19954902180//+/%}

这里数字的表应该是这样的 1234567890,问题来了,为啥上面那个对数字的处理不是这样的,迷。。。

出题人可能是从这篇文章找到的对数字的处理,有兴趣的自己看下吧

解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
c = 'yxrdv{uxwupytip19954902180//+/%}'
li = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
le = len(c)
m = ['*'] * le
add = ord('y') - ord('h')

for i in range(le):
if c[i].islower():
num = ord(c[i]) - 97 - add
num = num if num >=0 else num + 26
m[i] = chr(num + 97)
elif c[i].isdigit():
num = li.index(c[i]) - add
while num < 0:
num += 10
m[i] = li[num]
else:
m[i] = c[i]

print ''.join(m)

总结

与去年相比,题量还是大一些的,不过有好多可以搜到的。不要只想着拿 FLAG,背后的原理才是你应该关注的,你应该能从题目中感受到你缺哪部分知识,然后相应的去学,比如 web 安全的现在就可以开始 HTML 和 JS 的学习了。

路漫漫其修远兮,吾将上下而求索