hacktricks/network-services-pentesting/pentesting-snmp
2024-01-02 22:21:01 +00:00
..
cisco-snmp.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated ['network-services-pentesting/pentesting-mssql-microsoft-sql- 2024-01-02 22:21:01 +00:00
snmp-rce.md Translated to Chinese 2023-08-03 19:12:22 +00:00

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

通过 htARTE (HackTricks AWS Red Team Expert)从零开始学习AWS黑客攻击

支持HackTricks的其他方式


漏洞赏金小贴士注册 Intigriti,一个由黑客创建的高级漏洞赏金平台!立即加入我们 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返回哪些值或使用哪种数据类型。

OIDs

OIDs代表对象标识符OIDs在MIB层次结构中唯一标识管理对象。这可以被描述为一棵树其各个层次由不同的组织分配。顶级MIB对象IDOIDs属于不同的标准组织。 供应商定义私有分支,包括其自己产品的管理对象。

您可以通过这个网址在网上导航一个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。 有一些众所周知的OIDs,如1.3.6.1.2.1中的那些它引用了定义了简单网络管理协议SNMP变量的MIB-2。而从这个OID挂起的OIDs,您可以获得一些有趣的主机数据(系统数据、网络数据、进程数据...

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的凭据。
两种类型的社区字符串

  • 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。

微软 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 本地端口。

思科

如果你使用的是思科设备,请查看此页面:

{% 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 协议栈,所以它不需要任何 SNMP 库,如 net-snmp。

语法: braa [Community-string]@[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 .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

电子邮件

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 bounty tip注册 Intigriti,一个由黑客创建,为黑客服务的优质bug bounty平台!立即加入我们 https://go.intigriti.com/hacktricks,开始赚取高达**$100,000**的赏金!

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

通过 htARTE (HackTricks AWS Red Team Expert)从零开始学习AWS黑客攻击

支持HackTricks的其他方式