网络安全

了解最新公司动态及行业资讯

当前位置:首页>新闻资讯>网络安全
全部 12 公司动态 2 网络安全 10

【红蓝对抗】Linux透明代理在红队渗透中的应用

时间:2020-12-26   访问量:1349

决定写这篇文章是我解决了所有问题以后决定记录一下这个过程所写的,因此可能会忽略很多细节上的东西。

问题一:打点的时候经常会被WAF封禁IP怎么办?

问题二:内网的时候只想代理部分目的地址怎么办?


我想大部分人解决问题一的方案就是不断切换出口IP,使得出口地址一直改变,避免被封,而解决问题二的方案可能就是Proxifier或者Proxycap。

Proxifier是一款能够实现系统全局代理的软件,它支持的代理类型有:Http、Https、Socks4a、Socks5.


在使用Windows渗透的过程中,我经常使用Proxifier来实现进程单位的代理进行内网渗透,利用好rules就能避免系统全局流量被导入代理,流量流入内网从而暴露自己的一些信息。

以上两个问题在Windows下不是问题,我之前经常使用Kali Linux来进行渗透,自从更新版本以后,它设置系统代理需要自己写PAC文件,这一点增加了一点点学习门槛,并且好像不是那么好用。最近我使用Arch Linux已经有段时间了,并且把它安装在了我的工作机、家庭电脑上,我非常喜欢这个操作系统和这个操作系统的生态。


因此我不得不开始完全适应更多在Linux上渗透的场景,这也让我收获颇多,这篇文章就记录一下我如何学习自己搭建透明代理实现愉快的工作环境。





0x01 透明代理



1、什么是透明代理?

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。


2、为什么要用到透明代理?


因为这样能够让我的机器“身处”在内网中,也能让我的机器在“世界上的任何角落里”。

大家都知道,在Linux下常规的内网渗透需要使用一些如:proxychains的工具实现指定的进程访问内网的资源,相当于给程序套了一层代理。

它的实现原理如下:




ProxyChains是UNIX程序,它通过预加载的DLL将网络相关的libc函数挂接到动态链接的程序中,并通过SOCKS4a / 5或HTTP代理重定向连接。




关于LD_PRELOAD之前有写过相关文章:Linux权限维持之LD_PRELOAD


它的缺点却是每个命令必须要在前面加上proxychains,这样Bash shell有时候可能不会正常工作给我们进行参数提示。

我要做的就是使用iptables实现透明代理,让我的机器所有与目标地址相关的流量都导入socks5代理端口。


题外话一,关闭proxychains的输出信息可以将/etc/proxychains.conf文件中的quiet_mode前面的#去除。

题外话二,设置metasploit全局代理的方法:

可以将metasploit全局变量proxies的值进行设置来使得后续所有的流量都经过代理发出,这样能够达到内网穿透的效果。

图中演示了2层代理的设置





0x02 Linux下的iptables防火墙



iptables是一个用户空间实用程序,它允许系统管理员配置Linux内核防火墙的IP数据包过滤器规则,这些规则实现为不同的Netfilter模块。筛选器组织在不同的表中,这些表包含有关如何处理网络流量数据包的规则链。当前,不同的内核模块和程序用于不同的协议。iptables适用于IPv4,ip6tables适用于IPv6,arptables适用于ARP,而ebtables适用于以太网帧。

学习iptables有一点门槛,需要对表、规则链、动作等关系有一定的了解,这里不继续铺垫,可以自行搜索关于iptables的文章。


1、流量导入Socks代理


通过将规则插入到NAT表的PREROUTING链中,可以轻松地重定向传入流量。

例如:

1iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080


所有访问eth0网卡80端口的流量,都会被重定向到8080端口。

它不同于端口转发,REDIRECT的--dport端口并不会被iptables进行监听。

图片





0x03 实现简单的透明代理



redsocks是一个能够重定向socks代理的一款开源软件,它允许我们在系统上监听一个端口,与远程socks端口进行转换,并且支持socks5认证,这一点非常赞。后来发现还有新的redsocks一些还在维护,但旧版已经足够满足我的需要了,就没有下载。


1、redsocks安装


