Home [Tip] ngrok & Spawn stty shell
Post
Cancel

[Tip] ngrok & Spawn stty shell

드림핵에서 brad가 출제했던 Note 문제를 풀다가 RCE를 통해서 플레그를 얻어야하는데 cat flag를 해도되지만 갑자기 리버스 쉘이 연결하고 싶어서 리버스 쉘과 관련된 팁을 적어보고자 한다.

ngrok


What is ngrok?


ngrok은 쉽게 말하면 외부에서 로컬로 접속을 돕는 터널링 프로그램이다. 구글링을 해보니 급하게 API 테스트 같은 로컬에서 개발한 것들을 외부에서 접속이 필요할 때 종종 사용되는 듯 하다. 하지만 나는 그런건 잘 모르겠고 모의해킹 관점에서 설명하면 특히 리버스 쉘을 연결할 때 같은 네트워크가 아니라면 직접적으로 내 로컬에 연결할 수 없다. 그렇기 때문에 워게임 문제를 풀 때 RCE 같은 취약점이 있으면 대부분 플레그 파일을 읽는 식으로 문제를 해결하는데 CTF 같은 경우는 문제가 없겠지만 2차 침투가 필요한 경우에는 리버스 쉘이 필수적이다. 이 때 손쉽게 내 로컬로 연결시켜주는게 ngrok이다.

How to use?


먼저 맥북 기준 아래의 명령어로 ngrok을 설치한다.

1
brew install --cask ngrok


설치만하고 명령어를 실행하니 되지않아서 ngrok 사이트에서 가입 후에 인증토큰까지 등록하는 과정을 거쳤다.
signup

로그인을 한 뒤 마이페이지에서 Connect your account 부분에 있는 명령어를 복붙하여 자신의 토큰을 등록해준다.
auth

이러면 설정은 끝났다. 테스트를 위해서 로컬에서 nc 명령어를 통해 9001번 포트를 열어주고 다음과 같은 ngrok 명령어를 이용한다.

1
ngrok tcp 9001


그러면 아래 사진처럼 랜덤한 문자열의 호스트이름과 외부 포트를 할당받은 것을 볼 수 있다.
binding

리버스 쉘 명령어에 할당받은 호스트와 포트번호를 넣고 명령어를 실행하면 아래와 같이 로컬에서도 쉽게 리버스 쉘이 연결된다.
sucess

Spawn stty shell


이렇게 성공적으로 리버스 쉘을 연결하고 이 상태로 쓰게되면 거슬리는 점이 매우 많다. clear 안됨, 이전 명령어, 출력 관련 문제 등… 유저 이름과 현재 위치도 안알려주고 # 또는 $ 만 띄어주는 불친절한 경우도 많다.
예시를 들면 아래와 같이 ls 명령어를 입력하면 입력한 명령어가 한 번 더 뜨고 옆에 빈공간이 있는데도 1열로 출력된다. 또한 윗방향키를 눌러 이전 명령어를 보려고하면 ^[[A 만 뜬다.
ls

이 모든 것들을 해결하도록 아래와 같은 명령어를 순서대로 입력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In victim machine reverse shell
$ python3 -c 'import pty; pty.spawn("/bin/bash")' // python3가 없다면 python을 써도 무방
Ctrl-Z    // 백그라운드로 전환     

In Attacker console
# stty -a
# stty raw -echo; fg
[enter]
[enter]              

In reverse shell
$ export TERM=xterm // clear가 가능해짐
$ stty rows <num> columns <cols> // 이건 굳이 할 필요는 없다.(터미널 크기 문제?) 필요하다면 로컬에서 'stty -a' 명령어를 통해서 자신의 rows와 cols를 입력해준다.


그러면 아래와 같이 ls 명령어를 입력했을 때 출력이 제대로 된다. 또한 clear도 가능해지고 이전 명령어 확인도 된다.
ls

Reference


[Journal] 2022

[Hackthebox] SAW

Comments powered by Disqus.