Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

trash houz

task_struct 에서 권한상승 본문

Linux

task_struct 에서 권한상승

applemasterz17 2019. 8. 5. 18:05

리눅스 커널 소스에는 이런 것이 있다.

include/linux/sched.h 를 연 뒤에 task_struct 구조체를 찾아보자.

쭈욱 내리다보면 process credentials 주석 처리된 부분이 보인다. 

 

include/linux/sched.h -> struct task_struct 구조체중 일부

cred 구조체를 가르키는 포인터인 *real_cred와 *cred는 보통은 같은 구조체를 가리키고 있다고 한다. 

*real_cred는 다른 프로세스가 현재 프로세스에 접근하려고 하면 가져야 하는 권한을 나타내고 있다. 

*cred 는 현재 프로세스가 다른 task에 접근하는 등 어떠한 동작을 할 때 가지는 권한을 나타낸다. 

 

*cred 구조체를 수정하면 현재 프로세스가 행사하는 권한을 root 권한으로 변경할 수 있을 테고,

원하는 동작을 할 수 있게 된다.(쉘 실행 등)

 

원하는 곳에 쓸 수 있는 취약점은 있다 치고, 저 구조체를 어디서 찾아야 하는가? 

답은 바로 밑에 있는 comm 배열에 있다. 

comm 은 경로를 제외한 프로세스의 이름을 담고 있다. 

그렇다면 comm을 찾은 뒤에 - 8  하면 *cred에 접근할 수 있을 것이다. 

 

prctl(PR_SET_NAME, "원하는 이름"); 을 이용해 원하는 이름으로 바꾼 뒤에 메모리에서 변경한 이름으로 찾으면 된다. 

그 뒤엔 *cred 구조체 내용을 root 권한에 맞춰 변경하면 된다. 

 

prctl()에 첫 번째 인자로 PR_SET_NAME을 준 뒤 사용할 경우

만약 프로세스 상에서 호출했다면 프로세스의 이름을 바꿔준다(소속된 스레드까지 전부다 영향을 받음)

단, 특정 스레드 내부에서 호출할 경우 그 스레드의 이름만 바뀐다. 

'Linux' 카테고리의 다른 글

Linux Kernel Debugging with QEMU  (0) 2019.10.21