软路由实现流量拦截

在渗透测试中,侦听和拦截数据包是最基础的姿势。 但总是无可避免的会有一些测试对象上无法主动配置代理,比如一个WiFi电子秤… 其实,连接到WiFi网络,然后使用wireshark进行流量侦听是比较方便快捷的,但我就是想知道理论可行的流量拦截该怎么个姿势。

Mac · 软路由实现流量拦截

将Mac配置为一台路由器

路由器至少得有两个网卡,一个连接外部网络,一个连接内部网络。为此,我在笔记本上连接了一个USB网卡用以连接外部网络(相对而言的外部,其实是公司的局域网),把Mac自带的WiFi作为内部网卡使用。

使用Mac自带的共享功能,开启WiFi热点。

查看 ifconfig

如此,便开启了WiFi热点,而电脑就相当于是一个路由器。连接WiFi的设置,其流量需要先进入到“路由器”,然后路由到外网。

用手机连接WiFi热点即可共享上网。 由于此处创建了一个桥架网络bridge100,我就尝试将Mac上的Ubuntu虚拟机桥接到这个网络上。经验证,可行!!!(此种情况连接的网络应该与直接选择NAT上网应该是不一样的。直接选择NAT模式,充当网关的应该是虚拟机软件,而实体机上虚拟出来的网卡也只是连接到虚拟软件创建的网关上而已。)

pf基础知识


了解pf的简单使用,以便于理解数据拦截的原理,及进行灵活运用。
为此,笔者专门学习整理了一下pf相关的知识。http://oddboy.cn/2018/01/OpenBSD-PF-Packet-Filter-学习/

- 默认配置文件 /etc/pf.conf

1
2
3
4
5
6
7
crub-anchor "com.apple/*"   # 流量整形  * 表示含有所有的子规则/子anchor规则
nat-anchor "com.apple/*" # NAT规则
rdr-anchor "com.apple/*" # 重定向规则
dummynet-anchor "com.apple/*" # 不清楚~~~

anchor "com.apple/*" # 过滤规则
load anchor "com.apple" from "/etc/pf.anchors/com.apple" # 从文件载入规则

  • 常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    sudo pfctl -e   # enable pf
    sudo pfctl -E # Enable pf and increment the pf enable reference count.
    sudo pfctl -d # disable pf
    sudo pfctl -v -n -f /etc/pf.conf # 验证pf.conf文件是否有问题
    sudo pfctl -sa # -s all 查看所有
    sudo pfctl -sr # -s rules 查看规则
    sudo pfctl -s nat # 查看nat规则
    # 更多命令可查看 man pfctl
  • pfctl添加配置

    1
    2
    echo "block all" | sudo pfctl -Ef - # 拒绝所有流量 == 完全断网
    echo "block return out quick on en0 proto tcp to any port {443}" | sudo pfctl -f - # 拒绝访问443
  • 配置文件中添加配置

    在配置文件中配置信息顺序书写: Macro -> Table -> Option -> Scrub -> Queue -> Translation -> Filter

    1
    2
    3
    4
    5
    # /etc/pf.conf
    rdr on bridge100 proto tcp from any to ip.chinaz.com port 80 -> 127.0.0.1 port 8080 # 重定向
    block all # 拒绝所有
    pass out all # 允许出流量
    block out proto tcp to port 80 # 拒绝连接80端口
  • 通过锚(Anchor)动态修改规则

    /etc/pf.conf 文件中描述的”com.apple”锚是从/etc/pf.anchors/com.apple中加载的,但cat /etc/pf.anchors/com.apple(如下),仅仅只是anchor的定义,实际的rules会在运行时系统调用pfctl命令来加入。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #
    # AirDrop anchor point.
    #
    anchor "200.AirDrop/*"

    #
    # Application Firewall anchor point.
    #
    anchor "250.ApplicationFirewall/*"

当打开Mac系统防火墙,并配置为”Block all incoming connections”时,可以查看到相关的filter rules.

拦截HTTP/HTTPS数据包

1
➜ ~ echo "rdr on bridge100 proto tcp from any to ip.chinaz.com port 80 -> 127.0.0.1 port 8080" | sudo pfctl -Ef -

在桥接到bridge100的虚拟机上访问http://ip.chinaz.com/getip.aspx。可以看到至少流量确实被转发到了burpsuite。

在Proxy Listener中勾选“Support invisible proxying(enable only if needed)”。

重试! 请求包成功拦截到burpsuite中。


放行,但却没有成功,而且其它网站也无法访问了。

就是这里涉及到的一个小问题,困惑了我两三天。

因为在开启“Internet Sharing”的时候,系统生成了nat规则。 而我在加入自己的规则后,pf就清除了“Internet Sharing”的规则,所以添加上nat规则就可以成功了。

查看系统的实际配置,印证我的观点,并酌情优化我的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
➜  ~ grep -v "^#" /etc/pf.conf

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
dummynet-anchor "com.apple/*"

nat on en5 from bridge100:network to any -> (en5)
rdr on bridge100 proto tcp from any to any port 80 -> 127.0.0.1 port 8080

anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

➜ ~ sudo pfctl -sn
No ALTQ support in kernel
ALTQ related functions disabled
nat-anchor "com.apple/*" all
nat on en5 inet from 192.168.2.0/24 to any -> (en5) round-robin
rdr-anchor "com.apple/*" all
rdr on bridge100 inet proto tcp from any to any port = 80 -> 127.0.0.1 port 8080
➜ ~ sudo pfctl -sn # 重启Internet Sharing之后再次查看
No ALTQ support in kernel
ALTQ related functions disabled
nat-anchor "com.apple/*" all
nat-anchor "com.apple.internet-sharing" all
rdr-anchor "com.apple/*" all
rdr-anchor "com.apple.internet-sharing" all
➜ ~ sudo pfctl -a com.apple.internet-sharing/base_v4 -sn # 系统生成的translation规则
No ALTQ support in kernel
ALTQ related functions disabled
# 通过NAT规则,修改请求包的源地址和源端口。
nat on en5 inet from 192.168.2.0/24 to any -> (en5:0) extfilter ei
# 内部网络间不做nat转换 (感觉应该没用)
no nat on bridge100 inet from 192.168.2.1 to 192.168.2.0/24
# pf的ftp-proxy处理办法。应该是利用inetd开启了一个TCP代理,用于访问FTP。
rdr on bridge100 inet proto tcp from 192.168.2.0/24 to any port = 21 -> 127.0.0.1 port 8021

➜ ~ sudo pfctl -a com.apple.internet-sharing/base_v4 -sr # 系统生成的过滤规则
No ALTQ support in kernel
ALTQ related functions disabled
scrub on en5 all no-df fragment reassemble
scrub on bridge100 all no-df max-mss 1460 fragment reassemble
scrub on bridge100 proto esp all no-df fragment reassemble
pass on en5 all flags any keep state
pass on en5 proto esp all no state
pass on bridge100 all flags any keep state rtable 5


最终配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  ~ grep -v "^#" /etc/pf.conf
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
nat-anchor "hackproxy/*"
rdr-anchor "com.apple/*"
rdr-anchor "hackproxy/*"
dummynet-anchor "com.apple/*"

anchor "com.apple/*"
anchor "hackproxy/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "hackproxy" from "/etc/pf.anchors/hackproxy"

➜ ~ grep -v "^#" /etc/pf.anchors/hackproxy

nat on en5 inet from bridge100:network to any -> (en5:0) extfilter ei
rdr on bridge100 inet proto tcp all -> 127.0.0.1 port 8080

运行正常!!!

成功拦截到数据包!!!

Kali · 软路由实现流量拦截

配置软路由

为了在Linux上实现软路由,特地买了一块USB网卡(兼容Linux的)。在虚拟机中运行kali,插入USB网卡并直连到kali系统。

查看网卡状态

wlan0 即为无线网卡。

开启WiFi热点

