Как отключить diffie-hellman-group1-sha1 в ganymed-ssh2-build210.jar

В Java мы используем ganymed-ssh2-build210.jar для подключения к серверу через ssh. Мне нужно специально ограничить более слабый алгоритм " diffie-hellman-group1-sha1 ".

Есть ли в ganymed-ssh2-build210.jar настраиваемые параметры, позволяющие это ограничить?

Есть ли какие-либо настройки java.security для ограничения того же?

2 ответа

Если вы не можете управлять сервером, кроме библиотеки на клиенте.

Ниже может быть вариант

  • получить исходный код библиотеки ganymed-ssh2-build210-sources.jar
  • изменить ch/ethz/ssh2/transport/KexManager.java больше не поддерживать diffie-hellman-group1-sha1
  • составить исправленный код
  • создать исправленную библиотеку как ganymed-ssh2-build210_1.jar и использовать этот с клиентским приложением

отредактируйте Найдите пошаговую инструкцию, чтобы проверить вышеупомянутое.

Предположим, следующая структура

bin/
apache-sshd-1.6.0.tar.gz
ganymed-ssh2-build210.jar
ganymed-ssh2-build210-sources.jar
SshClientDemo.java
SshServerDemo.java

SshServerDemo.java

package sub.optimal;

import java.nio.file.Paths;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.kex.KeyExchange;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.scp.ScpCommandFactory;
import org.apache.sshd.server.shell.InteractiveProcessShellFactory;
import org.apache.sshd.server.shell.ProcessShellFactory;

public class SshServerDemo extends Thread {

    public static void main(String[] args) throws Exception {
        Logger.getGlobal().setLevel(Level.FINEST);
        SshServer sshd = SshServer.setUpDefaultServer();
        sshd.setPort(2222);
        sshd.setKeyPairProvider(
                new SimpleGeneratorHostKeyProvider(Paths.get("hostkey.ser"))
        );
        sshd.setShellFactory(InteractiveProcessShellFactory.INSTANCE);
        sshd.setCommandFactory(
                new ScpCommandFactory.Builder().withDelegate(
                        cmd -> new ProcessShellFactory(
                                GenericUtils.split(cmd, ' ')
                        ).create()
                ).build()
        );

        List<NamedFactory<KeyExchange>> keyExchangeFactories;
        keyExchangeFactories = sshd.getKeyExchangeFactories();
        keyExchangeFactories.removeIf(
                e -> !e.getName().equals("diffie-hellman-group1-sha1")
        );

        sshd.setKeyExchangeFactories(keyExchangeFactories);
        sshd.setPasswordAuthenticator(
                (username, password, session) -> username.equals(password)
        );

        sshd.start();
        Thread.sleep(Long.MAX_VALUE);
    }
}

SshClientDemo.java

package sub.optimal;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class SshClientDemo {

    public static void main(String[] args) throws Exception {
        Connection conn = new Connection("localhost", 2222);
        conn.connect();
        boolean isAuthenticated = conn.authenticateWithPassword("foo", "foo");
        Session sess = conn.openSession();
        System.out.println("session is authenticated: " + isAuthenticated);

        sess.execCommand("echo I'm there...");

        InputStream stdout = new StreamGobbler(sess.getStdout());
        BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

        while (true) {
            String line = br.readLine();
            if (line == null) {
                break;
            }
            System.out.println(line);
        }

        sess.close();
        conn.close();
    }
}
  • извлечь сервер Apache

    tar xzf apache-sshd-1.6.0.tar.gz
    
  • скомпилировать демонстрационные классы

    javac -cp "apache-sshd-1.6.0/lib/*" -d bin/ SshServerDemo.java
    javac -cp ganymed-ssh2-build210.jar -d bin/ SshClientDemo.java
    
  • извлечь KexManager.java

    jar vxf ganymed-ssh2-build210-sources.jar \
        ch/ethz/ssh2/transport/KexManager.java
    
  • изменить файл KexManager.java

    public static final String[] getDefaultKexAlgorithmList() {
        return new String[] { 
            "diffie-hellman-group-exchange-sha1", 
            "diffie-hellman-group14-sha1"// ,
            // "diffie-hellman-group1-sha1"
        };
    }
    ...
    public static final void checkKexAlgorithmList(String[] algos)
        ...
        if ("diffie-hellman-group14-sha1".equals(algos[i]))
            continue;
    
        // if ("diffie-hellman-group1-sha1".equals(algos[i]))
        //    continue;
        ...
    
  • скомпилировать исправленный KexManager.java

    javac -cp ganymed-ssh2-build210.jar ch/ethz/ssh2/transport/KexManager.java
    
  • создать пропатченную библиотеку

    cp ganymed-ssh2-build210.jar ganymed-ssh2-build210-patched.jar
    jar vuf ganymed-ssh2-build210-patched.jar \
        ch/ethz/ssh2/transport/KexManager.class 
    

в сеансе командной строки ОДИН

  • запустить сервер

    java -cp "bin/:apache-sshd-1.6.0/lib/*" sub.optimal.SshServerDemo
    

в сеансе командной строки ДВА

  • сначала проверьте алгоритмы обмена ключами, поддерживаемые сервером

    ssh -vv foo@localhost -p 2222
    

    на выходе только diffie-hellman-group1-sha1 сообщается

    debug2: peer server KEXINIT proposal
    debug2: KEX algorithms: diffie-hellman-group1-sha1
    
  • запустить клиент с непатчированной библиотекой

    java -cp bin/:ganymed-ssh2-build210.jar sub.optimal.SshClientDemo
    

    выход

    session is authenticated: true
    I'm there...
    
  • запустить клиент с пропатченной библиотекой

    java -cp bin/:ganymed-ssh2-build210-patched.jar sub.optimal.SshClientDemo
    

    выход

    Caused by: java.io.IOException: Cannot negotiate, proposals do not match.
    

    в журнале сервера

    Unable to negotiate key exchange for kex algorithms \
       (client: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 \
       / server: diffie-hellman-group1-sha1)
    

Это доказывает, что SshClientDemo с исправленной библиотекой не может использовать алгоритм обмена ключами diffie-hellman-group1-sha1 подключиться к серверу (который для PoC поддерживает только этот).

Вы хотите изменить разрешенные шифры на сервере, а не на своем клиенте, иначе любой может легко обойти это.

Проверьте ответ: https://unix.stackexchange.com/questions/333728/ssh-how-to-disable-weak-ciphers

Другие вопросы по тегам