取证

取证(Forensic)

内存取证

工具:volatility,DiskGenius

volatility

https://github.com/volatilityfoundation/volatility

镜像基本信息(得到profile):

volatility -f mem.data imageinfo

python3 vol.py -f mem.data windows.info

搜索进程、导出内存块:

volatility -f mem.data --profile=XXX pslist

python3 vol.py -f mem.data windows.pstree

volatility -f mem.data --profile=XXX memdump -p 2768 -D ./

查看命令行输入、命令行历史记录:

volatility -f mem.data --profile=XXX cmdline

python3 vol.py -f mem.data windows.cmdline

volatility -f mem.data --profile=XXX cmdscan

volatility -f mem.data --profile=XXX consoles

查看可疑文件、导出文件:

volatility -f mem.data --profile=XXX filescan | grep -E ".zip|.rar|.jpg|.png|.txt|.bmp|.7z"

volatility -f mem.data --profile=XXX dumpfiles -D ./ -Q 0x000000001e85f430 -n

python3 vol.py -f mem.data windows.dumpfiles --pid 8180

python3 vol.py -f mem.data windows.dumpfiles --virtaddr 0xd0064181c950

特殊文件后缀:

evtx - Windows系统日志

无法导出.dat文件,加 -u 参数(-u = —unsafe relax safety constraints more data)
volatility -f mem.data dumpfiles -r pdf$ -i --name -D dumpfiles/ -u

dumpfiles 参数:
参考:https://www.andreafortuna.org/2017/07/17/volatility-my-own-cheatsheet-part-4-kernel-memory-and-objects

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-r REGEX, --regex=REGEX
Dump files matching REGEX
-i, --ignore-case Ignore case in pattern match
-o OFFSET, --offset=OFFSET
Dump files for Process with physical address OFFSET
-Q PHYSOFFSET, --physoffset=PHYSOFFSET
Dump File Object at physical address PHYSOFFSET
-D DUMP_DIR, --dump-dir=DUMP_DIR
Directory in which to dump extracted files
-S SUMMARY_FILE, --summary-file=SUMMARY_FILE
File where to store summary information
-p PID, --pid=PID Operate on these Process IDs (comma-separated)
-n, --name Include extracted filename in output file path
-u, --unsafe Relax safety constraints for more data
-F FILTER, --filter=FILTER
Filters to apply (comma-separated)

查看内存中记录的当时正在运行的程序、运行次数、最后运行时间:

volatility -f mem.data --profile=XXX userassist

查看截图:

volatility -f mem.data --profile=XXX screenshot -D ./

查看剪贴板:

volatility -f mem.data --profile=XXX clipboard

volatility -f mem.data --profile=XXX clipboard -v

查看Edit编辑控件信息:

volatility -f mem.data --profile=XXX editbox

查看当前notepad文本:

volatility -f mem.data --profile=XXX notepad

查看账户与密码:

volatility --plugins=plugins/ -f mem.data --profile=XXX mimikatz(或PasswareKitForensic)

查看系统计算机名:

volatility -f mem.data --profile=XXX printkey -K "ControlSet001\Control\ComputerName\ComputerName"(或PasswareKitForensic)

查看系统用户名:

volatility -f mem.data --profile=XXX printkey -K "SAM\Domains\Account\Users\Names"

查看最后登录系统的账户:

volatility -f mem.data --profile=xxx printkey -K "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

查看网络连接:

volatility -f mem.data --profile=XXX netscan

查看缓存在内存中的注册表:

volatility -f mem.data --profile=XXX hivelist

提取注册表:

volatility -f mem.data --profile=XXX dumpregistry (dumpregistry插件)

提取注册表system和SAM虚拟地址的hash内容:

volatility -f mem.data --profile=XXX hashdump

volatility -f mem.data --profile=XXX hashdump -y 0xfffff8a000024010 -s 0xfffff8a00167a010 -D ./

python3 vol.py -f mem.data windows.hashdump

提取内存中主文件表(MFT)记录信息(文件属性):

volatility -f mem.data --profile=XXX mftparser > mft.txt

提取IE历史记录:

volatility -f mem.data --profile=XXX iehistory

显示环境变量:

volatility -f mem.data --profile=XXX envars

python3 vol.py -f mem.data windows.envars

提取Chrome历史记录(插件):

Chrome Cookies 的本质是 SQLite。

Chrome 80 以后更改了 Cookies 的加密方法。

cookies 表 encrypted_value 字段不为 V10 / V11 开头,是 Chrome 79 及以前版本的 Cookies。

volatility --plugins=plugins/ -f mem.data chromehistory

volatility --plugins=plugins/ -f mem.data chromevisits -Q(visits – QUICK)

volatility --plugins=plugins/ -f mem.data chromevisits(visits – FULL)

volatility --plugins=plugins/ -f mem.data chromesearchterms

volatility --plugins=plugins/ -f mem.data chromedownloads(Standard Text Output)

