タイトルの通り
バッファオーバーフローに関して質問です。
現在侵入能力とその対策を施せるペネトレーションテスターを目指して
セキュリュティを勉強しております。
バッファオーバーフローを持つ脆弱性プログラムに関する
シェルコードの埋め込みとエクスプロイトコードに関しては何となくですが理解できております。
しかし、ひとつ疑問が浮かんできました。
エクスプロイトコードをCで記述して作成したとして
それをどのタイミングで実行するのでしょうか??
例えばターゲットバッファオーバーフローの脆弱性を持つサーバーだとしてそのサーバーは
ユーザー権限とRoot権限があるとします。
こちらをペンテストとしてハッキングするとしたら
まずは、ユーザー権限の奪取から行うと思います。
そうすれば後は、コマンドでCプログラムを実行すれば良いででしょうが
初めから、Root権限の奪取を狙う場合は
どのようにしてあらかじめ、作成しておいたエクスプロイコードをコンパイル済みのCプログラムを実行するのでしょうか??
もしかして、IPアドレスとポートを指定して
プログラムを実行するコマンドがあるのでしょうか??
今日も起きてから18時間ぐらいそれについて調べてみたのですが
バッファオーバーフローの解説ばかりで肝心なバッファオーバーフローの脆弱性をもつサーバーに対して
それらのプログラムを実効する手法が見つけれませんでした。
お分かりになる方ご教示して頂ければと思います。
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
例えば下記のようなサーバプログラム(動くけどめちゃくちゃ適当です)が動いていたとします。
C
1#include <arpa/inet.h> 2#include <errno.h> 3#include <netinet/in.h> 4#include <stdio.h> 5#include <string.h> 6#include <sys/socket.h> 7#include <unistd.h> 8 9#define LISTEN_PORT 12121 10#define LISTEN_BACKLOG 10 11 12int main(void) 13{ 14 int sfd = socket(AF_INET, SOCK_STREAM, 0); 15 struct sockaddr_in addr = {.sin_family = AF_INET, 16 .sin_port = htons(LISTEN_PORT), 17 .sin_addr = {.s_addr = INADDR_ANY}}; 18 bind(sfd, (struct sockaddr *)&addr, sizeof(addr)); 19 listen(sfd, LISTEN_BACKLOG); 20 int afd = accept(sfd, NULL, NULL); 21 char buff[1024]; 22 recv(afd, buff, 1024, 0); 23 char *p = buff; 24 while (*p != '\n') 25 p++; 26 *p = '\0'; 27 28 int i = 0; 29 char s[10]; 30 strcpy(s, buff); 31 32 printf("%10s\ni = %d\n", s, i); 33 close(afd); 34 close(sfd); 35 return 0; 36}
ツッコミどころ満載のコードですし、脆弱性はありまくりです。これは、telnetで接続して、適当な文字列をわたすと、それを処理してくれます。しかし渡される文字列が一定数をこえるとバッファオーバーフローとか色々起きます。実際のサーバーソフトウェア、Apache HTTP ServerとかISC BINDとかSendmailとかは、上のようなサーバーソフトウェアをより複雑にしたに過ぎません。そのどこかに上のようなバッファオーバーフローが存在すると、想定していないところのメモリを書きかえることができます。
うまく操作して、次に実行される関数を指すところからシェルコードを呼び出すようにすれば、ほら、サーバー上で任意のコマンドを実行可能です。状況(ソースコード以外にもコンパイル環境やOS等にもよる)によって任意コード実行までできるのか、それともサーバーが落ちるぐらいしかできないかは違いますが、こういう所を付くことで、サーバーの乗っ取りを行います。(任意コード実行からroot権限奪取はまた別の話ですので、今回は除外します)
より具体的なソフトウェアの開発の話をしましょう。例えばApacheもnginxもIISも嫌になったのでHTTPサーバーを作ることになりました。HTTPでは最初に"HTTP/1.1"といったバージョン情報を送ることになりますので、1行目の解析のための枠にそれほど文字数は必要ありません。ということでchar http_versino[9]
みたいにつくって、改行の前までいれる(9文字目まで改行があるはずなので文字数は数えない)としたとしましょう。ですが、もし、悪意あるユーザーが"HTTP/1.1hogehogehoge"みたいのを送ってきたらどうなるでしょうか?文字数はかぞえてなかったので、指定文字数を超えてどんどん書き込まれてしまっています。その書き込まれるバイト列を任意コードを実行できるような形に工夫すれば、これで攻撃の第一段間は成功です。
投稿2017/01/28 03:59
総合スコア21735
0
ベストアンサー
脆弱性のあるプログラムが稼働していた場合は、ネットワーク経由で侵入後、パラメータを渡してオーバーフローを起こすんだと思います。
オーバーフローにも種類があるので、一概には言えません。
対象のサーバーに侵入した後にroot権限の奪取のためにオーバーフロー攻撃を利用するのだと思います。
root権限で動くものといえば、ポート番号が1024未満で動くネットワークプログラムなどは代表的なものだと思いますよ・・・
exploitといった攻撃コードを用意しておいて、root権限で動いているプログラムにオーバーフローを起こすことによってexploitのアドレスに制御を移し、root権限でexploitコードを実行させることはできます。
コンピュータに侵入しなくても、ネットワーク経由で攻撃コードを実行することも可能です。
metasploitはご存知ですか??
exploitを作って、実行することができます。使ってみてはいかがでしょう?
投稿2017/01/28 01:42
総合スコア651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/28 03:35
2017/01/28 03:40
2017/01/28 14:50
0
回答ではないのですが、「ペネトレーションテスターを目指して
セキュリュティを勉強しております」という質問を複数回見た気がするので、コメントします。
今、やられている事は、基礎力のアップなのだと思いますが、少し方向性が違うように思います。
私が仕事で関わった範囲内の話ですが、ペネトレーションテストを行う人は、個々のセキュリティホールを攻撃する力は特に必要としていません。
原則非破壊検査なので、どちらかと言うと、下記の能力が必要そうでした。
・使用している環境に対しての調査能力(OS/アプリの種類やバージョン等)
・世の中にどのような脆弱性(侵入のポイント)があるかを調べる検索(?)能力
・脆弱性に合致する侵入ポイントがあるかないかをどうツールに判断させるかのプログラミング能力
・それらをレポートする能力およびレポート結果からコンサルティングする能力
今学ばれている具体的な脆弱性の操作が生きるのは、「プログラマー」「セキュリティプロダクトの開発エンジニア」であって、ペネトレーションテストを行う人の必要な知識とは似て非なるものです。原理さえ知っていればイイんじゃないかなぁ。
ペネトレーションテスターを目指すなら、少しペネトレーションテスターの実体を確認されたほうが良いと思います。
今回のケースで言うと
・バッファオーバーフローに関する脆弱性は、どのようなアプリケーションで報告されていて、該当のバージョンが幾つか
・対象となるシステムの該当アプリケーションの使用有無を非破壊で検査する方法はどのようなものがあるか
・該当アプリがあった場合、その脆弱性を突かれる可能性のあるポイントを抽出するアルゴリズムはどのようなものが考えられるか。またそれを実際プログラミングできるか。
・ツールが環境に対して非破壊であることを担保できるか。
といったことが、ペネトレーションテスターに求められるスキルではないかと考えます。
まぁ、仕事で関わった狭い範囲での話を元に書いているので、若干認識違いもあるかもしれないですが、参考になれば。
投稿2017/01/28 01:19
編集2017/01/28 03:20退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
バッファオーバーランを利用して、コード実行を行う手法として、Return-to-libcというものがあります。
関数から戻る際に、戻り先のアドレスが必要となりますが、その戻り先をバッファオーバーランで(主にlibcにある関数のものに)書き換え、さらに引数もお膳立てすることで、ライブラリ関数を実行させることができます。system()
でシェルを呼ぶこともできます。
いまどきのOSにはデータ実行拒否機能があるので、スタックやヒープをオーバーフローさせてコードを書き込んでも、それを実行させるにはさらに工作が必要ですが、戻り先の書き換えであればそれも不要です。
投稿2017/01/28 00:28
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/28 04:33
2017/01/28 04:45