Unpacking a Sequence into Separate Variables

her hansi ardicilliq ve ya tekrarlanan data variable lere unpack oluba biler.Bunun ucun variable ler ardicilliga uygun gelmelidir

#!/usr/bin/python
#-*- coding: utf -*-

data = [ 'Camoufl4g3', 99, 1945, ('unknownperson', 'Delixana', 3)]
name,age,year,info = data

Yuxaridaki numunede list in icerisinde her elemente uygun olaraq deyiskenler menimsedirik
Eger deyiskenle data daki element ust uste dusmezse

ValueError: need more than 4 values to unpack
exception alacagiq.Bu exceptionun menasi odur ki,verilen ardicilliga gore deyisken uygun gelmir ya artiq yazilib ve eksik yazilib.
Pythonda bu ardicilligi legv etmek ucun her hansi xususi sintaksis yoxdur. Lakin asagi da ki formada bunu hell ede bilerik
(_ simvolu vasitesi ile)

data = [ 'Camoufl4g3', 99, 1945, ('unknownperson', 'Delixana', 3)]
name,age,year,_ = data

print age
Advertisements

Python admin panel scanner v.1

Salamlar hərkəsə.Sizlərlə python 2.7 versiyasında yazdığım admin panel scanner tool-unu paylaşmaq istəyirəm.Üzərində kiçik exception dəyişikliyini etmişəm
Tool haqqında kiçik məlumat verim.İşlədilməsi root privilegiya tələb edir. -help arqumenti ilə istifadə qaydası ilə tanış ola bilərsiniz.Tool hələki dönən response prinsipi ilə işləyir irəlidə bir az daha təkmilləşdirmək GUI də yazmaq olar.Niyə də olmasin
Github linkini paylaşıram proqramın özünü və lügəti ordan yükləyib işlədə bilərsiniz.
https://github.com/camoufl4g3/scanner

#!/usr/bin/python
# -*- coding: utf8 -*-
#Port scanner tool
#Python 2.7
# __author__ = 'camoufl4g3'
 
 
import os,sys,time,httplib,requests,urllib2,optparse 
from termcolor import colored
 
about = """
#########################################
                                       ##
Online Admin Panel Scanner. v.1        ##
                                       ##
#Camoufl4g3                            ##
                                       ##
camoufl4g3@gmail.com                   ##
Select the option -help for help       ##
#########################################
 
"""
 
def scan(domain):
    if "http://" not in domain:
        domain = "http://" + domain
    try:
        print "\n--------------------------------------------"
        print (colored('Scan starts for target: ','green'))+colored(domain,'red')
        print "--------------------------------------------\n"
         
        f = open("file.txt","r")
        myList = []
        for line in f:
            myList.append(line)
 
        all = 0
         
        for j in range(len(myList)):
             time.sleep(1)
              
             response = requests.get(domain+"/"+myList[j].rstrip('\n'))
             status   = response.status_code
             if(status == 200):
                 all+= 1
                  
                 print(domain+"/"+myList[j].rstrip('\n')),colored('[+]', 'green')
             elif(status == 401):
                 all+= 1
                  
                 print(domain+"/"+myList[j].rstrip('\n')),colored('[+]', 'green')
             else:
                 print(domain+"/"+myList[j].rstrip('\n')),colored('[-]', 'red')
 
                  
 
        print("Found result(s): "+colored(str(all), 'red'))
    except requests.exceptions.ConnectionError as e:
        time.sleep(1)
        print("web site is down")
 
def Main():
 
    try:
        # if not root...kick out
        if not os.geteuid()==0:
            sys.exit("\n Root permission need to run the scanner\n")
 
 
        parser = optparse.OptionParser(about)
        parser.add_option('-d',
                          action = "store", #stored
                          dest   = "domain",
                          type   = "string", #int tipi
                          help = "for example: ./scanner.py -d victim.com")
 
        (option,args) = parser.parse_args() #it return tuple
        if option.domain == None:
            print parser.usage
            sys.exit(0)
        else:
            scan(option.domain)
    except KeyboardInterrupt:
            print "Program exit"
 
     
 
