
前言
早在2000年代初期,许多人就为他们感到高兴,因为他们定期“扫描”其提供商的网络,有时甚至扫描更远的目标,以检测Windows机器及其上可读取(写入)的资源(SMB)。 搜索过程是原始的:设置了IP地址范围或网络掩码,并通过各种工具-LANguard网络扫描仪,xIntruder等-扫描了地址并找到了服务器。 通常,检测到的机器可用于读取各种网络资源(磁盘,打印机,目录),而较少用于写入。 通过IPC $和用户“来宾”的匿名会话,可以在计算机上传输资源,有时有“管理员”的成员没有密码,有时,在对检测到的计算机产生更“活跃”的影响之后,有可能找到运行Windows NT 4.0或Windows的服务器2000服务器。 如果运气好的话可以找到当时使用Windows 98的计算机,那么事情就变得容易了-那些日子里,指定的OS包含许多不同的漏洞,包括实施与SMB的联系,即使在拨号时也只需几分钟就可以进行暴力破解访问资源的操作。连接。 对于那些想涉足过去的人们,它详细地介绍了对Windows 9x的“访问”- 暴露的黑客:网络安全秘诀和解决方案。 第4章:入侵Windows 95/98和Me 。 但是本文的其余部分与之无关。
我从未想到过,在2019年,这样的“娱乐”是可能的。 相似之处在于易于为所有好奇的人找到其他人的可用资源。 此外,我们将不关注过去两年中流行的趋势-搜索MongoDB或Elasticsearch数据库以供访问-而是着眼于实际的服务。
此外,我提议不对整个程序,其道德规范进行评估,我注意到,该职位并不是要求采取可归因于俄罗斯联邦《刑法》某些条款或其他州法律类似规范的行动。
网络文件系统(NFS)
网络文件系统(NFS) -一种用于网络访问文件系统的协议,允许您通过网络连接(安装)远程文件系统,为用户提供对文件的访问权限,并允许您以与本地文件相同的方式使用这些文件。
当然,市场上大多数可用的网络附加存储(NAS)都支持NFS,并提供对本地资源的访问,以及在具有操作系统的任何服务器上的访问,可以在其中部署NFS服务。
可从任何Ubuntu操作系统和IP地址192.168.1.1访问服务器资源的设置包含在/ etc / exports文件中,并且是以下形式的条目:
- / data / place1 192.168.1.0/255.255.255.0(rw,no_subtree_check,nohide,async)192.168.101.0/255.255.255.0(rw,no_subtree_check,nohide,async)
- 数据/地方2 192.168.1.0/255.255.255.0(rw,no_subtree_check,nohide,异步)192.168.101.0/255.255.255.0(rw,no_subtree_check,nohide,异步)
在这种情况下,具有IP地址来自网络192.168.1.0/255.255.255.0、192.168.101.0/255.255.255.0的客户端可以对服务器及其资源/数据/ place1进行NFS访问。
将远程资源安装在本地目录中,例如/ home / user / example,如果客户端位于允许的子网上,并且已安装NFS客户端,则可以通过(Ubuntu)命令进行操作:
mount -t nfs 192.168.1.1:/data/place1 /home/user/example
如果指示的不是IP地址*或(每个人),则通常任何客户机都可以将远程资源装入其系统。
用户(例如,在Ubuntu下)仅需要输入终端:showmount -e ip-target并获取有关服务器上可用资源的信息(服务器的导出列表)。
例如:
showmount -e 81.24..
Export list for 81.24..:
/home/admin 192.168.52.1/24
因此,形成了以下情形:检测运行NFS的服务器,确定服务器上的可用资源,将结果合并为单个输出形式,然后根据情况进行操作。
资源上可能有什么-显然,任何东西:
- Internet用户的个人文件,例如在“开放” NAS设备的情况下;
- 包含整个企业的文件,数据库,数据库档案的目录;
- 通常是带有地址/ home / *的目录(有时带有.ssh中的键且可写);
- 包含视频监控系统文件的目录;
- 其他...
获取IP地址
关于在全球Internet上使用NFS查找服务器的方法有两种:独立使用各种工具,以及现成的第三方扫描结果,数据库和服务。 实际上,这全都归功于获得IP地址列表。 在本地网络中,我认为选择是显而易见的-独立行动。
打开的TCP端口111、2049可以用作NFS服务功能的证据。
要独立获取服务器IP地址列表,只需扫描地址范围或整个子网以查看是否存在所指示的开放端口。 任何工具都适用于此:nmap,masscan等。
例如,使用命令masscan -p111,2049 200.26.1XX.0/24 —rate=10000
网络200.26.1XX.0 / 24扫描几秒钟,以查找开放端口111、2049:
Scanning 256 hosts [2 ports/host]
Discovered open port 2049/tcp on 200.26.1XX.28
Discovered open port 111/tcp on 200.26.1XX.15
Discovered open port 111/tcp on 200.26.1XX.20
Discovered open port 111/tcp on 200.26.1XX.28
对于每个检测到的IP地址,可以应用以下命令:
showmount --no-headers -e 200.26.1XX.28
结果:
/usr/common *
显然,您可以自己扫描数百万个Internet空间的IP地址,但这不是最快的方法,然后出色的Shodan服务可以作为子任务的解决方案,当然还有其他一些任务,但是此任务具有非常方便的语法和API 。 深入研究服务功能的描述不是本文的目的。 简要地说-该服务提供了对连接到Internet的设备的高级搜索。 搜索条件可以是网络标识符和其他元数据:证书的序列号等。 Shodan具有许多用于目标搜索的功能,但是我没有在NFS上找到单独的搜索,例如,有一个带有产品名称的产品标准:mongodb,elastic或apache。 因此,通过Web NFS,可以根据需要搜索以下查询:nfs,tcp 2049,tcp 111, Portmap:2049等。

