exploit 이후 최초로 얻은 쉘은 매우 깨지기 쉽다.
습관적으로 Ctrl+C 를 누르면 reverse shell 연결이 바로 끊어져서 다시 exploit을 진행하는 경우가 많았다.
그리고 명령어를 수정하려고 좌우 방향키를 누르거나 이전 명령어를 불러오기 위해 위 방향키를 누르거나 자동완성 기능을 위해 Tab을 누르면 이상한 문자가 출력된다.
오늘은 왜 이런 현상이 나타나는지, 어떻게 해결할 수 있는지 적어보려고 한다.
리버스 쉘이나 바인드 쉘을 통해 대상 서버에 접속을 하여 쉘을 얻을 텐데 이 때 서버는 쉘을 직접 터미널에 할당하지 않고 네트워크 소켓을 통해 연결만 제공한다.
다시 말해 최초로 얻은 쉘은 터미널(TTY)가 할당되지 않는다.
아래는 초기에 획득한 쉘이 TTY가 할당되었는지 확인하는 두 가지 방법이다.
간단히 tty 명령어를 실행하면 확인이 가능하다.

ps -p $$ 명령어로 현재 쉘의 프로세스를 확인하여 TTY가 할당되어 있는지 알 수 있다.
TTY가 할당된 경우 : 출력된 TTY 열에 /dev/pts/0, /dev/tty1 등의 값이 있으면 TTY가 할당된 것이다.

TTY가 할당되지 않은 경우 : '?' 또는 'none'으로 표시된다.

TTY를 할당하는 방법은 여러가지 언어로 구현이 가능한데 여기서는 python을 통해 TTY를 할당하는 방법을 적어보려고 한다. 명령어는 다음과 같다.
python -c 'import pty;pty.spawn("/bin/bash")'
명령어를 실행한 뒤 tty나 ps를 쳐보면 '/dev/pts/1' 와 같이 TTY가 할당된 것을 볼 수 있다.
하지만 TTY가 할당되었다고 해서 자동완성 기능이나 'Ctrl+C', 방향키 기능이 제대로 작동하지 않는다. 기능적으로 크게 달라지는 것은 없는 것 같다.
ls 명령어 사용 시 출력결과가 원래는 세로 한줄로 출력됐는데 TTY 할당 이후에는 여러줄로 표시되어 한눈에 보기 편했다.


또 TTY가 할당되면 대화형 쉘을 얻어서 vi 명령 등을 사용할 수 있다고 하는데 할당 전이나 이후에나 vi 명령으로 편집이 가능하긴한데 방향키, esc키 등이 먹지않아 매우 불편하다.
굳이 다른점을 찾자면 vi 편집할 때 TTY 할당 전에는 'Output/Input is not to a terminal' 라고 에러메시지가 뜨는데 TTY 할당 이후에는 그런 메시지가 뜨지 않는다.

그래서 제대로 된 기능을 가진 쉘을 얻으려면 몇가지 명령어가 더 필요하다.
TTY 할당 없이 다음 스탭 명령어인 stty raw -echo; fg 명령어를 입력하니 출력문자가 날라다닌다..
TTY가 할당되어야 안정적으로 출력이 되는 듯하다.

'Ctrl+C'나 방향키같은 기능이 제대로 동작하려면 아래와 같은 스탭을 밟아야한다.
'TERM' 환경변수는 터미널의 유형을 지정한다. 'xterm'은 대부분의 터미널에서 사용가능한 기본적인 설정이다.
현재 실행 중인 프로세스를 일시중지(suspend)하고 내가 사용중인 쉘(나의 경우는 kali환경)로 돌려보낸다. 이 명령은 프로세스를 종료시키는 것이 아니라 exploit 이후 얻을 쉘을 백그라운드로 보내는 역할을 한다.
'stty' 명령은 터미널의 다양한 속성을 설정하는 명령어이다. 터미널을 'raw'로 설정하면 터미널이 입력된 데이터를 있는 그대로 처리한다. 그래야지 'Ctrl+C'를 입력해도 연결이 끊어지지 않고 Tab을 이용한 자동완성 기능이나 방향키 등이 제대로 동작한다.
-echo 옵션은 내가 입력한 명령어를 화면에 출력하지 않도록 한다.
마지막으로 fg는 exploit하여 얻은 쉘을 다시 포그라운드(foreground)로 올린다.
이 명령어를 통해 쉘의 출력이 잘리지 않도록 터미널 크기를 적절히 설정하여 길이 제한 문제를 해결한다.
하지만 exploit 이후에 이렇게 매번 설정을 하기도 매우 번거롭다.
nc 대신 pwncat-cs을 사용하면 이 모든 것을 자동으로 설정해준다.
'딸깍'
