CTF-流量分析电子取证

优秀的人,不是不合群,而是他们合群的人里面没有你

电子取证一般分为三种:数据包分析,日志分析,内存分析。

习惯用NET-A一把锁哈看看~

下面简略介绍一下,按照每一步流程走就是了

流量分析

上来就是两板斧操作

正常操作:通篇查看,确定重点协议(http)
    http:文件-导出对象-http-选中可疑的文件-点击save就可以
如果不知道重点协议,就自动分析:
    统计-协议分级-百分比占比

解题思路

直接net-a梭哈,

按照题目类型区分,大概5种:

1. 字符串隐藏flag,使用ctrl+f,选择分组字节流,分组列表都尝试一下,选择字符串搜索,搜索key,ctf,flag,pass
                            选择16进制搜索,搜索504b0304,89504e47
2. 文件提取,提取出来压缩包(rar,zip,7z),基本上解压密码都在数据包里找,搜索pass之类的。或者提取出来图片之类的。可以通过binwalk提取出来。
3. 内容分析,找到可疑的http流,可以右键追踪http流或者tcp流都可以,但是tcp可以更加详细的查看上一个下一个流,然后分析流量的内容
4. 内容升级分析,需要使用到代码脚本,首先需要掌握pyshark库的用法,然后就是找数据包的规律,这个也有差不多的套路
    1. 首先要明白,数据请求时包含两个(一个是requests,另一个是response,所以程序第一步需要筛选出ip,我们可能只需要一个,就ip.src==129.2.2.3这样就只有requests的数据)
    2. 然后分析数据包规律,可能是01这种只有两个特征变化的数据
    3. 找到规律数据后,用通用代码试一试,一般来说结果是二进制的数据,可以尝试二进制转字符串或者二维码或者七位二进制补充齐全,多试一试01或者10
5. 无线流量分析,固定套路需要账号密码,


    可以搜索ssid是username,密码可以爆破


    爆破密码在kali下aircrack-ng -e username -w password.txt xxx.pcap
    得到密码后,对流量包进行解密

    在kali下 airdecap-ng -e username -p password xxx.pcap
    这样就能够解密,桌面多了一个解密出来后的数据包

    然后正常按照上面四步一个一个的来

无线流量分析

找ssid
爆破密码:aircrack-ng -e ctf -w pass.txt ctf.pcap
解密流量:airdecap-ng -e ctf -p password1 ctf.pcap

注意 aircrack-ng xxx.pacp 可以直接列出所有的mac地址和ssid信息,可以用这个命令试一下,

另外可以直接命令 aircrack-ng -w password.txt xxx.pcap ,会提示让你选择项目,你就全部选择进去一个一个试一下

pyshark库

主要如果需要从流量包提取有规律的大量的数据,你必须会pyshark这个库的用法:

import pyshark
# pyshark提取需要的数据
cap = pyshark.FileCapture(r'xxx.pcapng')
# 打开流量包,筛选规则自己需要的   display_filter='ip.src == 127.0.0.1'
# 或者指定位置 pyshark.FileCapture('aa.pcap', tshark_path='E:/softinstall/Wireshark/tshark.exe',  display_filter='http')

