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つのインスタンスが必要です。CMD
cat
私は、ユーザー入力を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
終了します。デフォルトでは、出力は出力されず待機しているため、エンコードされた出力は返されません。を使用すると、ユーザー入力が反映されパイプされますが、入力後にのみ出力されます。cat
base64
base64
cat
EOF
cat
EOF
cat << EOF | base64
base64
EOF
$ 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