Bài viết này sẽ đi sâu vào việc setup các thiết bị phần cứng để phục vụ cho mục đích xây dựng bản đồ Wi-fi thành phố.

Trước khi bắt tay vào làm việc, hãy check qua kết quả của project này - chính là bản đồ Wi-Fi của tác giả xây dựng.

wardriving 1
Các Access Point hiển thị trên Google Maps

 

wardriving 2
... và trên Google Earth

#1 Chuẩn bị

Có 3 thiết bị chính: Raspi 3, card wifi và ăng-ten GPS

 

Đầu tiên, chúng ta cần Raspi 3.

raspi 3

Raspi 3 làm một máy tính Mini, thiết kế và chế tạo ở nước Anh thần thánh. Pi 3 có vi xử lý lõi tứ 1.2 Ghz, 1Gb RAM, tích hợp Wifi, bluetooth BLE, 4 cổng USB và ngõ Ethernet, kèm theo đó là 40 chân GPIO. Pi3 đủ sức chạy Linux hoặc Window IoT core hay thậm chí là Kali Linux.

Nếu bạn chưa biết Raspi 3 là gì, bạn đang lạc hậu đó! Hãy cập nhật ngay lập tức.

 

Tiếp theo ta cần chuẩn bị là một card wifi kết nối USB.

Ta có thể dùng card wifi tích hợp trên Pi3, tuy nhiên để thoải mái hơn trong việc sắp đặt vị trí và bắt được tín hiệu ổn định hơn, ta nên dùng một card wifi rời có ăng-ten (râu). Tác giả Scott sử dụng mẫu Alfa Network AWUS036NHA.

wifi card

Một thiết bị nữa cần quan tâm, đó là ăng-ten GPS. Pi3 không tích hợp linh kiện phục vụ cho GPS, do đó, ta cần một ăng-ten GPS kết nối USB.

Ăng-ten GPS này giúp ta xác định vị trí chính xác của mạng Wi-fi tìm được, nhờ đó, ta mới có thể xây dựng bản đồ Wi-fi có độ chính xác cao và đồng bộ danh sách các Access point chúng ta dò quét được với Google Map.

Scott sử dụng mẫu ăng-ten GlobalSat BU-353-S4

GPS

 

#2 Setup

Sau khi đã thu thập đủ các thiết bị phù hợp, đầu tiên hãy đảm bảo rằng Raspi 3 của bạn đã có hệ điều hành.

Cách đơn giản nhất để cài hệ điều hành cho Pi3 là làm theo hướng dẫn trên raspberrypi.org. Project lần này của chúng ta không quá phức tạp, do đó hệ điều hành Raspbian hoàn toàn có thể đáp ứng được. 

Sau khi cài Raspbian cho Pi3, nhớ update nó.

sudo apt-get update
sudo apt-get upgrade -y

Sau khi update, chúng ta bắt đầu cài các package phục vụ cho dự án này, có tất cả 8 package:

sudo apt-get install -y screen gpsd libncurses5-dev libpcap-dev tcpdump libnl-dev gpsd-clients python-gps

Tiếp theo, chúng ta config gpsd. Hãy dùng một text editor để mở file gpsd theo đường dẫn /etc/default/gpsd

START_DAEMON="true"
GPSD_OPTIONS="-n"
DEVICES="/dev/ttyUSB0" 
USBAUTO="true"
GPSD_SOCKET="/var/run/gpsd.sock"

Để ý dòng DEVICES="/dev/ttyUSB0" nhé, chắc gì cái ăng-ten GPS ở trên kia đã cắm đúng vào cổng usb mang số hiệu USB0? Để kiểm tra xem ăng-ten GPS được cắm vào cổng USB nào, hãy tải đoạn script sau:

wget https://gist.githubusercontent.com/ScottHelme/e793516d2b322ed3a4c795a429eb5d04/raw/5829f33d29182aa92b79bcb7e76e71ab51c8fe1b/find.sh

...và chạy nó:

chmod +x find.sh


./find.sh

Sau khi chạy, đoạn script sẽ đưa ra một output có dạng:

pi@raspberrypi:~ $ ./find.sh
/dev/ttyUSB0 - Prolific_Technology_Inc._USB-Serial_Controller_D

