安全实验
安全基础
iptables端口复用
第一种方式(ICMP遥控开关)
缺点:如果目标在内网,我们无法直接ping到它
实验环境
kali(客户端),centos(服务端)
centos配置
1.创建端口复用链
创建完成后查看是否创建成功,确保自定义链已经成功创建(如下图)
2.创建端口复用规则,将流量转发至22端口
3.开启开关
如果接收到一个长为1139的ICMP包,则将来源IP添加到名为test的列表中
4.关闭开关
如果接收到一个长为1140的ICMP包,则将来源IP从test列表中去掉
5.配置转链规则
如果发现SYN包的来源IP处于test列表中,将跳转到PRE-TEST链进行处理,有效时间为3600秒
最后确认是否全部创建完成
kali配置
1.开启复用
向目标发送一个长度为1111的ICMP数据包(加上包头28,实际总长度为1139)
这里是ping成功的,尝试用ssh登录
这里可以看出之前的配置能够将80端口的流量转发到22端口,返回centos发现建立了两次稳定的TCP链接
这里有两次稳定链接因为在做测试,如果现实中出现这样的请款会不会有什么问题?安全实验思考(持续更新)
测试80端口是否还可以访问
这里我们发现已经无法访问web了
我们再去centos上查看iptables,发现收到1139字节包,并且22端口有流量
开启复用成功!!!
2.关闭复用
向目标发送一个长度为1112的ICMP数据包(加上包头28,实际总长度为1140)
这里是ping成功的,尝试用ssh登录
此时已经登录不上了,为确保准确,我们查看iptables发现收到1140的包
关闭复用也完满成功!!!
第二种方式(TCP数据包关键字)
优点:不怕目标在内网
实验环境
kali(客户端),centos(服务端)
centos配置
1.创建端口复用链
创建完成后查看是否创建成功,确保自定义链已经成功创建(如下图)
2.创建端口复用规则,将流量转发至22端口
3.开启开关
4.关闭开关
5.配置转链规则
如果发现SYN包的来源IP处于test列表中,将跳转到PRE-TEST链进行处理,有效时间为3600秒
kali配置
1.开启复用
开启后本机到目标 80 端口的流量将转发至目标的 SSH,80 将无法再被本机访问:
2.关闭复用
关闭后,80 恢复正常:
SSLH共享端口
实验环境
kali(服务端)centos(客户端)
1.kali安装SSLH
2.配置ngenx
修改服务端口为443
重启服务
3.配置SSLH
SSLH 在所有可用接口上侦听端口 443(例如:0.0.0.0:443)
–user sslh:要求在这个特定的用户身份下运行。
–listen 0.0.0.0:443:SSLH 监听于所有可用接口的 443端口。
–sshs 127.0.0.1:22 : 将 SSH 流量路由到本地的 22 端口。
–ssl 127.0.0.1:443 : 将HTTPS/SSL 流量路由到本地的 443 端口。
重启SSLH服务
4.测试
查看SSLH守护程序是否在监听443端口
这里可以看见centos成功通过443端口连接上了kali
https也可以成功访问
实验成功!!!
Nginx Host绕过
Nginx 环境搭建
1、nginx基础配置
创建一个demo.conf ,在配置文件中包含一下
[root@192~ protected]# cat /usr/local/nginx/conf/nginx.conf
http {
include /usr/local/nginx/conf/demo.conf;
}
[root@192~ protected]# cat /usr/local/nginx/conf/demo.conf
# 2023.mhz.pw
server {
listen 80;
server_name 2023.mhz.pw;
root /usr/local/nginx/html/mhz/web;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
#重启nginx服务
[root@192~ protected]# cd /usr/local/nginx/sbin/
[root@192~ sbin]# ./nginx -s reload
2、添加hosts文件
192.168.123.128 2023.mhz.pw
3、上传pwnhub文件
4.给mhz文件权限,给tmp 权限
[root@192~ sbin]#chmod -R 777 mhz/
[root@192~ mhz]# cd protected/
[root@192~ mhz]# mkdir tmp
[root@192~ mhz]# chmod 777 tmp/
5、建库建表
create databases security;
use security;
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `flags`;
CREATE TABLE `flags` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`flag` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(256) NOT NULL,
`password` varchar(32) NOT NULL,
`email` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;
SET FOREIGN_KEY_CHECKS = 1;
6、测试
成功进入登陆界面
输入用户名和密码查看MySQL数据库结构
mysql> use security;
Database Test
mysql> show tables;
+--------------------+
| Tables_in_security |
+--------------------+
| flags |
| users |
+--------------------+
2 rows in set (0.00 sec)
mysql> select * from flags;
Empty set (0.00 sec)
mysql> show columns from flags;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| flag | varchar(256) | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> show columns from users;
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(256) | NO | UNI | NULL | |
| password | varchar(32) | NO | | NULL | |
| email | varchar(256) | YES | | NULL | |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert into flags (flag) values ('莫尼热');
Query OK, 1 row affected (0.00 sec)
mysql> select * from flags;
+----+-----------------------+
| id | flag |
+----+-----------------------+
| 2 | 莫尼热 |
+----+-----------------------+
1 row in set (0.00 sec)
mysql> select * from users;
+----+----------+----------------------------------+-------------------+
| id | username | password | email |
+----+----------+----------------------------------+-------------------+
| 15 | 123 | 1a2s3d4f5g6h7j8k9lq | 2893604790@qq.com |
+----+----------+----------------------------------+-------------------+
1 row in set (0.00 sec)
mysql>
第一种处理方法
Nginx在处理Host的时候,会将Host用冒号分割成hostname和port,port部分被丢弃。所以,我们可以设置Host的值为2023.mhz.pw:xxx’"@example.com,这样就能访问到目标Server块:
第二种处理方法
当我们传入两个Host头的时候,Nginx将以第一个为准,而PHP-FPM将以第二个为准。也就是说,如果我传入:Host: 2023.mhz.pw或者Host: xxx’"@example.comNginx将认为Host2023.mhz.pw,并交给目标Server块处理;但PHP中使用$_SERVER[‘HTTP_HOST’]取到的值却是xxx’“@example.com。这样也可以绕过:
第三种处理方法
我们在发送https数据包的时候,SNI中指定的域名将会被nginx作为Server Name,而无需和HTTP报文中的Host头保持一致。我们可以直接使用Burpsuite来测试这个trick,比如我在后端编写PHP代码echo $_SERVER[‘HTTP_HOST’]。正常访问是会显示此时的Host头