.. | ||
cisco-snmp.md | ||
README.md | ||
snmp-rce.md |
161,162,10161,10162/udp - SNMP渗透测试
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 如果您在网络安全公司工作,想在HackTricks上看到您的公司广告,或者想要获取PEASS最新版本或下载HackTricks的PDF?请查看订阅计划!
- 发现PEASS家族,我们独家的NFTs系列。
- 获取官方PEASS & HackTricks周边商品
- 加入💬 Discord群组或telegram群组或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks仓库 和 hacktricks-cloud仓库 提交PR来分享您的黑客技巧。
Bug bounty小贴士:注册 Intigriti,一个由黑客创建的高级bug bounty平台!今天就加入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 发送 traps。这些是 SNMP 服务器发送到客户端的数据包,而无需明确请求。 {% endhint %}
MIB
为了确保 SNMP 访问能够跨制造商以及不同的客户端-服务器组合工作,创建了 管理信息库(MIB)。MIB 是一种 独立的格式,用于存储设备信息。MIB 是一个 文本 文件,其中列出了设备的所有可查询的 SNMP 对象,并以 标准化 的树状层次结构排列。它至少包含一个 对象标识符
(OID
),除了必要的 唯一地址 和 名称 外,还提供有关各个对象的类型、访问权限和描述的信息。
MIB 文件采用基于 抽象语法表示法一
(ASN.1
)的 ASCII 文本格式编写。MIB 不包含数据,但它们解释了 在哪里找到哪些信息 以及它看起来如何,返回特定 OID 的值,或使用的数据类型。
OIDs
OIDs 代表 对象标识符。OIDs 在 MIB 层次结构中唯一标识管理对象。这可以被描述为一棵树,其各个层次由不同的组织分配。顶级 MIB 对象 ID(OIDs)属于不同的标准组织。 供应商定义私有分支,包括其自己产品的管理对象。
您可以通过这个网址 导航 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",您也可能能够 写入一些值。此外,可能 存在一些 始终是 '只读' 的对象。
如果您尝试 写入 一个对象,会收到 noSuchName
或 readOnly
错误。
在版本 1 和 2/2c 中,如果您使用了一个 错误 的社区字符串,服务器不会 响应。所以,如果它响应了,就是使用了 有效的社区字符串。
端口
- SNMP 代理在 UDP 端口 161 上接收请求。
- 管理器在端口 162 上接收通知(Traps 和 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 地址)、用户名、运行时间、服务器/操作系统版本以及正在运行的进程(可能包含密码)....
危险设置
来自 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" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?想在 HackTricks 中看到您的公司广告吗?或者想要获取PEASS 最新版本或下载 HackTricks 的 PDF吗?查看 订阅计划!
- 发现 The PEASS Family,我们独家的 NFTs 收藏
- 获取 官方的 PEASS & HackTricks 商品
- 加入 💬 Discord 群组 或 telegram 群组 或在 Twitter 上关注我 🐦@carlospolopm。
- 通过向 hacktricks 仓库 和 hacktricks-cloud 仓库 提交 PR 来分享您的黑客技巧。