.. | ||
cisco-snmp.md | ||
README.md | ||
snmp-rce.md |
161,162,10161,10162/udp - 渗透测试 SNMP
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFTs收藏品
- 加入 💬 Discord 群组 或 电报群组 或 关注我们的Twitter 🐦 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
如果您对黑客职业感兴趣并想要黑掉不可能黑掉的东西 - 我们正在招聘!(需要流利的波兰语书面和口语表达能力)。
{% embed url="https://www.stmcyber.com/careers" %}
基本信息
SNMP - 简单网络管理协议 是一种用于监控网络中不同设备(如路由器、交换机、打印机、物联网设备等)的协议。
PORT STATE SERVICE REASON VERSION
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
{% hint style="info" %} SNMP也使用端口162/UDP用于陷阱(traps)。这些是从SNMP服务器发送到客户端的数据包,而无需明确请求。 {% endhint %}
MIB
为了确保SNMP访问可以跨制造商和不同的客户端-服务器组合工作,创建了管理信息库(MIB)。MIB是一种独立的格式,用于存储设备信息。MIB是一个文本文件,其中列出了设备的所有可查询SNMP对象,并以标准化的树形层次结构进行排列。它至少包含一个对象标识符(OID)
,除了必要的唯一地址和名称外,还提供有关各个对象的类型、访问权限和描述的信息。
MIB文件以基于ASCII文本格式的抽象语法表示一(ASN.1)
编写。MIB不包含数据,但它们解释了在哪里找到哪些信息,以及其外观是什么,返回特定OID的值,或使用了哪种数据类型。
OIDs
**对象标识符(OIDs)起着至关重要的作用。这些唯一标识符旨在管理管理信息库(MIB)**中的对象。
MIB对象ID或OID的最高级别分配给各种标准制定组织。在这些顶级中,建立了全球管理实践和标准的框架。
此外,供应商被授予建立私有分支的自由。在这些分支中,他们有自主权包括与其产品线相关的受管理对象。这个系统确保了对跨不同供应商和标准的各种对象进行识别和管理的结构化和有组织的方法。
您可以从这里通过网络导航到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,引用了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”,您也可能能够写入一些值。此外,可能存在一些始终是“只读”的对象。
如果尝试写入一个对象,则会收到**noSuchName
或readOnly
错误**。
在版本1和2/2c中,如果使用错误的社区字符串,服务器将不会响应。因此,如果它响应了,就是使用了有效的社区字符串。
端口
- SNMP代理程序在UDP端口161上接收请求。
- 管理器在端口162上接收通知(陷阱和InformRequests)。
- 当与传输层安全性或数据报传输层安全性一起使用时,请求将在端口10161上接收,通知将发送到端口10162。
暴力破解社区字符串(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
如果您知道一个有效的团体字符串,您可以使用SNMPWalk或SNMP-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 树,这是网络管理的关键组成部分:
- 设置
rwuser noauth
允许无需身份验证即可完全访问 OID 树。这个设置很直接,允许无限制访问。 - 为了更具体的控制,可以使用:
rwcommunity
用于 IPv4 地址,以及rwcommunity6
用于 IPv6 地址。
这两个命令都需要一个 community 字符串 和相关的 IP 地址,无论请求的来源如何,都提供完全访问权限。
用于 Microsoft Windows 的 SNMP 参数
一系列 管理信息库(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 设备,请查看此页面:
{% 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 %}
Massive SNMP
Braa 是一个大规模 SNMP 扫描器。这样的工具的预期用途当然是进行 SNMP 查询 - 但与 net-snmp 中的 snmpwalk 不同,它能够同时查询数十甚至数百个主机,并在单个进程中执行。因此,它消耗非常少的系统资源,并且扫描非常快速。
Braa 实现了自己的 SNMP 栈,因此不需要像 net-snmp 这样的任何 SNMP 库。
语法: braa [Community-string]@[SNMP 服务器的 IP]:[iso id]
braa ignite123@192.168.1.125:.1.3.6.*
设备
该过程始于从每个文件中提取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表中存储的日志被检查以查找登录失败尝试,这可能会意外地包括将密码输入为用户名的情况。搜索关键字如_fail_、_failed_或_login_以找到有价值的数据:
grep -i "login\|fail" *.snmp
电子邮件
最后,为了从数据中提取电子邮件地址,使用带有正则表达式的grep命令,重点关注与电子邮件格式匹配的模式:
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
如果您对黑客职业感兴趣并想要黑掉不可能黑掉的东西 - 我们正在招聘!(需要流利的波兰语书面和口语表达能力)。
{% embed url="https://www.stmcyber.com/careers" %}
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
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)!
其他支持HackTricks的方式:
- 如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS家族,我们的独家NFTs
- 加入 💬 Discord群 或 电报群 或 关注我们的Twitter 🐦 @carlospolopm。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。