将无线网卡wlan0配置为自管理(不让network-manager插手),否则无法开启热点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat /etc/NetworkManager/NetworkManager.conf 
[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=false

[device]
wifi.scan-rand-mac-address=no # 务必配置,否者无线网卡的Mac地址会自动修改。 贼坑!!!

[keyfile]
unmanaged-devices=mac:ea:e3:6b:0f:f7:b6 # wlan0的mac地址。多个mac以;分割
# 以上配置文件中去掉'#'及后续内容,这个更坑!!!!
$ service network-manager restart # 重启network-manager服务

使用hostapd软件来开启WiFi。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ apt-get install hostapd       # 安装hostapd
# 下载官方配置文件示例作为参考
$ wget https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf -o /etc/hostapd/hostapd.conf.example

$ vim /etc/hostapd/hostapd.conf # 自己写一个简化配置
$ grep -v "^#" /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
hw_mode=g
channel=acs_survey # 6
auth_algs=3
ssid=wifitest
max_num_sta=32
wpa=3
wpa_passphrase=yourpassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

# hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
ACS: Automatic channel selection started, this may take a bit
wlan0: interface state UNINITIALIZED->ACS
wlan0: ACS-STARTED
....
wlan0: ACS-COMPLETED freq=2412 channel=1
Using interface wlan0 with hwaddr ea:e3:6b:0f:f7:b6 and ssid "wifitest"
wlan0: interface state ACS->ENABLED
wlan0: AP-ENABLED
# 运行成功!!!

现在hostapd的配置完成且启动成功,手机已经可以搜索到一个名为wifiteset的wifi。但是还连不上这个wifi,因为现在还没有配置dhcp服务器,无法获取IP地址,也无法上网,因为没有配置路由。

配置网络服务

使用dnsmasq来提供DNS和DHCP服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ apt-get install dnsmasq
$ vim /etc/dnsmasq.d/wifiNetServices.conf
$ grep -v "^#" /etc/dnsmasq.d/wifiNetServices.conf
interface=wlan0
listen-address=127.0.0.1
dhcp-range=192.168.9.50,192.168.9.150,255.255.255.0,12h
dhcp-option=3,192.168.9.1
dhcp-option=6,192.168.9.1
server=8.8.8.8
log-queries
log-dhcp
address=/bingo.com/192.168.9.1

$ ifconfig wlan0 192.168.9.1 netmask 255.255.255.0 # 配置网关IP,或使用如下静态配置。
# $ vim /etc/network/interfaces
# auto wlan0
# iface wlan0 inet static
# address 192.168.9.1
# netmask 255.255.255.0

此时,便可以连接WiFi了。

路由配置

普通的上网配置:

1
2
3
$ sysctl -w net.ipv4.ip_forward=1   # echo 1 > /proc/sys/net/ipv4/ip_forward # 永久配置
$ iptables -P FORWARD ACCEPT
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

此时连上WiFi的手机就能正常上网了。

iptables将流量转发到Proxy

核心功能就是用iptables来实现,而iptables里面几个主要是维护了几个规则表,从而实现其强大的功能。

对于当前我们这个使用场景,流量需要进过PREROUTING –> FORWARD –> POSTROUTING三个步骤。

  • 在PREROUTING中添加规则,修改数据包的目标IP和端口,实现将流量转发到Proxy。
  • FORWARD 直接允许即可。
  • POSTROUTING中添加规则,修改数据包的原始IP和端口,让目标站点返回的数据原路返回。(就是我们最通常意义上里面的NAT转换)

命令实现:

1
2
3
$ iptables -t nat -A PREROUTING -i wlan0 -p tcp -j DNAT --to-destination 10.1.0.2:8080
# $ iptables -P FORWARD ACCEPT # 此命令上面已经执行过,可以忽略。
$ iptables -t nat -A POSTROUTING -o eth0 -s 192.168.9.0/24 -d 10.1.0.2 -j MASQUERADE

查看路由表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere to:10.1.0.2:8080

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
MASQUERADE all -- 192.168.9.0/24 10.1.0.2

手机连上WiFi,玩玩“跳一跳”,之前Burpsuite无法截获的sessionID成功捕获:

Windows · 懵逼ing


折腾完之后,发现其实是个挺简单的问题和思路。不过,比较扎心的是,Windows平台上我始终无法做到!!! 如果哪位朋友有思路的话,烦请指点一二。 谢谢!

参考链接:

https://github.com/koenbuyens/kalirouter/blob/master/README.md

http://tlbdk.github.io/mac/proxy/mitmproxy/fiddler/2016/04/14/redirect-outgoing-traffic-for-user-on-mac.html

http://murusfirewall.com/Documentation/OS%20X%20PF%20Manual.pdf

https://man.openbsd.org/pfctl

https://apple.stackexchange.com/questions/296520/port-forwarding-on-mac-pro-with-macos-sierra

http://blog.csdn.net/weijinqian0/article/details/51812242

https://github.com/P0cL4bs/WiFi-Pumpkin

http://man.linuxde.net/iptables

https://github.com/imp/dnsmasq/blob/master/dnsmasq.conf.example