Narzędzia skryptowe do diagnostyki systemu, badania bezpieczeństwa i Windows forensic

forensic-windows12302013Szybkie opracowywanie narzędzi skryptowych stanowi codzienność w pracy analityka bezpieczeństwa systemów. Zaś możliwość napisania narzędzia, które oferuje dokładnie to, czego od niego oczekujemy, a na dodatek czyni to szybko i kompletnie za darmo, to pokusa nie do odparcia.

Dziś chciałbym zaprezentować Wam, jak szybko i sprawnie takie narzędzia opracowywać.

Zaznaczam, że dokonany przez mnie wybór języka programowania, w którym napisałem skrypt, podyktowany jest moimi preferencjami w tym zakresie. Nie ma problemów, by podobne narzędzia tworzyć w Ruby, Perlu, Pythonie czy Windows Shell. Ja tym razem wybrałem Tcl/Tk ze względów nie tylko sentymentalnych.

Jakie potrzeby zaspokaja skrypt?

Skrypt nie jest bynajmniej skończonym rozwiązaniem. Stanowi na tym etapie jego rozwoju zaledwie przedsmak takowego, ale od razu – lub po niewielkich modyfikacjach – może spełniać wiele pożytecznych funkcji. Na przykład, możemy przy jego pomocy śledzić niepożądane działania szkodliwego oprogramowania na poziomie obiektów BHO przeglądarki IE, modyfikacji rejestru, automatycznego uruchamiania w systemie złośliwych zadań, wstrzykiwania bibliotek DLL ze szkodliwym kodem, cookies, plików tymczasowych, modyfikacji czy podstawień procesów systemowych itp.

Zatem – generalnie – skrypt zaspokaja potrzeby w trzech obszarach – diagnostyka, bezpieczeństwo, forensic.

Czym jest i jak działa skrypt?

Skrypt został napisany, o czym już wspomniałem, w języku Tcl. Posiada graficzny interfejs użytkownika, opracowany w oparciu o bibliotekę Tk, co czyni korzystanie z niego zadaniem bardzo prostym. Poszczególne operacje diagnostyczne zostały pogrupowane w kategorie (i umieszczone w ślad za tym w menu Diagnostics) takie jak: system (charakterystyka systemu, procesy, pamięć), network (interfejsy, adresacja, tablica ARP, połączenia), registry (zainstalowane oprogramowanie, autostart programów), devices (załadowane do pamięci sterowniki urządzeń), files (pliki systemowe, pliki tymczasowe), config (wychwyty systemowe, konfiguracja i zdarzenia Winlogon, obiekty BHO przeglądarki IE).

Dane do diagnostyki pozyskiwane są mechanizmami biblioteki Twapi, ale nie tylko, bo także bezpośrednimi odpytaniami systemu. Jeśli chodzi o te drugie, to warto zauważyć, że każde z takich odpytań jest „obudowane” obsługą wyjątków, by błąd pojedynczej operacji odpytania nie spowodował przerwania działania programu.

Wygląda to tak, że jest na przykład:

catch { exec netstat -anvb  } result

albo:

if [catch { exec netstat -anvb  } result ] {
   # Obsługa błędu
} else {
   # Normalne działanie programu
}

zamiast:

set result [exec netstat -anvb]

Wywołania wewnętrznych poleceń systemowych zostały zaimplementowane w kodzie skryptu następująco:

catch { exec {*}[auto_execok dir] "$windir\\system32"} result

Pozyskiwane dane diagnostyczne są dopisywane do głównego okna tekstowego. Zebrane dane można w dowolnym momencie zapisać do pliku korzystając z opcji Save menu Operations.

Pożytecznym uzupełnieniem funkcjonalności skryptu jest możliwość wyszukiwania w wynikach diagnostyki dopasowań do wyrażeń regularnych. Wiersze tekstu, gdzie takowe dopasowania zostaną zidentyfikowane, będą podkreślone czerwonym kolorem czcionki i ramką. Drobne to udogodnienie, lecz trzeba przyznać, czasem bardzo przydatne.

Jakie dalsze zmiany można poczynić w skrypcie? Jakie inne narzędzia tej lub podobnej klasy można opracować?

Korzystając z ogromnych możliwości biblioteki Twapi, można – po pierwsze – uczynić diagnostykę jeszcze bardziej użyteczną i dotrzeć do takich informacji, jakie trudno jest pozyskać różnymi systemowymi narzędziami lub dedykowanym oprogramowaniem diagnostycznym. Po drugie zaś – możliwe jest przejście z działania w trybie wyłącznie odczytu danych systemowych do trybu sterowania systemem, a zatem wykonywania różnych zadań czy zmiany parametrów opisujących środowisko działania systemu w odpowiedzi na zdarzenia czy wyniki badania systemu. Poziom i zakres funkcjonalności narzędzi skryptowych jest więc praktycznie wyłącznie pochodną ilości czasu, jaką jesteście w stanie poświęcić na ich tworzenie. Jeśli weźmiemy dodatkowo pod uwagę fakt, że przecież nie jesteśmy skazani na funkcjonalność jednej tylko biblioteki, lecz mamy do dyspozycji całe ich mnóstwo, to w połączeniu z własnym kodem mamy wszystko, co potrzebne jest do programowania bardzo wszechstronnych i kompleksowych rozwiązań nie tylko do diagnostyki, sterowania systemem i Windows forensic.

