Skip to content

Commit f8f0ac5

Browse files
committed
finish prototyping the check method
1 parent 6854dc0 commit f8f0ac5

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Randomness itself is a give away of exploitation
2+
class MetasploitModule < Msf::Exploit::Local
3+
Rank = NormalRanking
4+
5+
include Msf::Post::Linux::System
6+
7+
# TODO get exact apport version after setting up a test environment
8+
# TODO targets in the initialize method and how they work
9+
# TODO other priv esc vectors, startup folders, periodic scripts
10+
# The vunerable version of apport may be available on other systems, distros and versions
11+
12+
def initialize(info = {})
13+
super(
14+
update_info(
15+
info,
16+
'Name' => 'Ubuntu Xenial Xerus Apport Symlink Hijacking Privilege Escalation ',
17+
'Description' => %q{
18+
On the Ubuntu Xenial Xerus 16.04.7 release the Apport 2.20 crash handler is vulnerable
19+
to symlink injection. Following a crash Apport will write reports to /var/lock/apport/lock,
20+
an attacker who can create a symlink to a privileged directory via /var/lock/apport will be
21+
able to create files with global 0777 permissions. This module exploits this weaknes by writing
22+
payloads to /etc/crontab/ as the root user.
23+
24+
},
25+
'License' => MSF_LICENSE,
26+
'Author' => [
27+
'gardnerapp' # mirageinfosec.cloud
28+
],
29+
'References' => [
30+
[
31+
'URL', 'https://nostarch.com/zero-day' # pg. 59
32+
]
33+
],
34+
'Platform' => 'linux',
35+
'Targets' => [
36+
[
37+
38+
]
39+
],
40+
'Payload' => {
41+
'BadChars' => "\x00"
42+
},
43+
'Privileged' => false,
44+
'DisclosureDate' => '',
45+
'DefaultTarget' => 0,
46+
'Notes' => {
47+
'Stability' => [CRASH_SAFE],
48+
'Reliability' => [REPEATABLE_SESSION],
49+
'SideEffects' => [ARTIFACTS_ON_DISK, IOC_IN_LOGS]
50+
},
51+
)
52+
register_options [
53+
OptString.new('Cron Name', [true, 'Name of the Crontab file', Rex::Text.rand_text_alpha(rand(8..12))])
54+
]
55+
)
56+
end
57+
58+
def check
59+
return CheckCode::Safe('Platform is not Linux') unless session.platform == 'linux'
60+
61+
return CheckCode::Safe('Target is not Ubuntu') unless kernel_version =~ /[uU]buntu/
62+
63+
# Todo check distro version here
64+
# Determine is xenail, and vxenial release version
65+
66+
sys_info = get_sysinfo
67+
puts system_info
68+
69+
distro = sysinfo[:distro]
70+
puts distro
71+
version = sysinfo[:version]
72+
puts system_info
73+
74+
# Maybe add <||= for the version, need to find out if other kernel versions are vulmerable
75+
if distro != 'Xenial Xerus' || version != '16.04.7'
76+
return CheckCode::Safe('Target is not the correct Linux distro or kernel version')
77+
end
78+
79+
# Check apport version
80+
if !command_exists?('apport-cli')
81+
return CheckCode::Safe('apport-cli does not appear to be installed or in the $PATH')
82+
end
83+
84+
apport = cmd_exec('apport-cli --version').to_s
85+
86+
return CheckCode::Detected('Unable to determine apport version') if apport.blank?
87+
88+
version = Rex::Version.new(apport.split('-').first)
89+
90+
vulnerable = Rex::Version.new '2.20'
91+
# Were there prior versions of apport which are NOT vulnerableii
92+
# if version < vulnerable return bad
93+
end
94+
95+
def exploit
96+
# Methods for
97+
# symlinking /var/lock/apport to /etc/crontab
98+
# Touching a file to this
99+
# verifying the permissions on the file (root ownership)
100+
# writing payloads
101+
# what type of payloads
102+
end
103+
104+
end

0 commit comments

Comments
 (0)