if __name__ == "__main__":
    Main()

InnoDB file space layout (vulnerability research)

Bu yaxınlarda İnnoDB üzərində fuzzing zamanı file space strukturasını oxumaq lazım gəldi və fikirləşdim bu haqda birşeydə yazım.

OS (architecture dependent) paging-dən fərqli olaraq İnnoDB də paging mexanizmi istifadə edir.

İnnoDB məlumat saxlama modeli “tablespace” adlanır. Bu “tablespace” faylında bir vəya birdən çox məlumatlar yerləşə bilər (os level) ancaq bu fayllar file system səviyyəsində tək bir logical faylda yerləşir.

İnnoDB-də hər space 32-bit unikal integer (space_id) dəyər təyin edilir. Bu dəyər müxtəlif yerlərdən space müraciət etmək üçün istifadə olunur. Həmçinin İnnoDB-də “system space” vardır və bunun space id dəyəri 0 olaraq təyin edilir (irəlidə ətraflı yazacam). Bu space İnnoDB tərəfindən lazımi informasiyaların saxlanılması üçün istifadə olunur. MYSQL ilə implementasiya halında İnnoDB additional space “file per table” halında dəstəkləyir. İnternal olaraq isə .idb faylı tam funksional space-dir və birdən çox table saxlamaya malikdir (innodb_file_per_table directive).
Paging
Hər bir “tablespace” səhifələrə (pages) bölünür,  hər “page” 32 bit integer dəyər “page number(page_no)” təyin edilir. Bu dəyər “offset” dəyəri olaraq adlandırılır və page offset dəyəri “tablespace”-də başlanğıcdan qeydə alınır.  Yəni page 0 “tablespace”-də offset 0-da yerləşir, page 1 offset 16384. “Page number”dəyəri birdən çox “tablespace”-də olsa belə hər “tablespace”-də bənzərsiz təyin edilir, space_id, page_no kombinasiyası ilə data folderində hər hansı bir data faylında “single page” bənzərsiz olaraq müəyyən edilə bilər.
“Tablespace” tərkibində həm istifadəçi məlumatları həm də sistem məlumatları saxlanır. Sistem məlumatları İnnoDB tərəfindən yaradılır və storage engine özəlliklərinin saxlayır(e.g the page headers, tablespace headers, segment information).

Aşağıdakı kimi səhifə(page) tərtib edilir:

Hər page 38 byte FIL Header və 8 byte FİL Trailer sahibdir (“FIL” file qısaldılmasıdır). Bu header-da həm də səhifə tipini (page type) göstərmək üçün istifadə edilən bir sahə var.  FIL başlık ve römork aşağıdaki yapıları (değil sırayla) içerir: FİL header və Trailer aşağıdakı strukturları saxlayır:

  • The page type is stored in the header. This is necessary in order to parse the rest of the page data. Pages are allocated for file space management, extent management, the transaction system, the data dictionary, undo logs, blobs, and of course indexes (table data).
  • The space ID is stored in the header.
  • The page number is stored in the header once the page has been initialized. Checking that the page number read from that field matches what it should be based on the offset into the file is helpful to indicate that reading is correct, and this field being initialized indicates that the page has been initialized.
  • A 32-bit checksum is stored in the header, and an older format (and broken) 32-bit checksum is stored in the trailer. The older checksum could be deprecated and that space reclaimed at some point.
  • Pointers to the logical previous and next page for this page type are stored in the header. This allows doubly-linked lists of pages to be built, and this is used for INDEX pages to link all pages at the same level, which allows for e.g. full index scans to be efficient. Many page types do not use these fields.
  • The 64-bit log sequence number (LSN) of the last modification of the page is stored in the header, and the low 32-bits of the same LSN are stored in the trailer.
  • A 64-bit “flush LSN” field is stored in the header, which is actually only populated for a single page in the entire system, page 0 of space 0. This stores the highest LSN flushed to any page in the entire system (all spaces). This field is a great candidate for re-use in the rest of the space.

Page Type:

