質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Q&A

解決済

4回答

2283閲覧

バッファオーバーフローに関して

Susanoo2442

総合スコア153

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

0グッド

1クリップ

投稿2017/01/28 00:02

タイトルの通り
バッファオーバーフローに関して質問です。

現在侵入能力とその対策を施せるペネトレーションテスターを目指して
セキュリュティを勉強しております。

バッファオーバーフローを持つ脆弱性プログラムに関する
シェルコードの埋め込みとエクスプロイトコードに関しては何となくですが理解できております。

しかし、ひとつ疑問が浮かんできました。

エクスプロイトコードをCで記述して作成したとして
それをどのタイミングで実行するのでしょうか??

例えばターゲットバッファオーバーフローの脆弱性を持つサーバーだとしてそのサーバーは
ユーザー権限とRoot権限があるとします。

こちらをペンテストとしてハッキングするとしたら
まずは、ユーザー権限の奪取から行うと思います。
そうすれば後は、コマンドでCプログラムを実行すれば良いででしょうが

初めから、Root権限の奪取を狙う場合は
どのようにしてあらかじめ、作成しておいたエクスプロイコードをコンパイル済みのCプログラムを実行するのでしょうか??

もしかして、IPアドレスとポートを指定して
プログラムを実行するコマンドがあるのでしょうか??

今日も起きてから18時間ぐらいそれについて調べてみたのですが
バッファオーバーフローの解説ばかりで肝心なバッファオーバーフローの脆弱性をもつサーバーに対して
それらのプログラムを実効する手法が見つけれませんでした。

お分かりになる方ご教示して頂ければと思います。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/01/28 04:33

ふむふむ・・・ なるほど! 最近、ソケットプログラミングをしているのですが、 GET / HTTP/1.1 このリクエストはGET とHTTPの間はURLで良いんですよね??
raccy

2017/01/28 04:45

あ、GET / がつくのを忘れてました。><
guest

0

ベストアンサー

脆弱性のあるプログラムが稼働していた場合は、ネットワーク経由で侵入後、パラメータを渡してオーバーフローを起こすんだと思います。

オーバーフローにも種類があるので、一概には言えません。
対象のサーバーに侵入した後にroot権限の奪取のためにオーバーフロー攻撃を利用するのだと思います。

root権限で動くものといえば、ポート番号が1024未満で動くネットワークプログラムなどは代表的なものだと思いますよ・・・

exploitといった攻撃コードを用意しておいて、root権限で動いているプログラムにオーバーフローを起こすことによってexploitのアドレスに制御を移し、root権限でexploitコードを実行させることはできます。

コンピュータに侵入しなくても、ネットワーク経由で攻撃コードを実行することも可能です。

metasploitはご存知ですか??
exploitを作って、実行することができます。使ってみてはいかがでしょう?

投稿2017/01/28 01:42

strike1217

総合スコア651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Susanoo2442

2017/01/28 02:26

回答ありがとうございます。 やはり、バッファオーバーフローを 引き起こさせる場合は対象のサーバーに 侵入した上でRoot権限を乗っ取る為に 使うのが一般的みたいですね。 サーバー内でしたら 当然Cプログラムをコマンドで 実行できますので。 ひとつ気になったのですが ネットワークからの 攻撃という事ですが 具体的にはMetaSplotを用いて 攻撃を行うという事でしょうか?? その辺りもご教示頂ければ 有難いです。 宜しくお願い致します。
strike1217

2017/01/28 03:35

CTFの難問などには、ネットワーク経由の攻撃がありますね。 metasploitもそうですが、特定のポートで動作しているアプリケーションに対して攻撃します。 ほかにもネットワーク経由だとXSS, SQL injectionなどもそうだと思います。 あとは、ウィルスによるデーモンを作成しておけば、ネットワークからの侵入も容易になったりする場合もあります。 maisumakunさんも言っているのですが、オーバーフローはASLRやNXビットといったセキュリティ機能があるので、できない場合があります。 書式指定攻撃などは現在ではほとんど使用されなくなったと思いますよ。
strike1217

2017/01/28 03:40

私の持っている本だと、80ポートなどで稼働しているwebサーバーのプログラムなどに脆弱性があった場合、ネットワークのパケットを受けとった時点でオーバーフローが成立する例などが載っています。 ポートバインド型シェルコードなども調べてみると面白いかもしれません。 ネットワーク経由の場合はセキュリティ装置(ハードウェア)が多数出回っているので、あまり直接的な被害に会うケースは少ないと思います。
Susanoo2442

2017/01/28 14:50

この度は回答ありがとう ございました。 まさに求めていた 答えです。 ほかの皆様もありがとう ございました。
guest

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

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問