보안 분야에 있다 보면 이런 말을 많이 들어봤을 것이다. “쉘 땄음”, “계산기 띄웠음” 해킹을 잘 알지 못하는 사람이라면, 이게 무슨 말인가 싶다. 쉘을 따서 어떻게 하라고, 계산기를 띄웠는데 그게 뭐, 마치 그들만의 은어 같지만, 여기에는 이유가 있다. 해커가 쉘을 따면 무슨 일이 생길까, 해커가 계산기를 띄우면 무슨 일이 생길까. 오늘은 왜 이런 말이 쓰이고, 어떻게 쓰이는지 한 번 알아볼까 한다.
먼저, 컴퓨터의 구조를 한 번 알아보도록 하자. 컴퓨터를 종료하기 위해서 컴퓨터에 ‘종료되어 줄래’라고 입력하면 컴퓨터는 못 알아듣는다. 우리가 컴퓨터를 종료하기 위해서는 ‘컴퓨터 종료’ 버튼을 누르거나 ‘shutdown’ 명령어를 입력하는 것처럼, 사전에 정해진 명령어를 보내어 컴퓨터를 종료시킨다. 그렇다면 컴퓨터는 우리가 영어로 입력하지 않아서 우리의 말을 못 알아들은 것일까. 그건 아니다. 컴퓨터는 한글로 입력해서 못 알아듣는 것도 아니고, 영어로만 알아듣는 것도 아니다. 걔들은 ‘shutdown’이라는 명령어를 컴퓨터가 알아들을 수 있는 이진수로 변환한 후 컴퓨터에 명령을 내린 것이다. 즉, 컴퓨터가 알아들을 수 있는 언어인 0과 1을 통해 컴퓨터에 데이터를 입력하고, 컴퓨터를 제어한다. 정확히 말하면 내가 내리는 명령어를 통해 커다란 하드웨어를 조작하는 것이다.
사용자가 입력한 명령어는 일련의 과정을 거쳐 하드웨어를 제어하게 된다. 사용자가 명령어를 내리고 하드웨어를 조작하기까지 이 사이에는 몇 개의 과정을 거쳐서 수행된다. 우리가 명령어를 컴퓨터에 입력하면, 컴퓨터 내부에 있는 쉘(shell)이 이를 받아들이고, 명령어를 해석하여 커널을 통해 하드웨어를 조작한다. 즉, 제일 하단에는 하드웨어가 있고 그 위에는 커널(Kernel), 커널 위에는 쉘 그리고 쉘 위에는 사용자가 존재하여 우리의 입력을 받는 것이다.
하, 그럼 커널은 대체 뭐야. 커널이란 하드 디스크나 메모리 등 하드웨어 자원을 효율적으로 관리하기 위한 것으로 쉽게 말해 하드웨어를 제어한다고 보면 된다. 어떤 명령이나 프로그램이 실행되는 동안 사용되는 자원은 커널이 관리해준다. 그리고 사용자의 입력을 받아 어떻게 처리할 것인지를 결정하고 도와주는 것이 쉘이다. 아무튼, 커널은 컴퓨터 운영체제의 가장 중요한 핵심으로, 여러 가지 운영체제의 기본적인 서비스를 제공한다. 하지만 커널이 운영체제인 것은 아니고 커널은 운영체제의 일부로 메모리에 항상 떠 있는 하나의 프로그램이다. 커널은 리눅스가 부팅될 때 메모리에 로딩되는데 쉽게 생각하면, 컴퓨터 전원을 딱 넣었을 때 나오는 화면이 커널을 로딩하는 화면이라고 생각하면 된다. 커널은 앞서 얘기한 것처럼 시스템 자원을 관리하기 때문에 일반 사용자 권한이 아니라 관리자 권한으로 제어된다. 따라서, 해커가 관리자 권한을 갖는다면 시스템 자원 관리를 마음대로 조작할 수 있기 때문에 커널 레벨의 취약점이 위험하다는 것이다.
그렇다면 쉘은 무엇일까. 앞서 얘기한 것처럼 쉘은 사용자의 명령어 처리에 도움을 주는 것으로, 커널과 사용자 사이를 이어주는 역할을 한다. 따라서 쉘은 사용자의 명령어를 해석하고, 커널에 명령어를 전달하며 컴퓨터를 제어하는 일종의 번역기인 셈이다. 쉘은 사용자의 명령을 해석하여 운영체제가 알아들을 수 있게 변경하고, 운영체제는 쉘에서 받은 명령을 다시 하드웨어를 위한 언어로 바꾸어준다. 쉘은 운영체제 상에서 사용자가 다양한 기능과 서비스를 이용 할 수 있는 환경을 제공하는 인터페이스 프로그램이다. 따라서, 사용자가 키보드와 같은단말 장치를 이용하여 사용자의 입력을 받으면 여러 프로그램이나 명령을 실행할 수 있다. 보통은 리눅스 쉘이많이 언급되지만 윈도우에서도 쉘을 지원한다. 윈도우의 CMD 창도 일종의 쉘(CLI)이라고 보면 된다.
정리해서 커널과 쉘을 연결하여 설명하면, 사용자는 쉘과 대화를 나누고 다시 쉘은 커널과 대화를 나누는 식으로 컴퓨터를 제어한다. 따라서, 사용자와 커널 사이에 쉘이라는 인터페이스가 존재하는 것이다. 쉘을 사용하면 사용자는 복잡한 커널 단위의 연산들을 알 필요 없이 쉘 상의 인터페이스로 시스템 자원들을 쉽게 관리할 수 있다. 이것이 바로 쉘이 생겨난 이유이다. 앞서 얘기한 것처럼 윈도우는 그래픽 쉘로 GUI(그래픽 사용자 인터페이스)를 제공한다. 이 때문에 윈도우 사용자들이 ‘ls’ 명령어를 모르고도 단지 마우스 클릭만으로 컴퓨터 안을 활보할 수 있다.
자, 그럼 “쉘을 땄다”라는 것은 무슨 말일까. 해커의 “쉘을 땄다”라는 말은 사용자의 명령어를 받아 처리하는 쉘의 권한을 탈취한 것으로, 공격자가 사용자 컴퓨터에 명령어 입력을 할 수 있다는 것이다. 이는 해커가 사용자의 시스템에 접속하여 시스템 정보를 수집하거나 약간의 조작을 하는데 상당히 도움이 되므로 보통 해커는 먼저 쉘부터 딴다. 이렇게 원격에서 쉘을 따는 것을 리모트 어택이라고 한다.
시스템 해킹을 5단계로 설명하면, 정보를 수집하는 것이 1단계, 대상 시스템에 접속하기 위하여 원격에서 공격을 하는 리모트 어택 2단계, 리모트로 얻은 쉘의 권한이 낮을 경우 3단계로 권한 상승을 위해 사용자의 시스템을 추가적으로 공격하는 로컬 어택이 있다. 그리고 자신이 침입한 흔적을 지우는 4단계 흔적 삭제와 마지막으로 상황에 따라 옵션으로 할 수 있는 백도어 생성 및 유지, 이렇게 5단계로 볼 수 있다.
마지막으로 해커들은 왜 “계산기 띄웠어요” 하면 모두가 “오~~” 하는 걸까. 이는 해커가 의도한 임의의 코드가 실행되었다는 것이다. 해커가 ‘계산기를 띄워’라는 명령어를 컴퓨터에 입력하였고, 컴퓨터는 이를 그대로 실행한 것이다. 그리고 여기에서 언급한 계산기는 공격자가 실행시키는 프로그램으로, 계산기가 아니라 다른 프로그램을 실행시킬 수도 있다. 따라서, 만약 해커들이 “저 계산기 띄웠어요”하는 것은 그 시스템을 제어하고 장악하여 어느 프로그램이든 실행시킬 수 있다는 것을 의미한다.
어떻게, 쉘과 커널 그리고 해커들의 언어가 이해가 되는가.