优秀的人,不是不合群,而是他们合群的人里面没有你
电子取证一般分为三种:数据包分析,日志分析,内存分析。
习惯用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找到
内存分析
解题思路
首先确定镜像是何种操作系统的,命令imageinfo即可获取镜像信息。
需要获取的是计算机在这一时刻运行了哪些进程。
Volatility提供了众多的分析进程的命令,如pstree、pesscan、pslist……filescan命令可以对打开的文件进行扫描。
命令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用法
基本思路
- 直接ctrl+f选择字符串搜索flag,如果找到了,右键追踪数据流就能复制
- 没有思路试一试文件分离看看
- 在做题过程中,发现如果数据包里出现中文,就会乱码。这时候打开追踪 TCP 流,选择原始数据,然后 save as 文本文件,即可解决乱码
- 如果是加密流量,比如ssl加密,那么肯定汇给你一个xxx.log密钥文件,在wireshark-工具-tlskeylog导入或者neta中设置好就行
- 如果搜不到flag,那就逐个分析数据包,查看固定格式,说不定每个数据包包含一个flag的值
- 上面都没有的话,就看看题目的提示,假如是要看http请求操作顺序,就筛选http,然后右键追踪http流,能看到请求和相应,注意,每个http流都可以追踪,一般来说,假如响应里面有图片,压缩包之类的文件,通过看请求头就知道是啥文件,然后把这个文件导出,这个文件导出方法就是点击这个http,然后点击文件,点击选择http方式,然后会让你选择哪个链接,选中可疑的哪个导出就行,如果是05461238574这种16进制的数据,保存到文本,然后使用010座上交倒入16进制文件。
- 有时候自动提取得不到想要的结果时,也可以使用 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 流关键内容:
- HTML 中直接包含重要信息
- 上传或下载文件内容,通常包含文件名、 hash 值等关键信息,常用 POST 请求上传
- 一句话木马, POST 请求,内容包含 eval,内容使用 base64 加密
常见的TCP流关键内容:
- 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加密,需要解密一下