for p in cap:
    # print(p)
    print(p.highest_layer)
    # 输出每个数据包的协议信息
    print(p.tcp.field_names)
    # 注意这个是最重要的~~~
    #['srcport', 'dstport', 'port', 'stream', 'len', 'seq', 'ack', 'hdr_len', 'flags', 'flags_res', 'flags_ns', 'flags_cwr', 'flags_ecn', 'flags_urg', 'flags_ack', 'flags_push', 'flags_reset', 'flags_syn', 'flags_fin', 'flags_str', 'window_size_value', 'window_size', 'window_size_scalefactor', 'checksum', 'checksum_status', 'urgent_pointer', 'analysis', 'analysis_initial_rtt', 'analysis_flags', 'analysis_duplicate_ack', 'analysis_duplicate_ack_num', 'analysis_duplicate_ack_frame', '_ws_expert', '_ws_expert_message', '_ws_expert_severity', '_ws_expert_group']
    # 输出tcp额可以打印出来的内容
    #print(p.tcp.port)
    print(p.tcp.urgent_pointer)
    # 这样就直接打印出来了~~


    # flag =''
    # if int(p.tcp.urgent_pointer )!= 0:
    #     print(chr(int(p.tcp.urgent_pointer)))
    #     flag += chr(int(p.tcp.urgent_pointer))
    # print(flag)

    # flag =''
    # print(p.icmp.field_names)
    # d = int((p.icmp.data_len))
    # if d == 32:
    #     flag+='0'
    # else:
    #     flag+='1'
    # print(flag)


    # # 后面的dns.filed_names在wireshark找到
    # print(i.dns.qry_name.split('.')[0])


    # print(p.eth.dst)  
    # # 想获取哪个字段,就用字段名称.获取网卡mac地址
    # print(p.ip.src)
    # # 想获取哪个字段,就用字段名称.获取ip

    # src_ip = p.ip.src
    # # 获取数据包的源IP地址
    # dst_ip = p.ip.dst
    # # 获取数据包的目的IP地址
    # protocol = p.transport_layer
    # # 获取数据包的协议
    # print(f"Packet: {protocol} from {src_ip} to {dst_ip}")

    # print(p.dns.qry_name.split('.')[0])
    # # 后面的dns.filed_names在wireshark找到

内存分析

解题思路

  1. 首先确定镜像是何种操作系统的,命令imageinfo即可获取镜像信息。

  2. 需要获取的是计算机在这一时刻运行了哪些进程。

  3. Volatility提供了众多的分析进程的命令,如pstree、pesscan、pslist……filescan命令可以对打开的文件进行扫描。

  4. 命令dumpfile和memdump命令将相关数据导出,然后对导出的数据进行二进制分析。

简单说只要熟悉Volatility工具的常用命令,并能够对结合其他类型的知识(图片隐写、压缩包分析等)对提取出的文件进行分析,便可轻松解决。

volatility 工具

使用工具:volatility,用来分析vmem和raw后缀的文件

kali下使用命令 

./volatility -f xxx.raw imageinfo  
这行命令主要的到:Suggested Profile(s) : WinXPSP2x86这个版本信息,后面的命令都需要把这个x86加上去

然后就是开始正常的作业了:

./volatility -f xxx.raw --profile=WinXPSP2x86 imageinfo

./volatility -f xxx.raw --profile=WinXPSP2x86 pslist
# 查看所有正在运行的进程,比如有nc.exe  notepad正在运行,我要看这数据,使用命令
./volatility -f xxx.raw --profile=WinXPSP2x86 notepad
# 查看notepad的数据

./volatility -f xxx.raw --profile=WinXPSP2x86 cmdscan
# 查看cmd命令

./volatility -f xxx.raw --profile=WinXPSP2x86 consoles
# 查看历史命令

./volatility -f xxx.raw --profile=WinXPSP2x86 clipboard
# 查看粘贴板

./volatility -f xxx.raw --profile=WinXPSP2x86 connscan
# 看网络连接

./volatility -f xxx.raw --profile=WinXPSP2x86 filescan 
./volatility -f xxx.raw --profile=WinXPSP2x86 filescan | grep ".zip"
./volatility -f xxx.raw --profile=WinXPSP2x86 filescan | grep "flag"
./volatility -f xxx.raw --profile=WinXPSP2x86 filescan | grep ".rar"
./volatility -f xxx.raw --profile=WinXPSP2x86 filescan | grep ".jpg"
# 搜索文件,匹配文件名常见的flag,ctf,password,key,或者这么写grep ctf|flag|png|jpg|gif|zip|rar|7z|pdf|txt|doc’

./volatility -f xxx.raw --profile=WinXPSP2x86 dunpfiles -Q 指定文件 -D 指定路径
./volatility -f xxx.raw --profile=WinXPSP2x86 dumpfiles -Q 0x0000000002c61318 -D ~/Desktop 
# 下载文件,这里的-Q 是通过filescan找到的文件在内存的位置,然后桌面就出来两个文件,这两个文件修改好正确后缀

