2020高校战“疫”网络安全分享赛 MISC Write Up
2020-03-10
前不久报名参加了“2020高校战“疫”网络安全分享赛”,作为一名资深小菜鸡,在这次比赛中学到了很多,现整理一下相关Write UP,权当学习笔记之用,同时也算是给队里的学弟学妹分享我的做题思路。
0x01 简单MISC
题目下载下来首先是一个压缩包
解压得到flag.zip和一张表情包
首先打开zip,发现有密码,检查伪加密,用winhex修改伪加密标记位为00
依然无法解压,证实这不是伪加密,那就再看这张表情包
winhex打开表情包,可以很明显的看到后半段有个PK头,且通过加密位判断这个压缩包是未加密的。
修改文件扩展名为.zip,打开文件,获得一个ctf.txt,是一段莫尔斯电码
./.--./../-.././--/../-.-./.../../-/..-/.-/-/../---/-./---/..-./..-/-./../...-/./.-./.../../-/-.--/.--/.-/.-.
解码获得如下内容
EPIDEMICSITUATIONOFUNIVERSITYWAR
使用这串文本成功解压flag.zip
base64解码,得到flag
Th1s_is_FlaG_you_aRE_rigHT
0x02 隐藏的信息
不得不说这道题确实有点绕,由于以往参加比赛的思维惯性让我以为这道题的flag也是flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}一长串,所以浪费了很多时间。
首先解压压缩包,映入眼帘的是一张残缺的二维码和一个“纯数字.zip”的压缩包
按照经验,首先打开压缩包,要密码,那我们再扫扫二维码吧
拼接二维码至完整,看看有啥
上ps,将二维码角标和像素点置于同一直线后修改大小
扫描结果:
????
然后查看压缩包,发现压缩包其实是个伪加密。。。
修改标记位,成功打开并解压,得到“隐藏的信息.wav”
用au打开,发现频谱里面并没有flag,反倒是有几个小音符
试着听了一下,发现是DTMF音也就是俗称的拨号音,同时发现前面也有一些响度很低的DTMF
导出获得的wav为单声道,使用工具进行解码
这里不得不吐槽一下工具,手头没有matlab,找了半个多小时就没一个好使的工具,因为前半部分响度过小,增强后有很多噪音导致识别失败,最后找到了一个叫“dtmf2num”的小工具成功解密,结果为如下
187485618521
尝试提交失败,显然需要更多线索
随后用winhex打开二维码.jpg,发现了如下两句话
USE BASE64 TO GET YOUR FLAG
尝试将dtmf值进行base64处理,得到flag并提交成功,flag为:
flag{MTg3NDg1NjE4NTIx}
0x03 武汉加油
这道题的解出其实很有戏剧性,是一名小学弟试出来的,大致思考流程如下
签到题“2019-nCoV”的flag为“flag{shijiejiayou}”(世界加油),而题目中的海报是“武汉加油”,再结合之前比赛的经验、本次比赛的主题和“简单Misc”中“CTF.txt”的内容:“EPIDEMIC SITUATION OF UNIVERSITY WAR(高校战疫)”以及flag“Th1s_is_FlaG_you_aRE_rigHT”,那么“湖北加油”和“中国加油”、“XX大学加油”这些口号可能有很大概率会是flag的内容,随后学弟开始试,最终得到flag如下
flag{zhong_guo_jia_you}
0x04 ez_mem&usb
这道题的题型是从未接触过的内存审计类的题,确实具有一定的挑战性,且因为后面有一些具有误导性的信息,且加之我个人的一些思路问题,花费了很多时间在误导性的信息上,否则其实这道题能在500-600分甚至更高的时候就做出来,唉···
首先下载题目的压缩包,解压出来一个流量包。
打开流量包,一串tcp流映入眼帘
看了一下,基本上都是几个大的tcp流,其他的一些UDP流没啥意义,追踪一下看看
显然这是一个在上传文件的流,我们尝试把它导出
其中除了图标只有俩网页、俩ncsi是Windows网络连接指示器请求微软网站判断连接的文件,应该就是uploadfile3和uoloadfile,这里我已经改过了扩展名为zip,解压后俩压缩包里面都是data.vmem,用md5校验工具发现这俩压缩包里的vmem是同一个文件,所以任选其一做下面的题。
内存取证可以使用Volatility Framework等工具,我们这里用Volatility 来做这道题(主要是因为菜)。由于kali最近有点问题且没来得及重装,以下复现将用Windows和kali穿插进行·····
Volatility的用法:
volatility -f "文件名" --profile=[配置文件] [插件] [插件参数]
imageinfo:显示目标镜像的摘要信息,知道镜像的操作系统后,就可以在 –profile 中带上对应的操作系统
pslist:该插件列举出系统进程,但它不能检测到隐藏或者解链的进程,psscan可以
psscan:可以找到先前已终止(不活动)的进程以及被rootkit隐藏或解链的进程
pstree:以树的形式查看进程列表,和pslist一样,也无法检测隐藏或解链的进程
mendump:提取出指定进程,常用foremost 来分离里面的文件
filescan:扫描所有的文件列表
hashdump:查看当前操作系统中的 password hash,例如 Windows 的 SAM 文件内容
svcscan:扫描 Windows 的服务
connscan:查看网络连接
dumpfiles:dumpfilescan所扫描出的文件
-Q 0x00000000053e9658 :指定要dump的文件的位置
--dump-dir=./ :指定dump位置
-n(--name):同时dump文件名
[/code]
判断镜像类型
使用命令:
volatility -f data1.vmem --profile=WinXPSP3x86 imageinfo
返回如下
Volatility Foundation Volatility Framework 2.6 INFO : volatility.debug : Determining profile based on KDBG search... Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86) AS Layer1 : IA32PagedMemoryPae (Kernel AS) AS Layer2 : FileAddressSpace (data1.vmem) PAE type : PAE DTB : 0xb18000L KDBG : 0x80546ae0L Number of Processors : 1 Image Type (Service Pack) : 3 KPCR for CPU 0 : 0xffdff000L KUSER_SHARED_DATA : 0xffdf0000L Image date and time : 2020-02-24 07:56:47 UTC+0000 Image local date and time : 2020-02-24 15:56:47 +0800
从上面我们可以看出 这个内存镜像的操作系统为X86架构的Windows XP SP3或者SP2,所以我们这里就使用WinXPSP3x86配置文件来进行处理,因为二者似乎是兼容的
首先按照我在大创项目搞运维的经验,我们先来查看一下进程
使用命令:
volatility -f data1.vmem --profile=WinXPSP3x86 psscan
Volatility Foundation Volatility Framework 2.6 Offset(P) Name PID PPID PDB Time created Time exited ------------------ ---------------- ------ ------ ---------- ------------------------------ ------------------------------ 0x0000000000b7d020     services.exe 668 492 0x02840080 2020-02-23 13:17:14 UTC+0000 0x0000000000e0d020 winlogon.exe 492 372 0x02840060 2020-02-23 13:17:13 UTC+0000 0x0000000000e10020 csrss.exe 464 372 0x02840040 2020-02-23 13:17:13 UTC+0000 0x000000000110f020 svchost.exe 1072 668 0x02840140 2020-02-23 13:17:14 UTC+0000 0x0000000001205660 System 4 0 0x00b18000 0x0000000001cecb10 svchost.exe 1024 668 0x02840120 2020-02-23 13:17:14 UTC+0000 0x00000000048367b8 cmd.exe 1396 1476 0x02840220 2020-02-23 13:24:09 UTC+0000 0x00000000050e0c28 smss.exe 372 4 0x02840020 2020-02-23 13:17:13 UTC+0000 0x00000000051273d8 VGAuthService.e 1932 668 0x028401a0 2020-02-23 13:17:33 UTC+0000 0x000000000512ada0 vmtoolsd.exe 2008 668 0x02840200 2020-02-23 13:17:40 UTC+0000 0x0000000005d7f468 spoolsv.exe 1568 668 0x028401e0 2020-02-23 13:17:15 UTC+0000 0x0000000005e0ebf0 vmacthlp.exe 836 668 0x028400c0 2020-02-23 13:17:14 UTC+0000 0x0000000006cb84e0 svchost.exe 1132 668 0x02840160 2020-02-23 13:17:14 UTC+0000 0x0000000007253da0 wmiprvse.exe 540 848 0x02840180 2020-02-23 13:17:41 UTC+0000 0x000000000746f568 svchost.exe 848 668 0x028400e0 2020-02-23 13:17:14 UTC+0000 0x0000000007471a78 svchost.exe 932 668 0x02840100 2020-02-23 13:17:14 UTC+0000 0x000000000757cda0 vmtoolsd.exe 588 1476 0x02840260 2020-02-23 13:17:41 UTC+0000 0x0000000007705da0 ctfmon.exe 596 1476 0x02840240 2020-02-23 13:17:41 UTC+0000 0x0000000007817020 lsass.exe 680 492 0x028400a0 2020-02-23 13:17:14 UTC+0000 0x0000000007bea3c0 conime.exe 544 1396 0x02840280 2020-02-23 13:24:09 UTC+0000 0x0000000007d85020 explorer.exe 1476 1400 0x028401c0 2020-02-23 13:17:15 UTC+0000
大致一看似乎没有什么奇怪的进程,对于Windows XP而言21个进程也是很正常的常态,也不存在进程过少的情况
我们再尝试扫描一下命令行历史,使用命令:
volatility -f data1.vmem --profile=WinXPSP3x86 cmdscan
返回结果如下:
Volatility Foundation Volatility Framework 2.6 ************************************************** CommandProcess: csrss.exe Pid: 464 CommandHistory: 0x556bb8 Application: cmd.exe Flags: Allocated, Reset CommandCount: 2 LastAdded: 1 LastDisplayed: 1 FirstCommand: 0 CommandCountMax: 50 ProcessHandle: 0x504 Cmd #0 @ 0x3609ea0: passwd:weak_auth_top100 Cmd #1 @ 0x5576d0: start wireshark Cmd #13 @ 0x9f009f: ?? Cmd #41 @ 0x9f003f: ?\?????????
从里面我们可以看到设定密码的“passwd”(但是这并不是Windows下用的..)和“start wireshark”,但是这很明显不是flag,暂且记住这两个线索
我们再获取一下文件列表,看看有什么新的发现没有
使用命令:
volatility -f data1.vmem --profile=WinXPSP3x86 filescan
由于返回的文件列表过多,此处不展示,为了更加有效地获取所需信息,使用|findstr flag来筛选信息,命令如下。
volatility -f data1.vmem --profile=WinXPSP3x86 filescan |findstr flag
返回如下:
Volatility Foundation Volatility Framework 2.6 0x0000000001155f90 1 0 R--rwd \Device\HarddiskVolume1\Documents and Settings\Administrator\flag.img
很棒,有一个flag.img,我们暂且记录这个线索,继续找(讲真我这个思路是多次比赛被坑到的后遗症,但是这道题坑了我不少时间)
我们再使用mftparser插件来扫描一下缓存在内存中的MFT表(磁盘中的文件表)是否有其他的线索
使用命令:
volatility -f data1.vmem --profile=WinXPSP3x86 mftparser
由于输出值太多,此处只列出一些有用的文件
2020-02-23 12:41:03 UTC+0000 2020-02-23 12:42:07 UTC+0000 2020-02-23 13:17:58 UTC+0000 2020-02-23 12:42:07 UTC+0000 DOCUME~1\ADMINI~1\hint1.txt 0000000010: 0d 0a 68 69 6e 74 31 20 69 73 20 22 6d 6f 75 6e ..hint1.is."moun 2020-02-23 13:22:07 UTC+0000 2020-02-23 13:22:07 UTC+0000 2020-02-23 13:22:07 UTC+0000 2020-02-23 13:22:07 UTC+0000 DOCUME~1\ADMINI~1\Recent\hint1.lnk 2020-02-23 12:41:03 UTC+0000 2020-02-23 12:41:56 UTC+0000 2020-02-23 12:41:56 UTC+0000 2020-02-23 12:41:56 UTC+0000 DOCUME~1\ADMINI~1\Recent\hint.lnk 0000000150: 6e 74 73 5c 68 69 6e 74 2e 74 78 74 00 00 18 00 nts\hint.txt.... 2020-02-23 12:43:30 UTC+0000 2020-02-23 12:43:30 UTC+0000 2020-02-23 12:43:30 UTC+0000 2020-02-23 12:43:30 UTC+0000 hint2.txt 0000000010: 0d 0a 68 69 6e 74 32 20 69 73 20 22 75 73 62 22 ..hint2.is."usb" 2020-02-24 07:47:32 UTC+0000 2020-02-24 07:47:32 UTC+0000 2020-02-24 07:47:32 UTC+0000 2020-02-24 07:47:32 UTC+0000 DOCUME~1\ADMINI~1\flag.img 2020-02-24 07:22:21 UTC+0000 2020-02-24 07:22:21 UTC+0000 2020-02-24 07:22:21 UTC+0000 2020-02-24 07:22:21 UTC+0000 Documents and Settings\Administrator\Local Settings\Temp\flag.zip
我们可以看到有俩hint,还有一个flag.img和一个flag.zip。
导出之前找到的flag.img(hint似乎无法导出,当然可能是我太菜了)
使用命令:
volatility -f data1.vmem --profile=WinXPSP3x86 dumpfiles -Q 0x0000000001155f90 -n --dump-dir=./ -n
根据残缺不全的hint(其实可以用winhex直接搜索内存镜像中的关键字找到完整的hint,但是懒得复现了….这里残缺不全是因为volatility的问题)我们可以猜测出完整的hint是什么样的。
hint1:hint1 is "mount" hint2:hint2 is "usb"
hint1提示我们要mount(挂载),目前能让我们挂载的只有刚才找到的img了(其实这个hint大可不必,都拿到img了自然能想到别的)
hint2提示我们usb,这也是题目名称中就有的提示
我们将flag.img丢进winhex,看看有啥线索
可以发现里面有一个压缩文件,复制这部分数据另存之,得到flag.zip(获得flag.zip的方法有两种,一是挂载img文件,可以用diskgenius或者linux下的fdisk实现,一种就是和我一样直接截取img)
这是一个加密的zip,密码则是我们之前获取到的“passwd:weak_auth_top100”中的“weak_auth_top100”,解压后获得了usbdata.txt,内容如下
00:00:09:00:00:00:00:00 00:00:0F:00:00:00:00:00 00:00:04:00:00:00:00:00 00:00:0A:00:00:00:00:00 00:00:2F:00:00:00:00:00 00:00:23:00:00:00:00:00 00:00:26:00:00:00:00:00 00:00:1F:00:00:00:00:00 00:00:27:00:00:00:00:00 00:00:27:00:00:00:00:00 00:00:25:00:00:00:00:00 00:00:20:00:00:00:00:00 00:00:22:00:00:00:00:00 00:00:24:00:00:00:00:00 00:00:25:00:00:00:00:00 00:00:21:00:00:00:00:00 00:00:08:00:00:00:00:00 00:00:06:00:00:00:00:00 00:00:20:00:00:00:00:00 00:00:08:00:00:00:00:00 00:00:07:00:00:00:00:00 00:00:25:00:00:00:00:00 00:00:07:00:00:00:00:00 00:00:1F:00:00:00:00:00 00:00:04:00:00:00:00:00 00:00:23:00:00:00:00:00 00:00:21:00:00:00:00:00 00:00:08:00:00:00:00:00 00:00:24:00:00:00:00:00 00:00:20:00:00:00:00:00 00:00:09:00:00:00:00:00 00:00:08:00:00:00:00:00 00:00:26:00:00:00:00:00 00:00:1E:00:00:00:00:00 00:00:20:00:00:00:00:00 00:00:06:00:00:00:00:00 00:00:27:00:00:00:00:00 00:00:30:00:00:00:00:00
这段代码似乎某种usb设备的抓包,结合题目中的“不区分大小写”,我首先想到了键盘,因为键盘本没有大小写,所谓的大小写是由“Caps Lock键”激活与否定义的,事实也证明了我的想法(实际上搜索usbdata.txt就能搜索到相关内容,这里我又浪费了很多时间),我尝试使用手动将键盘信号记录转换为按键,但是由于其复杂(至少有一点)的定义导致失败,但是至少可以确定这就是flag,以下是我手动转换的结果
IODJocf_gge'bdeaHFTHGeG_DWUHX'IHf^' jgp
为什么可以确定这就是flag呢?很简单,根据经验,我觉得这串字符前四个字有点眼熟,于是进行了凯撒解密,当解密到第23重时,我得到了如下结果
FLAGlzc_ddb'yabxECQEDbD_ATREU'FEc ^'gdm
这不可能是巧合,但是flag不对,我又开始寻找其他转换方法,直到我搜索了“usbdata.txt”,找到了[安全客:【技术分享】从CTF中学USB流量捕获与析析]https://www.anquanke.com/post/id/85218
借助这篇文章的这一段代码,我成功获得了flag
mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." } nums = [] keys = open('usbdata.txt') for line in keys: if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0': continue nums.append(int(line[6:8],16)) # 00:00:xx:.... keys.close() output = "" for n in nums: if n == 0 : continue if n in mappings: output += mappings[n] else: output += '[unknown]' print('output :n' + output)
大致看了一下,这段代码用的码表和我的码表是不一样的,我的码表没有数字,怪不得我手动转换的不对。。。对了,这里的flag好像需要把[]替换为{},我记不太清了,还需要全部转换为小写。
最终的flag:
flag{69200835784ec3ed8d2a64e73fe913c0}
最后的总结:
这次比赛的题目,单论Misc是很有新意的,我本人也是受益匪浅,
要不是我太菜,我肯定能做出更多的题(?)
总之,还算开心,期待疫情早日过去,武汉加油!
合影
围观大佬