接点閉鎖によるONT Sercomm RV6688へのルートアクセスの取得

かつて、著者は良いものに代わる新しいものを望み、有名なオペレーターからGPONに接続することにしました。 そして著者は、電話をかけたり、インターネットをサーフィンしたり、テレビを見たりするための魔法の箱をアパートに入れ、そこに本物の光ケーブルを持ち込みました。 そして、このボックスは、光ネットワーク端末(ONT)Sercomm RV6688と呼ばれ、このまさにオペレーターの注文によって作られ、対応するロゴが描かれています。

ボックスが機能します。 しかし、作者は座っていなかったので、もう一度何かを望んでいたので、ボックス内のこのすべての魔法がどのように得られ、それを細かく制御できるかを明らかにしました。 しかし、驚くことなく魔法はあります。



出発点



インターネットのトピックで見つけられるもの。 「ベースボードの下」の管理者権限を持つ手動管理者から知られている管理者アカウントに加えて、技術フォーラムの拡張サポート権限を持つ「秘密」(ここには記載されていません)アカウントを掘り下げることができました。 ONTオペレーティングシステム。 また、ユーザーの権利を高めることができるWebインターフェースの「穴」についても言及しましたが、新しいファームウェアではすぐに削除されたため、関連性が失われました。



独自の方法



このような機器の経験から、ONTにはサービス用のポートが必要であることが示唆されました。 通常、これはRS-232シリアルポートであり、(まれに)12 VレベルのD-subコネクタで外部に出力されるか、TTLレベルが+ 5 Vまたは+ 3.3 Vのピンブロックの形でボード上に存在します。 追加の電圧レベル変換チップのない純粋なUART。 多くの場合、Linuxコンソール(ONT Linuxの内部に疑いの余地はありませんか?:)およびRedbootブートローダーコンソール、U-boot、Bareboxなどは、Linuxなどのtty *デバイスと呼ばれるこのポートにアクセスされます。このコンソールへのアクセスが提供されました幅広い分野のアクションがあります。 しかし、外部コネクタが見つかりませんでした。

一般に、ONTのネジを外し始めたとき、これらの仮定に固執しました。 麻酔薬については、保護シールのシールに関するいくつかの言葉。 RV6688のプラスチックケースは、シールを破らずに「トリッキー」にわずかに開くことができます。 ベンドの密閉ネジの締め付けをわずかに「緊張」させると、ボードを取り外すことさえできます。



ONTボード:







光モジュールを数秒間見てからボードをすばやく検査すると、同じサービスポートの候補が明らかになりました。 そして、RX、TX、GNDの署名はこの意見を強めただけです。 マルチメータテストにより、これが3.5VレベルのUARTであることが示されました。



サービスポート:







その時点では、USB <-> UART(TTL)アダプターは手元にありませんでしたが、信号変換器として機能するArduino Mega 2560ボードがありました。 念のため、UARTメガを使用しない(入力を高インピーダンス状態に変換する)空のスケッチをそこに注ぎました。



USB <-> UARTコンバーターとしてのArduino Mega 2560:







次に、簡単なケーブルを作成し、PCに接続して、お気に入りのTera Term端末プログラムを起動します。 そして最後に、ブートプロセスの1秒間の中断とU-Bootローダー環境への招待を伴うブートログの予想される行を表示する満足度。 ブートの最後に、Linuxログインプロンプトが表示されます。 しかし、既知のONTログイン/パスワードのペアはいずれも表示されなかったため、調査の次のステップはU-Bootブートローダー環境に入り、ログインプロンプトをバイパスできるようにするなど、Linuxブートプロセスを制御できるようにすることです!



出力のロードを開始します。

BL LILAC STARTER VER-2.1.06.0-BL (Aug 26 2013 - 17:00:31) SOC ID: BL_23570 Init DDR3.... 128MB Attempt to boot from NAND... Try to load bootloader from boot bank 0 Bootloader Loaded to DRAM Cache enabled, start bootloader... .... Enter 'Ctrl+C' to stop autoboot: 0 ....
      
      





