패스트터틀

임베디드 시스템 보안(19.6.4) 본문

Cyber Security(undergraduate)/embeded system security

임베디드 시스템 보안(19.6.4)

SudekY 2019. 6. 4. 13:47

shellcode = 아주작은 어셈블리코드, 런타임 취약점 을 테스트할수있다고함

기계어로 만들었는데 만약 0(null)이 들어가면 끊기게 되는데 안들어가게 하는 개발스텝이 포함됨

Exploit Database.com = 알려진 취약점을 공개한곳

bin/sh(바이너리 쉘) execution

/bin/sh shellcode:

Shellcode modeling

 

1. 쉘코드를 만들때에는 c로 먼저 만들어서 모델링을하고 strace(system call trace) 라는 리눅스툴로 c에 들어간 시스템콜을 자동으로 호출해서 보여줌

2. the possible models가 몇가지고 나오는데 그중 되는걸로 하면됨(원래 이렇게 되긴만하면 되는분야라고함)

3. 그러면 이제 이것을 가지고 파악하구 

4. 어셈블리 코드 작성(익숙해져야 쉬워짐)

5. gdb에 올리고 잘 만들어지면 systemcall에서 breakpoint를 걸어서 안에 각 요소가 또는 데이터가 잘 들어갔는지 확인해봐야함( 여하튼 Argument 속성이 잘되면 잘된거임 어떻게 작성되었던간에 )

 

문제점 1 : null byte data 제거

1. 0(null)이 들어가면 그뒤에 데이터를 읽지 않기때문에 0포함된 명령어를 제거해야 한다.

2. 똑같은 기능을 하는 다른 명령어로 치환한다.

 

문제점 2 : fixed pointers

1. ASLR env(고정된 주소에 프로그램이 올라가서 공격자가 특정주소로 특정화할수있는데 프로그램을 올릴때마다 랜덤화제이션 시켜 랜덤으로 변하는 환경) 에서 /bin/sh을 올렸는데 주소값이 움직이기 때문에 자신의 주소값을 아는것(극복)이 필요하다. -> 자신의 위치를 상대적위치로 아는것(get-$pc code) , x86에서는 push pop을 하면 쉽다고하는데 MIPS에서는 어렵다고한다.

 

x86 에서는 xor로 하면 0이 안들어가는데 

MIPS에서는 불가능하기 때문에 연산트리거( ex) 0xfffffefe + 0x102(258) -> 0x100000000 (zero))를 사용한다.

lui a1, 0xffff

ori a1,a1,0xfefe

addi a1,a1,258

a2,0xfff

a2,a2,0xfefe

a2,a2,258e

이런식이라고 보면된다. ( 잘 이해는 안간다 )

 

c(0000000c)는 c가 syscall을 부르는것이기때문에 이런 확정된 명령인데 어떻게 바꿀수 있을까?

02eaf84c syscall 0xbabe1(의미없는값)을 포함시켜서 넣는것(경험적인것이 크다고함)으로 표현가능하다.

 

이밖에도 0을 없애는 것들을 사용해서 최종적으로 0이 없는 버젼으로 shellcode를 만든다.

 

MIPS Linux stack based buffer overflow

 

버퍼오버플로우 취약점은 굉장히 중요함

ICS(산업시스템)은 임베디드의 집합임 여기서 BufferOverflow취약점은 가장많다(2015년기준)(Kaspers key 통계기준)

 

-------------------------- Process Memory Organization ----------

동적영역(?)

stack( grows down )

memory mapping seg. ( mmap(ex. dso library) )

heap ( brk/mmap )

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

bss(uninitialized static var)

data(intialized static var)

text(prgram code)

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

 

stack에 있는 return address에 원래 돌아갈 값을 넣지 않고 shellcode의 주소를 넣으면 shellcode가 수행됨

flow corruption = 버퍼를 넘어서 써서 위의 메모리를 덮어버리는것

 

How to disable ASLR

(못들음)

 

buffer overflow 

 

그러면 return address의 값을 정확히 알아야되는데 offset을 알아야됨

디버거를 써도되지만 metasploit을 쓰면 금방알수있다고함(utilizer pattern)

이렇게 해서 알고선 리턴을 바꾸면 원하는 코드 실행가능

 

프로그램을 많이 알아야 어떤게 취약한지 알수있음

 

http/1.1 chunked transfer

chunked : 쿼리를 한번에 (본래 따로따로받아와) 보내는것, 전송효율성을위해

이것을 웹서버가 잘못처리해서 stack overflow가 발생함

= CVE-2013-2028

bufferoverflow가 길이 5에 hello가 들어가야되는데 -(마이너스)값이 들어가고 -(마이너스)는 unsigned도 굉장히 큰값이기 때문에 버퍼 오버플로우가 발생해버림

 

ASLR이 있다고 하더라도 우회할수있음

쉘코드를 stack에 넣고 실행시키는데 여기서 rwx(read write execution 에서 x를 빼버림) => rx로해버림

하지만 return oriented 공격기법을 사용해서 (코드 재사용기법) 하는것인데 실행을 하지않더라도 이미 있는 코드를 사용하는것이기 때문에 가능함

 

32비트 같은경우는 aslr이 2000번인가 때려맞추면 된다고해서 취약하다고함

하지만 x64는 힘들다고함

 

ROP(Retrun Oriented Programming)

요새는 stack을 코드 인젝션으로 안하기때문에 페이로드를 어떻게 하냐면 return address대신에 gadget(가젯)주소를 넣음, 목적은 똑같다. , 쉘코드 역할을 하는것을 쉘코드 안쓰고 하는것임

 

가젯은 이미존재하는 (ida로 분석해보면 특정주소에 코드들이 있는데 jr이런식으로 끝나는거는 return address인것이고)

것들을 사용하는것 그 명령 자체를 말함, 그러면 여기서 다음 가젯주소를 넣고해서 chaining(체이닝)이 됨

임의의 프로그램을 가젯연결로만으로 구성할수있음 <-> 어셈블리로만들어서 넣은 코드가 아니다.

(2009년 부터 해가지고 지금도 현업에서 쓰고있다고함)

ropper라는 도구는 가젯을 찾아주는도구이다.

하지만 범위가 작아지고 할수있는것들에 제약조건이 있음. 그렇기때문에 기존의 쉘코드랑 연결시키는데 환경을 만들어주기위해 쓰는데다가 주로씀(물론 복잡한것이 아닌 간단한것이라면 rop로도 할수있다면 할수있음)

 

((페이로드는 사용에 있어서 전송되는 데이터를 뜻한다.  printf("hello world")에서 helloworld가 payload이다.))

 

sleep(1) > jump to sc > native sc (mips나 arm이나 싱크? 동기화?를 위한 꼼수라고함)

sleep에 들어가면 레지스트값 ? 코드? 가 정리가 된다는데 설명을 잘 못들음 나중에확인

 

이걸 전체적으로 하는데에는 3개월정도가 소요된다고함(공부하는 과정이라고 칠때)

진입장벽이 높은 분야긴 하다. 그런데 재미가 들리면 재미있다고함 최소 교수는 재미있었다고함...

 

나이보다는 창의성이 중요하다고함.

 

 

 

 

 

 

 

Comments