hacktricks/network-services-pentesting/pentesting-snmp
2023-08-03 19:12:22 +00:00
..
cisco-snmp.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated to Chinese 2023-08-03 19:12:22 +00:00
snmp-rce.md Translated to Chinese 2023-08-03 19:12:22 +00:00

161,162,10161,10162/udp - 渗透测试SNMP

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


Bug赏金提示注册Intigriti一个由黑客创建的高级Bug赏金平台!立即加入我们的https://go.intigriti.com/hacktricks,开始赚取高达**$100,000**的赏金!

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

基本信息

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

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

OID

OID代表对象标识符OID在MIB层次结构中唯一标识受管对象。这可以表示为树其级别由不同组织分配。顶级MIB对象IDOID属于不同的标准组织。
供应商定义了包括其自己产品的受管对象的私有分支

您可以从这里通过OID树进行导航http://www.oid-info.com/cgi-bin/display?tree=#focus,或者通过访问http://oid-info.com/get/1.3.6.1.2.1.1查看OID的含义(例如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中困难得多

社区字符串

如前所述在版本1和2/2c上访问MIB上保存的信息时需要知道社区字符串而在版本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地址)、用户名、运行时间、服务器/操作系统版本和正在运行的进程(可能包含密码)....

危险的设置

来自https://academy.hackthebox.com/module/112/section/1075的设置:

设置 描述
rwuser noauth 提供对完整OID树的无需身份验证的访问权限。
rwcommunity <community string> <IPv4 address> 提供对完整OID树的访问权限无论请求来自何处。
rwcommunity6 <community string> <IPv6 address> rwcommunity相同的访问权限区别在于使用IPv6。

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 [Community-string]@[IP of SNMP server]:[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 .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 Trap数据相关。因此再次使用以下grep命令我们可以快速地解析大量的MIB数据搜索关键词“trap”

grep -i "trap" *.snmp

用户名/密码

另一个感兴趣的领域是日志我发现有一些设备在MIB表中保存了日志。这些日志也可能包含登录失败的尝试。想想你上次通过Telnet或SSH登录设备时是否不小心将密码输入为用户名。我通常搜索关键词如_fail_failed_或_login,并检查这些数据,看是否有任何有价值的信息。

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

电子邮件

SNMP can be used to gather information about email services running on a target system. This can include details such as the email server's IP address, port number, and other configuration settings.

SNMP可以用于收集有关目标系统上运行的电子邮件服务的信息。这些信息可以包括电子邮件服务器的IP地址、端口号和其他配置设置。

Enumerating Email Addresses

枚举电子邮件地址

SNMP can also be used to enumerate email addresses on a target system. By querying the SNMP MIB (Management Information Base) for the email service, it is possible to retrieve a list of email addresses associated with that service.

SNMP还可以用于枚举目标系统上的电子邮件地址。通过查询电子邮件服务的SNMP MIB管理信息库可以检索与该服务关联的电子邮件地址列表。

Sending Emails via SNMP

通过SNMP发送电子邮件

In some cases, it may be possible to send emails using SNMP. This can be achieved by leveraging the SNMP MIBs that allow for email functionality. By configuring the necessary SNMP settings and using the appropriate SNMP commands, it is possible to send emails through the target system's email service.

在某些情况下可以通过SNMP发送电子邮件。这可以通过利用允许进行电子邮件功能的SNMP MIB来实现。通过配置必要的SNMP设置并使用适当的SNMP命令可以通过目标系统的电子邮件服务发送电子邮件。

SNMP Email Traps

SNMP电子邮件陷阱

SNMP can also be used to send email traps, which are notifications sent to a specified email address when certain events occur. These traps can be configured to alert administrators of critical events, such as system failures or security breaches.

SNMP还可以用于发送电子邮件陷阱即在发生某些事件时向指定的电子邮件地址发送通知。可以配置这些陷阱以通知管理员关键事件例如系统故障或安全漏洞。

SNMP Email Authentication

SNMP电子邮件身份验证

When using SNMP to send emails, it is important to ensure proper authentication to prevent unauthorized access. This can be achieved by configuring SNMPv3 with strong authentication mechanisms, such as HMAC-SHA or AES encryption.

在使用SNMP发送电子邮件时确保适当的身份验证以防止未经授权的访问非常重要。可以通过配置具有强身份验证机制的SNMPv3例如HMAC-SHA或AES加密来实现这一点。

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.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


Bug赏金提示注册Intigriti一个由黑客创建的高级Bug赏金平台!立即加入我们,开始赚取高达**$100,000**的赏金!

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

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