• 2019护网杯baby_forensic


    题目名称:baby_forensic
    题目描述:can you catch the flag?
    附件:“data.7z”

    2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下。

    获取profile的类型,因为不同的系统数据结构不一样,所以需要用--profile=来指定。

    这里自动猜解可能的系统类型,一般情况下第一个是正确的,如果不对每个都试一下。

    volatility -f /root/data.vmem imageinfo

    列出所有的进程

    volatility -f /root/data.vmem --profile=WinXPSP2x86 pslist

    psxview可以查看隐藏进程

    将内存中的某个进程数据以dmp的格式保存出来

    volatility -f mem.vmem --profile=WinXPSP2x86 -p [PID] -D [dump 出的文件保存的目录]

    可以用strings工具打印字符串或者用编辑器打开

    列举缓存在内存的注册表

    volatility -f /root/data.vmem --profile=WinXPSP2x86 hivelist

    hivedump 打印出注册表中的数据

    volatility -f mem.vmem --profile=WinXPSP2x86 hivedump -o 注册表的virtual地址

    获取SAM表中的用户

    volatility -f /root/data.vmem --profile=WinXPSP2x86 printkey -K "SAMDomainsAccountUsersNames"

    提取内存中保留的cmd命令使用情况

    volatility -f /root/data.vmem --profile=WinXPSP2x86  cmdscan

    提示hill_matrix 3,2,2,9,7,7,6,4,9

    filescan查看文件,grep搜索关键词

    volatility -f /root/data.vmem --profile=WinXPSP2x86 filescan | grep 桌面

    利用dumpfiles提取filescan的文件

    volatility -f /root/data.vmem --profile=WinXPSP2x86 dumpfiles -Q 0x0000000001873e40 --dump-dir=/root

     

    重命名为disk.zip,解压后是一个img镜像

    进行binwalk分析

    binwalk disk.img

    只是一个镜像文件,使用mount命令挂载一下,新建一个命名为1的文件夹(umount /root/disk.img命令卸载)

    mount disk.img ./1

    打开文件发现是usb流量包

     wireshark打开后看到Protocol为USB协议,搜索关于usb流量分析的文章

    USB协议的数据部分在Leftover Capture Data域之中,在Mac和Linux下可以用tshark命令可以将 leftover capture data单独提取出来

    tshark -r /root/1/usb.pcapng -T fields -e usb.capdata > usbdata.txt

    第一次运行报错

    解决方法:

    1.cd /usr/share/wireshark

    2.init.lua用文本编辑器打开。

    3.更改disable_lua = false到disable_lua = true。

    运行成功,主目录生成usbdata.txt文件

     查看usbdata.txt 发现数据包长度为八个字节

    查资料知道USB流量分为键盘流量和鼠标流量。

    键盘数据包的数据长度为8个字节,击键信息集中在第3个字节,每次key stroke都会产生一个keyboard event usb packet。

    鼠标数据包的数据长度为4个字节,第一个字节代表按键,当取0x00时,代表没有按键、为0x01时,代表按左键,为0x02时,代表当前按键为右键。第二个字节可以看成是一个signed byte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。第三个字节与第二字节类似,代表垂直上下移动的偏移。

    这里数据包长度是八个字节显然为键盘数据包。

    网上查找USB协议的文档,可以找到这个值与具体键位的对应关系,根据这个映射表有脚本能解码得出数据包。

    脚本如下:

    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)

    因为不是正常字符会输出[unknown],影响找字符串,看情况修改为空格。

    提示为:'WYTXRXORCQDH'.HILLDECODE

    显然3,2,2,9,7,7,6,4,9是希尔密码加密矩阵,WYTXRXORCQDH是密文

    希尔密码解密即可。

    https://www.dcode.fr/hill-cipher

    flag{SPVZPLEBASMV}

  • 相关阅读:
    Linux shell脚本基础学习详细介绍(完整版)二
    python读取单个文件操作
    【转载】HTTP 缓存的四种风味与缓存策略
    【转载】HTTP 响应头与状态码
    【转载】HTTP 请求头与请求体
    【转载】HTTP 基础与变迁
    3-2 从单词中获取单词出现的频率信息,并把他们写进对应的列表里
    170925_2 Python socket 创建UDP的服务器端和客户端
    170925_1 Python socket 创建TCP的服务器端和客户端
    2-2 列表推导同 filter 和 map 的比较
  • 原文地址:https://www.cnblogs.com/wkzb/p/12286280.html
Copyright © 2020-2023  润新知