System에 오픈되어 있는 Port 를 확인하는 방법에는 여러가지가 있습니다. 대표적으로 port 에 대해 직접 요청하여 확인하는 방법(Syn Scan, XMAS 등등)이 있지요. nmap을 통해 서비스에 있는 포트들에 대해 확인하게 되는데 이 중 rpc 관련 포트가 있다면 좀 더 세심하게 스캔이 가능합니다.
바로 RPC Port Map Dump라는 기법을 이용해서 서비스에서 사용중인 포트에 대해 점검할 수 있지요. rpcbind(111) 이 포트가 있고 rpc가 공격자의 요청에 원하는 응답을 주어야 스캔이 가능합니다. 물론 종종 스캔이 가능한 서버들이 있지요. 간단하게 원리랑 Metasploit / Nmap을 이용해서 스캔하는 방법에 대해 알아볼까 합니다.
공격원리
원래 portmap은 NFS사용 시 꼭 사용되는 데몬이며 RPC 서비스에 Port 를 매핑시켜줍니다. 이 친구에게 공격자가 Port를 확인하는 질의를 날려서 서비스에 동작하는 Port를 확인하는 방법이죠.
Local시스템에서는 rpcinfo라는 명령을 통해 쉽게 확인할 수 있습니다. #> rpcinfo program version netid address service owner 100000 4 tcp6 ::.0.111 portmapper superuser 100000 3 tcp6 ::.0.111 portmapper superuser 100000 4 udp6 ::.0.111 portmapper superuser 100000 3 udp6 ::.0.111 portmapper superuser 100000 4 tcp 0.0.0.0.0.111 portmapper superuser ..snip..
그러나 원격지에서 확인할 수 없도록 설정이 필요하지만 원격에서 조회가 가능한 서비스라면 공격자가 rpcbind 포트(111) 즉 PortMapper로 TCP Packet을 보내 RPC가 가지고 있는 서비스 리스트를 받아올 수 있습니다. 아래에서 Metasploit을 통해 확인하는 방법에 대해 보겠습니다.
Metasploit을 이용한 RPC Port Map Dump
auxiliary의 scanner 중 portmap 관련 스캐너가 있습니다. 해당 모듈을 이용하여 RPC Port Mamp Dump가 가능합니다.
hahwul auxiliary(portmap_amp) #> use auxiliary/scanner/portmap/portmap_amp hahwul auxiliary(portmap_amp) #> hosts -R
Hosts
address mac name os_name os_flavor os_sp purpose info comments ——- — —- ——- ——— —– ——- —- ——– 127.0.0.1 127.0.0.1 Linux 3.X server
RHOSTS => 127.0.0.1
hahwul auxiliary(portmap_amp) #> run
[] Sending Portmap RPC probes to 127.0.0.1->127.0.0.1 (1 hosts) [+] 127.0.0.1:111 - Vulnerable to Portmap RPC DUMP (Program version: 2) amplification: No packet amplification and a 15x, 588-byte bandwidth amplification [+] 127.0.0.1:111 - Vulnerable to Portmap RPC GETSTAT amplification: No packet amplification and a 7x, 272-byte bandwidth amplification [] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed hahwul auxiliary(portmap_amp) #>
Reference
https://en.wikipedia.org/wiki/Portmap http://qdata.co.kr/bo/bbs/board.php?bo_table=lqa&wr_id=49&page=9