ユーザー入力を他のプログラムに渡す

ユーザー入力を他のプログラムに渡す

catパラメータなしで実行すると、ユーザー入力が反映されることがわかります。

$ cat
test
test
reflected
reflected

リフレクションの出力を別のプログラムにパイプしたいですbase64。たとえば、予想される動作は次のとおりです。

$ cat | base64
test
dGVzdA==
another
YW5vdGhlcg==

入力されたとおりにテキストを1行ずつエンコードしたいか、そのようなものを渡したいと思いますnc。ただし、これを使用すると出力が反映されないように見え、エスケープはctrl+C出力なしで全体を終了します。

$ cat | base64
test
fail
^C

すべてが正常に機能する場合は、次のようにエンコード/暗号化された接続を確立できる必要があります(非常に簡単なチャットアプリケーション)。

# client
$ $CMD | encrypt | nc $SERVER $PORT
this is a test
multiple lines
^C

# host
$ nc -lvp | decrypt
this is a test
multiple lines

同様に、次のようにエンコードして保存できる必要があります。

$ CMD | base64  | tee log_file
test
dGVzdA==
another
YW5vdGhlcg==
^C

$ cat log_file
dGVzdA==
YW5vdGhlcg==

すべてがパイプでなければならないことに注意してください。ループを使用すると、nc各反復が新しい接続を確立するため、正しく機能しません。teeそれ以外の場合は、-aファイル内のすべての行(各繰り返し)が上書きされます。ncのようなものから入力パイプを取得しますが、ファイルの代わりにユーザー入力をbase64使用する最後のコマンド(たとえば、、)の1つのインスタンスが必要です。CMDcat

私は、ユーザー入力を1行ずつ別のプロセスにパイプする方法を探しています。可能であれば、短い行を使用することをお勧めします。このようなユーザー入力パイプをどのように取得できますか?

答え1

このような?

# this is an infinite loop, but can be changed to whatever you need
while true; do read x; echo "$x" | base64; done

出力:

foo
Zm9vCg==
bar
YmFyCg==

答え2

cat | base64期待どおりに機能しない理由を見つけました。base64受け入れなければならないみんな(私の考えでは)によって入力、終了しましたEOF。の出力にはcat終端がないため、base64入力の受信とバッファリングを中断せずに合計をctrl-C終了します。デフォルトでは、出力は出力されず待機しているため、エンコードされた出力は返されません。を使用すると、ユーザー入力が反映されパイプされますが、入力後にのみ出力されます。catbase64base64catEOFcatEOFcat << EOF | base64base64EOF

$ cat << EOF | base64
pipe heredoc> ls
pipe heredoc> test
pipe heredoc> EOF
bHMKdGVzdAo=

一方、ncユーザー入力を継続的に受け取るには、入力をで区切ります\n。したがって、パイプラインはcat | nc。これが侵入テストとCTFからシェルと一般cat的なnc方法を取得する方法です。

バインディングシェル

# user
$ cat | nc $IP 1337

# target
$ nc -lp 1337

アンチシェル

# user
$ cat | nc -lp 1337

# target
$ nc $IP 1337

アプリケーション(base64および)間のncバッファリングとターミネータの違いにより、わずかな調整がなければ、作成したいパイプラインは不可能です。すべての出力を一度に返すコマンド(例base64:)をループ内に入れwhile、入力を1行ずつ取得するコマンド(例:パイプの右側)を入れて最終チェーンをnc実装できます。

# code courtesy of @muru in the comments
while read x; do
   echo "$x" | base64
done | nc

関連情報