Web#
1、sqlcheckin#
打开题目是一个登录框,并且给出了源码
看到 PDO 以为是堆叠注入,先 fuzz 一遍
可以看到几乎能用的都被过滤了,堆叠最关键的分号;也在其中
回头再看源码,发现账号和密码是直接拼接查询的,并且满足 username == admin 即可拿到 flag
接下来就是构造万能密码,字符都过滤的差不多了,但是没用过滤 ()
和 -
- 最终的万能密码:admin / '-(0)-'
2、webtemp#
参考文章:
从零开始 python 反序列化攻击:pickle 原理解析 & 不用 reduce 的 RCE 姿势
题目要求我们满足:
I will give you the flag if we share the same animal as our favourite.
并且放出了源码
CTF 对 pickle 的利用大多是利用 __reduce__
方法,它的指令码是 R
,但是如果禁用掉了 R 的话又该如何攻击呢(如何利用 __reduce__
文章中和网上其他资源都已经写的很详细了),这里又引出了一个全局指令:
C
指令,但是c
指令(也就是 GLOBAL 指令)基于find_class
这个方法, 然而find_class
可以被出题人重写。如果出题人只允许c
指令包含__main__
这一个 module,这道题又该如何解决呢?
根据文章内容,我们如果想要满足题目条件,就需要 secret 类的属性和 Animal 属性一致,如果能够控制 secret,篡改它的值,使之与 Animal 相对应的值相等,就能满足题目所需。
我们先用调试器生成一个正常 Animal 类序列化
b'\x80\x03c__main__\nAinimal\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x02\x00\x00\x00aaq\x04X\x08\x00\x00\x00categoryq\x05X\x02\x00\x00\x00bbq\x06ub.'
然后将篡改的内容添加到序列化内容前面
b'\x80\x03cmain\nsecret\n}(Vname\nVaa\nVcategory\nVbb\nub0c__main__\nAnimal\n)\x81}(X\x04\x00\x00\x00nameX\x02\x00\x00\x00aaX\x08\x00\x00\x00categoryX\x02\x00\x00\x00bbub.'
生成 payload
提交标记处的 base64 即可获得 flag
3、nweb#
题目标题 俺不会注入
就是一个提示,尽量往注入方向靠(不排除出题人太狗)
先正常注册一波,习惯性的注册 admin 用户,发现提示用户名已存在
注册用户后登录页面如下
flag.php 提示我们无权访问
转了一圈没发现什么能伪造 admin 的地方
在注册页面处发现了注释
这个点也想了挺久
最后发现修改 type=110 可以直接越权注册
有了权限后我们去访问 flag.php,测试后果然存在注入,且是有回显盲注
py 脚本不知道为什么跑着跑着就会断开连接(ORZ 太菜了)
只能用 BP 去跑了
database 为
ctf
,搞忘截图了,存在表admin
,fl4g
,jd
,user
继续跑注 fl4g 中的列
只有一列
flag
继续注
用正则匹配匹到
flag{Rogue-M
就不知为何配不出来了,并且正则不区分大小写,这里还是用 ascii 码跑最后跑的 flag 只有一半。。。。
flag{Rogue-MySql-Server
Rogue-MySql-Server
任意文件读取漏洞在 DDCTF 和国赛上曾经考过,可以去看看 WP
但是目前我们登录的页面没用涉及到数据库操作的地方,猜测可能 admin 用户的界面有此操作,所以现在来注 admin
表
username 为
admin
,pwd 为 md5 加密数据,解密后为whoamiadmin
本以为拿这个账号密码就可以去登录了,但还是密码错误密码错误
无计可施之下想扫扫看看有没有其他页面,结果还真找到了!!(一拿到题目就扫就不存在这些问题了)
用 admin/whoamiadmin 登录 database.php
最后就是利用
exp
了
连接成功后成功在文件中成功找到另一半 -is-nday}
flag
flag{Rogue-MySql-Server-is-nday}
Misc#
1、ez_mem&usb#
这是个 USB 内存取证
附件分析
附件给的是一个 pcap 包,用 wireshark 打开即可
大体看一下,发现存在 http 协议,直接过滤 http
发现存在一个文件上传的记录
简单分析一下,可以看出来,上传了一个压缩包

我们把这压缩包导出来看一下
解压,可以得到虚拟内存文件 data.vmem
使用内存取证工具 volatility 分析
分析操作系统 volatility -f /root/桌面/data.vmem imageinfo
查看进程信息 volatility -f /root/桌面/data.vmem –profile=WinXPSP2x86 pslist
这里面进程都是系统进程,一般不需要特别关注,主要有一个进程可以看一下,就是 explorer.exe
,这是资源管理器,可以看到用户当前所处的位置信息
导出 explorer.exe
的 dmp 文件信息
volatility -f /root/桌面/data.vmem –profile=WinXPSP2x86 memdump -p 1476 -D ./
借助 strings 工具,可以快速查看包含的 ascii 信息
strings 1476.dmp > 1476.txt
尝试过滤出包含 flag 的信息 cat 1476.txt |grep flag
可以看出来,就两个和 flag 有关的信息 flag.zip
,flag.img
查找一下这俩文件
volatility -f /root/桌面/data.vmem –profile=WinXPSP2x86 filescan |grep flag
找到一个 flag.img,导出该文件
volatility -f /root/桌面/data.vmem –profile=WinXPSP2x86 dumpfiles -Q 0x0000000001155f90 --dump-dir=./
导出的文件名和内存中显示的文件名是不一样的,手动修改一下 cp file.None.0xff425090.dat flag.img
查看文件类型 file flag.img
lag.img: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "SYSLINUX", sectors/cluster 2, root entries 112, sectors 360 (volumes <=32 MB), Media descriptor 0xfd, sectors/FAT 1, sectors/track 9, heads 1, serial number 0x5d307603, label: "FDD_BOOT ", FAT (12 bit), followed by FAT
是个虚拟磁盘文件~提取文件 binwalk -e flag.img
提取到的目录
进入查看信息,发现 usbdata.txt 是空的,只有一个 F400.zip,对该压缩包进行解压
发现需要密码,可是哪里有可能存在密码呢既然可以在命令行输密码解压,那就可以在命令行输密码压缩,查看该镜像的命令记录
volatility -f /root/桌面/data.vmem –profile=WinXPSP2x86 cmdscan
发现一个疑似密码的东西=>passwd,拿过去解压看看~
解压成功~得到 usbdata.txt
usbdata 是键盘数据,根据键码对应表,可以写脚本输出数据
可以参考本篇文章:
从 CTF 中学 USB 流量捕获与解析
import sys
import os
usb_codes = {
0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF",
0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL",
0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR",
0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX",
0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4import sys
import os
usb_codes = {
0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF",
0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL",
0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR",
0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX",
0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4$",
0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)",
0x2C:" ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}", 0x32:"#~",
0x33:";:", 0x34:"'\"", 0x36:",<", 0x37:".>", 0x4f:">", 0x50:"<"
}
def code2chr(filepath):
lines = []
pos = 0
for x in open(filepath,"r").readlines():
code = int(x[6:8],16)
if code == 0:
continue
if code == 0x51 or code == 0x28:
pos += 1
continue
if code == 0x52:
pos -= 1
continue
while len(lines) <= pos:
lines.append("")
if code in range(4,81):
if int(x[0:2],16) == 2:
lines[pos] += usb_codes[code][1]
else:
lines[pos] += usb_codes[code][0]
for x in lines:
print(x)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage:\n\tpython keyboardScanCode.py datafile.txt\nhow to get datafile:\t tshark -r file.usb.pcapng -T fields -e usb.capdata > datafile.txt")
exit(1)
else:
filepath = sys.argv[1]
code2chr(filepath)
quot;,
0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)",
0x2C:" ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}", 0x32:"#~",
0x33:";:", 0x34:"'\"", 0x36:",<", 0x37:".>", 0x4f:">", 0x50:"<"
}
def code2chr(filepath):
lines = []
pos = 0
for x in open(filepath,"r").readlines():
code = int(x[6:8],16)
if code == 0:
continue
if code == 0x51 or code == 0x28:
pos += 1
continue
if code == 0x52:
pos -= 1
continue
while len(lines) <= pos:
lines.append("")
if code in range(4,81):
if int(x[0:2],16) == 2:
lines[pos] += usb_codes[code][1]
else:
lines[pos] += usb_codes[code][0]
for x in lines:
print(x)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage:\n\tpython keyboardScanCode.py datafile.txt\nhow to get datafile:\t tshark -r file.usb.pcapng -T fields -e usb.capdata > datafile.txt")
exit(1)
else:
filepath = sys.argv[1]
code2chr(filepath)
解出来的结果是 flag[69200835784ec3ed8d2a64e73fe913c0]
,不知道是不是键码映射有问题,两个括号出来的不是大括号,手动改成大括号才是对的
2、2019-nCoV#
过于傻瓜,略
3、简单 MISC#
首先来看一下题目
由于不靠谱的队友把服务器图片都删了,所以本题没有图片
【目标】简单密码学
【环境】Windows
【工具】Winhex+ 在线工具
【分析过程】
-
直接解压,发现一个加密的压缩包 flag.zip,在其预览中发现 flag.txt 应该就是我们要的 flag
-
当即觉得这个压缩包是个伪加密,扔进 Winhex 发现根本不是伪加密。
于是想到解压密码可能与 flag.zip 一同解压出来的还有一张图片有关
-
将 photo.jpg 放入 winhex,发现头文件并不是 jpg 头文件格式 FFD8FF,将头文件 FFD0FF 改为 FFD8FF
保存后发现图片可以打开了,哈哈哈,看来是挺easy。
然后就用StegSolve查看图片,试着去看看关于解压密码是不是藏在图片中
- 好吧,我被耍了,回过头再看 photo.jpg,在 winhex 中查看到藏着一个 zip 压缩包,将这压缩包单独提出来
好像,这里没有坑,可以直接解压,得到一个ctf.txt,打开后是一段摩尔斯电码
-
用摩尔斯解码工具解码,得到
EPIDEMICSITUATIONOFUNIVERSITYWAR
-
接下来去试试能不能解压 flag.zip,发现可以咯。
解压出来的 flag.txt,是一段 base64 的加密的字符,直接 base64 解码就好了,这里就不多说了。
Th1s_is_FlaG_you_aRE_rigHT
,试着去提交 flag,发现并不正确,哈哈哈,我还是太菜了,居然不加头标识符就交了,加上去得到 flag{Th1s_is_FlaG_you_aRE_rigHT}
就是正确的 flag 咯。
4、隐藏的信息#
给出的二维码补全了后并没有什么用
拖进 winhex 查看压缩包发现是伪加密,将标志位修改后打开.wav 文件,里面的开头和末尾有隐藏的拨号音
并且在 winhex 中同样发现了二维码图片的隐藏提示
USE BASE64 TO GET YOUR FLAG
应该是将拨号音 base64 编码后即为 flag。
将拨号音切成几个小份的 wav,2 3 位一段,在群内大佬们的帮助下和一上午的尝试下,最终拿到了正确的拨号数字
187485618521
编码后提交即可
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论