Shell Stabilization(쉘 안정화)

김기훈·2024년 8월 19일

개념정리

목록 보기
2/2

exploit 이후 최초로 얻은 쉘은 매우 깨지기 쉽다.
습관적으로 Ctrl+C 를 누르면 reverse shell 연결이 바로 끊어져서 다시 exploit을 진행하는 경우가 많았다.

그리고 명령어를 수정하려고 좌우 방향키를 누르거나 이전 명령어를 불러오기 위해 위 방향키를 누르거나 자동완성 기능을 위해 Tab을 누르면 이상한 문자가 출력된다.

오늘은 왜 이런 현상이 나타나는지, 어떻게 해결할 수 있는지 적어보려고 한다.

리버스 쉘이나 바인드 쉘을 통해 대상 서버에 접속을 하여 쉘을 얻을 텐데 이 때 서버는 쉘을 직접 터미널에 할당하지 않고 네트워크 소켓을 통해 연결만 제공한다.

다시 말해 최초로 얻은 쉘은 터미널(TTY)가 할당되지 않는다.
아래는 초기에 획득한 쉘이 TTY가 할당되었는지 확인하는 두 가지 방법이다.

1. 'tty' 명령어 사용

간단히 tty 명령어를 실행하면 확인이 가능하다.

  • TTY가 할당된 경우 : /dev/tty1, /dev/pts/0 와 같은 출력이 나타난다. 이는 현재 쉘이 특정 TTY나 PTY에 연결되어 있음을 의미한다.
  • TTY가 할당되지 않은 경우 : 'not a tty' 라는 메시지가 출력된다. 이는 현재 쉘이 TTY에 연결되어 있지 않다는 것을 의미한다.

2. 'ps' 명령어 사용

ps -p $$ 명령어로 현재 쉘의 프로세스를 확인하여 TTY가 할당되어 있는지 알 수 있다.

  • TTY가 할당된 경우 : 출력된 TTY 열에 /dev/pts/0, /dev/tty1 등의 값이 있으면 TTY가 할당된 것이다.

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

1. TTY 할당

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가 할당되어야 안정적으로 출력이 되는 듯하다.

2. 완전한 터미널로 변환

'Ctrl+C'나 방향키같은 기능이 제대로 동작하려면 아래와 같은 스탭을 밟아야한다.

1. export TERM=xterm

'TERM' 환경변수는 터미널의 유형을 지정한다. 'xterm'은 대부분의 터미널에서 사용가능한 기본적인 설정이다.

2. 쉘 일시 중지(Ctrl+Z)

현재 실행 중인 프로세스를 일시중지(suspend)하고 내가 사용중인 쉘(나의 경우는 kali환경)로 돌려보낸다. 이 명령은 프로세스를 종료시키는 것이 아니라 exploit 이후 얻을 쉘을 백그라운드로 보내는 역할을 한다.

3. stty raw -echo; fg

'stty' 명령은 터미널의 다양한 속성을 설정하는 명령어이다. 터미널을 'raw'로 설정하면 터미널이 입력된 데이터를 있는 그대로 처리한다. 그래야지 'Ctrl+C'를 입력해도 연결이 끊어지지 않고 Tab을 이용한 자동완성 기능이나 방향키 등이 제대로 동작한다.
-echo 옵션은 내가 입력한 명령어를 화면에 출력하지 않도록 한다.
마지막으로 fg는 exploit하여 얻은 쉘을 다시 포그라운드(foreground)로 올린다.

4. stty rows 38 columns 116

이 명령어를 통해 쉘의 출력이 잘리지 않도록 터미널 크기를 적절히 설정하여 길이 제한 문제를 해결한다.


하지만 exploit 이후에 이렇게 매번 설정을 하기도 매우 번거롭다.

nc 대신 pwncat-cs을 사용하면 이 모든 것을 자동으로 설정해준다.

'딸깍'

0개의 댓글