./volatility -f xxx.raw --profile=WinXPSP2x86 editbox
# 查看曾经编辑过的内容

./volatility -f xxx.raw --profile=WinXPSP2x86 hashdump
# 查看登录密码


./volatility -f xxx.raw --profile=WinXPSP2x86 iehistory
# 查看当前系统浏览器搜索过的关键词

./volatility -f xxx.raw --profile=WinXPSP2x86 memdump -p 指定pid  --dump-dir=./
# 下载内存,提取出指定进程,常用foremost 来分离里面的文件,比如命令为:memdump -p 332 -D XX/ ,导出为332.dmp,dump出来的进程文件,可以使用 foremost 来分离里面的文件,strings -e l 2040.dmp | grep flag 查找flag 

./volatility -f xxx.raw --profile=WinXPSP2x86 printkey -K"ControlSet001\Control\ComputerName\ComputerName"
# 查看主机名

./volatility -f xxx.raw --profile=WinXPSP2x86 printkey -K"SAM\Domains\Account\Users\Names"
# 查看用户名


./volatility -f xxx.raw --profile=WinXPSP2x86 screenshot --dump-dir=E:\截图
# 查看屏幕截图

./volatility -f xxx.raw --profile=WinXPSP2x86 printkey -K"SAM\Domains\Account\Users\Names"
# 查看当前内存镜像中的用户

./volatility -f xxx.raw --profile=WinXPSP2x86 lsadump
# 查看强密码,这个是hashdump没法解密,就用这个

./volatility -f xxx.raw --profile=WinXPSP2x86 pslist -p 2588
# 查看指定的进程

./volatility -f xxx.raw --profile=WinXPSP2x86 svcscan
# 查看服务名称

./volatility -f xxx.raw --profile=WinXPSP2x86 netscan
# 查看当前ip,有一些版本 这个命令是使用不了 这里我们就要使用(connscan,connections)

如果需要找到查看密码可以从下面角度出发:记事本,粘贴版,cmd命令,hashdump,或者文件搜索key,pass等

附上这个工具所有插件用法~

