シェルコードとは何ですか?
シェルコードは、実行中のプログラムを制御する目的でコンピューターのメモリに挿入される一連のマシンコードまたは実行可能命令です。 このような攻撃では、ステップの1つはプログラムカウンタの制御を取得することで、実行する次の命令を識別します。 その後、プログラムフローを挿入されたコードにリダイレクトできます。 侵入型のマシンコードは攻撃のペイロードと呼ばれ、一般的にシェルコードという用語で呼ばれる要素です。 この方法は、オペレーティングシステムのコマンドシェルを開いて攻撃者にアクセスを許可するためによく使用されるため、一般的にコードインジェクション攻撃はシェルコードとして知られるようになりました。
悪用される脆弱性には通常、プログラムがメモリを割り当て、入力データの有効性をチェックし、メモリエラーを処理する方法が含まれます。 ソフトウェア開発者は通常、入力データを厳密に定義し、不適切な値を拒否することにより、この脅威を回避できます。 チェックされていない場合、その値に割り当てられたメモリよりも多くのストレージスペースを必要とする値は受け入れられます。 これにより、バッファオーバーフローと呼ばれるセキュリティ違反が発生し、データの一部が、値に割り当てられたスペースに隣接するメモリ位置に書き込まれます。 慎重に操作すると、この異常により侵入コードが導入される可能性があります。
シェルコードは通常、アセンブリ、C、C ++などの低レベルのシステムアクセスを備えたプログラミング言語で記述されています。 ただし、対象となる脆弱性によっては、PERLなどの解釈されたスクリプト言語のコード、またはJAVAなどの仮想マシンのバイトコードを挿入することで、同じ結果が実現される場合があります。 コードは、プログラムカウンターのハイジャックの前、最中、または後に埋め込むことができます。 したがって、侵入コードは、ターゲットマシンのファイルに含まれているか、ネットワーク接続を介してリアルタイムで送信されます。
ローカルシェルコードエクスプロイトは、攻撃者が物理的にアクセスできるマシンを制御できるように設計されています。 この場合の目的は、たとえば管理者権限を持つアカウントを作成することです。 同様に、実行中のプロセスの特権レベルが高い場合、悪用に成功すると、侵入者に同じレベルのアクセスが一時的に許可されます。
リモートマシンで実行されているプロセスは、標準のネットワークプロトコルを使用してターゲットコンピューターと通信します。 コネクトバックシェルコードは、侵入者のコンピューターへの接続を開始するようにターゲットマシンに指示します。 侵入者が接続を開始する場合、リモートマシンのポートと呼ばれるネットワーク接続の制御を試みるため、コードはバインドシェルと呼ばれます。 ファイアウォールがアウトバウンド接続を禁止することはめったにないため、コネクトバック方法がより広く使用されています。