0x01 基础方法

1. 查看USB设备lsusb

1
2
3
4
5
6
7
 ⚡ root@kali  ~/Desktop  lsusb 
Bus 001 Device 005: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. VMware Virtual USB Mouse
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

在USB接口001/005上检测到网卡。

2. 查看无线网卡iwconfig

1
2
3
4
5
6
7
8
9
10
 ⚡ root@kali  ~/Desktop  iwconfig
lo no wireless extensions.

eth0 no wireless extensions.

wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=0 dBm
Retry short long limit:2 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off

3. 激活无线网卡wlan0 ifconfig wlan0 up

4. 扫描网络 iwlist wlan0 scanoriw dev wlan0 scan

发现未加密的网络

image-20201028224750008

发现WPA2-PSK/WPA-PSK加密的网络

image-20201028224952271

5. 连接网络

(1) 连接未加密网络

iw dev wlan0 connect [网络SSID]

(2) 连接WEP加密网络

iw dev wlan0 connect [网络SSID] key 0:[WEP密钥]

(3) 连接WPA加密网络

wpa_supplicant是一个连接、配置WIFI的工具,它主要包含wpa_supplicant与wpa_cli两个程序. 可以通过wpa_cli来进行WIFI的配置与连接,前提要保证wpa_supplicant正常启动
加密方式为 WPA-PSK 得用 wpa_supplicant 而不能使用 iwconfig wlan0 key xxx 形式,iwconfig key方式适用于WEP

新建文件 vim /etc/wpa_supplicant/my_wpa_supplicant.conf

wpa_passphrase CU_511 4006181111 > /etc/wpa_supplicant/my_wpa_supplicant.conf可生成密码

1
2
3
4
5
6
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="TP-LINK_22E1D2"
psk="密码"
}
# 其中的ctrl_interface就是用来和wpa_cli通信使用,其原理是wpa_supplicant是个干活的wifi服务器(比如连接wifi,断开wifi,启动热点等),wpa_cli就是个客户端,通过本地socket通信连接上wpa_supplicant服务器,发命令叫他干活。

连接wlan0到网络,并以daemon方式运行wpa_supplicant -B -i wlan0 -c /etc/my_wpa_supplicant.conf

-B Background 在后台以daemon 运行
-i interface
-c 配置文件

-D 驱动程序名称(可以是多个驱动程序:nl80211,wext)

如果想要看过程中的详细log,可以加上参数-dd,然后用logcat同时看log。

image-20201028230901968

此时wlan0网络状态

image-20201028231136436

6. 获取IP地址

最后,无论是连到开放的网络还是加密的安全网络,都得获取 IP 地址。简单地使用如下命令:

(1) dhcpcd wlan0 dhcpcd会后台守护进程运行,下次重连wifi会自动获取IP

image-20201028231224415

image-20201028231246065

(2) dhclient wlan0

7. 查看连接状态

(1) WPA wpa_cli status

image-20201029035104036

(2) 未加密,WEP iwconfig

image-20201028231336674

8. 断开当前连接

(1) WEP,未加密: iw dev wlan0 disconnect
(2) WPA:wpa_cli terminate

关闭某网卡ifconfig [网卡名] down

0x02 其他操作

有很多种方式来管理无线连接。刚才使用的是最基本的方式,有很多高级的应用程序(如 NetworkManager、wicd、netcfg、wifi 等等),他们是不包含在“默认包”里面的,使用它们会大大简化操作过程,但一般建议是开始的话最好从基本的来。

1. 设置IP地址ifconfig wlan0 [IP地址]

2. 查看路由表route

查看网关(缺省路由)方法:

1、route -n 或netstat -rn
2、ip route show

3. 添加默认网关 route add default gw [网关地址] dev wlan0

4. wpa_supplicant配置文件解读/etc/wpa_supplicant/my_wpa_supplicant.conf

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 请不要修改下面这一行内容,否则将不能正常工作  
ctrl_interface=/var/run/wpa_supplicant

# 确保只有root用户能读取WPA的配置
ctrl_interface_group=0

# 使用wpa_supplicant来扫描和选择AP
ap_scan=1

# 简单的情形:WPA-PSk密码验证方式,PSK是ASCII密码短语,所有合法的加密方式都允许连接
network={
ssid="simple"
psk="very secret passphrase"
# 优先级越高,就能越早匹配到。
priority=5
}