或安装Shodan客户端(CLI),将您的KEY API初始化为服务,然后从命令行调用搜索,例如:
- shodan search --fields ip_str,端口端口图:2049
- shodan搜索--fields ip_str,端口--separator,nfs
结果:
139.196.154.23,111,
198.27.116.37,111,
95.211.192.96,111,
80.23.66.122,111,
210.116.82.97,111,
192.198.82.3,111,
165.227.67.242,111,
116.12.48.9,111,
85.34.250.102,111,
182.75.249.197,111,
192.151.212.175,111,
119.216.107.127,111,
217.59.68.2,111,
178.159.12.97,111,
...
因此,如何获取具有有效NFS服务的设备的IP地址列表是可以理解的。
有很多方法可以整体解决此问题:编写bash脚本,通过调用showmount的命令链组织棘手的管道,以及其他选项-谁喜欢。
在我的研究中,我以两种不同的方式用Python解决了这个问题。 第一个是通过ssh使用NFS客户端连接到您的个人Ubuntu服务器,然后使用所需的IP地址池在其上调用showmount命令。 第二种解决方案是在纯Python中。
我想可能会出现一个问题:为什么这么难?为什么要用Python?
因为,正如我上一篇有关Habr的文章中所述,我将使用Lampyre工具,他们在2月26日向Lampyre工具发布了API ,该API可让您使用Python将模块写入平台。
Lampyre简要介绍Lampyre-一个用于Windows的OSINT和数据分析的软件平台,该平台带有用于Windows的“加厚”客户端,该客户端是用于相同目的的著名且流行的工具的类似物-Maltego。 与在Maltego中一样,Lampyre“开箱即用”提供了一系列针对各种服务的请求。 从概念上讲,查询等同于从更知名的产品进行的转换。 如果缺少某些内容,现在可以编写您自己的请求。 Lampyre随附的请求在平台基础结构上执行,并在计算机上独立编写。 也就是说,用户必须安装Python并在代码中使用所有必需的库。
我决定测试API的功能。 关键在于,Lampyre已经向Shodan提出了多个“请求”,特别是因为用户不需要从服务中获得自己的KEY API。 因此,通过一个请求,您可以获取带有NFS服务的IP地址列表,而通过第二个请求,我编写的模块将检查可用资源,并在同一张图上直观显示具有资源特征的结果。
韩国
在从Shodan进行搜索并测试模块期间,有趣的是,看到了Shodan服务在亚洲国家中扫描结果的质量和数量的情况,以及资源不安全的情况。 选择权在于大韩民国,我认为不必说韩国是一个技术先进的国家,我建议您可以在韩国的网络中找到一些有趣的东西。
按Shodan进行搜索,在查询中: nfs ,在国家/地区:大韩民国代码, kr

结果很快就来了(在下图中,只是一般方案的一部分)。

