hacktricks/network-services-pentesting/pentesting-snmp/README.md

21 KiB
Raw Blame History

161,162,10161,10162/udp - SNMPのペネトレーションテスト

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


バグバウンティのヒント: Intigriti登録しましょう。ハッカーによって作られたプレミアムなバグバウンティプラットフォームです!今日https://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得し始めましょう!

{% embed url="https://go.intigriti.com/hacktricks" %}

基本情報

SNMP - Simple Network Management Protocolは、ネットワーク内の異なるデバイスルーター、スイッチ、プリンター、IoTなどを監視するために使用されるプロトコルです。

PORT    STATE SERVICE REASON                 VERSION
161/udp open  snmp    udp-response ttl 244   ciscoSystems SNMPv3 server (public)

{% hint style="info" %} SNMPは、トラップのためにポート 162/UDP も使用します。これらは、明示的に要求されなくてもSNMPサーバーからクライアントに送信されるデータパケットです。 {% endhint %}

MIB

異なるメーカーやクライアント・サーバーの組み合わせでSNMPアクセスが機能するように、Management Information Base (MIB) が作成されました。MIBは、デバイス情報を保存するための独立した形式です。MIBは、デバイスの問い合わせ可能なSNMPオブジェクト標準化されたツリー階層でリストされているテキストファイルです。少なくとも1つの Object Identifier (OID) を含み、必要なユニークなアドレス名前に加えて、対象オブジェクトのタイプ、アクセス権、説明についての情報も提供します。 MIBファイルは、Abstract Syntax Notation One (ASN.1) ベースのASCIIテキスト形式で書かれています。MIBにはデータが含まれていませんが、どの情報をどこで見つけるか、どのように見えるかを説明し、特定のOIDに対してどの値を返すか、またはどのデータタイプが使用されるかを説明します。

OIDs

OIDsは、Object Identifiersを意味します。OIDsは、MIB階層内の管理対象オブジェクトを一意に識別します。これはツリーとして描かれ、そのレベルは異なる組織によって割り当てられます。トップレベルのMIBオブジェクトIDOIDは異なる標準組織に属しています。 ベンダーは、自社製品の管理対象オブジェクトを含むプライベートブランチを定義します。

こちらのウェブサイトからOIDツリーをナビゲートできます: http://www.oid-info.com/cgi-bin/display?tree=#focus または、1.3.6.1.2.1.1のようなOIDの意味を確認することができます: http://oid-info.com/get/1.3.6.1.2.1.1。 いくつかのよく知られたOIDがあります。例えば、1.3.6.1.2.1内のものは、Simple Network Management Protocol (SNMP)変数を定義したMIB-2を参照しています。そして、このOIDから派生するOIDからは、興味深いホストデータシステムデータ、ネットワークデータ、プロセスデータなどを取得できます。

OIDの例

1 . 3 . 6 . 1 . 4 . 1 . 1452 . 1 . 2 . 5 . 1 . 3. 21 . 1 . 4 . 7

このアドレスの内訳は以下の通りです。

  • 1 これはISOと呼ばれ、これがOIDであることを確立します。これが、すべてのOIDが「1」で始まる理由です。
  • 3 これはORGと呼ばれ、デバイスを構築した組織を指定するために使用されます。
  • 6 これはdod、つまりインターネットを最初に確立した組織である国防総省です。
  • 1 すべての通信がインターネットを通じて行われることを示すインターネットの値です。
  • 4 この値は、このデバイスが政府ではなく民間組織によって製造されたことを決定します。
  • 1 この値は、デバイスが企業またはビジネスエンティティによって製造されたことを示します。

これらの最初の6つの値は、すべてのデバイスに共通であり、それらについての基本情報を提供します。この数字のシーケンスは、デバイスが政府によって製造された場合を除いて、すべてのOIDで同じです。

次の一連の数字に進みます。

  • 1452 このデバイスを製造した組織の名前を示します。
  • 1 デバイスのタイプを説明します。この場合、それは目覚まし時計です。
  • 2 このデバイスがリモートターミナルユニットであることを決定します。

残りの値は、デバイスに関する具体的な情報を提供します。

  • 5 離散的なアラームポイントを示します。
  • 1 デバイス内の特定のポイント
  • 3 ポート
  • 21 ポートのアドレス
  • 1 ポートの表示
  • 4 ポイント番号
  • 7 ポイントの状態

