KeePass CVE-2023-32784:进程内存转储检测
KeePass 是一种流行的开源密码管理器,可以在 Windows、Mac 或 Linux 上运行。该漏洞允许从正在运行的进程的内存中以明文形式提取主密钥。主密钥将允许攻击者访问所有存储的凭据
强烈建议更新到KeePass 2.54以修复该漏洞
在本文将解释新漏洞 CVE-2023-32784,其工作原理以及当攻击者获得对系统的完全访问权限并执行其他技术来窃取凭据时如何检测此类攻击
Linux 内存中的凭证
在谈论Linux的凭证时,我们通常会想到/etc/shadow
文件,但那并不是密码可能存储的唯一位置。许多进程也会将凭证存储在内存中,恶意工具会尝试提取这些凭证。例如,在下面描述的proc目录就是这种攻击类型的一个常见向量
来自Linux内核文档:
“/proc
目录包含(除其他内容外)系统上运行的每个进程都有一个子目录,以该进程ID(PID)命名。”
MITRE定义了对proc文件系统进行凭证获取的敌对行为称为操作系统凭证转储:Proc文件系统T1003.007
什么是 KeePass CVE-2023-32784?
CVE-2023-32784允许从内存转储中恢复明文主密码。内存转储可以是KeePass进程转储、交换文件(pagefile.sys)、休眠文件(hiberfil.sys)或整个系统的RAM转储
KeePass 2.X使用自定义开发的密码输入文本框SecureTextBoxEx。在这个CVE中被利用的漏洞是,每输入一个字符,就会在内存中创建一个剩余字符串。由于.NET的工作原理,一旦它被创建出来几乎不可能摆脱它。例如,当键入“Password”时,将产生以下剩余字符串: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d.第一个字符无法恢复
为了重现该场景,我们使用了18.04.1-Ubuntu和Linux上的KeePass 2.38版本。概念验证(PoC)基于此Github仓库,并且也是原始PoC的一部分
我们使用的 PoC 按照以下步骤提取 KeePass 密钥:
- 首先,扫描所有
/proc/<pid>/cmdline
文件并存储带有关键字 KeePass 的文件的 pid /proc/<pid>/maps
然后,获取不与库直接关联的内存映射的地址- 最后,利用 . 将所有这些映射的内存存储到缓冲区中
/proc/<pid>/mem
。解析内存以尝试查找用户输入主密码时剩余的字符串,这些字符串依次为 •a、••s、•••s
正如我们在上图中看到的,主密钥在没有第一个字符的情况下被暴露
如何检测 KeePass CVE-2023-32784
为了检测这种类型的攻击,我们应该能够监控/proc
未知进程对文件夹的访问。这将触发警报,我们可以进一步调查。
在这种情况下,我们需要调整策略 从/proc文件中读取环境变量或创建一个新的**
为了正确触发此规则,我们应该修改条件以捕获PoC 中用于获取 KeePass 主密码的/proc/<pid>/cmdline
、/proc/<pid>/maps
或 的读取。/proc/<pid>/mem
- rule: Dump memory detection
desc: An attempt to read process environment variables from /proc files
condition: >
open_read and container and (fd.name glob "/proc/*/mem" or fd.name glob "/proc/*/maps")
output: >
Detected process memory dump to search for credentials (proc.name=%proc.name
proc.pname=%proc.pname fd.name=%fd.name container=%container.info evt.type=%evt.type
evt.arg.request=%evt.arg.request proc.pid=%proc.pid proc.cwd=%proc.cwd proc.ppid=%proc.ppid
proc.cmdline=%proc.cmdline proc.pcmdline=%proc.pcmdline)<small>
<span class="shcb-language__paren"></span></small>
通过这条新策略,我们能够检测到 CVE-2023-32784 的利用
该告警包含我们继续调查威胁所需的所有信息
10:47:47.232147057: Warning Detected process memory dump to search for credentials
(proc.name=dump proc.pname=sudo fd.name=/proc/2859/mem container=host (id=host)
evt.type=openat evt.arg.request=<NA> proc.pid=2916
proc.cwd=/home/kpdemo/CVE-2023-32784-keepass-linux/ proc.ppid=2915
proc.cmdline=dump proc.pcmdline=sudo ./dump gparent=bash ggparent=gnome-terminal-
gggparent=systemd proc.sid=2802
proc.exepath=/home/kpdemo/CVE-2023-32784-keepass-linux/dump user.uid=0
user.loginuid=1000 user.loginname=kpdemo user.name=root group.gid=0 group.name=root
container.id=host container.name=host image=<NA>)<small>
<span class="shcb-language__paren"></span></small>
正如漏洞利用中所述,如果攻击者在您的计算机中拥有足够的权限和能力,则攻击者可能能够执行任何恶意操作。然而,这条策略可以让我们知道我们的凭据是否被破坏并采取相应的行动
更多转储进程内存的工具
如果我们对此类技术进行更多研究,我们会发现还有其他工具可以执行类似的操作。让我们看看几个以及如何以相同的方式检测它们
Mimipenguin
Mimipenguin 2.0是一个转储当前 Linux 桌面用户登录密码的工具。它改编自流行的 Windows 凭据窃取工具 mimikatz 背后的想法
该工具尝试执行类似于 KeePass PoC 的操作,但在这种情况下,它找不到密钥(因为未实现 CVE)。但是,它能够获取系统凭据。在上图中,我们可以看到两个警报;第一个是检测对/proc/<pid>/mem
10:56:59.508184318: Warning Detected process memory dump to search for credentials
(proc.name=python proc.pname=sudo fd.name=/proc/1114/mem container=host (id=host)
evt.type=openat evt.arg.request=<NA> proc.pid=7194 proc.cwd=/home/kpdemo/mimipenguin/
proc.ppid=7193 proc.cmdline=python mimipenguin.py proc.pcmdline=sudo python
mimipenguin.py gparent=bash ggparent=gnome-terminal- gggparent=systemd
proc.sid=2802 proc.exepath=/usr/bin/python user.uid=0 user.loginuid=1000
user.loginname=kpdemo user.name=root group.gid=0 group.name=root container.id=host
container.name=host image=<NA>)<small><span class="shcb-language__paren"></span></small>
第二个是它/etc/shadow
从提取用户密码的地方获取访问权限
10:57:52.447428441: Warning Sensitive file opened for reading by non-trusted program
(user=root user_loginuid=1000 program=python command=python mimipenguin.py pid=7194
file=/etc/shadow parent=sudo gparent=bash ggparent=gnome-terminal- gggparent=systemd
container_id=host image=<NA>)<small><span class="shcb-language__paren"></span></small>
LaZagne
LaZagne是一个开源应用程序,用于检索本地计算机上存储的大量密码。在这种情况下,它不仅关注内存,还使用不同的技术(纯文本、API、自定义算法、数据库等)搜索凭证
在此示例中,我们再次收到检测到访问的警报,并且该工具向我们显示它已找到用户的密码和我们保存的 KeePass 数据库
11:14:02.074516511: Warning Detected process memory dump to search for credentials
(proc.name=python proc.pname=sudo fd.name=/proc/1114/maps container=host (id=host)
evt.type=openat evt.arg.request=<NA> proc.pid=7253
proc.cwd=/home/kpdemo/LaZagne/Linux/ proc.ppid=7252 proc.cmdline=python laZagne.py
all proc.pcmdline=sudo python laZagne.py all gparent=bash ggparent=gnome-terminal-
gggparent=systemd proc.sid=2802 proc.exepath=/usr/bin/python user.uid=0
user.loginuid=1000 user.loginname=kpdemo user.name=root group.gid=0 group.name=root
container.id=host container.name=host image=<NA>)<small>
<span class="shcb-language__paren"></span></small>
最后
收集凭据是攻击者非常常用的技术。需要拥有所有必要的工具来检测这些类型的操作,以防止它们横向移动或影响其他服务
mall>
## 最后
收集凭据是攻击者非常常用的技术。需要拥有所有必要的工具来检测这些类型的操作,以防止它们横向移动或影响其他服务
最后,我们强烈建议升级到新版本KeePass 2.54