支持的插件命令:

    amcache            查看AmCache应用程序痕迹信息
    apihooks           检测内核及进程的内存空间中的API hook
    atoms              列出会话及窗口站atom表
    atomscan           Atom表的池扫描(Pool scanner)
    auditpol           列出注册表HKLMSECURITYPolicyPolAdtEv的审计策略信息
    bigpools           使用BigPagePoolScanner转储大分页池(big page pools)
    bioskbd            从实时模式内存中读取键盘缓冲数据(早期电脑可以读取出BIOS开机密码)
    cachedump          获取内存中缓存的域帐号的密码哈希
    callbacks          打印全系统通知例程
    clipboard          提取Windows剪贴板中的内容
    cmdline            显示进程命令行参数
    cmdscan            提取执行的命令行历史记录(扫描_COMMAND_HISTORY信息)
    connections        打印系统打开的网络连接(仅支持Windows XP 和2003)
    connscan           打印TCP连接信息
    consoles           提取执行的命令行历史记录(扫描_CONSOLE_INFORMATION信息)
    crashinfo          提取崩溃转储信息
    deskscan           tagDESKTOP池扫描(Poolscaner)
    devicetree         显示设备树信息
    dlldump            从进程地址空间转储动态链接库
    dlllist            打印每个进程加载的动态链接库列表
    driverirp          IRP hook驱动检测
    drivermodule       关联驱动对象至内核模块
    driverscan         驱动对象池扫描
    dumpcerts          提取RAS私钥及SSL公钥
    dumpfiles          提取内存中映射或缓存的文件
    dumpregistry       转储内存中注册表信息至磁盘
    editbox            查看Edit编辑控件信息 (Listbox正在实验中)
    envars             显示进程的环境变量
    eventhooks         打印Windows事件hook详细信息
    evtlogs            提取Windows事件日志(仅支持XP/2003)
    filescan           提取文件对象(file objects)池信息
    gahti              转储用户句柄(handle)类型信息
    gditimers          打印已安装的GDI计时器(timers)及回调(callbacks)
    gdt                显示全局描述符表(Global Deor Table)
    getservicesids     获取注册表中的服务名称并返回SID信息
    getsids            打印每个进程的SID信息
    handles            打印每个进程打开的句柄的列表
    hashdump           转储内存中的Windows帐户密码哈希(LM/NTLM)
    hibinfo            转储休眠文件信息
    hivedump           打印注册表配置单元信息
    hivelist           打印注册表配置单元列表
    hivescan           注册表配置单元池扫描
    hpakextract        从HPAK文件(Fast Dump格式)提取物理内存数据
    hpakinfo           查看HPAK文件属性及相关信息
    idt                显示中断描述符表(Interrupt Deor Table)
    iehistory          重建IE缓存及访问历史记录
    imagecopy          将物理地址空间导出原生DD镜像文件
    imageinfo          查看/识别镜像信息
    impscan            扫描对导入函数的调用
    joblinks           打印进程任务链接信息
    kdbgscan           搜索和转储潜在KDBG值
    kpcrscan           搜索和转储潜在KPCR值
    ldrmodules         检测未链接的动态链接DLL
    lsadump            从注册表中提取LSA密钥信息(已解密)
    machoinfo          转储Mach-O 文件格式信息
    malfind            查找隐藏的和插入的代码
    mbrparser          扫描并解析潜在的主引导记录(MBR)
    memdump            转储进程的可寻址内存
    memmap             打印内存映射
    messagehooks       桌面和窗口消息钩子的线程列表
    mftparser          扫描并解析潜在的MFT条目
    moddump            转储内核驱动程序到可执行文件的示例
    modscan            内核模块池扫描
    modules            打印加载模块的列表
    multiscan          批量扫描各种对象
    mutantscan         对互斥对象池扫描
    notepad            查看记事本当前显示的文本
    objtypescan        扫描窗口对象类型对象
    patcher            基于页面扫描的补丁程序内存
    poolpeek           可配置的池扫描器插件
    printkey           打印注册表项及其子项和值
    privs              显示进程权限
    procdump           进程转储到一个可执行文件示例
    pslist             按照EPROCESS列表打印所有正在运行的进程
    psscan             进程对象池扫描
    pstree             以树型方式打印进程列表
    psxview            查找带有隐藏进程的所有进程列表
    qemuinfo           转储 Qemu 信息
    raw2dmp            将物理内存原生数据转换为windbg崩溃转储格式
    screenshot         基于GDI Windows的虚拟屏幕截图保存
    servicediff        Windows服务列表(ala Plugx)
    sessions           _MM_SESSION_SPACE的详细信息列表(用户登录会话)
    shellbags          打印Shellbags信息
    shimcache          解析应用程序兼容性Shim缓存注册表项
    shutdowntime       从内存中的注册表信息获取机器关机时间
    sockets            打印已打开套接字列表
    sockscan           TCP套接字对象池扫描
    ssdt               显示SSDT条目
    strings            物理到虚拟地址的偏移匹配(需要一些时间,带详细信息)
    svcscan            Windows服务列表扫描
    symlinkscan        符号链接对象池扫描
    thrdscan           线程对象池扫描
    threads            调查_ETHREAD 和_KTHREADs
    timeliner          创建内存中的各种痕迹信息的时间线
    timers             打印内核计时器及关联模块的DPC
    truecryptmaster    Recover     恢复TrueCrypt 7.1a主密钥
    truecryptpassphrase        查找并提取TrueCrypt密码
    truecryptsummary    TrueCrypt摘要信息
    unloadedmodules    打印卸载的模块信息列表
    userassist         打印注册表中UserAssist相关信息
    userhandles        转储用户句柄表
    vaddump            转储VAD数据为文件
    vadinfo            转储VAD信息
    vadtree            以树形方式显示VAD树信息
    vadwalk            显示遍历VAD树
    vboxinfo           转储Virtualbox信息(虚拟机)
    verinfo            打印PE镜像中的版本信息
    vmwareinfo         转储VMware VMSS/VMSN 信息
    volshell           内存镜像中的shell
    windows            打印桌面窗口(详细信息)
    wintree            Z顺序打印桌面窗口树
    wndscan            池扫描窗口站
    yarascan           以Yara签名扫描进程或内核内存