(こちらからの例 here)

SNMPのバージョン

SNMPには2つの重要なバージョンがあります

  • SNMPv1: 主要なもので、最も頻繁に使用されており、認証は文字列(コミュニティ文字列)に基づいており、プレーンテキストで送信されます(すべての情報がプレーンテキストで送信されます)。バージョン2と2cトラフィックをプレーンテキストで送信し、認証にコミュニティ文字列を使用します。
  • SNMPv3: より良い認証形式を使用し、情報は暗号化されて送信されます(辞書攻撃が可能ですが、SNMPv1およびv2よりも正しい資格情報を見つけるのははるかに困難です

コミュニティ文字列

前述のように、MIBに保存された情報にアクセスするには、バージョン1および2/2cではコミュニティ文字列を、バージョン3では資格情報を知る必要があります。
コミュニティ文字列には2種類あります

  • public 主に読み取り専用機能
  • private 一般的に読み書き可能

OIDの書き込み可能性は使用されるコミュニティ文字列に依存するため、"public"が使用されているとしても、いくつかの値を書き込むことができる可能性があります。また、常に「読み取り専用」であるオブジェクトも存在するかもしれません。
オブジェクトに書き込みを試みると、noSuchNameまたはreadOnlyエラーが返されます。

バージョン1および2/2cでは、不正なコミュニティ文字列を使用すると、サーバーは応答しません。したがって、応答がある場合は、有効なコミュニティ文字列が使用されたということです。

ポート

コミュニティ文字列のブルートフォース (v1 と v2c)

コミュニティ文字列を推測するためには、辞書攻撃を行うことができます。SNMPに対してブルートフォース攻撃を行う異なる方法はこちらをチェックしてください。よく使われるコミュニティ文字列は public です。

SNMPの列挙

デバイスから収集した各OIDが意味するものを確認するために、以下のインストールが推奨されます:

apt-get install snmp-mibs-downloader
download-mibs
# Finally comment the line saying "mibs :" in /etc/snmp/snmp.conf
sudo vi /etc/snmp/snmp.conf

有効なコミュニティ文字列を知っている場合、SNMPWalk または SNMP-Check を使用してデータにアクセスできます:

snmpbulkwalk -c [COMM_STRING] -v [VERSION] [IP] . #Don't forget the final dot
snmpbulkwalk -c public -v2c 10.10.11.136 .

snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP]
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP] 1.3.6.1.2.1.4.34.1.3 #Get IPv6, needed dec2hex
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP] NET-SNMP-EXTEND-MIB::nsExtendObjects #get extended
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP] .1 #Enum all

snmp-check [DIR_IP] -p [PORT] -c [COMM_STRING]

nmap --script "snmp* and not snmp-brute" <target>

braa <community string>@<IP>:.1.3.6.* #Bruteforce specific OID
拡張クエリdownload-mibsのおかげで、以下のコマンドを使用してシステムについてさらに詳しく列挙することが可能です
snmpwalk -v X -c public <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull

SNMPにはホストに関する多くの情報が含まれており、興味深いものには次のようなものがあります:ネットワークインターフェースIPv4およびIPv6アドレス)、ユーザー名、稼働時間、サーバー/OSバージョン、プロセス

(パスワードが含まれている可能性があります)....

危険な設定

以下より https://academy.hackthebox.com/module/112/section/1075****

設定 説明
rwuser noauth 認証なしで完全なOIDツリーにアクセスできます。
rwcommunity <コミュニティ文字列> <IPv4アドレス> リクエストの送信元に関係なく、完全なOIDツリーにアクセスできます。
rwcommunity6 <コミュニティ文字列> <IPv6アドレス> rwcommunityと同じアクセス権を持ちますが、IPv6を使用する点が異なります。

Microsoft Windows SNMPパラメータ

MIB値 説明
1.3.6.1.2.1.25.1.6.0 システムプロセス。
1.3.6.1.2.1.25.4.2.1.2 実行中のプログラム。
1.3.6.1.2.1.25.4.2.1.4 プロセスパス。
1.3.6.1.2.1.25.2.3.1.4 ストレージユニット。
1.3.6.1.2.1.25.6.3.1.2 ソフトウェア名。
1.3.6.1.4.1.77.1.2.25 ユーザーアカウント。
1.3.6.1.2.1.6.13.1.3 TCPローカルポート。