そして今、リラックスしてコーヒーを飲みながらゆっくりとU-Boot環境変数を調べなければなりませんが、ONT開発者は興味深い驚きを提示しました。



Ctrl + Cの組み合わせが機能せず、この段階でU-Boot環境に入ることができないことが判明しました! 他の多くのランダムなキーの組み合わせを試し、ターミナルプログラムの設定と通信速度を変更しました。 無駄に。 PC(RXからONT)からのデータ送信は機能しなかったと思いますが、ブート手順の最後に、ログインLinuxプロンプトが表示されたとき、キーボード入力はすでに機能していました。 一般に、キーボードで作業しても何も得られませんでした。 (何らかのキーの組み合わせがまだあると思いますが...)



私は冷たいコーヒーを終えて、状況について考えました。 ユーレカはすぐに来ました。 ブート時に、プロセッサはこのダウンロードの手順に従ってフラッシュメモリを熱心に読み取ります。 ダウンロードの中断を求めるプロンプトが表示されるまでブートローダーとそのパラメーターをロードし、システムのカーネルなどを読み取ります。 1秒待ってから。 アイデアは単純でした。画面でカウントダウンがカチカチになった瞬間に、フラッシュからデータを読み取る機能をブロックします。 ブート手順が中断され(読み取りエラー)、U-ブートコンソールへの移行が実行され、ブートパラメーターが修正されます(少なくとも、私は思ったとおりです)。 可能な実装オプションの中で、最も労働集約的でなく、私の意見では中程度に安全なものとして以下が選択されました。 ブートローダーを起動した後、フラッシュチップのレッグ43、44を短絡し、1秒の遅延の直後にデータの正しい読み取りをブロックすることにしました。 これは、細いドライバーを使用して実装されました。 3回目の試行から、私はより自信を持ってドライバーで「突く」ようになりました。



フラッシュレッグ:







