如何基于volatility2构建“新”版本内核的profile

WriteUp 1年前 (2022) admin
772 0 0

点击 / 关注我们

文前漫谈

前两天跳跳糖发表了一篇如何基于vol3构建symbolstable的文章 Linux新版内核下内存取证分析附CTF题 vol3之于vol2,很大的改变就是用symboltables(符号表)替换了profile(配置文件),vol3带有一个广泛的符号表库,并且可以基于内存映像本身为大多数 Windows 内存映像生成新的符号表。最近的2022祥云杯正好出了一道需要自己构建新版本内核的题(这里“新”指的是profile在互联网上找不到对应的profile),关于构建profile中文社区没发现什么文章。这里记录一下,直接用祥云杯的附件做例子了。一般的profile,我们可以在vol社区的https://github.com/volatilityfoundation/profiles找找,适用于祥云杯这题的profile我也已经上传(https://github.com/may1as/myvolatilityprofiles)如何基于volatility2构建“新”版本内核的profile

识别Linux内存映像的内核版本

取证的尽头是strings,strings提取出来可能会有其他数据,取其精华就行。祥云杯附件Linux kernel是5.4.0-84-generic,正好我的虚拟机是Ubuntu18.04,直接开始操作

  1. strings 1.mem | grep -i 'Linux version' | uniq

  2. Linux version 5.4.0-84-generic (buildd@lcy01-amd64-007) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #94~18.04.1-Ubuntu SMP Thu Aug 26 23:17:46 UTC 2021 (Ubuntu 5.4.0-84.94~18.04.1-generic 5.4.133)

或者用vol2的插件

  1. python2 vol.py -f 1.mem banners.Banners

如何基于volatility2构建“新”版本内核的profile

小tips

总是 python2 vol.py...使用的太麻烦,用 vim~/.bashrc,之后直接在命令行中直接 vol2就行 (不同用户之间不生效,因为是在home目录修改的)

如何基于volatility2构建“新”版本内核的profile

切换内核版本

构建过程中要求本机(这里是虚拟机)内核版本和内存映像内核版本相同

sudo apt install linux-image-x.x.x-xx-lowlatency linux-headers-x.x.x-xx-lowlatency

apt install安装对应内核版本,这里说说我的Ubuntu18.04切换切换内核的方法

开机时按住Esc,进入高级选项(Advanced options),选择内核版本

如何基于volatility2构建“新”版本内核的profile

构建过程

注意内核文件的位置和内核文件夹下是否有build目录,没有的话重新安装下内核头文件

  1. sudo apt-get install linux-headers-$(uname -r)

若有,直接下一步安装 build-essentialdwarfdump(调试文件导出工具), /boot目录下找到该 System.map.xx文件包含系统的符号信息。

  1. sudo apt install build-essential dwarfdump

  2. cd volatility/tools/linux

  3. make

  4. sudo zip Ubuntu1804.zip volatility/tools/linux/module.dwarf /boot/System.map-x.x.x-xx-lowlatency

  5. mv Ubuntu1804.zip volatility/volatility/plugins/linux/

make这一步可能会出现问题,一般就是前面说的内核文件夹下是否有build目录的问题,这一步会得到一个module.dwarf文件,然后就zip命令压缩,放在volatility/plugins/linux/目录下就行

如何基于volatility2构建“新”版本内核的profile

构建完成

vol2 -f 1.mem –info

可以看见制作好的profile已经载入, --profile=LinuxUbuntu1804-5_4_0-84x64载入即可如何基于volatility2构建“新”版本内核的profile

2022祥云杯 strange_forensics 题解

题目描述:小赵的内存被dump下来了,你能找到flag嘛?flag分为三段,flag1为用户密码,flag3以 .为结束符(.不算在flag里)找到三个flag后依次拼在一起,用flag{}包上提交

制作完profile能够正常解析就简单了,flag分三段

flag1

  1. vol2 -f 1.mem --profile=LinuxUbuntu1804-5_4_0-84x64 linux_enumerate_files | grep "/etc/shadow"

