私はよくコンソールでcatを使用してファイルの内容を表示しますが、時々、基本的に意味不明なビープ音とシステムのビープ音を生成するバイナリファイルを誤って鳴らします。しかし、今日私はcatユーティリティからの出力がコンソール入力にリダイレクトされる状況に遭遇したので、次のようなものを手に入れました:
-bash: 2c: command not found
-bash: 1: command not found
-bash: 1: command not found
-bash: 112: command not found
-bash: 112: command not found
-bash: 1: command not found
-bash: 0x1: command not found
-bash: 2c1: command not found
-bash: 2c: command not found
-bash: 1: command not found
-bash: 1: command not found
-bash: 112: command not found
-bash: 112: command not found
-bash: 1: command not found
-bash: 0x1: command not found
-bash: 2c1: command not found
-bash: 2c1: command not found
-bash: 2c1: command not found
-bash: 2c1: command not found
...
...
これは、特別に細工されたバイナリファイルがシステム上でかなり混乱を引き起こす可能性があると考えさせられました?!...今、私はこのように無謀に猫を使用することは特にスマートではないことに気づきましたが、実際にここで何が起こっているのか知りたいのですが。どの文字がコンテンツを標準入力に突然ダンプする効果を生み出すか...
注:これを行っている間、私はMac OS Xターミナルにいました。実際にdiff -aを呼び出して、2つのファームウェアromイメージを比較し、その違いを出力しました(数バイトの違いがあると思いましたが、ほぼ8 MBの違いが画面に出力されました)後で、わざとファイルの1つをcatしようとして、ここに貼り付けたのと同じ効果を得ました。
-更新--更新--更新-
これを昨日の夜遅くここに投稿しましたが、今朝はその行動を再現しようとしましたが、できません。残念ながら、いくつかのエスケープ文字が原因でバイナリの意味不明な文字がコンソールで自動的に実行されたのか、または猫の最後に(ペーストした場合と同様に)たくさんの文字が残っているのかはわかりませんコマンドラインと私はおそらく明確なラインを得るために誤ってエンターを押した...
問題のファイルを今すぐ猫にしようとすると、完了時にこれが表示されます(右にスクロールすると表示されます)。
D?k(Fli9p?s?HT?78=!g??Ès3?&é?? =??7??K?̓Kü<ö????z(;???????j??>??ö?Ivans-MacBook-Pro:FI9826W-2.11.1.5-20140121 NA ivankovacevic$ 1;2c1;2c1;2;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c;1;1;112;112;1;0x1;2c1;2c;1;1;112;112;1;0x1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c
私の実際のプロンプトは:
Ivans-MacBook-Pro:FI9826W-2.11.1.5-20140121 NA ivankovacevic$
どこ:
FI9826W-2.11.1.5-20140121 NA
現在の作業ディレクトリです。あなたが見るように、それはバイナリの意味不明な言葉で偽装されており、私は反射的に何かを押したのかもしれません。明らかに私のプロンプトは「カモフラージュ」されていたかもしれないので、これ自体は猫の少し間違っています。しかし、それは私が最初に考えたほど深刻ではありません。昨夜試したときに自動的に実行されなかったかどうかはまだ100%わかりませんが、これの前に、昨夜起こった別の奇妙なことがあったためです。ターミナルアプリを終了させる別の非常に類似したファイルで猫を呼び出しました:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00007fcb9a3ffffa
今、私はこれらの2つのイベントの組み合わせがコンソールで意味不明の自動実行を引き起こしたと考えています。しかし、私はその行動を再び再現することはできません。
問題のファイルはFoscam IPカメラのファームウェアです。ここにリンクがあります:
国際サイト: http://foscam.com/Private/ProductFiles/FI9826W-2.11.1.5-20140120.Zip
そして、中のファイル:FI9826W_app_ver1.11.0.40_OneToAll.bin
その上で猫を呼び出すと、ターミナルが終了します。
米国のサイト: http://foscam.us/downloads/FI9826W-2.11.1.5-20140121%20NA.Zip
次にファイル:FI9826W_app_ver1.11.0.40_OneToAll_A.bin
コマンドラインで1; 2c1; 2c1; 2; 2c1; 2c1; 2c1; 2c1; 2c1; 2c1; 2c1; 2c ....文字の貼り付けが行われることを示す
私がLATIN-1
エンコーディングからUTF-8
としてデフォルトのエンコーディングとしてほとんどのシステムで)に切り替えたときから、これの周りにいくつかの重要なfeaturesが見つかりました( 1つの文字列に2つの長さがあります )...
サンプルとして、bashで遊ぶ)が好きなので、 bashのローカライズが複数行の文字列で機能しない理由 と質問しました。このbash機能にはバグがあります、ここでの回避策はeval
を使用することです。これがセキュリティ上の欠陥でない場合、これは1つになるか、またはそれを生成する可能性があります...
ほとんどすべての進化(言語、ライブラリ、ツール、プロトコル、アプリケーション、ハードウェア、インストーラー、コンソールなど)で、新しい機能が登場し、潜在的に新しいバグが...
幸いなことに、それらはすぐに修正されるのと同じくらい少ないですが(one-day明らかにするから))、修正されています!
だから間違いなくはい、気をつけてください!
cat
コマンドの正しい使用法。現代のターミナルエミュレータを使用しているように見えるため、一部のエスケープシーケンスを使用してキーボードバッファを変更できます。
適切なシェルコマンドが挿入されている可能性があります。
安全な操作には、_cat
の引数-e
を使用できます。man cat
を参照してください。
-e equivalent to -vE -E, --show-ends display $ at end of each line -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
その後
cat -e suspectfile.raw
cat -e suspectfile.raw | less
または bash の下:
less < <(cat -e suspectfile.raw)
あるいは
which less cat
/usr/bin/less
/bin/cat
rawless() { /usr/bin/less < <(/bin/cat -e "$@");}
実際、それは過去に可能であったです...これが問題になったため、これらの種類の機能はすぐに削除されました、 だが...
command not found
を読み取る場合、これは何かが効果的に注入されたことを意味します。
削除された主な注入機能でないは、多くのVT-100カプセル化で使用されるシーケンス自分を識別するです)です。
このシーケンスはEscape Z
であり、これは注入文字列1;2c
をキーボードバッファに挿入します。つまり、VT-100
を意味します(AVO規約で)。
cat
について言えば、次のことを試すことができます。
cat <<< $'\033Z'
プロンプトが表示された次の行には、あなたがヒットしたかのように、1;2c
または使用している端末によっては、別の番号が付いている場合があります)が表示されます。
...そして
cat -e <<< $'\033Z'
^[Z$
ここで、-e => -vE
、-v
変換_(\033
から^[
および-E
は、行の終わりに$
記号を付けます(次の行には何も置かれず、キーボードバッファは影響を受けません) )。
VT100ユーザーガイド で面白いことがたくさん見つかるかもしれません(例:cat <<< $'\033#8'
;)
(それらはモダンターミナル!以前は...)
キーボードのバッファをフラッシュして彼のコンテンツを取得するための小さなbashコマンドがあります:
cat <<<$'\033Z';buf='';while read -t .1 -n 1 chr;do buf+="$chr";done;printf "\n>|%q|<\n" $buf
^[[?1;2c
>|$'\E[?1;2c'|<
そして、チェーンをテストする小さな関数:
trySeq() {
printf -v out "$1"
echo -n "$out"
buf=""
while read -t.1 -n1 char
do buf+="$char"
done
[ "$buf" ] && printf "\r|%q|->|%q|<\e[K\n" "$out" "$buf"
}
だから私は試すことができます:
for seq in $'\e['{c,{1..26}{n,t,x}};do trySeq "$seq";done
|$'\E[c'|->|$'\E[?65;1;9c'|<
|$'\E[1x'|->|$'\E[3;1;1;120;120;1;0x'|<
|$'\E[5n'|->|$'\E[0n'|<
...
(おそらくあなたのコンソールに何らかの影響があります)
想像してください、あなたの環境に次のようなものを置くことができる人がいます:
$ source <(printf '%dc() { printf "You\\047ve been hitted\\041\\n";};\n' {0..100})
そこから、あなたが
$ cat <<<$'\e[c'
$ 65;1;9c_
カーソルはコマンドプロンプト行の最後に留まります。そこから、機械的に叩いたら Return の代わりに Ctrl+c、あなたは次のようなものを読むでしょう:
$ 65;1;9c
bash: 65: command not found
bash: 1: command not found
You've been hitted!
$ _
そこから、残念ながら標準はありません。
すべての仮想端末実装は、完全なANSIおよび/または完全なDEC標準をサポートできます...
しかし、いくつかのセキュリティ問題があるため、多くはそうではありません...
ある端末を使用すると、別の端末を使用して観察できないいくつかの動作を観察できます...
xterm、linux console、gnome-terminal、konsole、fbterm、Terminal(Mac OS)...list of terminal emulators はそれほど短くありません!
また、それぞれにDECおよびANSI標準と比較して独自のバグと制限があります。
実際には、他の仮想コンソールよりも多くの機能があり、キーボードインジェクションがセキュリティを破壊する可能性がある場合があります。
これは、他のより機能的なツールよりも常に同じ(古い)xterm
を使用することを好む理由の1つです。
「本物の」ガラス端末には、画面をプリンターに印刷するためのエスケープシーケンスがありました。コマンドを実行し、現在の画面の内容を印刷コマンドのstdinにパイプすることでこれを行いました。
コマンドは、別のエスケープシーケンスによって構成できます。
これを利用する古典的な方法は、エスケープシーケンスを埋め込んだ名前のファイルを作成してプリンターコマンドを設定し、それを任意のスクリプトに変更してから、印刷エスケープシーケンスを含む2番目のファイルを作成することでした。
その後、誰かがそのディレクトリでls
を実行すると、最終的にコードが実行されます。彼らがroot
ユーザーであれば、それは素晴らしいことでした。
理論的には、現代のターミナルエミュレータは、そのようなことをこれ以上行うべきではありません。
Terminal.appはNeXTSTEP nstermに基づいているように見えるため、あらゆる種類の奇妙さが含まれている可能性があります。
たぶん、正確なバイトがcommand not found
メッセージ?
端末を上下させるエスケープシーケンスがあるようです。
http://the.taoofmac.com/space/apps/Terminal
ここにいくつかの詳細情報:
http://invisible-island.net/ncurses/terminfo.src.html#toc-_Apple__Terminal_app
プログラムの標準入力にコンテンツを送信する場合は、
program -para meters < /path/file.ext
通常、脆弱性はありませんが、使用方法を間違えれば作成できます。
文字7
はマシンのビープ音を鳴らすための古い端末コマンドであり、一部の端末プログラムはまだそのコマンドを尊重しているため、バイナリファイルの内容を印刷するとビープ音が発生します。しかし、設計上、あなたを傷つけることができるものは何もありません。最悪の場合、新しいターミナルウィンドウを開いて、作成された可能性のある混乱を元に戻します。
ここで、ファイルの内容を何らかの方法でコマンドシェルにリダイレクトした場合、それは別の問題です。何かの出力を/bin/bash
にパイプすることによってこれを行うことができます(通常、セキュリティの観点から不満を感じます)。または、誤ってそれをコピーしてターミナルに貼り付けた可能性があります。また、通常は不適切なアドバイスです。
しかし、あなたがrunしない限り、あなたは元気です。
表示されているのは xterm制御シーケンス です。
制御シーケンスは、ターミナルの出力に表示されるとアクティブになります。たとえば、印刷不可能なASCIIであるバイトを含むファイルをcatする場合。
あなたの例では、制御シーケンスはESC Z(バイト1B 5A
)端末IDを返す-端末のコマンドとして。
あなたはそれを自分で試すことができます:
echo -e '\x1BZ'
(または、ESCを\e
またはZ
as \x5A
)。
他にも楽しいものがあります:
echo -e '\eF' # move the Prompt to the bottom of the terminal.
echo -e '\ec' # Reset the terminal
自分の質問に答えるつもりはありませんが、ここにこの情報を追加します。エスケープシーケンスとしてよく知られている、他のいくつかの文字を印刷するときにコマンドラインに挿入できる文字は、このサイトで本当に適切に定義されています(F。Hauri (言及について):
http://vt100.net/docs/vt100-ug/chapter3.html
章の下:レポート
カーソル位置レポート
ESC [6 nによって呼び出されます
応答はESC [Pl; PC R
Pl =行番号。 Pc =列番号
ステータスレポート
ESC [5 nによって呼び出されます
応答はESC [0 n(ターミナルok)です
ESC [3 n(端末は問題ありません)
あなたは何ですか
ESC [cまたはESC [0 cによって呼び出されます
応答はESC [? 1; PS c
Psは「オプションあり」パラメーターで、次の意味があります。
Ps意味
0ベースVT100、オプションなし
1プロセッサーオプション(STP)
2高度なビデオオプション(AVO)
3 AVOおよびSTP
4グラフィックプロセッサオプション(GPO)
5 GPOおよびSTP
6 GPOおよびAVO
7 GPO、STP、およびAVO
または、ESC Zによって呼び出されます(非推奨)。レスポンスは同じです。
ESCはASCII 10進数27または8進数33または16進数1B。
したがって、たとえば現在のカーソル位置を出力したり、既存のコマンドラインに挿入したりするには、次のように呼び出します。
echo -e '\033[6n'
出力は次のようになります。
7;1R
次のエスケープシーケンスでカーソル位置を移動できます
echo -e '\033[10;20H'
10-行10
20-列20
ただし、端末が行の先頭にリセットする可能性があるため、列の位置は移動しません(行を移動します)。とにかく、直後にカーソル位置をクエリすると、コンソールに設定された列位置が「貼り付け」られます。
echo -e '\033[10;20H\033[6n'
出力:
0;20R
これは、コンソールでさまざまな出力を注入(「貼り付け」)する方法です。これは、出力できる組み合わせの数だけが異なるため、実際のエクスプロイトとはかけ離れていますが、他の何かと組み合わせることができます。知るか。
ファームウェアイメージを作成した私のケースでは、1; 2cこれで「What Are You」であることがわかりました。 "私の端末が何であるかを報告します。ここで、2の意味は次のとおりです。高度なビデオオプション(AVO)。
結局のところ、ファイルを無茶苦茶に食べないようにする方が間違いなく良いでしょう...
すでに提案されているように(F。Hauri)でも、少なくともcat -e