安装必备库:

ArchLinux : yaourt -S --noconfirm redsocks-git

Debian : apt install gcc libevent-dev

CentOS : yum install libevent-devel git gcc


编译代码:

1git clone https://github.com/darkk/redsocks
2cd redsocks
3make


安装完毕后,当前目录会生成redsocks二进制可执行文件,把它拷贝到环境变量目录下即可,例如:/usr/bin/redsocks

将配置文件redsocks.conf拷贝至/etc/redsocks.conf


2、配置redsocks代理服务器

在/etc/redsocks.conf第61行-62行是设置Socks5服务器IP和端口的:

1// `ip' and `port' are IP and tcp-port of proxy-server
2// You can also use hostname instead of IP, only one (random)
3// address of multihomed host will be used.
4ip=***;
5port=***;


3、配置redsocks启动身份

为了避免启用端口流量重定向后数据发生回环问题,需要用iptables根据UID进行过滤redsocks的出口流量。


添加redsocks组与redsocks用户:

1groupadd redsocks
2useradd -g redsocks redsocks


将/etc/redsocks.conf的启动用户名和用户组进行更改:

1user = redsocks;
2group = redsocks;


对应的防火墙规则:

1iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner redsocks  -j REDSOCKS


这么做是为了把除了redsocks用户产生的流量全部经过REDSOCKS链。





0x04 打点模式-配置代理链



1、创建自定义规则链


 1iptables -t nat -N REDSOCKS 
2# 建立REDSOCKS链
3iptables -t nat -A PREROUTING -p tcp -j REDSOCKS 
4# 将所有的TCP流量经过REDSOCKS链
5iptables -t nat -A REDSOCKS -d <SOCKS_API_SERVER> -j RETURN 
6# 放行获取Socks代理的API服务器
7iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN 
8# 放行内网地址
9iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN 
10# 放行内网地址
11iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN 
12# 放行内网地址
13iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN 
14# 放行内网地址
15iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN 
16# 放行内网地址
17iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 31338 
18# 将所有的TCP流量在经过REDSOCKS链后,全部重定向到31338端口。
19iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner redsocks  -j REDSOCKS
20# 将准备流出的流量除了redsocks产生的以外,全部经过REDSOCKS链


建立一个独立的链是为了方便的清空和新建,并且还不会污染内置链的规则。

31338是redsocks的默认端口。


2、启动redsocks


1sudo /usr/bin/redsocks -c /etc/redsocks.conf


启动redsocks后,进程的所属者会被自动更改为redsocks。

这时访问公网查看出口IP,会变成Socks5代理服务器的出口IP,实现打点模式的透明代理。





0x05 内网模式-配置代理链



内网与打点模式不同,主要是实现指定IP地址范围的代理,打点是“放哪些”,内网是“要哪些”。

1iptables -t nat -N REDSOCKS
2iptables -t nat -F REDSOCKS # 清空
3
4iptables -t nat -A PREROUTING -p tcp -j REDSOCKS
5iptables -t nat -A REDSOCKS -p tcp -d 10.0.0.0/8 -j REDIRECT --to-port 31338
6iptables -t nat -A REDSOCKS -p tcp -d 172.0.0.0/8 -j REDIRECT --to-port 31338
7iptables -t nat -A REDSOCKS -p tcp -d 192.168.0.0/16 -j REDIRECT --to-port 31338
8iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner $redsocks_user  -j REDSOCKS


以上防火墙规则是将以下目的地址的流量全部导入redsoks:

10.0.0.0/8

172.0.0.0/8

192.168.0.0/16


如果要添加专网的地址,可以手动添加:

1iptables -t nat -A REDSOCKS -p tcp -d XXX.XXX.XX.XX/XX -j REDIRECT --to-port 31338


启用以上防火墙规则后,我可以不需要使用proxychains,直接可以用nmap探测端口,自定义的工具也能够像在内网一样工作,本机开的虚拟机切换到NAT模式也能够“身处”内网。