Ciekawą dziedziną zastosowań może być szeroko pojęte bezpieczeństwo systemu: od pozyskiwania danych na temat statusu systemu w tym konkretnym aspekcie, przez aktywny monitoring zmian, a skończywszy na konfiguracji mającej na celu podniesienie poziomu bezpieczeństwa.

Wyobrażam sobie, że można by opracować takie rozwiązanie które pozwoli na wykonywanie ‘migawek’ stanu systemu, będzie zapisywało je w bazie (na przykład SQLite), stworzy możliwość porównań zmian pomiędzy dwoma dowolnie wybranymi stanami, pokaże historię zmian itp. Narzędzie tego rodzaju byłoby przydatne nie tylko do detekcji zmian niepożądanych, wywołanych na przykład działaniem szkodliwego oprogramowania, ale mogłoby być stosowane do szeroko pojętego zarządzania zmianą.

Zachęcam Wam do dalszego rozwoju tego narzędzia. Polecam w tym celu ActiveTcl, który w wersji community edition można pobrać za darmo ze strony http://www.activestate.com (na Windows, MacOS i Linux).

Gdybyście chcieli dystrybuować swoje skrypty w wersji wykonywalnej, gotowej do uruchamiania na komputerach, gdzie nie ma Tcl-a, polecam darmowe narzędzie freewrap, które pakuje skrypt, biblioteki i interpreter do postaci pliku EXE.

Interfejs skryptu prezentuje się następująco:

bwi

Oto kod skryptu:

package require twapi

proc message_box {title message} {
   set answer [tk_messageBox -title $title -message $message -type ok -icon info] 
}

proc choose_file {} {
   set types {
      { {Text files} {.txt} }
   }
   set filename [tk_getSaveFile -filetypes $types -parent . -defaultextension "txt" \
                 -title "Enter the file name:"]
   return $filename
}

proc save_to_file {filename data} {
   if [catch {open $filename w} result] {
      message_box "Warning" "Problem with opening the output file"
      return
   } else {
      set fp $result
   }
   puts $fp $data 
   close $fp
   message_box "Ready" "Data has been written to file ${filename}"
}

proc system {txt_widget} {
   $txt_widget insert end "Computer name: [twapi::get_computer_name]\n"
   $txt_widget insert end "Computer NETBIOS name: [twapi::get_computer_netbios_name]\n"
   
   set memory ""
   # set mem_list [twapi::get_memory_info -all]
   if [catch {twapi::get_memory_info -all} mem_list] {
      set memory "Problem with memory diagnostics...\n"
   } else {
      foreach {key value} $mem_list {
         append memory "\t$key - $value\n"
      }
   }
   $txt_widget insert end "Memory info: $memory"
   $txt_widget insert end "System version: [twapi::get_os_version]\n"
   
   set system ""
   foreach {key value} [twapi::get_os_info] {
      append system "\t$key - $value\n"
   }
   $txt_widget insert end "System info: $system"
   
   $txt_widget insert end "Detailed info about the system: [twapi::get_os_description]\n"
   $txt_widget insert end "Number of CPU: [twapi::get_processor_count]\n"

   set proc_info ""
   set proc_list [twapi::get_process_ids]
   foreach proc_id $proc_list {
      append proc_info "\t$proc_id: [twapi::get_process_name $proc_id]\t parent proc ID: [twapi::get_process_parent $proc_id]\n"
   }
   $txt_widget insert end "Processes list: $proc_info\n"
   
   catch { exec tasklist \/v } result 
   $txt_widget insert end "\nList of tasks: $result\n"
   
   set cpu ""
   foreach {key value} [twapi::get_processor_info {} -all] {
      append cpu "\t$key - $value\n"
   }
   
   $txt_widget insert end "Info about CPU: $cpu"
   $txt_widget insert end "System uptime: [twapi::get_system_uptime]\n"
   $txt_widget insert end "Users list: [twapi::get_users]\n"
}

proc devices {txt_widget} {
   set drivers ""
   set drivers_list [twapi::get_device_drivers -all]
   foreach {key value} $drivers_list {
      append memory "\t$key - $value\n"
   }
   $txt_widget insert end "Device drivers currently loaded: $memory"
}

proc network {txt_widget} {
   catch { exec ipconfig /all } result
   $txt_widget insert end "Network interface configuration:\n$result"
   catch { exec route print } result
   $txt_widget insert end "Routing table:\n$result"
   catch { exec arp -a } result
   $txt_widget insert end "ARP cache:\n$result"
   catch { exec netstat -anvb  } result
   $txt_widget insert end "Established TCP connections:\n$result"
}

