别问我 SolarWinds Orion API 怎么用,自己进来看看,看完还不会来骂我

前言
SolarWinds Orion 平台是一个统一的网络和系统管理产品套件,可用于监控 IT 基础架构。我们可以通过 SolarWinds Information Service (SWIS)访问 Orion 平台中的数据。
在程序实现上,我们可以借助 SolarWinds Orion API 进行开发,但是在最近的漏洞利用上,我们无法直接使用 SolarWinds Orion API。
本文将要介绍 SolarWinds Orion API 的用法,分析无法直接使用的原因,提供一种解决方法,开源两个测试代码。
简介
本文将要介绍以下内容:
◼SolarWinds Orion API 的使用
◼模拟网页操作的实现
◼开发细节
◼开源代码
SolarWinds Orion API 的使用
参考资料:
https://github.com/solarwinds/OrionSDK/wiki
Python 语言可使用 orionsdk 库进行开发,地址如下:
https://github.com/solarwinds/orionsdk-python
在引入 orionsdk 库后,可以很容易的实现以下功能:
◼query
◼invoke
◼create
◼read
◼update
◼bulkupdate
◼delete
◼bulkdelete
为了研究 SolarWinds Orion API 的实现细节,决定不借助 orionsdk 库实现相同的功能。
语法格式的参考资料:
https://github.com/solarwinds/OrionSDK/wiki/REST
对于 SolarWinds Orion API,需要注意以下细节:
1.接口地址
默认接口地址为https://< url >:17778/SolarWinds/InformationService/v3/Json/
2.用户验证
添加 Header: Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
其中,dXNlcm5hbWU6cGFzc3dvcmQ 为 username:password 作 Base64 编码后的结果。
3.数据查询
通过 POST 发送查询命令,格式为 application/json 类型。
SolarWinds Orion API 使用 SolarWinds Query Language (SWQL),类似于 SQL 语法。
数据库的表项可以通过本地搭建测试环境,执行 SolarWinds Orion 下的 DataBase Manager 进行查看。
查询数据库的示例代码:

在 Python 代码开发上,需要考虑以下细节:
1.将字典作为命令行参数传递
可以先通过命令行参数传入字符串,再将字符串转义为 json 字符串。
固定参数的用法示例:

将字典作为命令行参数传递的用法示例:

2.将列表作为命令行参数传递
可以先通过命令行参数传入字符串,再将字符串转为列表。
固定参数的用法示例:

将列表作为命令行参数传递的用法示例:

完整的实现代码已上传至 Github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/SolarWindsOrionAPI_Manage.py
代码支持以下功能:
◼query
◼invoke
◼create
◼read
◼update
◼bulkupdate
◼delete
◼bulkdelete
为了便于使用,省去输入查询语句的过程,还支持以下功能:
◼GetAccounts
◼GetAlertActive
◼GetAlertHistory
◼GetCredential
◼GetNodes
◼GetOrionServers
猜测是出于安全考虑,SolarWinds Orion API 的功能有限,有些数据库无法进行查询,例如 VirtualMachines 表(存储虚拟机信息)、CredentialProperty 表(存储凭据信息)、Accounts 表的 PasswordHash 项和 PasswordSalt 项。
已公开的 SolarWinds 漏洞(CVE-2020-10148、CVE-2020-27870、CVE-2020-27871、CVE-2021-31474)涉及的均为网络协议接口((默认为http://< ip >:8787/Orion/),同 SolarWinds Orion API 不同,所以无法结合利用
模拟网页操作的实现
为了结合漏洞利用,我们需要网页登录,通过抓取数据包的方式实现同 SolarWinds Orion 的数据交互,功能同 SolarWinds Orion API 的功能保持一致。
1.登录验证
通过抓取数据包发现,SolarWinds Orion 基于 ASP.NET 平台使用了 ViewState 存储数据。
但经过实际测试,我们的测试程序可以不带有 ViewState,不影响功能。
登录验证的数据包流程如下:
1.访问:http://< ip >:8787/Orion/Login.aspx?autologin=no
2.返回响应码为 302
3.自动跳转至http://< ip >:8787/Orion/View.aspx
4.返回响应码为 302
5.自动跳转至http://< ip >:8787/Orion/SummaryView.aspx
6.返回响应码为 200,获得最终结果
在程序实现上,我们可以对返回的最终结果进行判断,如果 Cookie 中带有__AntiXsrfToken 项,那么代表用户验证成功。
示例代码:

2.查询操作
Header 中需要额外添加属性 X-XSRF-TOKEN
属性 X-XSRF-TOKEN 的值在初次登录时访问http://< ip >:8787/Orion/Login.aspx?autologin=no 返回的 302 结果中获得。
在程序实现上,可以通过添加参数 allow_redirects=Faslse 来禁用跳转,在返回的 Cookie 中取出 X-XSRF-TOKEN。
查询接口地址:http://< ip >:8787/api2/swis/query
示例代码:

数据格式同 SolarWinds Orion API 的 query 命令保持一致,所以我们可以直接对照 SolarWinds Orion AP 实现相同的功能。
完整的实现代码已上传至 Github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/SolarWindsOrionAPI_Manage.py
代码支持用户口令验证和数据库查询的功能
为了便于使用,省去输入查询语句的过程,支持以下功能:
◼GetAccounts
◼GetAlertActive
◼GetAlertHistory
◼GetCredential
◼GetNodes
◼GetOrionServers
小结
本文分别介绍了使用 SolarWinds Orion API 和模拟网页操作实现数据查询的方法,开源测试代码,便于同其他漏洞利用相结合。

评论