これは、リバースレポートの瞬間からフラッシュデータの短い行で起動しようとする試みです。

 Enter 'Ctrl+C' to stop autoboot: 0 UBI: mtd1 is detached from ubi0 Creating 1 MTD partitions on "nand0": 0x000000100000-0x000000200000 : "mtd=1" UBI: attaching mtd1 to ubi0 UBI: empty MTD device detected UBI: create volume table (copy #1) UBI error: ubi_scan_get_free_peb: no eraseblocks found UBI error: ubi_init: cannot attach mtd1 UBI error: ubi_init: UBI error: cannot initialize UBI, error -28 UBI init error -28 ERROR: failed to select 'cfg' partition Creating 1 MTD partitions on "nand0": 0x000000100000-0x000000200000 : "mtd=1" UBI: attaching mtd1 to ubi0 UBI: empty MTD device detected UBI: create volume table (copy #1) UBI error: ubi_scan_get_free_peb: no eraseblocks found UBI error: ubi_init: cannot attach mtd1 UBI error: ubi_init: UBI error: cannot initialize UBI, error -28 UBI init error -28 ERROR: failed to select 'cfg' partition Creating 1 MTD partitions on "nand0": 0x000000100000-0x000000200000 : "mtd=1" UBI: attaching mtd1 to ubi0 UBI: empty MTD device detected UBI: create volume table (copy #1) UBI error: ubi_scan_get_free_peb: no eraseblocks found UBI error: ubi_init: cannot attach mtd1 UBI error: ubi_init: UBI error: cannot initialize UBI, error -28 UBI init error -28 ERROR: failed to select 'cfg' partition =>
      
      





ご覧のとおり、最後にU-bootコマンドプロンプトが表示されました。 中身を見てみましょう(printenv):

 => printenv bootcmd=blboot baudrate=115200 consoledev=ttyS0 modetty0=115200n8 mtdids=nand0=nand mtdparts=mtdparts=nand:0x100000(starter),0x100000(cfg),0x200000(uboot0),0x200000(uboot1),0x100000(cal),0x400000(linux0),0x400000(linux1),0x2800000(rootfs0),0x2800000(rootfs1),0x800000(sc_config),0x100000(bbt) mem_reserve_low=tm=0x1400000 mc=0x400000 dsp=0x200000 EMACS_GRP_MODE=QSGMII EMAC=EMAC0 E4_MODE=NONE ethact=ETHMAC0 bootdelay=1 update_uboot=tftp a9d00000 u-boot.bin;blnp uboot;saveenv update_kernel=tftp a9d00000 uImage;blnp linux;saveenv update_rootfs=tftp a9d00000 rootfs.img;blnp rootfs;saveenv bootargs=ubi.mtd=0 ubi.mtd=11 root=ubi0_0 rw rootfstype=ubifs console=ttyS0,115200 xx=dd filesize=CEB800 fileaddr=A9D00000 gatewayip=192.168.1.254 netmask=255.255.255.0 ipaddr=172.21.17.188 serverip=172.21.17.155 boot_ver=1110 ethaddr=d4:21:22:xx:xx:xx memsize=128M stdin=serial stdout=serial stderr=serial partition=nand0,0 mtddevnum=0 mtddevname=starter Environment size: 946/262140 bytes =>
      
      





これで変数を調整できます。 待機ポーズを3秒に増やし、Initプロセスをshell / bin / shに置き換えます(なぜログインが必要なのですか?いいえ、ログインは不要です)。 つまり 簡単なシングルユーザーのダウンロードを作成しましょう。

 Environment size: 946/262140 bytes => setenv bootdelay 3 => setenv bootargs ubi.mtd=0 ubi.mtd=11 root=ubi0_0 rw rootfstype=ubifs console=ttyS0,115200 single init=/bin/sh => saveenv => printenv ... bootargs=ubi.mtd=0 ubi.mtd=11 root=ubi0_0 rw rootfstype=ubifs console=ttyS0,115200 single init=/bin/sh ... Environment size: 966/262140 bytes =>
      
      





変更を保存して(saveenv)、bootcmdを実行するか、ONTのパワーを歪めます。

ここで、ドライバーを使用せずにONTが完全にロードされるまで待機します。

ダウンロードログの最後の行:

 UBIFS: file system size: 14450688 bytes (14112 KiB, 13 MiB, 112 LEBs) UBIFS: journal size: 2967552 bytes (2898 KiB, 2 MiB, 23 LEBs) UBIFS: media format: w4/r0 (latest is w4/r0) UBIFS: default compressor: zlib UBIFS: reserved for root: 0 bytes (0 KiB) Freeing unused kernel memory: 196k freed BusyBox v1.15.3 () built-in shell (ash) Enter 'help' for a list of built-in commands. /bin/sh: can't access tty; job control turned off / # # whoami SuperUser
      
      





ほら、私たちはrootfsにいます。



結論として、SSH経由で接続するユーザーのアクセス許可を増やす方法に関する推奨事項。

SSHでこのONTを使用した人は、非常に伝統的なLinuxシェルを起動していないことに気づいています。 構成ファイル/ var / cli_pwを見つけました。このファイルには、CLIユーザー(主にSSHユーザー)に関する情報が含まれ、/ etc / passwdに類似した構文があります



次のように、ユーザーレコードをこのファイルに直接追加することは意味がありません。 すべてのリブート/ var / cli_pwは、他の場所に保管されている構成から上書きされます。 したがって、自動実行スクリプト/ etc / rcSを使用して、ユーザーを/ var / cli_pwに追加しました。 再起動するたびに、このコマンドが実行されます。 次のようなものを/ etc / rcSに追加します。

 echo 'alex:$1$SERCOMM$/Yr1kjT7kcnd11coqAlgN1:0:0:root:/:/bin/sh' >> /var/cli_pw
      
      





支援するViエディター。

したがって、SSHを介してONTに接続する場合、ユーザーalexは完全な管理者権限を持ちます。

これで、U-Boot変数を元の値に戻し、ルートアクセスを楽しむことができます。



All Articles