主机列表:
- psi.kaist.ac.kr
- 绿巨人
- messi.kaist.ac.kr
- 奇迹
- Kaist.ac.kr
- ai1.kaist.ac.kr
- jarvis3.kaist.ac.kr
- baraddur.kaist.ac.kr
- Rhokaist.ac.kr
- jarvis.kaist.ac.kr
从图形和名称中都可以看到,所有这些都被列为AS1781- 韩国科学技术高等专科学校

韩国先进技术学院 -位于大田的韩国领先的学术研究大学,在韩国国家排名中位居第二。 在韩国5%的顶级教育机构中,该大学一直都名列前茅。
我们使用指定的IP地址作为书面模块“ Explore:NFS(SSH)”的输入参数,结果是:

我很快草拟了一种在图形中显示表格结果的方案(关于本文后面的构造图形的方案和原理)。

与Shodan模式结合的结果

当分析图的顶点和关系时,很明显在/ home资源可用的地址处,所有人都可以访问(*)。
为了获得更好的视觉效果,请更改图形对象的属性和图表的其他设置:

当然,我轮流在我的一台服务器上安装部分资源,然后开始学习。 结果到处都是几乎相同的用户目录:asm,hoo,hyshin,jay,jiwon,jkhee110,jokangjin,kmh603,ksm782,lee,linus,lost + found,marvel_guest,pie,qwe,scloud,seokmin,sgim,thrlek,百日草yosj yoosj 7。
几乎所有带有文件的目录都被读写。 .ssh中的某些用户具有对它们具有写访问权的authorized_keys文件。
我生成了密钥,将其复制到用户之一的authorized_keys中,并通过端口2222上的ssh连接到服务器,我从Shodan的数据中收到了端口号。
用户,网络设置:

网络上的主机:

文件/ etc /导出并驱动:

文件/ etc / fstab和OS:

我相信这是一个由研究生或学生组成的部门网络,他们在服务器上执行某种计算,因为存在许多不同的Python来源,与GPU和Anaconda发行版相关,等等。 我没有研究所有内容,而是开始考虑如何处理所有这些,当然,我可以在大部分节点上“走动” (也许我可以想到一些更奇特的东西) ,但是这并没有引起我的兴趣。 我想出了以下几点:由于该研究所是科学和先进的,因此应该在信息安全领域。 实际上,甚至是整个实验室: 软件安全实验室及其负责人Sang Kil Cha
我决定给他写一封信,所以他们说,允许每个人都将具有Internet读写权限的NFS资源连接起来是非常危险的,显然您需要修复某些问题,附加屏幕截图并发送。
字母1亲爱的桑吉查,
我正在写信给您,就像在kaist.ac.kr网站上一样,您被称为KAIST领先的SoftSec实验室,我相信以下问题与您有关。
在我们对信息安全领域的研究中,无意间偶然发现了以下服务器:
143.248.247.131-psi.kaist.ac.kr
143.248.247.4-jarvis3.kaist.ac.kr
143.248.247.169
143.248.247.223
143.248.247.235
143.248.247.251-marvel.kaist.ac.kr
143.248.247.239-jarvis.kaist.ac.kr
143.248.247.194-hulk.kaist.ac.kr
143.248.2.23
所有这些服务器都已启动并正在运行NFS(网络文件系统)服务。
访问这些服务器的安全级别非常低。
任何人都可以使用Internet访问这些服务器及其所有内容的主目录。
例如,设置nfs-/ etc / exports 143.248.247.251-> / home 或143.248.247.239
showmount -e 143.248.247.239
143.248.247.239的导出列表:
/数据
/主页/ appl
大多数服务器的用户目录可供读取和写入,包括其子目录,其中包含公共和私有ssh访问密钥。
编辑文件允许添加新的访问密钥,并获得对服务器的远程ssh访问,然后对某些内部KAIST子网的访问。
仅用于测试这种浅层访问,无需进行任何修改,无需编辑,复制或删除数据,也不会损害基础架构。
请参阅附件中的某种确认和证明。
我没有任何要求或要求,但我建议您显着提高您的网络安全级别。
很快,他们回答了我,免费翻译:谢谢,我们将转发给任何人。
答案1感谢您让我知道! 我会将这封电子邮件转发给负责我们的网络和安全的人员。 最好的,桑基尔
在发布本文之前,我决定检查一下,看看有什么变化:

实际上,仅允许从内部网络上的机器访问资源,但是服务器143.248.247.251呢? 根据表中的条目,NFS设置中的主机资源仍为*。 我将表的“映射”的另一个版本绘制为图表:

“映射”的变化是什么:NFS对象现在具有2个相同的属性“粘在一起”-IP和NFS路径。 仅当包含原始记录列内容的value属性包含值“ * ”时,才会创建Status对象
表格上的图形以新形式出现:

现在,顺便说一下,内部网络的寻址已变得清晰可见,并且在服务器143.248.247.251上,还可以编辑用户目录,文件的内容; 原则上,可能性与以前相同。
因此,我正在写第二封给桑基查先生的信,信中的内容相似,并指出一些事件将在流行的habr.com资源上的一篇文章中介绍:
字母2亲爱的桑吉查,祝您有美好的一天。
我决定查看发送给您的电子邮件后是否有任何更改,并且确实更改了访问设置。 但是显然安全工程师忽略了143.248.247.251 IP地址,并且其设置保持不变。 请同时保护此ip,以使任何陌生人都无法访问它。
我正在写一篇有关信息安全的文章,并将其发布在https://habr.com上 。 这是在俄罗斯非常受欢迎的网站。 本文将介绍一些有关NFS访问设置质量低下的问题,并举例说明服务器的情况。 发布文章后,我会将其链接发送给您。
如何使用Lampyre API并编写模块
要求该模块接受IP地址列表或192.168.0 / 24形式的子网列表作为输入-在此阶段,对于子网,在代码中有必要独立于代码中的IP地址中的字符串参与来验证输入数据-转换为IP列表。
下一步,将通过Python paramiko库访问个人ssh服务器,并按顺序(在模块概念代码中尝试进行异步)访问该命令:
timeout {timeouts} showmount --no-headers -e {ip}
结果的输出将通过Python代码解析为输出结构,即表格:Python中的词典列表。
字典中的键:
- current_day-用户请求日期
- host_query-接收信息的IP
- shared_path-NFS资源
- status_ip-有关访问资源的信息,如果IP地址通过“,”列出,则字典字符串在列表中重复。
此外,根据该概念的概念,尝试进行原始尝试以将status_ip密钥的值解析为主题:IP地址,主机记录,值“ *”或“每个人”
根据API文档和来自Lampyre.io支持的解释-每个模块都应将数据返回一个或多个表,但该表应作为API的一部分进行描述(任务标头,表标头)。 实际上,这是该模块的主要结果。
因此,考虑到字典键,最终结果将是一个表:
class NFSHeader(metaclass=Header): display_name = 'Search data from NFS services' current_day = Field('Date', ValueType.Datetime) host_query = Field('Search ip', ValueType.String) shared_path = Field('NFS path', ValueType.String) ip = Field('ip address', ValueType.String) network = Field('network address', ValueType.String) host = Field('host', ValueType.String) status = Field('raw record', ValueType.String)
分析服务器上showmount命令结果的值(略作修改)将写入表中。 类中字段的名称说明一切;在原始记录列中,将存储有关资源访问的信息。 从某种意义上说,对NFS资源数据的这种分析也可以看作是OSINT,有关来自各种IP地址的可能访问的信息给出了资源所有者或资源网络内寻址的某种概念。 例如,具有NFS的服务器的IP地址位于乌克兰,允许访问的IP地址位于德国:

并且,如果您扩展了此示例的研究,那么不仅可以通过NFS,而且可以通过一个证书来确认服务器的连接,该证书的地址为:77.120.103.9、138.201.202.135和域* .aniart.com.ua:

