CTF中的流量包分析(2)

298 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

流量分析3

首先txt提示

流量分析
200pt


提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意补齐私钥格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----

流量包里有tsl,ssl加密内容,https相当于一个加密过程

首先就是要搞到https加密的密钥

SMTP是发邮件的协议,定位发邮件的时候有几个对象,我们直接

文件->导出对象->IMF

看到数据最大的是9285,我们直接定位追踪流是一串图片被编码的base64,导出为原始数据1.txt

删掉多余的数据,写个脚本将其转成图片

import base64
fp = open('1.txt','r')
png = open('misc1.png','wb')
bin_png = base64.b64decode(fp.read())
png.write(bin_png)
fp.close()
png.close()

misc1.png

根据图片加上提示判断是rsa私匙

现在想办法将其提取出来,,目前还没有找到不联网能破解的方案

MIICXAIBAAKBgQDCm6vZmclJrVH1AAyGuCuSSZ8O+mIQiOUQCvN0HYbj8153JfSQLsJIhbRYS7+zZ1oXvPemWQDv/u/tzegt58q4ciNmcVnq1uKiygc6Q0tvT7oiSTyOvMX/q5iE2iClYUIHZEKX3BjjNDxrYvLQzPyGD1EY2DZIO6T45FNKYC2VDwIDAQABAoGAbtWUKUkx37lLfRq7B5sqjZVKdpBZe4tL0jg6cX5Djd3Uhk1inR9UXVNw4/y4QGfzYqOn8+Cq7QSoBysHOeXSiPztW2cL09ktPgSlfTQyN6ELNGuiUOYnaTWYZpp/QbRcZ/eHBulVQLlk5M6RVs9BLI9X08RAl7EcwumiRfWas6kCQQDvqcOdxl2wIjwNczILcoWLig2c2u71Nev9DrWjWHU8eHDuzCJWvOUAHIrkexddWEK2VHd+F13GBCOQZCM4prBjAkEAz+ENahsEjBE4+7H1HdIaw0+goe/45d6A2ewO/lYH6dDZTAzTW9z9kzV8uz+Mmo5163/JtvwYQcKF39DJGGtqZQJBAKa18XR16fQ9TFL64EQwTQ+tYBzN+04eTWQCmH3haeQ/0Cd9XyHBUveJ42Be8/jeDcIx7dGLxZKajHbEAfBFnAsCQGq1AnbJ4Z6opJCGu+UP2c8SC8m0bhZJDelPRC8IKE28eB6SotgP61ZqaVmQ+HLJ1/wH/5pfc3AmEyRdfyx6zwUCQCAH4SLJv/kprRz1a1gx8FR5tj4NeHEFFNEgq1gmiwmH2STT5qZWzQFz8NRe+/otNOHBR2Xk4e8IS+ehIJ3TvyE=

然后编辑->首选项

protool->TLS 导入密钥

之后直接看http追踪流,里面就有flag LX100

追踪http流发现是关于MP4的东西

视频流是用udp而不是TCP

于是我们我们找UDP,随便找一个流追踪一下 反应是jpg

原始数据导出,FFD9结束了图片内容,然后下面还有其他内容,是不影响显示的,我们可以直接写脚本提取

提取了400多张图片,应该是一个视频的每一帧

flag就在某一帧里。

脑洞属实大

USB流量分析

鼠标

把鼠标协议数据区内容用wireshark提取出来//在wireshark安装目录下

命令

tshark -r xxx.pcapng -T fields -e usb.capdata >21321.txt

提取出来

鼠标协议麻烦的点在于需要知道哪两个字节代表着标准字节中的水平和垂直移动,然后把这个套用在mouse.py里面

# -*- coding: utf-8 -*-
nums = []
keys = open('usb.txt','r')
result = open('result.txt','w') # 最后生成的result.txt 是一个xxx xxx 形式的坐标集合,直接用gnuplot 画图即可
posx = 0
posy = 0
for line in keys:
    if len(line) != 24 :
         continue
    x = int(line[6:8],16) #这是代表第三个字节,如果生成的usb.txt没有: 的话,这个改为 x = int(line[4:6],16)
    y = int(line[12:14],16) # 这是代表第五个字节,如需修改,与上面同理修改
    if x > 127 :
        x -= 256
    if y > 127 :
        y -= 256
    posx += x
    posy += y
    btn_flag = int(line[0:2],16)  # 1 for left(左键) , 2 for right(右键) , 0 for nothing(无按键)
    if btn_flag == 1 :
        result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()

导出之后是坐标,第一列是X第二列是Y

然后托kai里用gnuplot

plot 'result.txt'

出来图片

键盘

指令一样,若提取出来的数据带冒号,要给他全删了

然后套keyboard脚本

# -*- coding: utf-8 -*-
# Python2
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:"!", 0x1f:"@", 0x20:"#", 0x21:"$", 0x22:"%", 0x23:"^",0x24:"&",0x25:"*",0x26:"(",0x27:")",0x28:"<RET>",0x29:"<ESC>",0x2a:"<DEL>", 0x2b:"\t",0x2c:"<SPACE>",0x2d:"_",0x2e:"+",0x2f:"{",0x30:"}",0x31:"|",0x32:"<NON>",0x33:""",0x34:":",0x35:"<GA>",0x36:"<",0x37:">",0x38:"?",0x39:"<CAP>",0x3a:"<F1>",0x3b:"<F2>", 0x3c:"<F3>",0x3d:"<F4>",0x3e:"<F5>",0x3f:"<F6>",0x40:"<F7>",0x41:"<F8>",0x42:"<F9>",0x43:"<F10>",0x44:"<F11>",0x45:"<F12>"}
nums = []
keys = open('usbout.txt') # 这里填写提取出来并处理好的keyusb.txt
for line in keys:
    if line[0]!='0' or line[1]!='0' or line[2]!='0' or line[3]!='0' or line[6]!='0' or line[7]!='0' or line[8]!='0' or line[9]!='0' or line[10]!='0' or line[11]!='0' or line[12]!='0' or line[13]!='0' or line[14]!='0' or line[15]!='0':
        # 如果提取出来的数据没有: 的话,上面一行就将改为:
        # if line[0]!='0' or line[1]!='0' or line[2]!='0' or line[3]!='0' or line[6]!='0' or line[7]!='0' or line[8]!='0' or line[9]!='0' or line[10]!='0' or line[11]!='0' or line[12]!='0' or line[13]!='0' or line[14]!='0' or line[15]!='0':
        continue
    nums.append(int(line[4:6],16)) # 如果提取出来的数据没有: 的话,这里就将改为 nums.append(int(line[4:6],16))
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