# 161,162,10161,10162/udp - Pentesting SNMP {{#include ../../banners/hacktricks-training.md}} ## 基本信息 **SNMP - 简单网络管理协议** 是一种用于监控网络中不同设备的协议(如路由器、交换机、打印机、物联网设备等)。 ``` PORT STATE SERVICE REASON VERSION 161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public) ``` > [!NOTE] > SNMP 还使用端口 **162/UDP** 进行 **traps**。这些是 **从 SNMP 服务器发送到客户端的数据包,而无需明确请求**。 ### MIB 为了确保 SNMP 访问在不同制造商和不同客户端-服务器组合之间正常工作,创建了 **管理信息库 (MIB)**。MIB 是一种 **存储设备信息的独立格式**。MIB 是一个 **文本** 文件,其中列出了设备的所有可查询 **SNMP 对象**,以 **标准化** 的树形层次结构呈现。它至少包含一个 `对象标识符` (`OID`),该标识符除了必要的 **唯一地址** 和 **名称** 外,还提供有关类型、访问权限和相应对象描述的信息。\ MIB 文件采用 `抽象语法标记一` (`ASN.1`) 基于 ASCII 文本格式编写。**MIB 不包含数据**,但它们解释 **在哪里找到哪些信息** 以及它们的外观,返回特定 OID 的值,或使用哪种数据类型。 ### OIDs **对象标识符 (OIDs)** 起着至关重要的作用。这些唯一标识符旨在管理 **管理信息库 (MIB)** 中的对象。 MIB 对象 ID 或 OID 的最高级别分配给各种标准制定组织。在这些顶级中,建立了全球管理实践和标准的框架。 此外,供应商被授予建立私有分支的自由。在这些分支中,他们有 **自主权来包含与其自身产品线相关的管理对象**。该系统确保在不同供应商和标准之间有一个结构化和有组织的方法来识别和管理各种对象。 ![](<../../images/SNMP_OID_MIB_Tree (1).png>) 您可以通过网络 **导航** 通过 **OID 树**: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) 或 **查看 OID 的含义**(如 `1.3.6.1.2.1.1`)访问 [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1)。\ 有一些 **知名的 OID**,例如 [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 中的 OID,引用了 MIB-2 定义的简单网络管理协议 (SNMP) 变量。从 **此 OID 的待处理 OID** 中,您可以获取一些有趣的主机数据(系统数据、网络数据、进程数据...) ### **OID 示例** [**来自这里的示例**](https://www.netadmintools.com/snmp-mib-and-oids/): **`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 – 该值表示该设备是由企业或商业实体制造的。 这前六个值对于所有设备来说往往是相同的,它们提供了关于设备的基本信息。这个数字序列对于所有 OID 来说都是相同的,除非设备是由政府制造的。 接下来是下一组数字。 - 1452 – 给出制造该设备的组织名称。 - 1 – 解释设备的类型。在这种情况下,它是一个闹钟。 - 2 – 确定该设备是一个远程终端单元。 其余的值提供有关设备的具体信息。 - 5 – 表示一个离散的报警点。 - 1 – 设备中的特定点 - 3 – 端口 - 21 – 端口地址 - 1 – 端口的显示 - 4 – 点号 - 7 – 点的状态 ### SNMP 版本 有 2 个重要的 SNMP 版本: - **SNMPv1**:主要版本,仍然是最常见的,**身份验证基于字符串**(社区字符串),以 **明文** 形式传输(所有信息以明文传输)。**版本 2 和 2c** 也以 **明文** 发送 **流量**,并使用 **社区字符串作为身份验证**。 - **SNMPv3**:使用更好的 **身份验证** 形式,信息以 **加密** 形式传输(可以进行 **字典攻击**,但找到正确的凭据比在 SNMPv1 和 v2 中要困难得多)。 ### 社区字符串 如前所述,**要访问 MIB 中保存的信息,您需要知道版本 1 和 2/2c 的社区字符串,以及版本 3 的凭据。**\ 有 **2 种类型的社区字符串**: - **`public`** 主要是 **只读** 功能 - **`private`** **读/写** 一般 请注意,**OID 的可写性取决于使用的社区字符串**,因此 **即使** 您发现使用了“**public**”,您也可能能够 **写入某些值**。此外,可能存在 **始终为“只读”的对象**。\ 如果您尝试 **写入** 一个对象,将收到 **`noSuchName` 或 `readOnly` 错误**。 在版本 1 和 2/2c 中,如果您使用 **错误的** 社区字符串,服务器将不会 **响应**。因此,如果它响应,则使用了 **有效的社区字符串**。 ## 端口 [来自维基百科](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol): - SNMP 代理在 UDP 端口 **161** 上接收请求。 - 管理器在端口 **162** 上接收通知([Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) 和 [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest))。 - 当与 [传输层安全性](https://en.wikipedia.org/wiki/Transport_Layer_Security) 或 [数据报传输层安全性](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security) 一起使用时,请求在端口 **10161** 上接收,通知发送到端口 **10162**。 ## 暴力破解社区字符串 (v1 和 v2c) 要 **猜测社区字符串**,您可以执行字典攻击。查看 [这里不同的方式来对 SNMP 执行暴力攻击](../../generic-hacking/brute-force.md#snmp)。一个常用的社区字符串是 `public`。 ## 枚举 SNMP 建议安装以下内容,以查看从设备收集的 **每个 OID 的含义**: ```bash 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** 访问数据: ```bash 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" braa @:.1.3.6.* #Bruteforce specific OID ``` 通过扩展查询(download-mibs),可以使用以下命令枚举更多关于系统的信息: ```bash snmpwalk -v X -c public NET-SNMP-EXTEND-MIB::nsExtendOutputFull ``` **SNMP** 具有大量关于主机的信息,您可能会发现有趣的内容包括:**网络接口**(IPv4 和 **IPv6** 地址)、用户名、正常运行时间、服务器/操作系统版本和 **进程** **运行中**(可能包含密码).... ### **危险设置** 在网络管理领域,某些配置和参数是确保全面监控和控制的关键。 ### 访问设置 两个主要设置使访问 **完整的 OID 树** 成为可能,这是网络管理中的一个关键组成部分: 1. **`rwuser noauth`** 被设置为允许在不需要身份验证的情况下完全访问 OID 树。此设置简单明了,允许无限制访问。 2. 为了更具体的控制,可以使用以下方式授予访问权限: - **`rwcommunity`** 用于 **IPv4** 地址,和 - **`rwcommunity6`** 用于 **IPv6** 地址。 这两个命令都需要一个 **社区字符串** 和相关的 IP 地址,无论请求的来源如何,都提供完全访问权限。 ### SNMP 参数用于 Microsoft Windows 一系列 **管理信息库 (MIB) 值** 被用于通过 SNMP 监控 Windows 系统的各个方面: - **系统进程**:通过 `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` MIB 值。 - **存储单元**:通过 `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` 值允许跟踪用户账户。 - **TCP 本地端口**:最后,`1.3.6.1.2.1.6.13.1.3` 被指定用于监控 TCP 本地端口,提供对活动网络连接的洞察。 ### Cisco 如果您使用 Cisco 设备,请查看此页面: {{#ref}} cisco-snmp.md {{#endref}} ## 从 SNMP 到 RCE 如果您拥有允许您在 SNMP 服务中 **写入值** 的 **字符串**,您可能能够利用它来 **执行命令**: {{#ref}} snmp-rce.md {{#endref}} ## **大规模 SNMP** [Braa](https://github.com/mteg/braa) 是一个大规模 SNMP 扫描器。此类工具的预期用途当然是进行 SNMP 查询——但与来自 net-snmp 的 snmpwalk 不同,它能够同时查询数十或数百个主机,并且在一个进程中。因此,它消耗的系统资源非常少,并且扫描速度非常快。 Braa 实现了自己的 SNMP 堆栈,因此不需要任何 SNMP 库,如 net-snmp。 **语法:** braa \[Community-string]@\ [IP of SNMP server]:\[iso id] ```bash braa ignite123@192.168.1.125:.1.3.6.* ``` 这可以提取大量您无法手动处理的信息。 所以,让我们寻找最有趣的信息(来自 [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)): ### **设备** 该过程从每个文件中提取 **sysDesc MIB 数据** (1.3.6.1.2.1.1.1.0) 开始,以识别设备。这是通过使用 **grep 命令** 完成的: ```bash grep ".1.3.6.1.2.1.1.1.0" *.snmp ``` ### **识别私有字符串** 一个关键步骤是识别组织使用的 **私有社区字符串**,特别是在 Cisco IOS 路由器上。这个字符串使得从路由器中提取 **运行配置** 成为可能。识别通常依赖于分析 SNMP Trap 数据中包含 "trap" 的 **grep 命令**: ```bash grep -i "trap" *.snmp ``` ### **用户名/密码** 存储在 MIB 表中的日志会被检查以寻找 **登录失败尝试**,这可能意外地包括作为用户名输入的密码。搜索关键词如 _fail_、_failed_ 或 _login_ 以找到有价值的数据: ```bash grep -i "login\|fail" *.snmp ``` ### **Emails** 最后,为了从数据中提取 **email addresses**,使用带有正则表达式的 **grep command**,重点关注匹配电子邮件格式的模式: ```bash grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp ``` ## 修改 SNMP 值 您可以使用 _**NetScanTools**_ 来 **修改值**。您需要知道 **私有字符串** 才能做到这一点。 ## 欺骗 如果有一个 ACL 只允许某些 IP 查询 SMNP 服务,您可以在 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.wiki/en/network-services-pentesting/pentesting-smtp/index.html 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 ``` {{#include ../../banners/hacktricks-training.md}}