连载一:Social Network 靶机渗透


重要声明 本系列的所有文章均来自本人的学习笔记,转载请注明出处。请勿用文章内所涉及的相关技术从事非法活动,如因此产生的一切不良后果,与文章作者无关。


《和我一起来打靶》是由苑房弘老师精心打造的,面向具有一定网络安全基础同学的课程。苑老师计划在30周之内,每周详细讲解一个靶机的打靶过程,重点分析面对不同场景的渗透思路,进而演示每一个漏洞的实战攻击方法,用来帮助初学者快速的掌握渗透测试这项实战技能。而《打靶笔记》系列文章则是笔者用来学习、梳理与归纳《和我一起来打靶》课程的相关笔记,共计三十篇。

 

如有同学对苑老师的课程感兴趣,可以扫描下面的二维码了解详情:


    一、靶机介绍  

Description:

Leave a message is a new anonymous social networking site where users can post messages for each other. They've assigned you to test their set up. They do utilize docker containers. You can conduct attacks against those too. Try to see if you can get root on the host though.

Difficulty: Med                       (难度中等)

Tasks involved:                       (涉及技术)

  • port scanning                 (端口扫描)
  • webapp attacks              (web应用攻击)
  • code injection                (代码注入)
  • pivoting                          (跳板攻击)                  
  • exploitation                    (漏洞利用)
  • password cracking            (密码爆破)
  • local privilege escalation(本地提权)

Virtual Machine:     (建议靶机运行在Virtual上)

  • Format: Virtual Machine (Virtualbox OVA)
  • Operating System: Linux

Networking:

  • DHCP Service: Enabled
  • IP Address Automatically assign
This works better with VirtualBox rather than VMware.     目标:获取目标靶机(IP : 192.168.1.8)的最高 root 权限 !  
    下载地址:https://download.vulnhub.com/boredhackerblog/medium_socnet.ova    
  二、本地环境   渗透主机:kali_linux 2021.4    (基于 VMware     虚拟平台搭建;IP,192.168.1.6) 目标靶机:Social Network      (基于 VirtualBox  虚拟平台搭建;IP,192.168.1.8)       渗透主机和目标机之间的通讯采用的是桥接方式,网络拓扑图大概如下:  


三、端口服务的探测

渗透测试的初始阶段便是信息收集,面对刚搭建好的靶机,探测目标靶机所开放的端口、服务是必不可少的。这边笔者使用的是nmap 工具,扫描结果如下图:

可以看到,nmap探测到了目标端口开放了两个端口,分别运行在 22 和 5000 端口。靶机 22 端口运行着 SSH 服务,版本是 6.16。5000 端口运行着 http 服务,版本信息中,nmap 给出了一个Werkeug(Python 2.7.15)信息反馈。Werkeug 是一个基于Python编写,用来开发web应用程序的底层框架库。我们结合 nmap 的扫描内容可以初步猜测运行在靶机 5000 端口上的 web 服务,后端处理脚本极有可能是 python 。另外nmap 还根据靶机返回的一些标志性信息,初步判断靶机的系统内核大概为:Linux 3.2 - 4.9 。


  四、目录的强制访问     一般情况下,对靶机进行渗透测试,我们不会一上来就对 ssh 服务进行测试。一方面,靶机作者在设计靶机环境时,如果突破点不在这,那么他的登录密码将会设置的很复杂,这就要求我们的爆破字典需要极其强大;另一方面,在实际的渗透测试过程中,渗透测试者和甲方签约的合同中经常会有一条要求:不影响生产环境。而爆破是极其耗时的,几千万密码的字典跑下去,最起码得有两小时,密码还不一定跑得出来。这样的爆破,会对生产环境造成一定程度的影响,甚至导致测试目标的一些服务宕机。既然靶机开启了 http 服务,我们不妨先尝试寻找 web 方面的安全漏洞,看看能不能突破边界。如若不能,可以再回过头来测试靶机的 ssh 服务。   接下来,我们用浏览器访问靶机在 5000 端口上开启的 http 服务,如下图:    

  首页是一个具有留言功能的匿名社交网站,不管输入啥,都可以原封不动的回显出来。个人猜测可能存在 SSTI (模板注入),结果验证失败;又猜测可能存在sql注入漏洞,还是失败。这个web功能笔者暂时找不出漏洞点,没办法,只能先放这儿,先寻找其他 web 页面,测试其功能。寻找其他 web 页面,通俗点叫目录爆破,也有人称作目录的强制访问。我在这里使用的工具是kali中自带的工具:dirsearch 。    

经过短暂的 6 秒,很快 dirsearch 的爆破结果就回显出来了,它发现了一个 /admin 的目录,服务器的 HTTP 响应码是 200,表示可以正常访问 。学习网络安全相关专业的同学对网站 /admin 目录是很敏感的,因为出现 admin ,往往意味着这是网站后台管理页面的路径。现在我们去访问它:       可以看到这是个代码测试页面,网页上有提示:现在没有代码运行,让我们输入一些代码去执行。  
  五、反弹 shell   当尝试输入一些 bash 命令时,页面返回了一个错误的提示。    

打靶到这里,我不得不停下来思考一个问题:应该输入什么代码?结合之前 nmap 扫描的推测结果,于是便有了一个大胆的推测,难道是 python 代码?有了猜测,那就要验证一番。    

这边我采用的是延时思想辅助验证猜测。可以看到,网站的 Status 显示的代码状态变成了 Ran the code 以及服务器响应的数据包确实延迟了 3 秒。这也代表着刚刚输入的代码被成功的执行了,可以执行的代码语言是 python 。既然能够执行 python 代码,那我们便可以获得一个运行此代码测试功能权限的 shell 。