如何将数据传输到模块并写入表:
从Task类创建您自己的SearchDataNFS类:
class SearchDataNFS(Task)
在get_id
方法中, get_id
返回一个唯一的随机UUID:
def get_id(self): return 'bf51fd57-3fec-4416-9d07-905935a484b4'
在get_display_name
方法中get_display_name
指定如何调用Task;在get_description
方法中,根据名称指定Task的描述:
def get_display_name(self): return 'Explore: NFS(SSH)' def get_description(self): return 'Explore NFS resourses'
在get_headers
方法中get_headers
指定我们将使用的表:
def get_headers(self): return NFSHeader
get_enter_params方法将确定输入窗口的外观。 从代码中可以明显看出,字符串列表被提供给输入,随后将其独立地转换为IP地址:
def get_enter_params(self): ep_coll = EnterParamCollection() ep_coll.add_enter_param('ips', 'IP', ValueType.String, is_array=True, value_sources=[Attributes.System.IPAddress], description='IPs, networks') return ep_coll
在execute方法中, 执行主要任务:
ips = [] for input_ip in set(map(lambda z: z.strip(), enter_params.ips)): ips.extend(reparse_ip_hosts(input_ip))
输入参数可通过enter_params.ips访问。 在reparse_ip_hosts
方法中,发生了对IP地址中的字符串的自我实现的验证。
targets = ((ip, port) for ip in ips for port in ports) lines = thread_async_nfs_one_client(targets) info = reparse_result_rows(lines) fields_table = NFSHeader.get_fields() for data_id in info: tmp = NFSHeader.create_empty() for field in fields_table: if field in data_id: tmp[fields_table[field]] = data_id[field] result_writer.write_line(tmp, header_class=NFSHeader)
在thread_async_nfs_one_client
函数中,使用ssh与服务器建立连接(IP地址,用户名和密码由硬代码设置)并执行showmount,如前所述,结果被解析,然后在reparse_result_rows
函数中再次修改。 重要的是要注意,info是一个由字典组成的列表,在每个字典中,键都被命名为NFSHeader类的字段。 也就是说,字典如下所示:
{ 'current_day': datetime.datetime(2019, 3, 6, 16, 48, 17), 'host_query': '192.168.1.1', 'shared_path': '/volume1/workspace', 'ip': '192.168.10.10', 'network': '', 'host': '', 'status': '192.168.10.10' }
观察字典中的数据类型很重要,它们必须与表中的描述相同。
在循环的更深处,发生了遍历列表元素并将其通过API方法( result_writer.write_line )写入特定NFSHeader表的情况。
有关更详细的描述,请阅读文档。
基本上,该模块已准备好添加到Lampyre。
在Lampyre中使用您的模块
当然,由于使用了ssh并执行了showmount命令,因此您必须可以通过ssh访问服务器。 在我的测试中,该角色由Virtualbox中安装了Ubuntu和NFS客户端的虚拟机扮演。
要在用户计算机上使用本机模块,必须使用Python 3.6,解释器的路径必须在系统变量中,或者必须在Lampyre\config\appSettings.config
指定其路径。 默认情况下,pythonPath键在设置中被注释掉。
通过以下步骤将模块加载到Lampyre中:
- 在“脚本”窗口中,加载文件Lampyre \ user_tasks \ ontology.py(与应用程序一起提供)
- 在同一窗口中,加载模块,在本例中为nfs_via_ssh.py。 如果出现问题,“ 详细信息”按钮应有帮助
- 加载后,在“ 任务”选项卡上的“请求列表”窗口中,将显示“ 本地任务”部分(在模块的代码中,您可以用不同的方式调用它),其名称为“ 探索:NFS(SSH)” :

更新的请求列表窗口:

- 如前所述,具有NFS的服务器的IP地址最好通过首先使用Query:tcp 2049参数执行Shodan搜索查询来获得(您可以简单地指定nfs )。 Page或range参数,默认设置为1,表示将返回1页Shodan服务的响应,通常在一页上有100个结果(行)。
Shodan的执行结果:

- 将IP地址从表或图中复制到剪贴板,然后将其粘贴到IP探索:NFS(SSH)模块窗口中。 运行并期待结果:

当然,您必须考虑自己和外部服务器的带宽以及超时,这些在模块代码中严格设置。
结果以表格形式获得,但是您可以继续执行并将表的结果与执行Shodan搜索的结果图结合起来。 一开始很难理解。
可视化结果表
让我们开始吧。 有一个带有一组列的表,这些列具有来自用户模块执行的值。 但是,如果您注意“请求”窗口的“模式”按钮-它是无效的。 因为未设置表到图形的映射,所以必须设置它。
方案1(不是最好的)
从模块结果中打开表格后,在右下角单击“创建模板”窗口,将显示“添加创建模板”界面元素。 在这里,您可以指定表行到图形对象的映射,我将不在本文中详细描述该过程,Youtube 平台频道上的链接显示了如何执行此操作,在本文中,我将自己局限于应该发生的图像:

图形模板:

重要的是要注意IP,域对象在Lampyre中,并且我创建了NFS和网络对象。 , «» . , , — «» — , — - , . , NFS – 2 , NFS path Status, — NFS path. — . «» — Schema .
:

:

«» — i2 (IBM i2 Analyst's Notebook) :

«» , : IP- IP- , , NFS , IP. ( ).
2

. — , IP- :

, , (csv) . , «» . «» , .
Shodan NFS Shodan search, add to active tab — :

:

Lampyre , ssh.
— , NFS .