리눅스는 RWX 이외에도 특정 디렉토리나 파일에 대한 특수 권한을 사용하는데 다음과 같다.
- SetUID, SetGUI
해당 권한은 애플리션이 실행될 때 애플리케이션이 실제 수행하는 권한을 일시적으로 소유자 혹은 소유
그룹으로 바꾸는 권한이다.
- Sticky Bit
해당 권한은 일반적으로 디렉토리에 부여되며, 해당 권한이 부여된 디렉토리는 누구나 Full 권한을 가진다.
즉 해당 디렉토리에서는 누구나 읽고, 쓰고, 삭제하는 행위를 할 수 있다.
대표적인 예가 /tmp
$ ls -ld /tmp
SetUID/SetGUI 권한이 왜 필요 한가?
취약한 애플리케이션이 SetUID 권한을 가질 경우 발생하는 일
$ sudo su -
# chown root:root bof1 // bof1 애플리케이션의 소유자, 소유그룹 바꾸기
# chmod 4755 bof1 // bof1 애플리케이션에 SetUID 권한 설정하기
이제 bof1 애플리케이션은 실행이 될 때의 소유자는(EUID) root 가 된다.
다시 coresec 계정을 이용하여 해당 프로그램을 공격해 보겠다.
$ ./bof1 $(python ./exp_bof1.py)
...
# <-- euid가 root로 변경
결론 : 리눅스상에서 애플리케이션에 SetUID를 함부로 부여하면 안된다.
Bind Shell 쉘코드와 Reverse Shell 쉘코드의 기본 개념
"원격쉘(Remote Shell)" 네트워크상에 있는 원격 시스템의 제어를 할 수 있는 쉘 프로그램을 말한다.
대표적인 예는 텔넷, SSH 프로그램이 있다.
원격쉘은 크게 다음 두 가지로 나누어진다.
Bind Remote Shell
Reverse Remote Shell
두 쉘의 공통점은 원격에 있는 클라이언트가 서버를 제어할 수 있는 쉘 프롬프트를 사용한다는 것이며,
차이점은 쉘 프롬프트를 사용하기 위한 TCP 핸드쉐이킹의 최초 연결 주체이다. 즉,
클라이언트가 먼저 SYN 패킷을 송신하느냐, 서버가 먼저 SYN 패킷을 송신하느냐에서 차이를 보인다.