proc winregistry {txt_widget} {
   set userprofile $::env(USERPROFILE)
   catch { exec REG QUERY HKLM\\Software } result
   $txt_widget insert end "Software installed on local machine:\n$result\n"
   catch { exec REG QUERY HKCU\\Software } result
   $txt_widget insert end "\nSoftware used by current user:\n$result"
   catch { exec REG QUERY "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /s } result
   $txt_widget insert end "\nAutostarted programs:\n$result"
   catch { exec REG QUERY "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" /s } result
   $txt_widget insert end "\nAutostarted programs:\n$result"   
}

proc files {txt_widget} {
   set temp $::env(TEMP)
   set windir $::env(windir)
   catch { exec {*}[auto_execok dir] "$temp"} result
   $txt_widget insert end "TEMP directory content:\n$result\n"
   catch { exec {*}[auto_execok dir] "$windir\\temp"} result
   $txt_widget insert end "\nWindows TEMP directory content:\n$result\n"
   catch { exec {*}[auto_execok dir] "$windir\\system32"} result
   $txt_widget insert end "\nWindows system files:\n$result\n"
}

proc config {txt_widget} {
   catch { exec REG QUERY "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks" /s } result
   $txt_widget insert end "Shell Hooks:\n$result"   
   catch { exec REG QUERY "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify" /s } result
   $txt_widget insert end "\nWinlogon events:\n$result"
   catch { exec REG QUERY "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Network" /s } result
   $txt_widget insert end "\nWinlogon network:\n$result"
   catch { exec REG QUERY "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon" /s } result
   $txt_widget insert end "\nWinlogon:\n$result"
   catch { exec REG QUERY "HKLM\\SOFTWARE\\Microsoft\\Internet Explorer" /s } result
   $txt_widget insert end "\nInternet Explorer general settings:\n$result"
   catch { exec REG QUERY "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /s } result
   $txt_widget insert end "\nInternet Explorer current user settings:\n$result"
}

proc save {data} {
   set filename [choose_file]
   save_to_file "$filename" $data
}

proc clear {txt_widget} {
   $txt_widget delete 1.0 end
}

proc regexp_match {txt_widget} {
   global search
   set content [$txt_widget get 1.0 end]
   $txt_widget delete 1.0 end
   foreach {line} [ split $content "\n" ] {
      if {[regexp "$search" $line]} {
         $txt_widget insert end "$line\n" distinguish
      } else {
         $txt_widget insert end "$line\n"
      }
   }
}

set help {
To get more help about twapi functions go to:
http://twapi.sourceforge.net/v3.1/osinfo.html
}

frame .textarea -relief groove
font create pol_char -family "Courier" -size 9 -weight normal

text .txt -width 100 -height 30 -wrap none \
   -yscrollcommand ".srl_y set" -xscrollcommand ".srl_x set" \
   -font pol_char

.txt tag configure distinguish -foreground red -relief solid -borderwidth 1
   
scrollbar .srl_y -command ".txt yview" -orient v
scrollbar .srl_x -command ".txt xview" -orient h

grid .txt   -in .textarea -row 1 -column 1
grid .srl_y -in .textarea -row 1 -column 2 -sticky ns
grid .srl_x -in .textarea -row 2 -column 1 -sticky ew

grid .textarea -column 0 -row 0 -columnspan 3

menu .mbar
. configure -menu .mbar

menu .mbar.fl -tearoff 0
.mbar add cascade -menu .mbar.fl -label Operations -underline 0

.mbar.fl add command -label Save -command { save [.txt get 1.0 end] }
.mbar.fl add command -label Clear -command { clear .txt }
.mbar.fl add separator
.mbar.fl add command -label Exit -command { exit }

menu .mbar.diag -tearoff 0
.mbar add cascade -menu .mbar.diag -label Diagnostics -underline 0

.mbar.diag add command -label System -command { system .txt }
.mbar.diag add command -label Network -command { network .txt }
.mbar.diag add command -label Registry -command { winregistry .txt }
.mbar.diag add command -label Devices -command { devices .txt }
.mbar.diag add command -label Files -command { files .txt }
.mbar.diag add command -label Config -command { config .txt }

menu .mbar.help -tearoff 0
.mbar add cascade -menu .mbar.help -label Help -underline 0

.mbar.help add command -label Help -command { message_box "Help" $help }

labelframe .search_frame -height 50 -width 50 -text " Search "
label .search_frame.search_label -text "Search for (regexp)"

set search "^.*$"

entry .search_frame.search_entry -textvariable search
button .search_frame.execute_button -text Search -command { regexp_match .txt }

grid .search_frame -column 0 -row 1 -columnspan 4 -sticky ew -pady 5 -padx 5
grid .search_frame.search_label -column 0 -row 1 
grid .search_frame.search_entry -column 1 -row 1 -sticky ew
grid .search_frame.execute_button -column 2 -row 1 -sticky ew -padx 5 -pady 5

grid columnconfigure .search_frame 0 -weight 1
grid columnconfigure .search_frame 1 -weight 4
grid columnconfigure .search_frame 2 -weight 2

wm title . "Basic Windows Info - Janusz Nawrat (2014)"
wm resizable . 0 0

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: