Shaolin.TW

shaolin's 20% time

Wi-Fi Positioning System 欺騙 (2)

前言

上一篇的實驗中,我們能夠透過假造 AP 資訊來欺騙手持裝置,使其地理位置改變。但改變位置到一個定點好像沒有這麼好玩,如果我想要讓位置移動,塑造高超走位!高超走位!的效果呢?今天的主題,就來讓偽造的地理位置移動起來吧!

實作

話不多說,沒圖沒真相,直接放結果影片:我寫了一個 demo script,每 20 秒會換一次 AP set,所以可以看到手機定位的位置差不多 20 秒會移動一次!

script 的內容大致如下:

demo.sh
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
#!/bin/bash

WLANIFACE=wlan0   # 網路卡介面

ifconfig $WLANIFACE down
iwconfig $WLANIFACE mode monitor
ifconfig $WLANIFACE up

# 台灣基督長老教會景美教會
gnome-terminal -e "airbase-ng -c 11 -e 'OOOOOOOO OOOOOO' -a 12:34:56:cd:bb:ee $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 11 -e 'PPPPPPPPP_PPPP_PP' -a 00:dd:44:cc:55:66 $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 1 -e 'UUUUUU' -a aa:11:44:33:aa:cc $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 1 -e 'HHHHH' -a 34:34:34:27:27:27 $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 11 -e 'DDD-DDDDD' -a ff:77:88:55:66:11 $WLANIFACE" &
sleep 20
killall airbase-ng

# 景華公園平面配置圖
gnome-terminal -e "airbase-ng -c 6 -e 'WWWWW' -a 00:88:22:22:bb:22 $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 6 -e 'TTT-FFFF' -a 00:11:22:22:44:11 $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 7 -e 'CCCC hhh' -a 44:77:00:ff:33:aa $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 11 -e 'HHHH' -a 44:aa:33:cc:dd:44 $WLANIFACE" &
gnome-terminal -e "airbase-ng -c 1 -e '1234567' -a 00:00:cc:cc:aa:aa $WLANIFACE" &
sleep 20
killall airbase-ng

技術層面來說,這只是不斷切換欲偽造地點的 AP 資訊而已,每 20 秒換一次。比較困難的是要如何收集這些 AP 資訊並且變成上面的 shell script,畢竟要手動做這些事情非常的繁瑣,所以我又寫了一支程式解決這個需求:

collect.rb
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
#!/usr/bin/env ruby
#encoding: UTF-8


comment = ARGV[0] || "報告學長,完全沒有描述"
collect_count = (ARGV[1] || 5).to_i

raw_data = `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s`

# log raw_data
File.open("log/raw.txt", 'a') do |file|
  file.puts "# #{comment}"
  file.puts raw_data
end

# collect all AP info in hash
lines = raw_data.split(/[\r\n]/)
lines.shift
wifi_info = lines.map{|line|
  next if (line[1..32].nil? or line[33..-1].nil?)
  ssid    = line[1..32].strip
  cols    = line[33..-1].split(' ')
  bssid   = cols[0]
  signal  = cols[1].to_i
  channel = cols[2].split(',').first.to_i

  if signal != 0
    { ssid: ssid, bssid: bssid, signal: signal, channel: channel}
  else  # parse error
    next
  end
}.compact

# sort with signal
wifi_info.sort_by! {|x| x[:signal]}

# log top n AP info
top_wifi = wifi_info.reverse.first collect_count
puts top_wifi
File.open("log/collect.txt", 'a') do |file|
  file.puts "# #{comment}"
  top_wifi.each do |info|
    file.puts "gnome-terminal -e \"airbase-ng -c #{info[:channel]} -e '#{info[:ssid]}' -a #{info[:bssid]} $WLANIFACE\" &"
  end
  file.puts "sleep 50"
  file.puts "killall airbase-ng"
end
puts "已經新增[#{comment}] #{top_wifi.size} 筆 AP 資訊"

這支程式是 Mac Only,執行後會抓出當下周圍的 AP 資訊,並擷取訊號強度前 n 筆(預設是 5 筆)的 AP,輸出成前面的 shell script 樣式。執行時的畫面大概長這樣:

wifi_collection.png

結論

為了滿足我們想要製造手持裝置是在移動中的效果,可以透過持續偽造不同的 AP 來達成。本文提供了一段可以自動化切換偽造 AP 的 script 範例,還有一支用來收集 AP 資訊的程式。這樣一來,即使在家裡也可以在虛擬的世界啪啪造了!至於這到底有什麼實際上的應用,我也還沒有想到就是了 XD

« Wi-Fi positioning system 欺騙 (1) 在 PTT 插 javascript »

Comments