如何基于volatility2构建“新”版本内核的profile

  1. vol2 -f 1.mem --profile=LinuxUbuntu1804-5_4_0-84x64 linux_find_file -i 0xffff97ce7444b448

  2. -O shadow.txt

如何基于volatility2构建“新”版本内核的profile网站一把嗦如何基于volatility2构建“新”版本内核的profile

flag2

binwalk的时候偶然发现desktop上有个文件,凭经验与累计也应该能想到。当时在app.py也踩坑了,事实只有secret.zip有用

如何基于volatility2构建“新”版本内核的profile压缩包拿到手需要修复,将两个加密位从 0修复为 9,爆破得到密码 123456,得到flag2如何基于volatility2构建“新”版本内核的profile

flag3

flag3直接

  1. strings 1.mem | grep -i "flag3"

如何基于volatility2构建“新”版本内核的profileflag就是 flag{890topico_y0u_Ar3_tHe_LInUx_forEnsIcS_MASTER}昨晚文章写完了,看别的队伍的wp里这篇博客也不错,可惜当时没发现,制作Linux内存镜像+制作对应的volatility profile

附上vol2中的Linux插件与常用

  1. linux_apihooks - 检查用户名apihooks

  2. linux_arp - 打印ARP

  3. linux_aslr_shift - 自动检测Linux aslr改变

  4. linux_banner - 打印Linux Banner信息

  5. linux_bash - bash进程内存中恢复bash历史记录

  6. linux_bash_env - 恢复一个进程的动态环境变量

  7. linux_bash_hash - bash进程内存中恢复bash哈希表

  8. linux_check_afinfo - 验证网络协议的操作函数指针

  9. linux_check_creds - 检查是否有任何进程正在共享凭证结构

  10. linux_check_evt_arm - 检查异常向量表以查找系统调用表钩子

  11. linux_check_fop - 检查rootkit修改的文件操作结构

  12. linux_check_idt - 检查IDT是否被更改

  13. linux_check_inline_kernel - 检查内联内核挂钩

  14. linux_check_modules - 将模块列表与sysfs信息进行比较

  15. linux_check_syscall - 检查系统调用表是否已被更改

  16. linux_check_tty - 检查tty的钩子

  17. linux_cpuinfo - 打印有关每个活动处理器的信息

  18. linux_dentry_cache - dentry缓存收集文件

  19. linux_dmesg - 收集dmesg buffer

  20. linux_dump_map - 将选定的内存映射写入到磁盘

  21. linux_dynamic_env - 恢复进程的动态环境变量

  22. linux_elfs - 在进程映射中找ELF二进制文件

  23. linux_enumerate_files - 列出文件系统缓存引用的文件

  24. linux_find_file - 列出并从内存中恢复文件

  25. linux_getcwd - 列出每个进程的当前工作目录

  26. linux_hidden_modules - Carves内存寻找隐藏的内核模块

  27. linux_ifconfig - 收集活动接口

  28. linux_info_regs - GDB中的“info寄存器”。它打印出所有的输出

  29. linux_iomem - 提供与/proc/iomem相似的输出

  30. linux_kernel_opened_files - 列出从内核中打开的文件

  31. linux_keyboard_notifiers - 解析键盘通知调用链

  32. linux_ldrmodules - proc映射的输出与libdl中的库列表进行比较

  33. linux_library_list - 将库加载到一个进程中

  34. linux_librarydump - 将进程内存中的共享库转储到磁盘

  35. linux_list_raw - 列出应用程序与混杂的套接字

  36. linux_lsmod - 收集加载内核模块

  37. linux_lsof - 列出文件描述符及其路径

  38. linux_malfind - 查找可疑的过程映射

  39. linux_memmap - 转储用于linux任务的内存映射

  40. linux_moddump - 提取加载内核模块

  41. linux_mount - 收集挂载的fs/devices

  42. linux_mount_cache - 收集从kmem_cache安装的fs/设备。

  43. linux_netfilter - 列出Netfilter钩子

  44. linux_netscan - 刻画网络连接结构

  45. linux_netstat - 列表打开的套接字

  46. linux_pidhashtable - 通过PID哈希表枚举进程

  47. linux_pkt_queues - 将每个进程的数据包队列写入磁盘

  48. linux_plthook - 扫描ELF二进制文件' PLT hooks

  49. linux_proc_maps - 收集进程内存映射

  50. linux_proc_maps_rb - 通过映射红黑树收集linux的进程映射

  51. linux_procdump - 将进程的可执行映像转储到磁盘

  52. linux_process_hollow - 检查是否有进程被挖空的迹象

  53. linux_psaux - 收集进程和完整的命令行和开始时间

  54. linux_psenv - 收集进程及其静态环境变量

  55. linux_pslist - 收集活动任务通过task_struct->task list

  56. linux_pslist_cache - 从kmem_cache中收集计划任务

  57. linux_psscan - 扫描进程的物理内存

  58. linux_pstree - 显示进程之间的父/子关系

  59. linux_psxview - 查找隐藏进程与各种各样的进程列表

  60. linux_recover_filesystem - 从内存中恢复整个缓存的文件系统

  61. linux_route_cache - 从内存中恢复路由缓存

  62. linux_sk_buff_cache - 从sk_buff kmem_cache中恢复数据包

  63. linux_slabinfo - 在一台正在运行的机器上模拟/proc/slabinfo。

  64. linux_strings - 将物理偏移量匹配到虚拟地址(可能需要一段时间,非常详细)

  65. linux_threads - 打印进程的线程

  66. linux_tmpfs - 从内存中恢复tmpfs文件系统。

  67. linux_truecrypt_passphrase - 恢复缓存Truecrypt口令

  68. linux_vma_cache - 从vm_area_struct 缓存中收集VMAs

  69. linux_volshell - 内存映像中的shell

  70. linux_yarascan - Linux内存映像中的一个shell

