Nsking和他的想法

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是很有新意的,我本人也是受益匪浅,

要不是我太菜,我肯定能做出更多的题(?)

总之,还算开心,期待疫情早日过去,武汉加油!

 

留个小脚印

  • *只有经过审核的评论才会显示出来噢 发表评论
2496414612

合影

Kevin

围观大佬