現代のTelnetは暗号化できる

この記事はImaizumi Lab Advent Calendarの6日目です。

はじめに

youtu.be

Telnetは暗号化しないからセキュリティ的に危険」と教わった人は多いでしょう。

ところが、特定の条件下だとTelnetでも暗号化する場合があります。

先日行われたjusのUNIX歴史講座で「今のtelnetは暗号化する」という話題が出て、Twitterの方で知らなかったと言ってる方がちらほらいらっしゃったので意外と知られていないのかと思い記事を書くことにしました。

(その話題は動画だと35:00ごろ)

関連するRFC

  • RFC2946-2950, 2952-2953「Telnet Encryption」
  • RFC5929「Channel Bindings for TLS

という関連したRFCが存在します。ざっと眺めたところ、暗号化の方式ごとに議論されているようです。

実装を調べる

man

BSD General Commands Manual、Ubuntu manpagesを見る限りだと、encryptオプションなるものが存在するようです。ただし、

telnet が暗号化なしでコンパイルされた場合、 encrypt コマンドはサポートされない。

とのことです。

現在のバージョンの telnet は、暗号化をサポートしていない点に注意すること。

という記述がmanページにあるケースとないケースがあったため、なければ対応しているのかも?

どちらにしてもデフォルトで暗号化されるというわけではなさそうです。

ソースを読む(BSD)

BSDでは少なくとも10年ほど前から暗号化がサポートされているようです。FreeBSDtelnet.cの実装を見ると、encrypt.hというヘッダファイルを読み込んでいます。

以下特に関連しそうなソースです。

https://svnweb.freebsd.org/base/head/contrib/telnet/telnetd/telnetd.c?view=markup#l53

https://svnweb.freebsd.org/base/head/contrib/telnet/libtelnet/encrypt.h?view=markup

https://svnweb.freebsd.org/base/head/contrib/telnet/libtelnet/encrypt.c?view=markup

https://svnweb.freebsd.org/base/head/contrib/telnet/libtelnet/enc_des.c?view=markup

(BSDに関しては参考文献一つめの@bakamingさんの記事及び研究室の先生にご教示いただきました)

どうやらBSDの実装では共通鍵暗号方式(DES)を採用しているようです。

パッケージ

https://pkgs.org/search/?q=telnet

パッケージ検索で調べてみると、Ubuntutelnet-sslという実装があるようです。その名の通り、SSLをサポートしたTelnetのようです。

Dockerで試してみる

Ubuntutelnet-sslをDockerで試してみます。telnet-serverの方でtcpdumpを用いてパケットをキャプチャしてみます。

こちらのリポジトリに入っているので、すぐに試すことができます。*1

github.com

ちなみにUbuntu20.04からSSLのセキュリティレベルが上がった関係で、20.04ではうまく動かないようです。私は18.04で試しています。

詳しくはリポジトリのREADME.mdをご覧ください。

Wiresharkでキャプチャを開いてみる

暗号化した場合としなかった場合、それぞれのキャプチャファイルをWiresharkで開き、「分析>追跡>TCPストリーム」で見てみましょう。

普通のTelnetの方はログインユーザ、パスワードが全て書かれています。一方、暗号化されたTelnetの方はよく分からない文字列になっています。

f:id:RussianBlue25:20201217125520p:plain
暗号化されていないTelnet

f:id:RussianBlue25:20201217123130p:plain
暗号化されたTelnet

おわりに

暗号化するTelnetは確かにRFCに記載があり、実装もあることがわかりました。また、暗号化されていることをWiresharkを使って確認することができました。

ただし「現代のTelnetは暗号化できる」だとちょっと語弊がありますね。厳密には「現代のTelnetは暗号化できる(こともある)」ってところでしょうか。

参考文献

telnetは通信を暗号化できる…らしい - Qiita

docker間通信をtcpdumpしてpcapをいじる - やる

Dockerでたてたコンテナにtelnet-serverを入れて、telnetでコンテナ間通信ができるようにしてみた - 君は心理学者なのか?

*1:生のTelnetと暗号化Telnetは共存できないようなので、分けています