z4rootで携帯がtelnetサーバにもなる

Android携帯にz4rootというroot化のアプリを入れた。z4rootをインストールするとbusyboxというLinuxの標準コマンドが使えるようになるツールも一緒にインストールされる(busyboxについては“こちら”)。

で、busyboxの中身をもう一度よく見たら「おや、telnetd がある」と気が付いた。これはTelnetのサーバのプログラム。つまりこのbusyboxの中のtelnetdの機能を使えばネットワーク経由でアンドロイド端末にアクセスできる様になる。極端に言えばAndroid端末をTelnetサーバにできることになる。Telnetsshに比べセキュリティは低いが、まさか携帯電話をインターネット上でサーバとして運用するわけでもなく、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も含まれているが、こちらはとか色々と環境を設定しないと動きそうもないので使っていない。