0x06 自动化实现



  1#!/bin/bash
 2redsocks_bin_path="/usr/bin/redsocks"
 3redsocks_config_file_path="/etc/redsocks.conf"
 4socks_api_url='*****'
 5shell_log_path="/tmp/socks-switch.log"
 6# ssh port
 7ssh_port="22"
 8redsocks_user="redsocks"
 9
10socks_loging(){
11    current_time=$(date +"%Y-%m-%d %H:%M:%S");
12    echo "[*] "$current_time ": " $1 >> $shell_log_path
13    echo "[*] "$current_time ": " $1
14}
15
16
17change_socks(){
18    local socks_ip=$1;
19    local socks_port=$2;
20    socks_loging "Change Socks: $1, Port: $2";
21    # 61行是Socks IP
22    sed -i '61d' $redsocks_config_file_path
23    sed -i "61i        ip=$socks_ip;"  $redsocks_config_file_path
24
25    # 62行是Socks Port
26    sed -i '62d' $redsocks_config_file_path
27    sed -i "62i        port=$socks_port;"  $redsocks_config_file_path
28    pkill redsocks
29    socks_loging "Run redsocks...."
30    $redsocks_bin_path -c $redsocks_config_file_path
31}
32
33start_pentest(){
34    uninstall_iptables
35    iptables -t nat -N REDSOCKS
36    iptables -t nat -F REDSOCKS # 清空
37
38    iptables -t nat -A PREROUTING -p tcp -j REDSOCKS
39    iptables -t nat -A REDSOCKS -p tcp -d 10.0.0.0/8 -j REDIRECT --to-port 31338
40    iptables -t nat -A REDSOCKS -p tcp -d 172.0.0.0/8 -j REDIRECT --to-port 31338
41    iptables -t nat -A REDSOCKS -p tcp -d 192.168.0.0/16 -j REDIRECT --to-port 31338
42
43    unset_iptables
44    set_iptables
45    local socks_ip=$1;
46    local socks_port=$2;
47    change_socks $socks_ip $socks_port
48    socks_loging "Change Socks: $1, Port: $2";
49
50}
51
52install_iptables(){
53    iptables -t nat -F OUTPUT
54    iptables -t nat -F PREROUTING
55    # 如果没有就新建一个
56    local is_redsocks=`iptables -t nat -nL --line-number |grep REDSOCKS`
57    if [ -z "$is_redsocks" ]; then
58            iptables -t nat -N REDSOCKS
59    fi
60    iptables -t nat -F REDSOCKS # 清空
61    iptables -t nat -A PREROUTING -p tcp -j REDSOCKS
62    iptables -t nat -A REDSOCKS -p tcp --dport $ssh_port -j RETURN
63    iptables -t nat -A REDSOCKS -d <SOCKS API Server> -j RETURN
64    iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
65    iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
66    iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
67    iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
68    iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
69    iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 31338
70    socks_loging "Install Success!"
71}
72
73
74uninstall_iptables(){
75    iptables -t nat -F OUTPUT
76    iptables -t nat -F PREROUTING
77    socks_loging "Uninstall iptables  ..."
78    is_redsocks=`iptables -t nat -nvL REDSOCKS |wc -l`
79    if [ "$is_redsocks"!="0" ]; then
80            iptables -t nat -F REDSOCKS
81            iptables -t nat -X REDSOCKS
82    fi
83}
84
85
86set_iptables(){
87    iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner $redsocks_user  -j REDSOCKS
88}
89
90unset_iptables(){
91    ids=`iptables -t nat -nL OUTPUT --line-number | grep REDSOCKS | awk '{print $1}'`
92    if [ -z "$ids" ]; then
93        socks_loging "No Set Iptables ..."
94        return
95    fi
96    id_array=(${ids// / })
97    socks_loging "REDSOCKS OUTPUT Chian ID : $id_array"
98    for id in ${id_array[@]}
99    do
100        id=`echo $id|egrep -o "[0-9]{1,4}"`
101        if [ $id!="" ]; then
102            iptables -t nat -D OUTPUT $id
103        fi
104    done
105}
106
107
108
109
110if [ -z "$1" ]; then
111    echo "[*] Usage : $0 <start | stop | clean | install | uninstall | change IP PORT | pentest IP PORT>
112        $0 start : 启动redsocks,自动设置iptables
113        $0 stop : 停止redsocks,自动清空iptables
114        $0 clean : 清空iptables所有规则
115        $0 install : 安装iptables规则
116        $0 uninstall : 卸载iptables规则
117        $0 change : 改变Socks的IP和端口
118        $0 pentest : 开始内网渗透,传入Socks的IP和端口
119    "

120    exit 0
121fi
122
123
124
125if [ "$1" = "install" ]; then
126install_iptables
127    exit 0
128fi
129
130if [ "$1" = "pentest" ]; then
131    start_pentest $2 $3
132    exit 0


使用方式:

打点模式简单使用(每执行一次,向API拉取新的代理):

图片

1sudo ./socks-switch.sh install
2sudo ./socks-switch.sh start


切换至内网模式使用:


1sudo ./socks-switch.sh uninstall
2sudo ./socks-switch.sh pentest <Socks IP> <Socks Port>
3


手动指定Socks的IP和端口(打点模式与内网模式兼容):

1sudo ./socks-switch.sh change <Socks IP> <Socks Port>
2





0x06 树莓派实现6小时切换一次出口的WiFi



这个是我在熟悉透明代理后产生的想法,适合“团队作战”,尤其是Web渗透这块最消耗IP了,实验室的小伙伴大多也都是笔记本,因此想出了用树莓派实现6小时切换一次出口的WiFi,当然了,也能把穿透内网的Socks变成一个WiFi :)


1、更改redsocks监听地址

如果是多网卡需要把redsocks配置文件/etc/redsocks.conf的监听IP地址改为:0.0.0.0,不然在wlan0的流量转向eth0的时候,会找不到31338端口。

1local_ip = 0.0.0.0;
2local_port = 31338;


2、安装创建AP的工具

1sudo apt-get install util-linux procps hostapd iproute2 iw haveged dnsmasq
2sudo git clone https://github.com/oblique/create_ap
3cd create_ap
4sudo make install


创建WiFi:/usr/bin/create_ap -w 2 wlan0 eth0 <WiFi Name> <WiFi Pass>

-w 为启用WPA2


3、编写AP服务脚本

在 /usr/lib/systemd/system/创建wifi.service

 1[Unit]
2Description=Create AP Service
3After=network.target
4
5[Service]

6Type=simple
7ExecStart=/usr/bin/create_ap -w 2 wlan0 eth0 <WiFi Name> <WiFi Pass> 
8KillSignal=SIGINT
9Restart=on-failure
10RestartSec=5
11
12[Install]

13WantedBy=multi-user.target


4、编写计划任务脚本


random-wifi.sh:

1#!/bin/bash
2cd /home/pi/socks-switch
3systemctl stop wifi # 先停止WiFi
4./socks-switch.sh clean # 清空规则
5./socks-switch.sh install # 安装规则
6./socks-switch.sh start # 启用规则
7systemctl start wifi # 创建WiFi


sudo crontab -e进入root用户的计划任务编写:

1*/6 * * * /home/pi/socks-switch/random-wifi.sh # 每隔六小时重置一次,并获取新的出口代理


5、待完善的缺点

比如在切换新的出口时,WiFi是关闭的,现在的客户端一般都是会自动寻找下一个WiFi自动连接的,如果工具正在扫描会导致真实出口IP被发现。

思路:在切换WiFi前,将wlan0网卡的流量全部DROP,这样WiFi也不需要重启。

放两张喜爱的桌面:

图片





0x08 总结



通过动手实践,解决了工作痛点,让技术的价值发挥出来更能收获成就感。


期间还实现了科学上网的透明代理,但是与工作无关,网络上已经大把帖子了,收获颇多,关于渗透还需要研究更多,看问题的角度也要多变,就如上一篇Web正向代理的思考 ,虽说不是一个通用技术,但是能够解决一些场景的问题,提升效率。


图片

文:倾旋

转自:https://payloads.online/archivers/2020-11-13/1#0x00-%E5%89%8D%E8%A8%80

如有侵权请联系删除


上一篇:【大牛分享】chrome debug和我一些挖洞的经验

下一篇:【实例剖析】记一次通过代码审计完成的渗透