Ở ví dụ này, ăng-ten GPS được cắm vào cổng USB số hiệu USB0. Như vậy, tôi không phải sửa file gpsd ở trên. Nếu của bạn có output khác, hãy sửa giá trị DEVICES giống như output bạn nhận được.

 

Mọi thứ đã sẵn sàng chưa? Chưa đâu. Còn một thứ quan trọng nhất, đó là Kismet. Hãy cài Kismet trước khi bước ra khỏi cửa:

wget http://www.kismetwireless.net/code/kismet-2016-07-R1.tar.xz
tar -xvf kismet-2016-07-R1.tar.xz
cd kismet-2016-07-R1/
./configure
make dep
make
sudo make install

Sau khi cài Kismat, chúng ta config nó thông qua file kismet.conf nằm ở đường dẫn /usr/local/etc/kismet.confNhư thường lệ, hãy mở nó bằng một text editor.

sudo gedit /usr/local/etc/kismet.conf

hoặc

sudo leafpad /usr/local/etc/kismet.conf

Bước đầu tiên khi config Kismet là lựa chọn card wifi làm việc với Kismet. 

Tìm dòng # ncsource=wlan0...

Bỏ dấu hashtag - dấu #, và thay tên wlan0 bằng tên của interface đại diện cho card wifi USB ở trên. Để biết được interface nào đại diện cho card wifi USB, interface nào đại diện cho cạc wifi on-board, hãy dùng lệnh ifconfig

Sau khi config interface sẽ làm việc với Kismet, ta config tiếp phần đầu ra cho log file. Thông thường Kismet sẽ log ra khá nhiều thông tin "thừa". Như vậy, chúng ta cần hạn chế bớt đầu ra như sau:

Ban đầu là như này:

logtypes=pcapdump,gpsxml,netxml,nettxt,alert

Chúng ta sẽ rút gọn còn như này:

logtypes=gpsxml,netxml

Như vậy, đầu ra của kismet chỉ gói gọn trong 2 định dạng là *.gspxml*.netxml

Okay, vậy là chúng ta đã hoàn thành việc setup.

 

#3 Kiểm tra tín hiệu GPS

Với tín hiệu GPS, hãy chắc chắn rằng ăng-ten GPS của bạn không bị che khuất bởi ... trần nhà. 

gps

gps 2

Tác giả ốp Pi3 với ăng-ten GPS thành 1 khối và gắn nó lên cửa sổ xe hơi, nhờ vậy, ăng-ten GPS không bị che khuất.

Bây giờ, hãy kiểm tra ăng-ten GPS này trên Terminal của Pi3 bằng một lệnh đơn giản:

cgps

