laptop podglądający złodziei

24 kwi 2011

Jakiś czas temu, zainspirowany filmem…

…znanym powszechnie jako „Do not fuck with a hacker’s machine” i tym, że na swoim netbooku ostatecznie odszedłem od windowsa na rzecz debiana, postanowiłem zawczasu przygotować się na przykrą sytuację, żebym momencie w którym mój laptop zostałby skradziony/używany przez ludzi niepowołanych, mógł łatwiej go odzyskać, a być może także zabawić się kosztem złych ludzi;) Założenia były takie:

  1. Zawsze powinienem wiedzieć, pod jakim IP jest mój netbook, jeżeli tylko jest połączony z internetem.
  2. Jeśli komputera używa ktoś poza mną, powinien zostać dokładnie (i dyskretnie) obfotografowany.
  3. Zdjęcia ludzi profanujących moją własność powinny być szybko i niepostrzeżenie składowane na moim serwerze.

1. Lokalizacja komputera.

Ta część jest banalnie oczywista i nawet zawarta w filmie z Defconu – użycie dyn-dns’a. W tym celu zakładamy konto na ich stronie, wybieramy sobie jakiś darmowy alias i ustawiamy komputer, żeby cyklicznie zgłaszał się do ich serwerów podając swoje IP

nietaki@dblue:~$ su
Password:
root@dblue:/home/nietaki# apt-cache search dyndns | grep dyndns
dyndns - dynamic DNS (DDNS) update client implemented in Perl
tinydyndns - pop-before-dyndns service using djbdns
root@dblue:/home/nietaki#
root@dblue:/home/nietaki# apt-get install dyndns
### CIACH ###
root@dblue:/home/nietaki#
root@dblue:/home/nietaki# cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user    command
/20 *   * * *   nietaki dyndns --login nietaki --password almost_public_password --host my_dndns_host.dyndns.net --file /home/nietaki/ --urlping http://www.find-ip-address.org/show-ip.php -urlping-regex "Your IP Address is:\s*\<b\>\s*([\d.]+)" 2>/dev/null >/dev/null
17 *    * * *    root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

Czyli instalujemy perlowy updater dyndnsa (chociaż, jeżeli dobrze pamiętam można też łatwo napisać coś takiego samemu korzystając z curla)  i edytujemy  /etc/crontab,  żeby cron wywoływał go co 20 minut (linijka 21. kodu). Jeżeli coś jest nie jasne posługujemy się manualem klienta: ‘man dyndns’.

2. oraz 3. – zdjęcia i wysyłanie ich na serwer.

Tu idea jest następująca – od momentu załadowania systemu laptop robi zjdęcia użytkownikowi co x sekund, do momentu, aż użytkownik nie zaloguje się na moje konto. W przeciwnym wypadku (jeśli człowiek nie zaloguje się, albo zaloguje na specjalnie spreparowane konto gościa) robi zdjęcia aż do wyłączenia systemu. po wykonaniu każdego zdjęcia skrypt próbuje zsynchronizować zapisane na dysku zdjęcia z tymi wysłanymi już na serwer – na wypadek gdyby przy zrobieniu któregoś z poprzednich nie było jeszcze połączenia z internetem.

Do tego wykorzystamy także dostępny w debianowych paczkach program fswebcam, rscync’a oraz magię katalogu /etc/init.d.

Skrypt dla wygody i czytelności dzielimy na 4 części:

nietaki@dblue:~$ sudo touch /etc/init.d/monitoring.sh
nietaki@dblue:~$ mkdir -p ~/.webcam/sav
nietaki@dblue:~$ cd .webcam
nietaki@dblue:~$ touch monitor.sh killer.sh webcontrol.sh

W pliku monitor.sh znajdują się wszystkie ciekawe rzeczy:

#!/bin/bash
format="+%Y_%m_%d--%H_%M_%S"
period=30
font="/usr/share/fonts/truetype/freefont/FreeMono.ttf:10"
resolution="640x480"
additional_params='--quiet '
finished=false
save_dir="/home/nietaki/.webcam/sav/"
user="uploader"
password="no-secret"
#the idea - I'm run by the main user, so that the guest can't kill me
#uploading as 'uploader'
#upload
from_dir="/home/nietaki/.webcam/sav/"
to_dir="/home/uploader/monitor"
while ! $finished
do
  #taking pictures
  curdate="$(date $format;)"
  tmp_file="${save_dir}ss$curdate.jpg"
  fswebcam --font $font --resolution $resolution $additional_params $tmp_file
  #uploading to the server
  rsync -aq $from_dir uploader@my_server_host.dyndns.info:$to_dir 2>/dev/null
  sleep $period;
done
exit 0

