Linux透明代理在红队渗透中的应用
2020-11-13|2023-6-22

倾旋
type
status
date
slug
summary
tags
category
icon
password
URL
0x00 前言
决定写这篇文章是我解决了所有问题以后决定记录一下这个过程所写的,因此可能会忽略很多细节上的东西。
- 问题一:打点的时候经常会被WAF封禁IP怎么办?
- 问题二:内网的时候只想代理部分目的地址怎么办?
Proxifier是一款能够实现系统全局代理的软件,它支持的代理类型有:Http、Https、Socks4a、Socks5.
在使用Windows渗透的过程中,我经常使用Proxifier来实现进程单位的代理进行内网渗透,利用好rules就能避免系统全局流量被导入代理,流量流入内网从而暴露自己的一些信息。
以上两个问题在Windows下不是问题,我之前经常使用Kali Linux来进行渗透,自从更新版本以后,它设置系统代理需要自己写PAC文件,这一点增加了一点点学习门槛,并且好像不是那么好用。最近我使用Arch Linux已经有段时间了,并且把它安装在了我的工作机、家庭电脑上,我非常喜欢这个操作系统和这个操作系统的生态。
因此我不得不开始完全适应更多在Linux上渗透的场景,这也让我收获颇多,这篇文章就记录一下我如何学习自己搭建透明代理实现愉快的工作环境。
0x01 透明代理
什么是透明代理?

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。
为什么要用到透明代理?
因为这样能够让我的机器“身处”在内网中,也能让我的机器在“世界上的任何角落里”。
大家都知道,在Linux下常规的内网渗透需要使用一些如:proxychains的工具实现指定的进程访问内网的资源,相当于给程序套了一层代理。
它的实现原理如下:
ProxyChains is a UNIX program, that hooks network-related libc functions in dynamically linked programs via a preloaded DLL and redirects the connections through SOCKS4a/5 or HTTP proxies.
关于
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
的文章。流量导入Socks代理
通过将规则插入到
NAT
表的PREROUTING
链中,可以轻松地重定向传入流量。例如:
所有访问eth0网卡80端口的流量,都会被重定向到8080端口。
它不同于端口转发,
REDIRECT
的--dport
端口并不会被iptables
进行监听。
0x03 实现简单的透明代理
redsocks是一个能够重定向socks代理的一款开源软件,它允许我们在系统上监听一个端口,与远程socks端口进行转换,并且支持socks5认证,这一点非常赞。后来发现还有新的redsocks一些还在维护,但旧版已经足够满足我的需要了,就没有下载。
redsocks安装
安装必备库:
- ArchLinux :
yaourt -S --noconfirm redsocks-git
- Debian :
apt install gcc libevent-dev
- CentOS :
yum install libevent-devel git gcc
编译代码:
- 安装完毕后,当前目录会生成
redsocks
二进制可执行文件,把它拷贝到环境变量目录下即可,例如:/usr/bin/redsocks
- 将配置文件
redsocks.conf
拷贝至/etc/redsocks.conf
配置redsocks代理服务器
在
/etc/redsocks.conf
第61行-62行是设置Socks5服务器IP和端口的:配置redsocks启动身份
为了避免启用端口流量重定向后数据发生回环问题,需要用iptables根据UID进行过滤
redsocks
的出口流量。添加
redsocks
组与redsocks
用户:将
/etc/redsocks.conf
的启动用户名和用户组进行更改:对应的防火墙规则:
这么做是为了把除了redsocks用户产生的流量全部经过REDSOCKS链。
0x04 打点模式-配置代理链
创建自定义规则链
建立一个独立的链是为了方便的清空和新建,并且还不会污染内置链的规则。
31338是redsocks的默认端口。
启动redsocks
启动redsocks后,进程的所属者会被自动更改为redsocks。
这时访问公网查看出口IP,会变成Socks5代理服务器的出口IP,实现打点模式的透明代理。
0x05 内网模式-配置代理链
内网与打点模式不同,主要是实现指定IP地址范围的代理,打点是“放哪些”,内网是“要哪些”。
以上防火墙规则是将以下目的地址的流量全部导入redsoks:
- 10.0.0.0/8
- 172.0.0.0/8
- 192.168.0.0/16
如果要添加专网的地址,可以手动添加:
启用以上防火墙规则后,我可以不需要使用proxychains,直接可以用nmap探测端口,自定义的工具也能够像在内网一样工作,本机开的虚拟机切换到NAT模式也能够“身处”内网。
0x06 自动化实现
使用方式:
- 打点模式简单使用(每执行一次,向API拉取新的代理):

- 切换至内网模式使用:

- 手动指定Socks的IP和端口(打点模式与内网模式兼容):
0x06 树莓派实现6小时切换一次出口的WiFi

这个是我在熟悉透明代理后产生的想法,适合“团队作战”,尤其是Web渗透这块最消耗IP了,实验室的小伙伴大多也都是笔记本,因此想出了用树莓派实现6小时切换一次出口的WiFi,当然了,也能把穿透内网的Socks变成一个WiFi :)
更改redsocks监听地址
如果是多网卡需要把redsocks配置文件
/etc/redsocks.conf
的监听IP地址改为:0.0.0.0,不然在wlan0
的流量转向eth0
的时候,会找不到31338端口。安装创建AP的工具
创建WiFi:
/usr/bin/create_ap -w 2 wlan0 eth0 <WiFi Name> <WiFi Pass>
-w 为启用WPA2
编写AP服务脚本
在
/usr/lib/systemd/system/
创建wifi.service
编写计划任务脚本
random-wifi.sh:
sudo crontab -e
进入root用户的计划任务编写:待完善的缺点
比如在切换新的出口时,WiFi是关闭的,现在的客户端一般都是会自动寻找下一个WiFi自动连接的,如果工具正在扫描会导致真实出口IP被发现。
思路:在切换WiFi前,将
wlan0
网卡的流量全部DROP
,这样WiFi也不需要重启。放两张喜爱的桌面:

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