日志分析

这个可以用net-a一把锁哈看看

首先要会读取日志,每一行的内容,大概两种思路:

    1. 时间线入手(追踪ip)
    2. 漏洞入手(上传:upload,文件包含:etc/passwd,注入:union,select,and)
        一般来说,sql注入是bool或者time的盲注
            盲注的知识点,>100 对的 页面长度为 666
                        <50   错的  页面长度为 555
                        那么就这么正则表达式搜索r'RDER BY flag LIMIT 0,1),(.*?),1))>(.*?)' 就能找到数字,然后还的判断长度,然后麻烦的逻辑是,最后测试到正确的数据后,判断一下返回的页面长度,确定到正确的数字

用代码实现就是:

    import re
    dic = {}
    res = [x for x in open('access.log','r').readlines()]
    des = []
    for r in res:
        de = re.findall(r'RDER%20BY%20flag%20LIMIT%200%2C1%29%2C(.*?)%2C1%29%29%3E(.*?)%20.*? 200 (.*?) "-',r)
        # 提取出来需要的数值
        if de:
            des.append(de[0])
            if de[0][2] == '209':
                # 判断一下返回的长度对不对,然后选择出来那个是需要的
                dic[de[0][0]]=int(de[0][1])+1
            else:
                dic[de[0][0]]=int(de[0][1])
    for i in des:print(i)
    print(dic)
    print(''.join(chr(x) for x in dic.values()))

老师是这么写的

import re
f = {}
with open("access.log","r") as file:
    req = file.readlines()
    req = req[2780:3050]
    for i in range(len(req)):
        payload = re.findall("\d+%2C1%29%29%3E\d+",req[i])
        index,value = str(payload).replace("[\'", "").replace("\']", "").split('%2C1%29%29%3E')
        if "209" in req[i]:
            value = int(value) + 1
        else:
            value = int(value)
        f.update({index:value})
flag = ""        
for value in f.values():
    flag += chr(int(value))
print(flag)

pacp数据包以及wrireshark用法

基本思路

  1. 直接ctrl+f选择字符串搜索flag,如果找到了,右键追踪数据流就能复制
  2. 没有思路试一试文件分离看看
  3. 在做题过程中,发现如果数据包里出现中文,就会乱码。这时候打开追踪 TCP 流,选择原始数据,然后 save as 文本文件,即可解决乱码
  4. 如果是加密流量,比如ssl加密,那么肯定汇给你一个xxx.log密钥文件,在wireshark-工具-tlskeylog导入或者neta中设置好就行
  5. 如果搜不到flag,那就逐个分析数据包,查看固定格式,说不定每个数据包包含一个flag的值
  6. 上面都没有的话,就看看题目的提示,假如是要看http请求操作顺序,就筛选http,然后右键追踪http流,能看到请求和相应,注意,每个http流都可以追踪,一般来说,假如响应里面有图片,压缩包之类的文件,通过看请求头就知道是啥文件,然后把这个文件导出,这个文件导出方法就是点击这个http,然后点击文件,点击选择http方式,然后会让你选择哪个链接,选中可疑的哪个导出就行,如果是05461238574这种16进制的数据,保存到文本,然后使用010座上交倒入16进制文件。
  7. 有时候自动提取得不到想要的结果时,也可以使用 wireshark 也可以手动提取文件
    内容:
    点击想要的数据包,选定 media type 的位置,点击 file->export selected Packet
    Bytes,在弹出的框中将文件保存成二进制文件。
    文件->导出分组字节流

至于如何搜索!!这里最后强调一下,ctrl+f,然后下面选择字符串类型就可以,随便研究就知道了!!!

然后总结一下过滤器的使用方法