Cisco

Cisco機器を使用している場合は、このページをご覧ください

{% content-ref url="cisco-snmp.md" %} cisco-snmp.md {% endcontent-ref %}

SNMPからRCEへ

SNMPサービス内で値を書き込むことを許可する文字列を持っている場合、それを悪用してコマンドを実行することができるかもしれません:

{% content-ref url="snmp-rce.md" %} snmp-rce.md {% endcontent-ref %}

大量のSNMP

Braa は大量のSNMPスキャナです。このツールの意図された使用法はもちろんSNMPクエリの実行ですが、net-snmpのsnmpwalkとは異なり、数十または数百のホストに対して同時に、そして単一のプロセスでクエリを実行することができます。そのため、非常に少ないシステムリソースを消費し、非常に高速にスキャンを行います。

Braaは独自のSNMPスタックを実装しているため、net-snmpのようなSNMPライブラリは必要ありません。

構文: braa [コミュニティ文字列]@[SNMPサーバのIP]:[iso id]

braa ignite123@192.168.1.125:.1.3.6.*

これにより、手動では処理できない多くのMBの情報を抽出できます。

では、最も興味深い情報を探してみましょう(https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/より):

デバイス

私が最初に行うことの一つは、収集した情報からどのデバイスがあるかを判断するために、各ファイルからsysDesc .1.3.6.1.2.1.1.1.0 MIBデータを抽出することです。これは以下のgrepコマンドを使用して簡単に行うことができます

grep ".1.3.6.1.2.1.1.1.0" *.snmp

プライベートストリングの特定

例えば、組織がCisco IOSルーターで使用しているプライベートコミュニティストリングを特定できれば、そのコミュニティストリングを使用してルーターの実行設定を抽出する可能性があります。このようなデータを見つける最良の方法は、しばしばSNMPトラップデータに関連していました。したがって、以下のgrepを使用して、キーワード「trap」を検索しながら多くのMIBデータを迅速に解析することができます

grep -i "trap" *.snmp

ユーザー名/パスワード

興味のあるもう一つの領域はログです。MIBテーブル内にログを保持しているデバイスがあることがわかりました。これらのログには、ログオンの試行に失敗した記録も含まれていることがあります。TelnetやSSHを介してデバイスにログインしようとして、うっかりユーザー名としてパスワードを入力した最後の時を考えてみてください。私は通常、failfailedlogin などのキーワードを検索し、価値のあるものがないかそのデータを調べます。

grep -i "login\|fail" *.snmp

メール

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp

SNMP値の変更

NetScanTools を使用して値を変更することができます。これを行うには、プライベートストリングを知っている必要があります。

スプーフィング

SMNPサービスへの問い合わせを許可されているIPだけにACLがある場合、UDPパケット内でこれらのアドレスの一つをスプーフし、トラフィックを嗅ぎ取ることができます。

SNMP設定ファイルの調査

  • snmp.conf
  • snmpd.conf
  • snmp-config.xml

HackTricks 自動コマンド

Protocol_Name: SNMP    #Protocol Abbreviation if there is one.
Port_Number:  161     #Comma separated if there is more than one.
Protocol_Description: Simple Network Managment Protocol         #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for SNMP
Note: |
SNMP - Simple Network Management Protocol is a protocol used to monitor different devices in the network (like routers, switches, printers, IoTs...).

https://book.hacktricks.xyz/pentesting/pentesting-snmp

Entry_2:
Name: SNMP Check
Description: Enumerate SNMP
Command: snmp-check {IP}

Entry_3:
Name: OneSixtyOne
Description: Crack SNMP passwords
Command: onesixtyone -c /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt {IP} -w 100

Entry_4:
Name: Nmap
Description: Nmap snmp (no brute)
Command: nmap --script "snmp* and not snmp-brute" {IP}

Entry_5:
Name: Hydra Brute Force
Description: Need Nothing
Command: hydra -P {Big_Passwordlist} -v {IP} snmp


バグバウンティのヒント: Intigriti登録しましょう。ハッカーによって作られたプレミアムなバグバウンティプラットフォームです!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**の報酬を獲得し始めましょう!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