trash houz
task_struct 에서 권한상승 본문
리눅스 커널 소스에는 이런 것이 있다.
include/linux/sched.h 를 연 뒤에 task_struct 구조체를 찾아보자.
쭈욱 내리다보면 process credentials 주석 처리된 부분이 보인다.
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 |
---|