導入
SSHプロトコルは、3つの主要なカテゴリのリモートサーバーアクティビティをサポートしています。a)コマンド実行(ログインシェルを含む)、b)ネットワーク転送と操作、およびc)ファイル転送。
OpenSSHメンテナーは、SFTPとSCPにはポート転送の法的目的がないことを決定しました(-Lおよび-Rオプションを介して)。これらのユーティリティを使用したファイル転送中、これらの機能を明示的に無効にするフラグは、Child SSH実行可能ファイルに無条件に渡されます。
一部のユーザーは、実際にこれらの機能を必要とする場合があります。明らかなサブセットは、この機能がパブリックSFTPサーバーで明示的に無効になっていることを確認することをタスクである侵入テスターです。
SFTPバイナリ自体の文字列を変更するか、コマンドラインを簡単に編集できるシェルをリダイレクトすることにより、これらの抑制された機能を有効にする2つの手法を次に示します。プラットフォームの機能に応じて、この目標を達成するためにいずれかのテクノロジーが必要になる場合があります。
詳細を抑制します
まず、関心のある実行プロセスを見つけることが重要です。以下のシェル関数は、シェルパターンに一致するPIDを表示します(これは正規表現ではないことに注意してください)。これは、Debian Dash(および他のほとんどの一般的なシェル)の下で実行され、BSDのPSオプションに依存しています。
<code>pps () { local a= b= c= IFS=$'\r'; ps ax | while read -ra do [ "$b" ] || c=1; for b; do case "$a" in *"$b"*) c=1;; esac; done; [ "$c" ] && printf '%s\n' "$a" && c=; done; }</code>
従来のSFTPセッションを開始して、それに関連するプロセスを確認してください。
<code>$ id uid=1001(aturing) gid=1001(aturing) groups=1001(aturing)... $ sftp aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
上記のローカルUNIXユーザーは、リモートSFTPサーバーで同じユーザー名アカウントを持っていると想定しています。
セッションが実行された後、ユーザー名のローカルプロセス検索でSFTPによって生成された子SSHプロセスが表示されます。
<code>$ pps aturing PID TTY STAT TIME COMMAND 9666 pts/0 S 0:00 sftp aturing@sftp.victimandum.com 9667 pts/0 S 0:00 /usr/bin/ssh -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings yes -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
clearallforwardings yes parameter上記のパラメーターは、それを破るための行動を取ることなく、転送の試みを抑制します。
-lおよび-rポート転送フラグは、SFTPコマンドラインの有効なオプションとして存在しませんが、-sオプションを使用してそれらを明示的にトリガーしてカスタムSSHハンドラー、この場合はメールサーバーを指定できます。
<code>$ cat portssh #!/bin/sh exec ssh -L2525:smtp.victimandum.com:25 "$@"</code>
転送抑制が整っていない場合、このSFTP呼び出しは転送接続を確立するのに十分です。
<code>$ sftp -S ./portssh -oClearAllForwardings\ no aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
これで、子供のSSHプロセスで転送の試みを見ることができます。
<code>$ pps aturing PID TTY STAT TIME COMMAND 9897 pts/0 S 0:00 sftp -S ./portssh -oClearAllForwardings no aturing@sftp.victimandum.com 9898 pts/0 S 0:00 ssh -L2525:smtp.victimandum.com:25 -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings yes -o ClearAllForwardings no -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
ただし、ローカル転送ポートを介してリモートメールサーバーに連絡しようとすると、明示的なオーバーライドのために失敗しました。
<code>$ nc localhost 2525 $</code>
この無条件の抑制は、ソースコードで表示されます。
<code>$ sed -n /X11/,/Forwardings/p openssh-8.7p1/sftp.c addargs(&args, "-oForwardX11 no"); addargs(&args, "-oPermitLocalCommand no"); addargs(&args, "-oClearAllForwardings yes");</code>
これらの静的文字列は、コンパイルされたバイナリファイルにも表示されます。
<code>$ strings /usr/bin/sftp | grep [-]o[CFP] -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings yes -oForwardAgent no -oPort %d</code>
最後に、文書は、この抑制は意図的であり、合理的な理由を示していることを明確に示しています。
<code>$ man ssh_config | sed -n /ClearAllForwardings/,/default/p ClearAllForwardings Specifies that all local, remote, and dynamic port forwardings specified in the configuration files or on the command line be cleared. This option is primarily useful when used from the ssh(1) command line to clear port forwardings set in configura‐ tion files, and is automatically set by scp(1) and sftp(1). The argument must be yes or no (the default).</code>
コンパイルされた文字列を変更します
デフォルトのClearAllForwardings Yes Configurationを無効にしたい場合は、SEDを使用してSFTPバイナリの文字列を直接編集することです(プラットフォームのSEDがバイナリセーフであると仮定):
<code>$ sed 's/AllForwardings yes/AllForwardings no /' sftp.noclearforward</code>
この直接的な変更は、新しいバイナリファイルをコンパイルするよりもはるかに簡単です。
文字列が正常に変更されたことを確認できます。
<code>$ strings ./sftp.noclearforward | grep [-]o[CFP] -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no -oPort %d</code>
修正されたSFTPのコンテンツとチェックサムは異なりますが、既存のLinux BuildID SHA1は同じままです(ただし、編集されたSFTPを使用する場合はサポートチケットを送信しません):
<code>$ file /usr/bin/sftp ./sftp.noclearforward /usr/bin/sftp: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d7e77e24d5fac0fdc89e62a4c9c656091f2c4a33, for GNU/Linux 3.2.0, stripped ./sftp.noclearforward: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d7e77e24d5fac0fdc89e62a4c9c656091f2c4a33, for GNU/Linux 3.2.0, stripped $ sha1sum /usr/bin/sftp ./sftp.noclearforward d8bdaf0b4642b9c324f9c2e0aeee2d9578fbe383 /usr/bin/sftp b12dda8ecfd7bd2847919b5531aea7c03364c123 ./sftp.noclearforward $ sha256sum /usr/bin/sftp ./sftp.noclearforward 986eecdfc654c9b3ff3fd0dce59690d47cf56be96a4b98a04a3682aef95d3f52 /usr/bin/sftp c8f99ce33fc129250c11dc6dbb8a01112e01124e470a92d0acefb955fd17d670 ./sftp.noclearforward</code>
変更されたSFTPバイナリを呼び出して、ポート転送を有効にすることができます。
<code>$ chmod 755 sftp.noclearforward $ ./sftp.noclearforward -S ./portssh aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
これで、子プロセスで変更された設定を確認できます。
<code>$ pps aturing PID TTY STAT TIME COMMAND 9991 pts/0 S 0:00 ./sftp.noclearforward -S ./portssh aturing@sftp.victimandum.com 9992 pts/0 S 0:00 ssh -L2525:smtp.victimandum.com:25 -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
この機能は有効になり、リモートサーバーで実行され、別のシェルで接続を確認できます。
<code>$ nc localhost 2525 220 smtp.victimandum.com Microsoft ESMTP MAIL Service, Version: 1.2.3456.78901 ready at Sun, 1 Jan 2023 01:23:45 -0100 ^C</code>
サーバーで転送が無効になっている場合、接続が試行されたときにこのステータスを示す通知を受け取ります。
<code>channel 3: open failed: administratively prohibited: open failed</code>
信頼されていないアカウントを割り当てたSFTP管理者は、サーバー構成が転送とコマンドの実行を明示的に無効にすることを確認する可能性が高いはずです。
Posixシェルを超えて
Dash and Posix標準はセットを提供しますが、コマンドラインパラメーターをリセットする方法として、より高度な機能がBashとKSH93で提供されています。
<code>$ cat ynargs #!/bin/bash echo "${@//yes/no}"</code>
クイックテストにより、編集が成功することが確認されます。
<code>$ ./ynargs -oForwardX11 no -oPermitLocalCommand yes -oClearAllForwardings yes -oForwardAgent no -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no</code>
上記の$ {@// .../...}は有効なPOSIXではなく、PDKSHから派生したダッシュまたはシェル(MKSH、OKSH)で実行できないことに注意してください。多くのプラットフォームは、この機能を使用してシェルをバンドルしません(AndroidやOpenBSDなど、制限されたプラットフォームの場合、バイナリ編集手法は代替シェルをインストールするよりも直接的です。
強力なシェルでこの機能を活用するために、ディレクトリを作成し、その中にSSHラッパーを作成して問題設定をクリアします。
<code>$ cat ~/switcharoo/ssh #!/bin/bash exec /usr/bin/ssh "${@//yes/no}"</code>
次に、システムSSHの前にディレクトリを$パスで設定します。
<code>$ export PATH=~/switcharoo:$PATH $ which ssh ~/switcharoo/ssh</code>
次に、この変更された環境でシステムSFTPを呼び出します。
<code>$ /usr/bin/sftp -S ./portssh aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
シェルが問題のパラメーターをリセットすることを観察しました。
<code>$ pps aturing PID TTY STAT TIME COMMAND 10058 pts/0 S 0:00 /usr/bin/sftp -S ./portssh aturing@sftp.victimandum.com 10059 pts/0 S 0:00 /usr/bin/ssh -L2525:smtp.victimandum.com:25 -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
転送ポートへのローカル接続を再確認しました。
<code>$ nc localhost 2525 220 smtp.victimandum.com Microsoft ESMTP MAIL Service, Version: 1.2.3456.78901 ready at Sun, 1 Jan 2023 01:23:45 -0100 ^C</code>
最終的なデモとして、次のスクリプトを使用して完全なSMTP交換を実行できます。
<code>$ cat awkmail #!/bin/gawk -f BEGIN { smtp="/inet/tcp/0/localhost/2525"; ORS="\r\n"; r=ARGV[1]; s=ARGV[2]; sbj=ARGV[3]; # /bin/awkmail to from subj 0) print |& smtp print "." |& smtp; smtp |& getline j; print j print "quit" |& smtp; smtp |& getline j; print j close(smtp) } # /inet/protocol/local-port/remote-host/remote-port</code>
このスクリプトを使用して、ターゲットSMTPサーバーがアクセスできるリモートの受信者に独自のメールを送信できます。
<code>$ ./awkmail jatanasoff@victimandum.com aturning@localhost awkmail Queued mail for delivery</code>
高度に制御された環境では、これらの機能の存在は最適ではありません。
サーバーの制限
SFTP管理者は、ユーザーがサーバーの助けを借りて任意のTCP接続を行うことを許可しないことを理解できます。このアクティビティを制限することは、慎重なセキュリティ設定です。
一般的な制限構成は、信頼できないSFTPユーザーをグループに追加し、SSHD_CONFIGでこのグループのアクティビティを制約することです。
<code>Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no</code>
この推奨される構成は、通常、すべての転送の試みを防ぐのに十分です。
disableforwardingを追加することをお勧めします:
<code>$ man sshd_config | sed -n /DisableForwarding/,/configurations/p DisableForwarding Disables all forwarding features, including X11, ssh-agent(1), TCP and StreamLocal. This option overrides all other forwarding- related options and may simplify restricted configurations.</code>
これは、練習のために管理者に任されています。
結論は
SFTPクライアントの設定が厳しすぎると、サーバー管理の失明がある程度つながる可能性があります。 SFTPクライアントの制限は、さまざまな方法で簡単に回避できます。
SFTPサーバー管理者の場合、それらが制限されている場所と制限されている場所を知ることが重要であり、任意のTCP制御からサーバーを保護するためにクライアントに依存しないことが重要です。クライアントはユーザーによって制御され、構成が間違っている場合、サーバーにTCPコマンドを実装することは困難です。ユーザーssh_configでの広範な転送なしでテストを行う必要があります。ドキュメントの警告に注意してください。
この機能には考えられる法的目的があるかもしれませんが、虐待はまれです。
これらの問題は、サイトExecのバリエーションが数十年にわたってPlantext FTPに存在しているため、新しいものではありません。 SFTPは、プレーンテキストファイル転送の単純な代替手段ではなく、使いやすい機能も多くあります。
管理者は、これらの方法を使用して、不意を突かれないようにサーバーのセキュリティを検証できることを願っています。
以上がSFTPポート転送:抑制された機能を有効にしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。