1.过滤 IP,例如源 IP 和目标 IP 
ip.src eq x.x.x.x or ip.dst == x.x.x.x 或者 ip.addr eq x.x.x.x

2. 过滤端口 
tcp.port eq 80 or udp.port eq 80 源端口或者目的端口为 80 
tcp.dstport == 80 只显 tcp 协议的目标端口为 80 
tcp.srcport == 80 只显 tcp 协议的源端口为 80 
tcp.port >= 1 and tcp.port <= 80 


3. 过滤协议 
tcp/udp/arp/icmp/http/ftp/dns/ip…… 常用的协议 


4.过滤 MAC 地址 
eth.src eq b4:ae:2b:31:c5:07 
eth.dst eq b4:ae:2b:31:c5:07 
eth.addr == b4:ae:2b:31:c5:07


5. 过滤包长渡 
udp.length == 26 这个长度是指 udp 本身固定长度 8 加上 udp 下面那块数据包之和 。 
tcp.len >= 7 指的是 ip 数据包(tcp 下面那块数据),不包括 tcp 本身 
ip.len == 94 除了以太网头固定长度 14,其它都算是 ip.len,即从 ip 本身到最后 
frame.len == 119 整个数据包长度,从 eth 开始到最后


6. 过滤 HTTP 
http 
http.request.method== "GET" 
http.request.method== "POST" 
http.request.uri =="/img/logo-edu.gif" 
http contains "PNG"
一般的危险命令http contains "command"

常见的 HTTP 流关键内容:

  1. HTML 中直接包含重要信息
  2. 上传或下载文件内容,通常包含文件名、 hash 值等关键信息,常用 POST 请求上传
  3. 一句话木马, POST 请求,内容包含 eval,内容使用 base64 加密

常见的TCP流关键内容:

  1. TCP 流通常是命令行操作

额外补充:

如果检查中,提取发现了key.log文件,可以在在 Wireshark 中选择编辑->首选项->Protocols->tls(旧本叫 ssl)(Pre-Shared-Key)导入
key.log。

就能出现新的一波流量。

例题案例

  • 找到黑客使用的扫描器?

一般来说扫描器都自带请求头指纹,比如:

1.awvs:acunetix
2.netsparker:netsparker
3.appscan:Appscan
4.nessus:nessus
5.sqlmap:sqlmap

那么直接搜索

http contains"wvs"

如果有就说明用awvs

  • 找到黑客登录的后台?

后台一般为admin,manage这种,

直接搜索

http contains"admin"
  • 找到黑客登录后台的账号密码?

直接筛选post的数据,然后排序一下返回头的大小,逐个检查应该能发现

找到黑客上传的 webshell 的文件名和内容?

因为是 php 格式,所以只需搜索 eval

  • 找到黑客在 robots.txt 中得到的 flag?

一般robots.txt文件包含关键词,直接搜索

http contains"Disallow"
  • 找到黑客得到的数据库密码?

登录账号密码咯。搜索

http contains"dbhost"
  • 找到黑客攻击的 web 服务器,网卡配置?

直接搜索

http contains “eth0”
  • 找到黑客获得的 vpn,ip 是多少?

按照顺序执行-统计—端点,找到流量大的地址,则为黑客获得的 vpn ip

  • 分析出黑客通过工具对目标服务器的哪些服务进行了密码暴力枚举渗透测试?

使用过滤规则

tcp.connection.syn and ip.src == 攻击者ip
  • 找出黑客已经获取到目标服务器的基本信息?

使用过滤规则

ip.addr == 攻击者ip and telnet contains “login”

config系统文件取证

下载完发现是这样的格式,内容很大,要读取登录账号密码

将config文件夹复制进mimikatz主程序所在的文件夹内,然后依次执行命令

打开mimikatz.exe,然后cd config,执行:

lsadump::sam /sam:SAM /system:SYSTEM

在这里就看到:

然后密码是md5加密,需要解密一下

坚持原创技术分享,您的支持将鼓励我继续创作!

-------------本文结束感谢您的阅读-------------

腾讯云主机优惠打折:最新活动地址


版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%