Lệnh này sẽ khởi động một test client của gpsd (ta đã cài gpsd ở bước #2). Có thể bạn sẽ mất vài phút để nhận được kết quả.

gps 3
Kết quả của tác giả - đã bị che mất phần Latitude và Longitude

Nếu bạn không thể nhận được kết quả test, hãy thử restart lại gpsd và đứng im trong 1 phút.

 

#4 Thiết lập IP tĩnh

Hiện tại thì Pi3 sẽ nhận được địa chỉ IP từ DHCP server của bất kỳ mạng nào mà nó đang kết nối tới. Tuy nhiên khi bạn cần kết nối Pi3 với Laptop để remote access thì sao?

Hãy mở dhcpd.conf và paste đoạn config sau vào cuối file.

interface eth0
static ip_address=192.168.1.5/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

Sau khi config xong, reboot lại Pi3.

 

#5 Chạy thử

Kismet sẽ xuất toàn bộ dữ liệu thu được ra một các files. ta có thể chọn vị trí để lưu chúng. 

mkdir ~/testrun
cd ~/testrun

Thư mục testrun bây giờ sẽ lưu toàn bộ file output của Kismet, bây giờ, ta khởi chạy nó.

sudo kismet

Hãy tích vào ô "auto start Kismet Server" và bỏ tích ở ô "Show Console on the second prompt", sau đó ấn Start.

kismet 1

kismet 2

Khi Kismet khởi động, sau một vài giây, bạn sẽ thấy giao diện sau:

kismet 3

Như vậy, kismet đang capture. Ở trung tâm màn hình, bạn có thể thấy thông tin về tọa độ GPS (tác giả đã che đi tọa độ của mình). Trong cột bên phải, bạn thấy được số lượng các mạng Wi-Fi đang bao quanh mình, hãy đợi thêm một vài phút và Kismet sẽ thu thập dữ liệu đủ nhiều để phân tích. 

kismet 4

Sau vài phút, ta tắt Kismet và Kill server.

kismet 5

Một khi Kismet đã thoát, dữ liệu được lưu vào các file output nằm ngay tại folder lúc nãy ta khởi chạy Kismet. Bạn sẽ thấy có 2 file XML. Đây chính là 2 output được chúng ta giới hạn trong phần #2. 

ls

Kismet-20160808-21-40-31-1.gpsxml
Kismet-20160808-21-40-31-1.netxml

Đây chỉ là dữ liệu thô, hãy xào nấu chúng thành những món ăn hoàn chỉnh.

 

#6 Export ra Google Maps

Để biến 2 nguyên liệu thô ở trên thành các món ăn hoàn chỉnh, chúng ta cần sự trợ giúp của một đoạn script mang tên netxml2kml.

wget https://gist.githubusercontent.com/ScottHelme/5c6869e17c3e9c8b2034dc8fc13e180b/raw/31c2d34f66748b6bd26415fd7d120c06b3d92eaf/netxml2kml.py -O netxml2kml.py

Đoạn script này được viết bằng python. Chúng ta sẽ chạy nó để convert từ xml ra kml và upload các file kml lên Google Maps.

python netxml2kml.py --kml -o output *xml

kết quả: 

Parser: Kismet-20160808-21-40-31-1.gpsxml, 0 new, 0 old
Parser: Kismet-20160808-21-40-31-1.netxml, 38 new, 0 old
Outputfile: output.*

KML export...
WPA     24
WEP     0
None    8
Other   6
Done. 38 networks

Kết quả đã được convert sang file output.kml. Ta có thể upload file này lên Google Maps.

Như vậy chúng ta đã hoàn thành việc cấu hình cũng như kiểm tra khả năng hoạt động của các thiết bị. Tuy nhiên, cuộc vui mới chỉ bắt đầu...

 

#7 Wardriving

Có lẽ vấn đề lớn nhất của giai đoạn này là NĂNG LƯỢNG. Chúng ta cần năng lượng để duy trì Raspi 3 đồng thời gánh thêm 2 thiết bị ngoại vi là card wifi và ăng-ten GPS. Có 2 cách để duy trì năng lượng là sử dụng pin và sử dụng đầu châm thuốc trên xe hơi.

pi 3

Tác giả gắn một cục pin 50.000mAh. Cục pin này đủ dùng cho Pi 3 trong 1 ngày đi bộ.

Khi bạn sử dụng xe hơi, hãy dùng adapter và cắm thẳng vào đầu châm thuốc trên xe. 

Một vấn đề nho nhỏ, khi bạn remote access Pi 3 từ laptop thông qua SSH và chạy Kismet, nếu bạn ngắt kết nối SSH, Kismet sẽ bị đóng lại. Và chúng ta cần một công cụ hỗ trợ là Screen.

Screen là một công cụ cho phép mở nhiều shell, mỗi shell chạy một chương trình. Và quan trọng hơn hết, với Screen, khi bạn ngắt SSH, Screen session vẫn tiếp tục duy trì, nhờ đó, Kismet vẫn tiếp tục hoạt động.

Với Screen, ta khởi động một session lấy tên là kismet.

screen -S kismet

Trong session này, ta khởi chạy Kismet

sudo kismet

 

Khi kismet đã chạy, ta có thể nhảy ra khỏi session này bằng cách nhấn Ctrl+A, sau đó chọn D. D là viết tắc của detach.

Để kiểm tra session kismet vẫn chạy bình thường, ta gõ lệnh:

screen -ls

kết quả:
There is a screen on:
4121.kismet (Detached)
1 Socket in /var/folders/6m/xpnz0lp176n2mn/T/.screen.

Sau khi nhảy ra khỏi session kismet, ta hoàn toàn có thể quay lại nó bằng cách:

screen -r kismet

 

Như vậy, với screen, ta có thể chạy kismet, sau đó ngắt kết nối giữa Pi3 và Laptop rồi mang Pi 3 cùng với 2 phụ kiện còn lại đi dạo quanh thành phố....

 

Hãy chia sẻ kết quả của các bạn ở phần comment. Xin cảm ơn!

Tham khảo bài viết gốc tại blog của tác giả