/** File page types (values of FIL_PAGE_TYPE) @{ */
#define FIL_PAGE_INDEX  17855 /*!< B-tree node */
#define FIL_PAGE_RTREE  17854 /*!< B-tree node */
#define FIL_PAGE_UNDO_LOG 2 /*!< Undo log page */
#define FIL_PAGE_INODE  3 /*!< Index node */
#define FIL_PAGE_IBUF_FREE_LIST 4 /*!< Insert buffer free list */
/* File page types introduced in MySQL/InnoDB 5.1.7 */
#define FIL_PAGE_TYPE_ALLOCATED 0 /*!< Freshly allocated page */
#define FIL_PAGE_IBUF_BITMAP 5 /*!< Insert buffer bitmap */
#define FIL_PAGE_TYPE_SYS 6 /*!< System page */
#define FIL_PAGE_TYPE_TRX_SYS 7 /*!< Transaction system data */
#define FIL_PAGE_TYPE_FSP_HDR 8 /*!< File space header */
#define FIL_PAGE_TYPE_XDES 9 /*!< Extent descriptor page */
#define FIL_PAGE_TYPE_BLOB 10 /*!< Uncompressed BLOB page */
#define FIL_PAGE_TYPE_ZBLOB 11 /*!< First compressed BLOB page */
#define FIL_PAGE_TYPE_ZBLOB2 12 /*!< Subsequent compressed BLOB page */
#define FIL_PAGE_TYPE_UNKNOWN 13 /*!< In old tablespaces, garbage
in FIL_PAGE_TYPE is replaced with this value when flushing pages. */
#define FIL_PAGE_TYPE_LAST FIL_PAGE_TYPE_UNKNOWN

Space files

Space file birçox səhifənin (max 2^32) birləşməsidir. Daha effektiv idarə edilməsi üçün səhifələr 1 MiB bloklar halında qruplaşdırılır (16 KiB default page size ilə 64 bitişik səhifələr). İnnoDB bütün səhifələri, extents izləmək üçün bəzi bookkeeping tutması ehtiyyac duyur. Yəni bir super file bəzi super-struktura sahib olmalıdır.

Bir space-dəki ilk səhifə (page 0) daim FSP_HDR və yaxud “file space header” page olur. FSP_HDR səhifəsi bir FSP header strukturu saxlayır.  Bu sayədə space size,free lists,fragmented,full extents dəyərlərini izləməktədir. Hər space-dəki üçüncü səhifə isə INODE page olur. Fayl seqmentləri ilə bağlı siyahıları saxlamaq üçün istifadə olunur. Hər inode page 85 ədəd İNODE entries saxlaya bilir.

/** @name The space low address page map
The pages at FSP_XDES_OFFSET and FSP_IBUF_BITMAP_OFFSET are repeated
every XDES_DESCRIBED_PER_PAGE pages in every tablespace. */
/* @{ */
/*--------------------------------------*/
#define FSP_XDES_OFFSET   0 /* !< extent descriptor */
#define FSP_IBUF_BITMAP_OFFSET  1 /* !< insert buffer bitmap */
    /* The ibuf bitmap pages are the ones whose
    page number is the number above plus a
    multiple of XDES_DESCRIBED_PER_PAGE */
#define FSP_FIRST_INODE_PAGE_NO  2 /*!< in every tablespace */
    /* The following pages exist
    in the system tablespace (space 0). */
#define FSP_IBUF_HEADER_PAGE_NO  3 /*!< insert buffer
      header page, in
      tablespace 0 */
#define FSP_IBUF_TREE_ROOT_PAGE_NO 4 /*!< insert buffer
      B-tree root page in
      tablespace 0 */
    /* The ibuf tree root page number in
    tablespace 0; its fseg inode is on the page
    number FSP_FIRST_INODE_PAGE_NO */
#define FSP_TRX_SYS_PAGE_NO  5 /*!< transaction
      system header, in
      tablespace 0 */
#define FSP_FIRST_RSEG_PAGE_NO  6 /*!< first rollback segment
      page, in tablespace 0 */
#define FSP_DICT_HDR_PAGE_NO  7 /*!< data dictionary header
      page, in tablespace 0 */
