161,162,10161,10162/udp - Pentesting SNMP

支持 HackTricks

如果你对 黑客职业 感兴趣并想要攻克不可攻克的目标 - 我们正在招聘! (要求流利的波兰语书写和口语能力).

基本信息

SNMP - 简单网络管理协议 是一种用于监控网络中不同设备(如路由器、交换机、打印机、物联网设备等)的协议。

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

SNMP 还使用端口 162/UDP 进行 traps。这些是 从 SNMP 服务器发送到客户端的数据包,而无需明确请求

MIB

为了确保 SNMP 访问在不同制造商和不同客户端-服务器组合之间正常工作,创建了 管理信息库 (MIB)。MIB 是 存储设备信息的独立格式。MIB 是一个 文本 文件,其中列出了设备的所有可查询 SNMP 对象,以 标准化 的树形层次结构呈现。它至少包含一个 对象标识符 (OID),该标识符除了必要的 唯一地址名称 外,还提供有关类型、访问权限和相应对象描述的信息。 MIB 文件采用 抽象语法标记一 (ASN.1) 基于 ASCII 文本格式编写。MIB 不包含数据,但它们解释了 在哪里找到哪些信息 以及它们的外观,返回特定 OID 的值,或使用哪种数据类型。

OIDs

对象标识符 (OIDs) 起着至关重要的作用。这些唯一标识符旨在管理 管理信息库 (MIB) 中的对象。

MIB 对象 ID 或 OID 的最高级别分配给不同的标准制定组织。在这些顶级中,建立了全球管理实践和标准的框架。

此外,供应商被授予建立私有分支的自由。在这些分支中,他们有 自主权来包含与其自身产品线相关的管理对象。该系统确保在不同供应商和标准之间有一个结构化和有组织的方法来识别和管理各种对象。

您可以通过此网站 浏览 OID 树: 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。 有一些 众所周知的 OID,例如 1.3.6.1.2.1 中的 OID,引用了 MIB-2 定义的简单网络管理协议 (SNMP) 变量。从 此 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 – 该值表示该设备是由企业或商业实体制造的。

这前六个值对于所有设备通常是相同的,它们提供了关于设备的基本信息。这个数字序列对于所有 OID 都是相同的,除非设备是由政府制造的。

接下来是下一组数字。

  • 1452 – 给出制造该设备的组织名称。

  • 1 – 解释设备的类型。在这种情况下,它是一个闹钟。

  • 2 – 确定该设备是一个远程终端单元。

其余的值提供有关设备的具体信息。

  • 5 – 表示一个离散的报警点。

  • 1 – 设备中的特定点

  • 3 – 端口

  • 21 – 端口的地址

  • 1 – 端口的显示

  • 4 – 点号

  • 7 – 点的状态

SNMP 版本

有两个重要的 SNMP 版本:

  • SNMPv1:主要版本,仍然是最常见的,身份验证基于字符串(社区字符串),以 明文 形式传输(所有信息以明文形式传输)。版本 2 和 2c 也以 明文 发送 流量,并使用 社区字符串作为身份验证

  • SNMPv3:使用更好的 身份验证 形式,信息以 加密 形式传输(可以进行 字典攻击,但找到正确的凭据比在 SNMPv1 和 v2 中要困难得多)。

社区字符串

如前所述,要访问保存在 MIB 上的信息,您需要知道版本 1 和 2/2c 的社区字符串,以及版本 3 的凭据。2 种类型的社区字符串

  • public 主要是 只读 功能

  • private 读/写 一般

请注意,OID 的可写性取决于使用的社区字符串,因此 即使 您发现使用了“public”,您也可能能够 写入某些值。此外,可能存在 始终为“只读” 的对象。 如果您尝试 写入 一个对象,将收到 noSuchNamereadOnly 错误**.**

在版本 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

如果您知道有效的社区字符串,您可以使用 SNMPWalkSNMP-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 地址)、用户名、正常运行时间、服务器/操作系统版本,以及 进程

运行中(可能包含密码)....

危险设置

在网络管理领域,某些配置和参数是确保全面监控和控制的关键。

访问设置

两个主要设置使访问 完整的 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 设备,请查看此页面:

Cisco SNMP

从 SNMP 到 RCE

如果您拥有允许您 写入值 到 SNMP 服务的 字符串,您可能能够利用它来 执行命令

SNMP RCE

大规模 SNMP

Braa 是一个大规模 SNMP 扫描器。此类工具的预期用途当然是进行 SNMP 查询——但与来自 net-snmp 的 snmpwalk 不同,它能够同时查询数十或数百个主机,并且在一个进程中。因此,它消耗的系统资源非常少,并且扫描速度非常快。

Braa 实现了自己的 SNMP 栈,因此不需要任何 SNMP 库,如 net-snmp。

语法: braa [社区字符串]@[[SNMP 服务器的 IP]:[iso id]

braa ignite123@192.168.1.125:.1.3.6.*

这可以提取大量您无法手动处理的信息。

所以,让我们寻找最有趣的信息(来自 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 命令 完成的:

grep ".1.3.6.1.2.1.1.1.0" *.snmp

识别私有字符串

一个关键步骤是识别组织使用的 私有社区字符串,特别是在 Cisco IOS 路由器上。这个字符串使得从路由器中提取 运行配置 成为可能。识别通常依赖于分析 SNMP Trap 数据中包含 "trap" 的内容,使用 grep 命令

grep -i "trap" *.snmp

用户名/密码

存储在 MIB 表中的日志会被检查以寻找 失败的登录尝试,这些尝试可能意外地包括作为用户名输入的密码。搜索关键词如 failfailedlogin 以找到有价值的数据:

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

Emails

最后,为了从数据中提取电子邮件地址,使用带有正则表达式的grep命令,重点关注与电子邮件格式匹配的模式:

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

修改 SNMP 值

您可以使用 NetScanTools修改值。您需要知道 私有字符串 才能做到这一点。

欺骗

如果有一个 ACL 只允许某些 IP 查询 SNMP 服务,您可以在 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

支持 HackTricks

Last updated