# 与前面的设置相同,www.linuxidc.com但要求对特定的SSID进行扫描(针对那些拒绝广播SSID的AP)
network={
ssid="second ssid"
scan_ssid=1
psk="very secret passphrase"
priority=2
}

# 仅使用WPA-PSK方式。允许使用任何合法的加密方式的组合
network={
ssid="example"
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
priority=2
}

# 明文连接方式(不使用WPA和IEEE802.1X)
network={
ssid="plaintext-test"
key_mgmt=NONE
}

# 共享WEP秘钥连接方式(不使用WPA和IEEE802.1X)
network={
ssid="static-wep-test"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
}

# 共享WEP秘钥连接方式(无WPA和IEEE802.1X),使用共享秘钥IEEE802.11验证方式
network={
ssid="static-wep-test2"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
auth_alg=SHARED
}

# 在IBSS/ad-hoc网络中使用WPA-None/TKIP
network={
ssid="test adhoc"
mode=1
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="secret passphrase"
}

5. wpa_cli的使用

(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
wpa_cli -i wlan0 scan          //搜索附件wifi热点
wpa_cli -i wlan0 scan_result   //显示搜索wifi热点
wpa_cli -i wlan0 status //当前WPA/EAPOL/EAP通讯状态
wpa_cli -i wlan0 ping //pings wpa_supplicant

添加新的连接

wpa_cli -i wlan0 add_network //添加一个网络连接,会返回<network id>
wpa_cli set_network <network id> ssid '"name"' //ssid名称
wpa_cli set_network <network id> psk '“psk”'  //密码
wpa_cli set_network <network id> scan_ssid 1
wpa_cli set_network <network id> priority 1 //优先级

保存连接
wpa_cli -i wlan0 save_config //信息保存到默认的配置文件中
1
断开连接
wpa_cli -i wlan0 disable_network <network id>
1
连接已有连接
wpa_cli -i wlan0 list_network //列举保存过得连接
wpa_cli -i wlan0 select_network <network id> //连接指定的ssid
wpa_cli -i wlan0 enable_network <network id> //使能制定的ssid
(2) 交互式wpa_cli

image-20201029035526465

image-20201029035546263

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
实操:

> scan

OK

<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=

<3>CTRL-EVENT-SCAN-STARTED

<3>CTRL-EVENT-SCAN-RESULTS

<3>WPS-AP-AVAILABLE

<3>CTRL-EVENT-STATE-CHANGE id=-1 state=2 BSSID=00:00:00:00:00:00 SSID=

<3>CTRL-EVENT-NETWORK-NOT-FOUND

>

> scan_results

bssid / frequency / signal level / flags / ssid

04:a1:51:8a:9c:ae 5745 -53 [WPA2-PSK-CCMP][WPS][ESS] NETGEAR-63-5G

TP-LINK_5G_MT3
b8:a3:86:5:8f:b2 2437 -79 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS] SS7_VPN
40:e3:d6:8f:59:83 2462 -81 [WPA2-EAP-CCMP][ESS] mtkemp
38:97:d6:18:c4:00 5805 -85 [WPA-PSK-TKIP][WPA2-PSK-TKIP][ESS] wnwyanfa
40:e3:d6:8f:59:81 2462 -82 [WPA-EAP-CCMP+TKIP][WPA2-EAP-CCMP+TKIP][ESS]
0c:72:2c:4f:41:66 2427 -88 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS] ......
fc:75:16:a3:95:d0 2462 -76 [WPS][ESS] dlink
00:0c:43:28:08:88 2437 -78 [ESS] MT7623_AP_2.4G
6c:f3:7f:38:ff:e8 5785 -85 [ESS] mtkguest
40:e3:d6:8f:59:40 2462 -75 [ESS] mtkguest
6c:f3:7f:38:ff:e0 2462 -85 [ESS] mtkguest

> list_network

