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

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

ただいまの
回答率

90.52%

  • セキュリティー

    463questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 731

Susanoo2442

score 139

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/28 11:26


    回答ありがとうございます。
    やはり、バッファオーバーフローを
    引き起こさせる場合は対象のサーバーに
    侵入した上でRoot権限を乗っ取る為に
    使うのが一般的みたいですね。

    サーバー内でしたら
    当然Cプログラムをコマンドで
    実行できますので。

    ひとつ気になったのですが
    ネットワークからの
    攻撃という事ですが
    具体的にはMetaSplotを用いて
    攻撃を行うという事でしょうか??

    その辺りもご教示頂ければ
    有難いです。

    宜しくお願い致します。

    キャンセル

  • 2017/01/28 12:35

    CTFの難問などには、ネットワーク経由の攻撃がありますね。

    metasploitもそうですが、特定のポートで動作しているアプリケーションに対して攻撃します。
    ほかにもネットワーク経由だとXSS, SQL injectionなどもそうだと思います。
    あとは、ウィルスによるデーモンを作成しておけば、ネットワークからの侵入も容易になったりする場合もあります。

    maisumakunさんも言っているのですが、オーバーフローはASLRやNXビットといったセキュリティ機能があるので、できない場合があります。
    書式指定攻撃などは現在ではほとんど使用されなくなったと思いますよ。

    キャンセル

  • 2017/01/28 12:40

    私の持っている本だと、80ポートなどで稼働しているwebサーバーのプログラムなどに脆弱性があった場合、ネットワークのパケットを受けとった時点でオーバーフローが成立する例などが載っています。

    ポートバインド型シェルコードなども調べてみると面白いかもしれません。

    ネットワーク経由の場合はセキュリティ装置(ハードウェア)が多数出回っているので、あまり直接的な被害に会うケースは少ないと思います。

    キャンセル

  • 2017/01/28 23:50



    この度は回答ありがとう
    ございました。

    まさに求めていた
    答えです。

    ほかの皆様もありがとう
    ございました。

    キャンセル

0

バッファオーバーランを利用して、コード実行を行う手法として、Return-to-libcというものがあります。

関数から戻る際に、戻り先のアドレスが必要となりますが、その戻り先をバッファオーバーランで(主にlibcにある関数のものに)書き換え、さらに引数もお膳立てすることで、ライブラリ関数を実行させることができます。system()でシェルを呼ぶこともできます。

いまどきのOSにはデータ実行拒否機能があるので、スタックやヒープをオーバーフローさせてコードを書き込んでも、それを実行させるにはさらに工作が必要ですが、戻り先の書き換えであればそれも不要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

回答ではないのですが、「ペネトレーションテスターを目指して 
セキュリュティを勉強しております」という質問を複数回見た気がするので、コメントします。

今、やられている事は、基礎力のアップなのだと思いますが、少し方向性が違うように思います。

私が仕事で関わった範囲内の話ですが、ペネトレーションテストを行う人は、個々のセキュリティホールを攻撃する力は特に必要としていません。

原則非破壊検査なので、どちらかと言うと、下記の能力が必要そうでした。
・使用している環境に対しての調査能力(OS/アプリの種類やバージョン等)
・世の中にどのような脆弱性(侵入のポイント)があるかを調べる検索(?)能力
・脆弱性に合致する侵入ポイントがあるかないかをどうツールに判断させるかのプログラミング能力
・それらをレポートする能力およびレポート結果からコンサルティングする能力

今学ばれている具体的な脆弱性の操作が生きるのは、「プログラマー」「セキュリティプロダクトの開発エンジニア」であって、ペネトレーションテストを行う人の必要な知識とは似て非なるものです。原理さえ知っていればイイんじゃないかなぁ。

ペネトレーションテスターを目指すなら、少しペネトレーションテスターの実体を確認されたほうが良いと思います。

今回のケースで言うと
・バッファオーバーフローに関する脆弱性は、どのようなアプリケーションで報告されていて、該当のバージョンが幾つか
・対象となるシステムの該当アプリケーションの使用有無を非破壊で検査する方法はどのようなものがあるか
・該当アプリがあった場合、その脆弱性を突かれる可能性のあるポイントを抽出するアルゴリズムはどのようなものが考えられるか。またそれを実際プログラミングできるか。
・ツールが環境に対して非破壊であることを担保できるか。

といったことが、ペネトレーションテスターに求められるスキルではないかと考えます。

まぁ、仕事で関わった狭い範囲での話を元に書いているので、若干認識違いもあるかもしれないですが、参考になれば。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

例えば下記のようなサーバプログラム(動くけどめちゃくちゃ適当です)が動いていたとします。

#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

#define LISTEN_PORT 12121
#define LISTEN_BACKLOG 10

int main(void)
{
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr = {.sin_family = AF_INET,
        .sin_port = htons(LISTEN_PORT),
        .sin_addr = {.s_addr = INADDR_ANY}};
    bind(sfd, (struct sockaddr *)&addr, sizeof(addr));
    listen(sfd, LISTEN_BACKLOG);
    int afd = accept(sfd, NULL, NULL);
    char buff[1024];
    recv(afd, buff, 1024, 0);
    char *p = buff;
    while (*p != '\n')
        p++;
    *p = '\0';

    int i = 0;
    char s[10];
    strcpy(s, buff);

    printf("%10s\ni = %d\n", s, i);
    close(afd);
    close(sfd);
    return 0;
}

ツッコミどころ満載のコードですし、脆弱性はありまくりです。これは、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 13:33

    ふむふむ・・・
    なるほど!
    最近、ソケットプログラミングをしているのですが、

    GET / HTTP/1.1
    このリクエストはGET とHTTPの間はURLで良いんですよね??

    キャンセル

  • 2017/01/28 13:45

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • セキュリティー

    463questions

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