/*--------------------------------------*/

System space

system space üçün aşağıdakı səhifələr ayrılır: (reference)

  • Page 3, type SYS: Headers and bookkeeping information related to insert buffering.
  • Page 4, type INDEX: The root page of the index structure used for insert buffering.
  • Page 5, type TRX_SYS: Information related to the operation of InnoDB’s transaction system, such as the latest transaction ID, MySQL binary log information, and the location of the double write buffer extents.
  • Page 6, type SYS: The first rollback segment page. Additional pages (or whole extents) are allocated as needed to store rollback segment data.
  • Page 7, type SYS: Headers related to the data dictionary, containing root page numbers for the indexes that make up the data dictionary. This information is required to be able to find any other indexes (tables), as their root page numbers are stored in the data dictionary itself.
  • Pages 64-127: The first block of 64 pages (an extent) in the double write buffer. The double write buffer is used as part of InnoDB’s recovery mechanism.
  • Pages 128-191: The second block of the double write buffer.

InnoDB məlumat faylı və yaxud “.idb” faylı bərabər ölçülü səhiflərin ardıcılıqıdr. Həmçinin bu səhifələr (pages) “extens” və “segments” halında qruplandırılmışdır. Bir extent “.idb” faylındakı səhifələrin bitişik ardıcıllığından ibarətdir. Bir extents aid səhifə sayı səhifə ölçüsündən aslıdır (pages size)

PAGE SIZE EXTENT SIZE IN PAGES EXTENT SIZE IN MB
4KB 256 1MB
8KB 128 1MB
16KB 64 1MB
32KB 64 2MB
64KB 64 4MB

 

snippet: finding integer overflow using Z3 theorem 😀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** File space extent size in pages
page size | file space extent size
----------+-----------------------
   4 KiB  | 256 pages = 1 MiB
   8 KiB  | 128 pages = 1 MiB
  16 KiB  |  64 pages = 1 MiB
  32 KiB  |  64 pages = 2 MiB
  64 KiB  |  64 pages = 4 MiB
*/
#define FSP_EXTENT_SIZE         ((UNIV_PAGE_SIZE <= (16384) ? \
    (1048576 / UNIV_PAGE_SIZE) : \
    ((UNIV_PAGE_SIZE <= (32768)) ? \
    (2097152 / UNIV_PAGE_SIZE) : \
    (4194304 / UNIV_PAGE_SIZE))))

Həmçinin bir segment ardıcıl extents-lərdən ibarətdir. Extent Descriptor xdes isə bir extent haqqında informasiyaları saxlayır. Bu məlumatlar isə aşağıdakılardır (reference)

  • The identifier of the segment to which the extent belongs.
  • The location of the previous extent descriptor within the same segment.
  • The location of the next extent descriptor within the same segment.
  • The state of the extent.
  • The allocation bitmap of the pages within the extent. The size of this bitmap depends on the number of pages in the extent. For each page, 2 bits (XDES_BITS_PER_PAGE) are used. So if the extent has 64 pages, then the size of this allocation bitmap per extent is 16 bytes.

Hər page üçün 2 bit allocation bitmap mövcüddur, XDES_FREE_BIT və XDES_CLEAN_BIT. 

XDES_CLEAN_BIT hal hazırda istifadə edilmədiyini bildirir.
XDES_FREE_BIT isə  page artıq free edildiyini və yaxud istifadədə olduğunu bildirir.
Yəni extent descriptor həmçinin extent içindəki səhifələrin free olub olmadığını aşkarlamaq üçündə istifadə edilir. Həmçinin extent decriptor bizə extent vəziyyətini (state) bildirir. Extent aşağıdakı digər vəziyyətlərdə (state) belə ola bilər (reference):

  • XDES_FREE — The extent is in the free list and the space can be used.
  • XDES_FSEG — The extent belongs to a segment.
  • XDES_FREE_FRAG — The extent belongs to the free fragment list.
  • XDES_FULL_FRAG — The extent belongs to the full fragment list.

InnoDB Tablespace Header Structure