network id / ssid / bssid / flags
0 Xiaomi_5G any [DISABLED]
1 D8_5GHZ any [DISABLED]
2 SS7_VPN any [DISABLED]
3 Xiaomi_2.4G any [DISABLED
4 XIaomi_5G any [DISABLED]
5 hello any [DISABLED]
6 NETGEAR6200 any [DISABLED]
7 NETGEAR6200_5G any [DISABLED]
8 NETGEAR-63-2.4G any [DISABLED]
9 DLink88_24G any [DISABLED]

> add_network 10

10

> set_network 10 ssid "NETGEAR-63-5G"

OK

> list_network

network id / ssid / bssid / flags
0 Xiaomi_5G any [DISABLED]
1 D8_5GHZ any [DISABLED]
2 SS7_VPN any [DISABLED]
3 Xiaomi_2.4G any [DISABLED]
4 XIaomi_5G any [DISABLED]
5 hello any [DISABLED]
6 NETGEAR6200 any [DISABLED]
7 NETGEAR6200_5G any [DISABLED]
8 NETGEAR-63-2.4G any [DISABLED]
9 DLink88_24G any [DISABLED]
10 NETGEAR-63-5G any [DISABLED]

> set_network 10 key_mgmt WPA-PSK

OK

> set_network 10 psk "11111111"

OK

> get_network 10 key_mgmt

WPA-PSK

> get_network 10 psk

*

> enable_network 10

OK
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>Trying to associate with [18434.676000] 80211> Connect bssid 04:a1:51:8a:9c:ae

> select_network 10

OK

> reconnect

OK

> list_network

network id / ssid / bssid / flags
0 Xiaomi_5G any [DISABLED]
1 D8_5GHZ any [DISABLED]
2 SS7_VPN any [DISABLED]
3 Xiaomi_2.4G any [DISABLED]
4 XIaomi_5G any [DISABLED]
5 hello any [DISABLED]
6 NETGEAR6200 any [DISABLED]
7 NETGEAR6200_5G any [DISABLED]
8 NETGEAR-63-2.4G any [DISABLED]
9 DLink88_24G any [DISABLED]
10 NETGEAR-63-5G any [CURRENT]

> save_config

OK

> status
bssid=04:a1:51:8a:9c:ae
freq=5745
ssid=NETGEAR-63-5G
id=10
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=10.0.0.5
address=00:6c:fd:ab:68:be
uuid=12345678-9abc-def0-1234-56789abcdef0
<3>CTRL-EVENT-STATE-CHANGE id=10 state=9 BSSID=04:a1:51:8a:9c:ae SSID=NETGEAR-63-5G
<3>CTRL-EVENT-CONNECTED - connection to 04:a1:51:8a:9c:ae completed (auth) [id=10 id_str=]
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
保存后的wap_supplicant.conf

root@:/system/bin # cd /data/misc/wifi/
root@:/data/misc/wifi # cat wpa_supplicant
wpa_supplicant.conf wpa_supplicant/
at wpa_supplicant.conf <
ctrl_interface=/data/misc/wifi/sockets
driver_param=p2p_capable=0
update_config=1
uuid=12345678-9abc-def0-1234-56789abcdef0
device_name=full
manufacturer= Group Co., Ltd
model_name=Android TV
model_number=Android TV
serial_number=123456789
device_type=10-0050F204-5
os_version=01020300
config_methods=physical_display virtual_push_button
external_sim=1
wowlan_triggers=magic_pkt

network={
ssid="Xiaomi_5G"
psk="26630099"
key_mgmt=WPA-PSK
priority=12
disabled=1
}

network={
ssid="D8_5GHZ"
key_mgmt=NONE
priority=9
disabled=1
}

network={
ssid="SS7_VPN"
psk="12345678"
key_mgmt=WPA-PSK
priority=11
disabled=1
}

network={
ssid="Xiaomi_2.4G"
psk="26630099"
key_mgmt=WPA-PSK
priority=13
disabled=1
}

network={
ssid="XIaomi_5G"
psk="26630099"
key_mgmt=WPA-PSK
priority=18
disabled=1
}

network={
ssid="hello"
key_mgmt=NONE
priority=17
disabled=1
}

network={
ssid="NETGEAR6200"
psk="12345678"
key_mgmt=WPA-PSK
priority=19
disabled=1
}

network={
ssid="NETGEAR6200_5G"
psk="12345678"
key_mgmt=WPA-PSK
priority=27
disabled=1
}

network={
ssid="NETGEAR-63-2.4G"
psk="11111111"
key_mgmt=WPA-PSK
priority=56
disabled=1
}

network={
ssid="DLink88_24G"
psk="12345678"
key_mgmt=WPA-PSK
priority=38
disabled=1

}
network={
ssid="NETGEAR-63-5G"
psk="11111111"
key_mgmt=WPA-PSK
}

6. dhclient自动获取/重新获取IP

(1) 获取IP

dhclient eth1

There is no need to restart network service. Above command should work with any Linux distro such as RHEL, Fedora, CentOS, Ubuntu and others. On a related note you can also try out the following commands:

查看结果

1
2
方法1
ifconfig wlan0
1
2
方法-2,显示更详细
cat /var/lib/dhcp/dhclient.leases

image-20201029052843146

(2) 释放IP

dhclient -r

dhclient -r并没有真正释放IP,下一次执行dhclient wlan0时,没有discover这个步骤,而是直接REQUEST上次IP。
在网络拓扑或者配置变化的情况下,获取不到IP,需要删除cat /var/lib/dhcp/dhclient.leases 文件

image-20201029052959665

查看进程 ps aux|grep dhc

(3) 删除相关文件后,重新获取ipdhclient wlan0,这是个非常漫长的过程

服务器拒绝了很多次

image-20201029103343026

最终获取到了IP地址

image-20201029103925052

至于为什么DHCP服务器拒绝了这么多次,可能因为校园网人数太多,dhcp申请太过频繁,DHCP服务器广播的offer很快就被其他人使用了,导致我的request发到服务器的时候服务器发现刚刚那个offer已经被用掉了,所以就发送NAK来拒绝我们的申请

DHCP报文共有一下几种:

DHCP DISCOVER :客户端开始DHCP过程发送的包,是DHCP协议的开始
DHCP OFFER :服务器接收到DHCP DISCOVER之后做出的响应,它包括了给予客户端的IP(yiaddr)、客户端的MAC地址、租约过期时间、服务器的识别符以及其他信息
DHCP REQUEST :客户端对于服务器发出的DHCP OFFER所做出的响应。在续约租期的时候同样会使用。
DHCP ACK :服务器在接收到客户端发来的DHCP REQUEST之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给它的IP和其他信息可以被允许使用。
DHCP NAK :DHCP ACK的相反的报文,表示服务器拒绝了客户端的请求。
DHCP RELEASE :一般出现在客户端关机、下线等状况。这个报文将会使DHCP服务器释放发出此报文的客户端的IP地址
DHCP INFORM :客户端发出的向服务器请求一些信息的报文
DHCP DECLINE :当客户端发现服务器分配的IP地址无法使用(如IP地址冲突时),将发出此报文,通知服务器禁止
使用该IP地址。

DHCP详细工作流程解析

第一步:
DHCP客户端主动发起DHCP Discover包,用来寻找DHCP服务器,其中:

源MAC是自己的MAC地址,目的MAC是FFFF.FFFF.FFFF的广播
源IP是0.0.0.0(现在还没有IP,就用全0地址),目的IP是255.255.255.255的三层广播

因为DHCP服务器在哪里还不知道,所以使用广播来寻找,广播会泛洪到整个网段中;

第二步:
DHCP服务器收到客户端发的DHCP Discover之后,会在自己的地址池中拿出一个没有分配的地址以及配套的参数(如:掩码、DNS、网关、域名、租期……),然后以一个DHCP Offer包发送出去。
这个DHCP Offer数据包的地址如下:

源MAC是DHCP服务器的MAC,目的MAC是FFFF.FFFF.FFFF的广播
源IP是DHCP服务器的IP,目的IP是255.255.255.255的广播

这时客户端还没有获得IP,DHCP服务器端现在还无法定位客户端,所以用广播来回应。

第三步:
客户端收到这个DHCP Offer后,会再发出一个DHCP Request给服务器来申请这个Offer中包含的地址。
这个时候,客户端还没有正式拿到地址,所以还需要向DHCP服务器申请。

这时客户端的源IP还是0.0.0.0,目的IP还是255.255.255.255
源MAC是客户端的MAC,目的MAC是FFFF.FFFF.FFFF广播包

第四步:
服务器收到客户端的请求后,会发出一个DHCP ACK用来确认这个IP地址可以分配给这个客户端。
客户端收到第四个DHCP ACK数据包才算正式拿到了这个IP。

0x03 出现的错误

  1. 关闭wpa连接时出现Failed to connect to non-global ctrl_ifname: (nil) error: No such file or directory

    这是Wpa_supplicant没有在后台运行的原因

    解决办法:让wpa_supplicat在后台运行,nohup wpa_supplicant -c wpa.conf > /tmp/wpa_supplicant.log &或者-B参数


Wpa_supplicant 调试故障原因分析

linux下使用shell命令通过wpa_cli控制wpa_supplicant连接wifi

DHCP工作原理

DHCP工作过程详解

https://blog.csdn.net/yugongpeng_blog/article/details/45169291