至此,我们终于突破了边界,可惜这台机器的 IP 地址不同于我们的之前扫描靶机的 IP 地址,是个内网的网址。 


六、内网穿透

内网地址分为 A,B 和 C 类,以下这些地址都属于内网。


A 类地址范围:10.0.0.0 - 10.255.255.255
B 类地址范围:172.16.0.0 - 172.31.255.255
C 类地址范围:192.168.0.0 - 192.168.255.255


除了以上的地址和一些比较特殊的地址如127.0.0.1169.254.0.0/16等,其他的都属于公网地址。我们获取到的root权限机器的 IP 地址为 172.17.0.2 ,属于内网 B 类地址。

 

经过笔者对这台机器的进一步探测,发现这是一台 docker 容器,并不是我们最终的目标。判断依据:Linux初始化进程时,PID=1 代表的是初始化进程的ID,如果 1 进程下面的 cgroup 文件包含 docker 文件,基本上能确定这是个docker 容器。现在我们需要想办法从 docker 容器限制的环境中脱离出来,然后去找到宿主机,进而通过对宿主机(靶机)的漏洞利用拿到最高权限。渗透主机 kali 和 docker 容器所在的内网网络无法直接通信,也就是说,kali 中的工具暂时无法使用。要想在靶机的内网中使用 kali 中的工具,我们可以使用代理工具,进行内网穿透。代理工具 Venom 使用方法详情链接:安全工具 —— Venom 渗透测试人员的多级代理。

使用 Venom 工具建立好 socks 多级代理后,在 kali 上还需要配置下 proxychains 这款代理工具的配置,如上图。配置好后,我们就可以愉快的使用 nmap 对docker 容器的内网主机进行探测扫描了。这里需要说一个注意点, proxychains 工具不能代理UDP,ICMP,SYN网络协议,无法进行系统探测,主机发现等等,但是可以用-sT参数并结合-Pn进行 TCP 端口扫描探测。docker 容器所在的内网一共有三台存活的机器,分别是 172.17.0.3 、 172.17.0.2(docker 容器) 、172.17.0.1 ,nmap 扫描探测的相关端口和服务版本如下:

nmap 扫描的 172.17.0.1 这个 IP 所返回的开放端口及服务版本等信息和刚刚我们直接扫描靶机 IP 192.168.1.8 是一样的。这边,笔者不由得猜测内网 172.17.0.1 这台机器极有可能就是宿主机,也就是靶机本身。我们可以验证下猜想:

如上图所示,确实能成功访问 172.17.0.1 这台机器所开放的 5000 端口,其所提供的 web 功能和之前的一致。极有可能我们之前用浏览器从靶机 192.168.1.8 的 5000 端口直接访问的 http 服务,是经过 172.17.0.3 这台 docker 容器映射出去的。


七、漏洞利用

172.17.0.3 这台机器开放了 9200 端口,运行着 http 服务,版本是 Elasticsearch REST API 1.4.2 ,上图便是Elasticsearch官网的截图。Elasticsearch 是为开发者提供的一套基于 Http 协议的搜索引擎接口,只需要构造 rest 请求并解析请求返回的json即可实现访问Elasticsearch服务器,Elasticsearch 的 API 接口功能丰富,包含集群、监控、部署管理等,也包含常用的文档、索引操作等。Elasticsearch REST API 最新版本是 7.16.2 ,而 1.4.2 这个版本号是非常低的,它存在一个远程代码执行的漏洞(Remote Code Execution)。

利用这个漏洞,我们又成功的获得一个 root 权限的 shell。经过进一步的信息收集与探测,在 172.17.0.2 这台机器上,我发现了一个比较敏感的文件。

经常做渗透测试的同学一看这内容,结合文件的命名,就会得出一个结论:这文件很大概率是用来存储用户名和密码的密文。

经过一段时间的解密,可以得知 john 对应的密文解密为:1337hack 。


八、本地提权

用户名和密码,是用来进行身份验证的。在之前的打靶过程中,我们遇到的需要进行身份验证的地方也就只有一个 ssh 服务了,所以在这里我猜测这是靶机的登录账号和密码。

验证成功,我们顺利的登进靶机,并且靶机回显了一条欢迎信息:Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)。在之前,笔者就曾推测内网 IP : 172.17.0.1 这台机器就是宿主机也就是靶机,现在可以继续验证。可以看到,靶机内部存在多块网卡,靶机的 IP 地址为 192.168.1.8 ,而 docker0 虚拟网卡 IP 地址也正是 172.17.0.1。

我们的目标是获得靶机 root 用户权限,目前我们只有一个低权限的 john 用户权限,所以现在有对靶机做进一步的信息探测的必要性。可以看到,靶机的 Linux 内核版本是 3.13, Linux 内核版本最新的已经到了 5.16 。在 Linux 3.13 版本中,存在可以利用内核漏洞,实现本地提权的一个操作。本地提权:将低权限的用户提升为高权限。

kali 的漏洞利用库中集成了这个漏洞的 c 语言脚本,不过靶机内部不具有编译的环境,所以我们需要编译好后传到靶机中执行。

框选的部分应当删除,框选部分代码会调用 gcc 来编译ofs-lib.c文件,这个操作在靶机上是会报错的。

删除后,编译会报错,但能正常编译完成,功能也不受影响,现在我们可以把执行 exp 所需的 ofs-lib.so文件和编译好的 exp文件一同上传到靶机的 /tmp 目录,并赋予 exp 执行权限。


九、尾声

由于本人才疏学浅,技术也不是很精熟,文中的错漏在所难免,恳请读者见谅与指正。