列出文件

一般结合grep条件使用

  1. vol -f 1.mem --profile=LinuxUbuntu1804-5_4_0-84x64 linux_enumerate_files

导出文件

-i 选项的参数是linuxenumeratefiles得到的偏移量

  1. vol -f 1.mem --profile=LinuxUbuntu1804-5_4_0-84x64 linux_find_file -i 0xf5a4e568 -O file.txt

bash历史命令记录

  1. vol -f 1.mem --profile=LinuxUbuntu1804-5_4_0-84x64 linux_bash

总结

使用vol2的原因还是对vol3不太熟练,比赛时间也挺紧张,对vol3的中的一些新概念也还没做准备。取证方向的话,未来还是要接触到vol3的一些内容,毕竟vol3做出的改动也不只是python2/3之间的差别

参考文章

https://heisenberk.github.io/Profile-Memory-Dump/ https://github.com/volatilityfoundation/volatility/wiki/Linux-Command-Reference https://github.com/volatilityfoundation/volatility/wiki https://volatility3.readthedocs.io/en/latest/symbol-tables.html


推荐阅读:
2022蓝帽杯遇见的 SUID 提权 总结篇
CobaltStrike beacon二开指南
Edge浏览器-通过XSS获取高权限从而RCE
The End of AFR?
java免杀合集

跳跳糖是一个安全社区,旨在为安全人员提供一个能让思维跳跃起来的交流平台。

跳跳糖持续向广大安全从业者征集高质量技术文章,可以是漏洞分析,事件分析,渗透技巧,安全工具等等。
通过审核且发布将予以500RMB-1000RMB不等的奖励,具体文章要求可以查看“投稿须知”。
阅读更多原创技术文章,戳“阅读全文

原文始发于微信公众号(跳跳糖社区):如何基于volatility2构建“新”版本内核的profile

版权声明:admin 发表于 2022年11月4日 下午12:07。
转载请注明:如何基于volatility2构建“新”版本内核的profile | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...