Security
Blind SQL Injection
Blind SQL Injection
2017.08.08Boolean-based Blind SQL Injection쿼리 실행 결과의 ``sql True / False`` 여부에 따라 response가 다르다면, Boolean-based Blind를 사용할 수 있다.꼭 로그인에 성공해야 ``sql True``인 것은 아니다. query의 실행 결과가 참인 상태에서 로그인에 실패한 것과 query 실행 결과가 거짓인 상태에서 로그인에 실패한 것 둘을 구분할 수 있다면 사용할 수 있다. 중요한 것은 query의 실행 결과를 구분할 수 있느냐다. 다음 내장 함수를 사용한다.```sqlSUBSTR(str,pos,len) / ASCII(str) mysql> select ascii(substr(pw, 1, 1)) from sqlinj_test where id='umbum..
Basic SQL injection
Basic SQL injection
2017.08.08Note마지막에 짝이 안맞는 `` '``가 있으면 query가 실행되지 않는다. 1. 짝을 맞춰주거나 2. 주석처리 해주거나 3. escape 해주어야 한다.``sql SELECT``가 아니라 ``sql INSERT, UPDATE, DELETE`` 등이어도 injection 가능하다. 단, ``sql UPDATE`` 내부에 sub query로 ``sql SELECT``를 사용할 때 ``sql UPDATE`` 대상 database와 ``sql SELECT``대상 database가 같다면 아무것도 조회되지 않는다. && ||``sql AND / OR``는 공백 넣어주어야 하고, ``sql && / ||``는 공백 없어도 된다. 공백이 없어도 `` '``로 감싸면 문자열로 인식하기 때문에 ``sql ''or'..
[Windows] injection & hooking
[Windows] injection & hooking
2017.08.07Dll injection#1``c OpenProcess()``로 HANDLE을 얻는다.``c VirtualAllocEx()``로 타겟 프로세스에 injection할 dll의 path를 쓸 공간을 할당한다.``c WriteProcessMemory()``로 step 2의 주소에 path를 쓴다.``c GetProcAddress()``로 LoadLibraryA의 주소를 얻는다. ``c CreateRemoteThread()``의 네번째 인자로 실행할 함수( LoadLibraryA )의 주소를, 다섯번째 인자로 그 함수가 실행할 인자(path)를 전달한다.결과적으로 remote process가 ``c LoadLibraryA(path)``를 실행하게 되어 dll을 load하게 되고, ``c Dllmain()``이 ..
[Linux] injection
[Linux] injection
2017.08.07So injection#1리눅스는 윈도우의 CreateRemoteThread같은 API를 제공하지 않기 때문에, ptrace를 이용해야 한다.2016/12/12 - [System/LINUX & UNIX] - ptrace - Linux injection ( code injection / so injection ) #2환경변수 LD_PRELOAD가 설정되어 있는 경우 명시된 라이브러리를 먼저 로드한다.2016/12/19 - [System/LINUX & UNIX] - LD_PRELOAD를 이용한 so injection과 hooking. + wrapping function #3쓰기 권한이 있는 경우 ELF 포맷 대로 수정해서 library를 로딩하도록 하는게 가능할 것 같기는 한데, 해보지는 않았다. Code ..
[CodeGate2014] nuclear : libpthead(send, recv, system)
[CodeGate2014] nuclear : libpthead(send, recv, system)
2017.07.31아이디어 자체는 어렵지 않았으나 `` libc``가 아닌 다른 library의 함수가 호출될거라는 생각을 못했기 때문에 꽤 헤맸다.recv buffer 초기화에 별로 신경을 안썼더니, send의 결과로 받은 값에 이전 send 결과로 받은 데이터가 포함되어 몇 byte 씩 틀어져 있거나 처음에 303031이 들어가 시간을 꽤 소모함. fork를 사용하는 standalone 방식의 서버 프로그램이다. leak``c __isoc99_sscanf()`` 실행 이후 stack context```0000| 0xffffd050 --> 0xffffd070 ("1/1\n")0004| 0xffffd054 --> 0x8049877 ("%f/%f")0008| 0xffffd058 --> 0xffffd274 --> 0x3f80..
Shellcode
Shellcode
2017.07.26http://shell-storm.org/shellcode/ NOP-like NOP는 다음과 같은 방식으로도 만들 수 있다.```cmov %eax, %eax``` #1 peda #2 pwntools #3 msf x86```cvoid main(){__asm__ __volatile__("xor %eax, %eax \n\t" 31 c0"push %eax \n\t" 50"push $0x... \n\t" 68 ..."mov %esp, %ebx \n\t" 89 e3"push %eax \n\t" 50"push %ebx \n\t" 53"mov %esp, %ecx \n\t" 89 e1"mov %eax, %edx \n\t" 89 c2"mov $0xb, %al \n\t" b0 0b"int $0x80 \n\t" cd 80);..
UAF, Use After Free
UAF, Use After Free
2017.07.23* Integer overflow와 연계해 reference counter를 overflow시켜 0으로 만들어 강제로 ``c free()``시키는 방법으로 사용할 수도 있다. #1``c free()``된 영역을 참조하는 경우.보통 ``c free()``하면 `` fd/bk/last_size`` 부분만 초기화되고 나머지 영역은 그대로 남아있기 때문에 나머지 영역에 있는 데이터를 leak할 수 있다.이 때 ``c puts()``같은 문자열 함수를 사용해 처음부터 출력하면 `` \x00``까지만 읽어 `` fd`` 첫 바이트가 `` \x00``인 경우 아무것도 출력되지 않으므로 주의.```cint main(){ void *old_p = malloc(32); void *new_p; strcpy(old_p, "a..
[glibc] free_hook, malloc_hook
[glibc] free_hook, malloc_hook
2017.07.23```cgdb-peda$ x/4wx &__free_hook0xf7fd08b0 : 0x00000000 gdb-peda$ patch 0xf7fd08b0 one_gadget_addr```32bit `` libc.so``의 경우 다음과 같이 `` unsorted_bin``에서 `` 0x10`` 단위로 조회하면 없는 것 처럼 나오는데, 이는 `` gdb``가 맨 왼쪽에 있는 symbol만 표시해주기 때문이다.```bashgdb-peda$ x/40wx 0xf7fad7b0 - 0x600xf7fad750: 0x00000000 0x00000000 0x00000000 0x000000000xf7fad760 : 0xf7e6cfa0 0xf7e6cf40 0x00000000 0x000000000xf7fad770: 0x0000000..
[glibc] malloc - checks
[glibc] malloc - checks
2017.07.22[malloc] fastbins size check [malloc] smallbins bk check & unlink [malloc] unsorted bin size check [malloc] unsorted bin unlink [free] MINSIZE check [free] invalid next size (fast) [free] double free check [free] invalid next size (normal) [free] unsorted bin link [realloc] unlink size vs. prev_size check [realloc] invalid next size
[glibc] malloc - 4
[glibc] malloc - 4
2017.07.21malloc sequence너무 큰 heap memory 할당을 요청하는 경우, ``c mmap()``을 사용해 아예 다른 곳에 공간을 할당한다. * mmap'ing threshold 값은 따로 설정되지 않은 경우 dynamic하게 결정된다. 보통은 대략 `` 0x20800`` 이상일 때. 요청에 맞는 fastbin에 chunk가 있는 경우 반환한다. 요청에 맞는 smallbin에 chunk가 있는 경우 반환한다. large bin size request일 경우, 모든 fastbins's chunks를 (적당히 합치면서) unsorted bin으로 옮긴다. ``c if (have_fastchunks (av)) malloc_consolidate (av);`` unsorted bin에 있는 chunk들을 (..
[glibc] malloc - 3
[glibc] malloc - 3
2017.07.21* ASLR is disabled application's initial heap프로그램이 ``c malloc()`` 등 직접 heap을 할당받는 코드를 실행하지 않더라도, 기본적으로 `` 0x21000``(132KB) 크기의 initial heap을 가지고 있으며 이 heap은 main_arena에 해당한다.```bash00400000-00401000 r-xp 00000000 08:01 1442324 /home/umbum/heap_study/no_malloc00600000-00601000 r--p 00000000 08:01 1442324 /home/umbum/heap_study/no_malloc00601000-00602000 rw-p 00001000 08:01 1442324 /home/umbum/hea..
[glibc] malloc - 2
[glibc] malloc - 2
2017.07.19circular doubly linked listfastbin을 제외한 나머지 bins는 circular doubly linked list 구조를 사용한다.fastbin range에 속하지 않는 chunk일 경우, chunk 하나만 ``c free()``해도 ``bash (unsorted bin-8)``을 가리키는 `` fd/bk``가 생성된다.* fastbin은 `` main_arena``를 가리키지 않으며 두 개를 ``c free()``해야 첫 번째 free'd chunk에 `` fd``가 생성된다. Note) `` fd/bk``가 가리키는 곳이 그대로 다음 `` fd/bk``가 아니라, `` mchunkptr``이다. 그래서 `` +8`` 해주어야 다음 `` fd/bk``가 나온다. `` fd/bk..