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

glibc _IO_FILE table check bypass  (0) 2021.01.09
javascript engine fuzzing and exploitation reading list  (0) 2020.09.07
Node.js reverse Shell  (0) 2019.09.21
python pty module with reverse shell  (0) 2019.09.21
bash trick(꿀 tip)  (0) 2019.08.21

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

glibc _IO_FILE table check bypass  (0) 2021.01.09
Android Kernel Exploitation  (0) 2021.01.04
Node.js reverse Shell  (0) 2019.09.21
python pty module with reverse shell  (0) 2019.09.21
bash trick(꿀 tip)  (0) 2019.08.21

요즘 비오비에서 진행하는 프로젝트 때문에 Node.js를 보고있다.

그리고 취약점 진단을 위한 Node.js 리버스쉘코드가 필요한데 이참에 정리해둔다.

 

 

 

또한 아래는 리버스쉘 관련 팁들인데 시간나면 번역해서 정리해둬야겠다.

https://blog.ropnop.com/upgrading-simple-shells-to-fully-interactive-ttys/

리버스쉘로 쉘을 얻었을 때 /bin/sh 같은 경우 쉘 달러가 안보인다. 

그래서 이를 python의 pty 모듈을 이용해 bash 쉘을 띄워주는 역할을 할 수 있다.

 

inline으로 python의 pty 모듈을 import해서 spawn함수를 통해 /bin/bash를 실행시키면 아래와 같이 bash 쉘이 떨어진다.

 

 

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

javascript engine fuzzing and exploitation reading list  (0) 2020.09.07
Node.js reverse Shell  (0) 2019.09.21
bash trick(꿀 tip)  (0) 2019.08.21
tips for find binsh address using pwntool  (0) 2019.07.05
unsafe unlink  (0) 2019.06.06

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

+ Recent posts