Posted at
武蔵野Day 13

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


前書き

この記事は、武蔵野アドベントカレンダー13日目の記事です。

軽めですが、お楽しみいただけると幸いです。


telnetは暗号化出来ない?

会社の技術者仲間のslackで話をしていた時に、telnetのRFCはとてもわかりにくく、実装も大変だよね、という話題が上がりました。それに興味を持った私は、telnetのRFCをざらっと眺めることにしたのですが、その中にありえない文字を発見したのです。

RFC5929, Channel Bindings for TLS, Proposed Standard

えっ、telnetってTLS実装が提唱されていたの?telnetって暗号化も何も出来ないプロトコルって教わったよ?その他にも、見てみると

RFC2947, Telnet Encryption: DES3 64 bit Cipher Feedback---, Proposed

RFC2949, Telnet Telnet Encryption: CAST-128 64 bit Output Feedback---, Proposed

Standardにはなっていないとはいえ、実装している人がいてもおかしくはありません。軽く確認してみようか、というわけで、manページやソースを追うことにしました。


パッケージを見てみる

ubuntu 16.04で、パッケージをサーチしてみると、以下のパッケージが見つかります。

$ apt-cache search telnet

telnet-ssl - telnet client with SSL encryption support
telnetd - basic telnet server
telnetd-ssl - telnet server with SSL encryption support

おぉー、確かにTLS実装ではありませんが、SSLをサポートした、と謳っているパッケージが存在しますね。

man pageを見てみましょう。すると、以下のような記載が見つかります。

$ man telnet-ssl


-z option

Set SSL (Secure Socket Layer) parameters. The default is to negotiate via telnet protocol if SSL is available at server side and then to switch it on. In this mode you can

connect to both conventional and SSL enhanced telnetd's. If the connection is made to localhost and -z secure is not set, then SSL is not enabled.


オプションを見る限りは、サーバがssl対応しているならば大丈夫なようですね。


BSDのソースを眺めてみる

telnet-sslに関してはオブションで暗号化出来そうなことが分かりました。ではBSDのtelnetの方はどうなっているのでしょうか。というわけで見てみると。

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


#ifdef ENCRYPTION
#include <libtelnet/encrypt.h>

encryptに関するソースを読み込んでいることがわかります。telnetdだけでなく、telnetの方を眺めてみましたが、同様でした。libtelnetを眺めると

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

どうもDESは実装されているようです。きちんとコンパイルすれば、暗号化は出来そうなことがわかります。


まとめ

telnetは、暗号化などが全く出来ないので脆弱なのだ!と教わってきましたが、実際にはいくつか実装で暗号化ができるようです。今回は時間の関係で実機検証までは出来ませんでしたが、時間があれば試してみようと思います……いや、sshでいいじゃないか…