UART
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
UARTはシリアルプロトコルであり、コンポーネント間でデータを1ビットずつ転送します。対照的に、並列通信プロトコルは複数のチャネルを通じてデータを同時に送信します。一般的なシリアルプロトコルには、RS-232、I2C、SPI、CAN、Ethernet、HDMI、PCI Express、USBがあります。
一般的に、UARTがアイドル状態のとき、ラインは高い状態(論理1値)に保たれます。次に、データ転送の開始を示すために、送信者は受信者にスタートビットを送信し、その間、信号は低い状態(論理0値)に保たれます。次に、送信者は実際のメッセージを含む5〜8ビットのデータを送信し、オプションのパリティビットと1または2のストップビット(論理1値)を続けます。エラーチェックに使用されるパリティビットは、実際にはほとんど見られません。ストップビット(またはビット)は、送信の終了を示します。
最も一般的な構成を8N1と呼びます:8ビットのデータ、パリティなし、1つのストップビット。たとえば、Cという文字、またはASCIIで0x43を8N1 UART構成で送信したい場合、次のビットを送信します:0(スタートビット);0、1、0、0、0、0、1、1(0x43のバイナリ値)、および0(ストップビット)。
UARTと通信するためのハードウェアツール:
USB-to-serialアダプタ
CP2102またはPL2303チップを搭載したアダプタ
Bus Pirate、Adafruit FT232H、Shikra、またはAttify Badgeなどの多目的ツール
UARTには4つのポートがあります:TX(送信)、RX(受信)、Vcc(電圧)、およびGND(グラウンド)。PCBに**TX
およびRX
の文字が書かれている4つのポートを見つけることができるかもしれません。しかし、表示がない場合は、マルチメーターやロジックアナライザー**を使用して自分で見つける必要があるかもしれません。
マルチメーターを使用し、デバイスの電源を切った状態で:
GNDピンを特定するには、連続性テストモードを使用し、バックリードをグラウンドに置き、赤いリードでテストしてマルチメーターから音が聞こえるまで続けます。PCBには複数のGNDピンがあるため、UARTに属するものを見つけたかどうかはわかりません。
VCCポートを特定するには、DC電圧モードを設定し、20Vの電圧に設定します。黒いプローブをグラウンドに、赤いプローブをピンに置き、デバイスの電源を入れます。マルチメーターが3.3Vまたは5Vの一定の電圧を測定した場合、Vccピンを見つけたことになります。他の電圧が得られた場合は、他のポートで再試行します。
TX ポートを特定するには、DC電圧モードを20Vに設定し、黒いプローブをグラウンドに、赤いプローブをピンに置き、デバイスの電源を入れます。電圧が数秒間変動し、その後Vcc値で安定する場合、TXポートを見つけた可能性が高いです。これは、電源を入れるとデバッグデータを送信するためです。
RXポートは他の3つに最も近く、電圧の変動が最も少なく、すべてのUARTピンの中で最も低い全体的な値を持っています。
TXポートとRXポートを混同しても何も起こりませんが、GNDとVCCポートを混同すると回路が壊れる可能性があります。
一部のターゲットデバイスでは、製造元によってRXまたはTX、または両方が無効にされている場合があります。その場合、回路基板の接続を追跡し、ブレークアウトポイントを見つけることが役立ちます。UARTの検出が確認できず、回路が壊れていることを確認する強い手がかりは、デバイスの保証を確認することです。デバイスが保証付きで出荷されている場合、製造元はデバッグインターフェース(この場合はUART)を残しており、したがってUARTを切断し、デバッグ中に再接続する必要があります。これらのブレークアウトピンは、はんだ付けまたはジャンパーワイヤーで接続できます。
正しいボーレートを特定する最も簡単な方法は、TXピンの出力を見てデータを読み取ることです。受信したデータが読み取れない場合は、次の可能なボーレートに切り替えてデータが読み取れるようになるまで続けます。これを行うには、USB-to-serialアダプタやBus Pirateのような多目的デバイスを使用し、baudrate.pyのようなヘルパースクリプトと組み合わせます。最も一般的なボーレートは9600、38400、19200、57600、115200です。
このプロトコルでは、1つのデバイスのTXを他のデバイスのRXに接続する必要があることに注意してください!
CP210Xチップは、NodeMCU(esp8266搭載)などの多くのプロトタイピングボードでシリアル通信に使用されます。これらのアダプタは比較的安価で、ターゲットのUARTインターフェースに接続するために使用できます。デバイスには5つのピンがあります:5V、GND、RXD、TXD、3.3V。ターゲットがサポートする電圧に接続して、損傷を避けてください。最後に、アダプタのRXDピンをターゲットのTXDに、アダプタのTXDピンをターゲットのRXDに接続します。
アダプタが検出されない場合は、ホストシステムにCP210Xドライバーがインストールされていることを確認してください。アダプタが検出されて接続されると、picocom、minicom、またはscreenなどのツールを使用できます。
Linux/MacOSシステムに接続されているデバイスをリストするには:
UARTインターフェースとの基本的なインタラクションには、次のコマンドを使用します:
minicomの設定には、次のコマンドを使用します:
設定をSerial port setup
オプションでボーレートやデバイス名などに構成します。
構成後、minicom
コマンドを使用してUARTコンソールを起動します。
UARTシリアルからUSBアダプタが利用できない場合、Arduino UNO R3を使って簡単なハックが可能です。Arduino UNO R3は通常どこでも入手できるため、これにより多くの時間を節約できます。
Arduino UNO R3には、ボード自体にUSBからシリアルへのアダプタが組み込まれています。UART接続を得るには、ボードからAtmel 328pマイクロコントローラーチップを抜くだけです。このハックは、Atmel 328pがボードにハンダ付けされていないArduino UNO R3のバリアント(SMDバージョンが使用されています)で機能します。ArduinoのRXピン(デジタルピン0)をUARTインターフェースのTXピンに接続し、ArduinoのTXピン(デジタルピン1)をUARTインターフェースのRXピンに接続します。
最後に、Arduino IDEを使用してシリアルコンソールを取得することをお勧めします。メニューのtools
セクションでSerial Console
オプションを選択し、UARTインターフェースに応じてボーレートを設定します。
このシナリオでは、プログラムのすべての出力をシリアルモニターに送信しているArduinoのUART通信をスニッフィングします。
UART Consoleは、ランタイム環境で基盤となるファームウェアと作業するための優れた方法を提供します。しかし、UART Consoleのアクセスが読み取り専用の場合、多くの制約が生じる可能性があります。多くの組み込みデバイスでは、ファームウェアはEEPROMに保存され、揮発性メモリを持つプロセッサで実行されます。したがって、元のファームウェアは製造時にEEPROM自体にあり、新しいファイルは揮発性メモリのために失われるため、ファームウェアは読み取り専用のままに保たれます。したがって、組み込みファームウェアで作業する際にファームウェアをダンプすることは貴重な努力です。
これを行う方法はたくさんあり、SPIセクションではさまざまなデバイスを使用してEEPROMから直接ファームウェアを抽出する方法を説明しています。ただし、物理デバイスや外部インタラクションを使用してファームウェアをダンプすることはリスクがあるため、最初にUARTを使用してファームウェアをダンプすることをお勧めします。
UART Consoleからファームウェアをダンプするには、まずブートローダーにアクセスする必要があります。多くの人気ベンダーは、Linuxをロードするためのブートローダーとしてuboot(Universal Bootloader)を使用しています。したがって、ubootにアクセスすることが必要です。
ブートローダーにアクセスするには、UARTポートをコンピュータに接続し、任意のシリアルコンソールツールを使用し、デバイスへの電源供給を切断します。セットアップが完了したら、Enterキーを押して保持します。最後に、デバイスに電源を接続し、ブートさせます。
これを行うと、ubootのロードが中断され、メニューが表示されます。ubootコマンドを理解し、ヘルプメニューを使用してそれらをリストすることをお勧めします。これがhelp
コマンドかもしれません。異なるベンダーが異なる構成を使用しているため、それぞれを個別に理解することが必要です。
通常、ファームウェアをダンプするためのコマンドは:
これは「メモリダンプ」を意味します。これにより、メモリ(EEPROMコンテンツ)が画面にダンプされます。メモリダンプをキャプチャするために、手順を開始する前にシリアルコンソールの出力をログに記録することをお勧めします。
最後に、ログファイルから不要なデータをすべて削除し、ファイルを filename.rom
として保存し、binwalkを使用して内容を抽出します:
これは、16進数ファイルに見つかった署名に従って、EEPROMからの可能な内容をリストします。
ただし、使用されている場合でも、ubootが常にロック解除されているわけではないことに注意する必要があります。Enterキーが何も反応しない場合は、Spaceキーなどの異なるキーを確認してください。ブートローダーがロックされていて中断されない場合、この方法は機能しません。デバイスのブートローダーがubootであるかどうかを確認するには、デバイスのブート中にUARTコンソールの出力を確認してください。ブート中にubootと表示されるかもしれません。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)