网安教育
培养网络安全人才
技术交流、学习咨询
决定写这篇文章是我解决了所有问题以后决定记录一下这个过程所写的,因此可能会忽略很多细节上的东西。
问题一:打点的时候经常会被WAF封禁IP怎么办?
问题二:内网的时候只想代理部分目的地址怎么办?
我想大部分人解决问题一的方案就是不断切换出口IP,使得出口地址一直改变,避免被封,而解决问题二的方案可能就是Proxifier或者Proxycap。
Proxifier是一款能够实现系统全局代理的软件,它支持的代理类型有:Http、Https、Socks4a、Socks5.
在使用Windows渗透的过程中,我经常使用Proxifier来实现进程单位的代理进行内网渗透,利用好rules就能避免系统全局流量被导入代理,流量流入内网从而暴露自己的一些信息。
以上两个问题在Windows下不是问题,我之前经常使用Kali Linux来进行渗透,自从更新版本以后,它设置系统代理需要自己写PAC文件,这一点增加了一点点学习门槛,并且好像不是那么好用。最近我使用Arch Linux已经有段时间了,并且把它安装在了我的工作机、家庭电脑上,我非常喜欢这个操作系统和这个操作系统的生态。
因此我不得不开始完全适应更多在Linux上渗透的场景,这也让我收获颇多,这篇文章就记录一下我如何学习自己搭建透明代理实现愉快的工作环境。
1、什么是透明代理?
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。
2、为什么要用到透明代理?
因为这样能够让我的机器“身处”在内网中,也能让我的机器在“世界上的任何角落里”。
大家都知道,在Linux下常规的内网渗透需要使用一些如:proxychains的工具实现指定的进程访问内网的资源,相当于给程序套了一层代理。
它的实现原理如下:
关于LD_PRELOAD之前有写过相关文章:Linux权限维持之LD_PRELOAD
它的缺点却是每个命令必须要在前面加上proxychains,这样Bash shell有时候可能不会正常工作给我们进行参数提示。
我要做的就是使用iptables实现透明代理,让我的机器所有与目标地址相关的流量都导入socks5代理端口。
题外话一,关闭proxychains的输出信息可以将/etc/proxychains.conf文件中的quiet_mode前面的#去除。
题外话二,设置metasploit全局代理的方法:
可以将metasploit全局变量proxies的值进行设置来使得后续所有的流量都经过代理发出,这样能够达到内网穿透的效果。
图中演示了2层代理的设置
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进行监听。
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链。
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,实现打点模式的透明代理。
内网与打点模式不同,主要是实现指定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模式也能够“身处”内网。
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//n/ })
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
这个是我在熟悉透明代理后产生的想法,适合“团队作战”,尤其是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也不需要重启。
放两张喜爱的桌面:
通过动手实践,解决了工作痛点,让技术的价值发挥出来更能收获成就感。
期间还实现了科学上网的透明代理,但是与工作无关,网络上已经大把帖子了,收获颇多,关于渗透还需要研究更多,看问题的角度也要多变,就如上一篇Web正向代理的思考 ,虽说不是一个通用技术,但是能够解决一些场景的问题,提升效率。
文:倾旋
转自:https://payloads.online/archivers/2020-11-13/1#0x00-%E5%89%8D%E8%A8%80
如有侵权请联系删除
战疫期间,开源聚合网络安全基础班、实战班线上全面开启,学网络安全技术、升职加薪……有兴趣的可以加入开源聚合网安大家庭,一起学习、一起成长,考证书求职加分、升级加薪,有兴趣的可以咨询客服小姐姐哦!
加QQ(1005989737)找小姐姐私聊哦
本文始发于微信公众号(开源聚合网络空间安全研究院):【红蓝对抗】Linux透明代理在红队渗透中的应用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论