z4rootで携帯がtelnetサーバにもなる
Android携帯にz4rootというroot化のアプリを入れた。z4rootをインストールするとbusyboxというLinuxの標準コマンドが使えるようになるツールも一緒にインストールされる(busyboxについては“こちら”)。
で、busyboxの中身をもう一度よく見たら「おや、telnetd がある」と気が付いた。これはTelnetのサーバのプログラム。つまりこのbusyboxの中のtelnetdの機能を使えばネットワーク経由でアンドロイド端末にアクセスできる様になる。極端に言えばAndroid端末をTelnetサーバにできることになる。Telnetはsshに比べセキュリティは低いが、まさか携帯電話をインターネット上でサーバとして運用するわけでもなく、LANに接続してアクセスする程度の話なので十分だろう。Android版のsshdもあるようだが、少ないメモリに色々なアプリも入れたくないし。
こんな感じでさっそくroot化してtelnetdを起動してみた。
# busybox telnetd
“ps”コマンドで確認すると、ちゃんと動いているようだが、PCからアクセスできない。telnetdのヘルプを見ていて気付いたのだが、telnetdはクライアントからのアクセスがあると標準では/bin/loginというコマンドを起動してユーザがログインするようになっている。しかしAndroidにはログインなんて概念はなく/bin/loginもある筈もない。動かないわけだ。
そこでクライアントからのアクセスがあった場合に/bin/loginではなく、/system/bin/sh を起動するようにしたら、すんなり動いた。つまり、PCからtelnetを掛けるとログイン画面ではなく、いきなりrootのプロンプトが現れる(telnetdがroot権限で動いているため)。
セキュリティ的にはちょっと危険だが、別にIS04をサーバにするわけでもなく、ちょっとrootでファイルをいじくりたい時に使うのだから逆に便利とも言える。(suしないで(rootにならないで)telentdの起動を試みたがソケットがバインドできなくてtelnetd自身が起動しない。)
さて、起動の方法だが、次のようにadbで入ってtelnetdを起動するだけ。何の設定も要らない。
android@android:~$ adb shell $ su # busybox telnetd -l /system/bin/sh #
端末をUSBデバッグモードにして(もっともz4rootを動かすためにはデバッグモードにしておかないとならないが)、adbで端末に入ってsuしてtelnetdを起動するだけ。これでPCからtelnetでアクセスできるようになる。(勿論、携帯が無線LAN等でIPネットワークに接続されていなければならない。)
試しにPCからアクセスしてみる。その前に携帯のIPアドレスが分からないとアクセスできないので、busyboxのifconfigを使って確かめる。
# busybox ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1784 errors:0 dropped:0 overruns:0 frame:0 TX packets:1784 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:89200 (87.1 KiB) TX bytes:89200 (87.1 KiB) wlan0 Link encap:Ethernet HWaddr 5C:DA:D4:12:34:56 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::abcd:ffff:ff12:3456/64 Scope:Link UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:564 errors:0 dropped:0 overruns:0 frame:0 TX packets:459 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:89681 (87.5 KiB) TX bytes:9488 (9.2 KiB)
この例では、端末のIPアドレスは“192.168.1.3”となっていることがわかる。早速、接続。Windowsでもtelnetは使えるのでここでは敢えてDOS窓のサンプルを載せておく。(勿論、TeraTermで使った方がより便利だが。)PCのDOS窓から“telnet 192.168.1.3”と打ち込む。
なんか拍子抜けする画面だが、確かにAndroidのシェルが動いている。
最初にUSBを使てadbで入らないければならないが、あとはネットワーク経由でアクセスできるので楽になる。私は ConnectBot という仮想端末ソフト(sshクライアントになる)を入れているが、このアプリはlocalに接続してAndroidのシェル端末として使うこともできる。これを入れておけば、USB経由のadbを使うことなしに端末でtelnetdを起動することができる。
なお、以上の方法でtelnetdを起動するとシェルはbusybox内蔵のB-Shellもどきではなく、Androidのshなのでちょっと不便だ。telnetで入って改めて
# busybox sh
と実行する必要がある。いきなりbusyboxのshを起動するにはtelnetdを次のように起動する。
# busybox telnetd -l /sdcard/lbin/sh
ただし、“/sdcard/lbin/sh”はbusyboxへのシンボリックリンクになっている必要があり、予め設定しておかなければならない。
# ls -l /sdcard/lbin/sh lrwxrwxrwx root root 2011-03-01 09:30 sh -> /system/bin/busybox
シンボリックリンクの設定についても“こちら”を参照のこと。(私の携帯ではbusyboxへのリンクを作ってあるので、イチイチ busyboxを打ち込む必要はない。)
あと、busyboxの中にはloginも含まれているが、こちらはとか色々と環境を設定しないと動きそうもないので使っていない。