뉴비에욤

0xB Python Tutorials - Pseudo Terminal 본문

primalsecurity.net/Python Tutorials

0xB Python Tutorials - Pseudo Terminal

초보에욤 2015. 11. 6. 02:32

이번 레벨에서는 파이썬을 이용하여 간단하게 raw shell을 생성하는 법을 보여줄 것이다. 이런 방법을  완벽 하게 이해하기 위해서는 raw shell과 관련하여 몇 가지를 우선적으로 알아야 한다.

 

raw shell을 일반적인 명령어 shell (cmd.exe, /bin/bash 등)이 네트워크 소켓에 바인딩 된 것으로 대부분 공격자에게 연결(reverse shell)되거나 리스닝 포트에 바인딩 된다. raw shell은 터미널 액세스(SSH 액세스,  키보드 입력 등)와 달리 "STDIN/STDOUT/STDERR"을 처리하지 않는다.

 

쉽게 말하면 raw shell에 특정 명령어를 입력하는 것은 shell 자체를 중지시킬수 있다는 것이다. 이를 경험하기 위한 가장 쉬운 방법은 직접 로컬환경에서 netcat을 이용하는 것이다.

 

 

 

위와 같이 2개의 다른 터미널에서 로컬 환경에 리스닝 포트를 바인딩 하고 해당 포트에 "/bin/sh"을 실행시키도록 한 뒤 연결한다.

 

 

연결되면 리스닝 포트를 바인딩 했던 터미널에 클라이언트에 연결되었다는 메시지가 나타난다. 그런데 일반적인 shell과 달리 프롬프트가 보이지 않지만 몇몇의 명령어를 raw shell에 입력하면 정상적으로 실행된다.

 

 

이렇게 출력을 하는 형태의 명령어들은 대부분 정상적으로 실행되지만 사용자로부터 입력을 받아야 하는 명령어를 입력하면 raw shell이 중단될 것이다. "FTP,SSH,VI" 등의 명령어가 이런 형태(사용자 입력  필요) 이기 때문에 제대로 동작하지 않는다. raw shell의 이런 제약을 우회하기 위해 VI 대신에 라인 바이 라인(line by line)으로 파일을 만드는 방법 등이 존재한다.

 

 

이전에 본 것처럼 일반적인 터미널과 달리 프롬프트가 보이지 않는 이유는, 사실 프롬프트는 "STDERR"를 통해 전송되는 것이고 초반에 말했듯이 raw shell은 이를 처리하지 않는다. 따라서 추가적인 파일을 실행(미터프리터 바이너리) 실행하려고 하는 순간 발생되는 오류 메시지를 보지 못할 수 있다.

 

 

파이썬이 설치 된 raw shell 환경에서 본인이 항상 처음 하는 작업은 파이썬의 "pty" 모듈을 통해 가짜(Pseudo) 터미널을 생성하는 것이다. 이렇게 생성 된 터미널은 프롬프트를 제공하고 시스템과 좀 더 수월한 상호 작용을 할 수 있게 된다. 그러나 말 그대로 가짜 터미널이기 때문에 따지고 보면 실제 터미널 액세스 권한은 생기지 않는 것이다. 아래의 사진은 이전에 생성된 raw shell 환경에서 가짜 터미널을 생성하는 한 줄의 파이썬 코드이다.

 

가짜 터미널을 생성한 명령어의 "-c" 인자는 입력 한 코드가 CLI에서 직접 실행될 수 있도록 해준다. 또한 세미콜론(';')을 이용하여 같은 라인에 2개의 명령어를 연결시키고 "pty.spawn('/bin/bash')"를 이용하여 가짜 터미널을 생성하였다.

 

 

실제 터미널과 약간의 차이점은 있지만 이전의 raw shell과 비교해보면 엄청난 차이를 느낄 수 있다.

 

Comments