volatility --plugins=plugins/ -f mem.data chromedownloads --output=csv(CSV Output)

volatility --plugins=plugins/ -f mem.data chromedownloads --output=body(Bodyfile Output)

volatility --plugins=plugins/ -f mem.data chromedownloadchains

volatility --plugins=plugins/ -f mem.data chromecookies | more(Cookies – Basic example)

volatility --plugins=plugins/ -f mem.data chromecookies(Cookies – No Decryption)

volatility --plugins=plugins/ -f mem.data chromecookies -K "rq2uadV+VvAD+IBiBeJ75a=="(Cookies – Decrypted)

提取登录密码(LassPass插件):

volatility --plugins=plugins/ -f mem.data --profile=XXX lasspass

USB设备相关(usbstor插件):

volatility --plugins=plugins/ -f mem.data --profile=XXX usbstor

特殊进程

便签:StikyNot.exe.snt 文件,对应路径:C:\Users\XXX\AppData\Roaming\Microsoft\Sticky Notes\

联系人:wab.exe.contact 文件)

插件收集

https://github.com/superponible/volatility-plugins(chromehistory)

https://github.com/kevthehermit/volatility_plugins(usbstor)

参考

https://wiki.wgpsec.org/knowledge/ctf/Volatility.html

Linux镜像制作

内存取证实验 - 镜像 + 配置文件

磁盘取证

vmdk

AccessData FTK Imager 挂载

Bitlocker
  1. 磁盘+内存

    Elcomsoft Forensic Disk Decryptor

    volume选择挂载过的物理磁盘,memory dump选择内存文件,一直往后解密。

日志

到$Extend---$UsnJrnl---$J,使用NTFS Log Tracker或解析UsnJrnl的工具,加载 $J 文件,然后生成db文件,导出CSV。

社工(信息收集)

用户名

https://github.com/sherlock-project/sherlock

Sherlock Project提供了一个非常强大的命令行工具Sherlock来查找社交网络(社交网络列表及规则可自定义扩展延伸)中的用户名,以方便您进行信息收集相关的安全保障工作。

命令:python3 sherlock.py user1 user2 user3

WiFi

参考:How to decrypt stored Windows passwords using mimikatz and DAPA

工具:mimikatz

保存/使用主密钥(master keys):

dpapi::cache /save /file:cache.bin

提取WiFi密码:

dpapi::wifi /in:"{fullpath}\file.xml"

Cookies

工具:mimikatz

保存/使用主密钥(master keys):

Windows 下:文件夹选项 -> 查看 -> 取消勾选 “隐藏受保护的操作系统文件” 才能看到 SID 文件夹下的 protect 文件

dpapi::masterkey /in:S-1-5-21-262715442-3761430816-2198621988-1001\57935170- beab-4565-ba79-2b09570b95a6 /sid:S-1-5-21-262715442-3761430816-2198621988-1001 /password:<登录密码>

解密Cookies:

dpapi::chrome /in:"Cookies"

AirDrop

AirDrop有一个安全漏洞将发送者的Apple ID和电话号码的哈希值泄露给接收者设备。在AirDrop连接或文件传输之前,发送设备的Apple ID和电话号码的SHA-256哈希值会广播给所有邻近的设备。所以在传输过程中可以捕获该苹果ID和电话号码的部分SHA-256哈希值,爆破出完整的信息以此来识别发送设备。

关键文件:sysdiagnose/system_logs.archive

AirDrop AWDL数据存储在日志内的sharingd进程下,因此可以添加过滤条件只显示sharingd进程和Hashes的数据。

投递设备的部分Hash数据(前五位…后五位),可以写脚本爆破国内运营商所有手机号的号段,需要注意的是手机号前面要加上中国的手机号前缀86。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import hashlib

targetstart = input('[+] Enter the target hash start fragment: ')
targetend = input('[+] Enter the target hash end fragment: ')
print('[+] Checking all Chinese areacode')
areacodelist = ['139', '138', '137', '136', '135', '134', '159', '158', '157','150','151', '152', '188', '187', '182', '183', '184', '178']
phonematch = []

for areacode in areacodelist:
line = '0'
print('[+] Searching area code ' + areacode + ' for target...')
while int(line) < 10000000:
targetphone = '86' + str(areacode) + str(line).zfill(8)
targettest = hashlib.sha256(targetphone.encode())
starthashcheck = targettest.hexdigest() [0:5]
endhashcheck = targettest.hexdigest() [-5:]
if starthashcheck == targetstart.lower() and endhashcheck == targetend.lower():
print(targetphone + ' matches hash fragments. Still checking...')
phonematch.append(targetphone)
line = int(line) + 1
while int(line) == 10000000:
break

if phonematch:
print('Your target\'s phone number may be:')
for match in phonematch:
print(match)
else:
print('Target phone number not found in this area code set. Target phone may use another country code.')