Więc jak widać na swoim serwerze (my_server_host.dyndns.info) mam dedykowane konto „uploader”, służące tylko do przyjmowania wysyłanych zdjęć i zapisywania ich we właściwym miejscu. W rsync’u nie muszę podawać hasła do konta uploader, bo na serwerze w pliku /home/uploader/.ssh/authorized_keys mam dodany klucz publiczny laptopowego konta „nietaki” – więcej informacji tutaj. Cała reszta to jedna pętla i parametry dla rsync’a i programu fswebcam. Dodatkowo za pomocą chmoda warto się upewnić, czy monitor.sh może zostać przeczytany tylko z naszego konta ;)

Plik killer.sh dba o to, żebyśmy w stosownym momencie mogli łatwo ubić monitor.sh:

#!/bin/bash
#ubijamy monitor
ps aux | grep monitor.sh | grep bash |awk '{print $2}' |xargs kill 2> /dev/null
exit 0

…i prawie napewno da się to zrobić krócej i ładniej ;)

Teraz przejdźmy do /etc/init.d/monitoring.sh

#!/bin/bash
su -c "/home/nietaki/.webcam/webcontrol.sh $1" nietaki &
exit 0

Jak widać skrypt ten po prostu wywołuje webcontrol.sh (a zarazem przekazuje kontrolę) z takim samym argumentem, z jakim sam został wywołany, z tym że już, dla bezpieczeństwa, pod kontrolą użytkownika „nietaki”.  Nie będę się tu może rozwodził nad działaniem plików w /etc/init.d, zwłaszcza, że wszystko jest ładnie opisane w tutorialu z którego sam korzystałem, grunt, że korzystając z polecenia update-rc.d można sprawić, żeby wybrany przez nas plik umieszczony w /etc/init.d zostanie wywołany z argumentem „start” podczas uruchamiania systemu, i argumentem „stop” podczas jego zamykania.

I ostatni plik – webcontrol.sh:

#!/bin/bash
#echo $1
if [ "$1" == "stop" ]; then
  echo 'shutting down webcam monitoring'
  /home/nietaki/.webcam/killer.sh
  exit 0
fi
#sprawdzanie, czy jestem jedynym odpalonym procesem tego typu
cnt="$(ps aux | grep monitor.sh | grep bash | wc -l)"
echo 'webcam monitoring started'
#echo $cnt
if [ $cnt -lt 1 ]; then
  /home/nietaki/.webcam/monitor.sh & > /dev/null
else
  echo "too many webcam monitoring instances are started"
fi
exit 0

Jeżeli napisane przez nas pliki .sh są uruchamialne przez odpowiednich użytkowników, cały system powinien  w tym momencie już działać :)

Pozostaje nam jeszcze sprawić, żeby po zalogowaniu się na nasze osobiste konto skrypt robiący zdjęcia został ubity dla ochrony naszej prywatności. W Gnome’ie można to zrobić przeklikując się przez System->Preferences->Startup Applications, gdzie dodajemy nowy „startup program”:

I to już wszystko! Warto zadbać o to, żeby, na wszelki wypadek na koncie „gościa” na które może się zalogować nasz hipotetyczny złodziej nie było hasła, dało się od biedy działać i żeby na pulpicie było dużo zajmujących rzeczy: obrazki, filmy, pornografia. Dzięki temu możemy zdobyć więcej ujęć posiadacza naszego komputera ;).

W przypadku mojego eee podczas robienia zdjęcia diodka koło obiektywu świeci się przez chwilę na granatowo, można to spokojnie ukryć przy użyciu jakiejś czarnej kryjącej farby…

A na koniec przykładowe zdjęcie wykonane przez skrypt:

Jedyna rzecz której mi w tym całym zestawie brakuje to możliwość logowania się na laptopa przez ssh kiedy jest on w cudzych rękach i to za cudzym firewallem, ale chwilowo nie mam pomysłu jak to dobrze zrobić…

PS. Wiem, że na Maca jest program, który robi to i wiele innych rzeczy, ale ciekawiej (i taniej) napisać coś takiego samemu ;)

PS2. Jeżeli zamierzamy często przeglądać zdjęcia zrobione przez nasz skrypt, można zadbać o to, żeby wszystkie zdjęcia nie zapisywały się w jednym folderze, tylko z podziałem np na dni czy miesiące – w jakiejkolwiek powłoce graficznej zdjęcia będą się dużo szybciej ładowały – pozostawiam to jako ćwiczenie dla czytelnika, a skrypt jest „almost done” ;)

Jacek Królikowski


No responses yet. You could be the first!

Leave a Response

Recent Posts

Tag Cloud

Agile autotematyczne bash batch c++ CMake Debian film poklatkowy GNU Octave Google google test grafika Java MIM UW screencast tapeta TDD uczenie maszynowe webcam

Meta

Almost Done

Copyright © Almost Done