쉘 스크립트 개요 - 쉘, 스크립트, 그리고 쉘 스크립트란?
System/Shell Script

쉘 스크립트 개요 - 쉘, 스크립트, 그리고 쉘 스크립트란?





  침투 테스트에서 사용하기를 원하는 다른 프로그래밍 언어나 개발 툴과는 다르게, 거의 모든 시스템에는 쉘이 설치되어 있다. 물론 원하는 쉘을 항상 사용할 수는 없어도, 보통 작업을 진행할 수 있는 쉘이 있기 마련이다.


쉘이란



  쉘은 사용자와 운영체제 사이에 있는 인터페이스로, 프로그램을 실행하고, 파일 처리 및 기타 여러 작업들을 할 수 있게 해 준다. 모든 운영체제에서는 쉘을 사용하고 있는데, 크게 텍스트 기반과 그래픽 기반으로 나눌 수 있다. 많은 운영체제가 두 가지 기반의 쉘 모두를 제공하며, 각각 다른 장점이 있다.


  Microsoft Window 데스크톱 인터페이스, 리눅스의 GNOME와 KDE와 같은 GUI 환경의 쉘은 화려한 그래픽 기반의 메뉴를 사용할 수 있다. 파일 또한 그래픽 아이콘으로 표시되며 마우스로 아이템을 클릭하거나 시스템을 작동하는 등 편리하게 사용할 수 있다.


  bash 같은 CUI 쉘은 쉘 안에 기본적으로 탑재된 다양한 명령어와 기능으로 운영체제와 통신할 수 있고, 다른 프로그램이나 유틸리티를 실행할 수도 있다. 텍스트 기반 쉘은 많은 운영체제의 사용자 인터페이스의 시초로, 오늘날에도 활발하게 사용되고 있다.


  Windows와 같은 일부 운영체제에서는 설치할 때 기본적으로 설치되는 쉘만 있을 가능성이 높지만, 사용자에 따라 기타 다른 쉘들이 설치되어 있을 수도 있다. UNIX, Linux, OS X 등 유닉스 계열의 운영체제에서는 여러 GUI·CUI 기반 쉘을 찾을 수 있다. 다양한 인터페이스를 선택할 수 있으며, 각 사용자나 시스템 관리자 등 계정에 따라 설정을 바꾸어 각각 다른 쉘을 사용하게 할 수도 있다. 일반적으로 GNOME나 KDE를 그래픽 쉘로, bash를 텍스트 기반 쉘로 사용한다. 덧붙여 말하자면 침투 테스트에는 텍스트 기반 쉘이 더욱 접근성이 좋다.


스크립트


  스크립트 또는 스크립트 언어는 C++, Java 등 우리가 흔히 아는 프로그래밍 언어와 비슷하다. 스크립트 언어와 다른 프로그래밍 언어들의 가장 큰 차이점은 스크립트로 작성된 프로그램은 컴파일(compile)되지 않고 인터프리트(interpret)된다는 점이다.




  기존 프로그래밍 언어는 싶은 명령어를 작성하면 컴파일러를 통해 커널이나 CPU가 실행시킬 수 있는 기계어로 변환된다. 물론 이 과정을 거치면 사람은 파일을 읽을 수 없다. 명령어를 수정하면 이 과정을 다시 반복하고, 다시 실행 가능한 파일을 생성해야 한다. 반면 인터프리터 언어는 인터프리터가 직접 명령어가 담긴 스크립트를 실행하면서 기계어 변환까지 같이 한다. 컴파일 언어와는 다르게 텍스트를 사람이 읽고 이해할 수 있으며, 스크립트를 변경해도 다시 앞의 과정을 반복할 필요가 없다.


  일반적으로 Python, Perl, Ruby 등 스크립트 언어는 각각의 고유한 인터프리터가 있다. 따라서 각 언어용 인터프리터를 따로 설치해야 한다. 쉘 스크립트는 특별한 경우인데, 인터프리터가 쉘 자체에 이미 포함되어 있어서 쉘에서 인터프리트 과정을 진행한다.


쉘 + 스크립트 = 쉘 스크립트

  침투 테스트 툴 개발에 사용할 수 있는 가장 기본적이고 많이 사용하는 툴은 쉘 스크립트(Shell Script)라고 할 수 있다. 쉘 스크립트는 스크립트 언어로 만든 프로그램으로, 우리가 사용하는 운영체제의 쉘과 연동시키는 데에 사용된다. 그래픽 기반으로 제작된 프로그램과 유틸리티가 여럿 있지만 쉘 스크립트는 일반적으로 텍스트 기반의 쉘을 사용하는 프로그램을 의미한다.


  스크립트는 인터프리터가 처리하고 실행하는데, 쉘 스크립트의 경우는 쉘이 직접 스크립트를 인터프리트한다. 사실 특정한 명령어를 처리하는 데 사용되는 툴과 쉘 스크립트 처리 툴에는 차이가 없다. 예를 들어 유닉스 계열 운영체제에서 쓰이는 bash쉘에서는 ls와 같이 명령어 하나도 처리하고, 더 복잡한 스크립트도 처리하게 할 수 있다.


  쉘 스크립트는 대부분 프로그래밍 언어로 분류되지는 않지만, 다른 언어와 기능이 매우 비슷하다. 일반적으로 쉘 스크립트는 변수나 다른 자료구조, 서브루틴, 프로그램 흐름 통제, 주석 처리 등 다른 프로그래밍 언어와 비슷한 기능들을 제공한다. 쉘 스크립트로 큰 규모의 복잡한 프로그램을 개발할 수도 있지만, 이 경우 개발에 있어서 효율성에서 유지 측면에서 어려울 수도 있다. Ruby, Perl과 같은 기능이 많은 스크립트 언어를 사용하거나 C++과 같이 컴파일되는 프로그래밍 언어를 사용하는 편을 추천한다.


쉘 스크립트의 용도

  프로그램이나 유틸리티를 만들 때 다른 스크립트 언어나 컴파일되는 언어를 사용하기보다는 쉘 스크립트를 사용하는 것이 좋다. 다양한 이유가 있겠지만, 가장 큰 이유는 완전한 응용프로그램을 개발하는 것보다 간단한 프로그램을 빠른 시간 안에 개발해야 할 때 편리하기 때문이라고 할 수 있다. 또한 특정 작업을 완료하기 위해 툴을 여러 개 사용할 수도 있다. 요점만 말하자면, 최선의 방법도 아니고 가장 효율적이라는 보장도 없지만 급한 작업 진행에는 안성맞춤이라는 말이다.


 침투 테스트를 할 때에는 침투 대상 시스템에서 사용할 수 있는 개발 자원이 생각보다 제한적일 수도 있다. 가장 일반적인 서버의 보안을 강화하는 과정은 서버 기능에 필요한 모든 툴을 제거하는 것이다. (!) 따라서 보안상의 기본 정책을 지킨다면, Perl, Python 등 우리가 원하는 스크립트 언어가 설치되어 있지 않아서 난감해지는 경우도 있을 수 있다. 하지만 보통 텍스트 기반 쉘은 시스템에 설치되어 있는 경우가 많기 때문에, 이 쉘을 이용하여 쉘 스크립트를 작성하여 사용할 수 있다. 스크립트 언어는 소스코드가 평문이고, 앞서 말했지만 실행하기 전에 컴파일할 필요가 없기 때문에 대상 시스템에 터미널로 접속했다면 새로운 파일을 생성하여 스크립트를 작성하고, 바로 실행할 수 있다는 것이다.