RTL과 비슷한 방식의 공격기법이다.
솔직히 오메가 프로젝트안에 RTL이 있는건지.. 따로 분류가 되어있는 건지는
경계가 모호 하지만, 기본 컨셉은 같다.
앞서 소개한 RTL에서는 system 함수 내부에서 문자열 "/bin/sh"의 위치를 찾아서
페이로드르 구성하는 방식이었다.
하지만 오메가 프로젝트는 페이로드에 인자를 주지않고, 원래 인자자리에 위치한
쓰레기 값을 심볼릭 링크 시켜서 인자를 구성하는 방식을 사용한다.
직관적으로 얘기하면
RTL은 직접 넣는 것
오메가 프로젝트는 다른 곳에다 놓고 연결 시키는 것
공격을 실제로 한번 해보자. 이번에도 LOB의 gate에서 해보겠다.
버퍼는 256바이트.
빨간 네모친 부분은 시스템 함수 주소이다.
일단 우리가 적을 페이로드는 간단하다.
[nop 260] [SYSTEM 함수 주소] 이게 끝임;;
대신에 우리가 함수 인자를 따로 구성해주지 않은 대신에
원래 함수 인자 자리에 있는 녀석을 심볼릭 링크시켜서 셸이 실행될 수 있도록 한다.
그냥 문자열을 링크 시키면 되지 않나 하는 친구들은 RTL 포스팅 보고오소
이제 셸 실행 프로그램을 만들어 심볼릭 링크를 걸어보자.
아래는 공격 과정을 스택상에 나타낸 것이다.
일단 뭐 셸 실행 프로그램 부터 만들자.
sys.c 라는 이름.
exeve함수를 이용하여 제작했다.
이제 이 프로그램을 심볼릭 링크 걸어야지.
네모친 부분이 system함수가 인자로 참조할 위치이다. 메인함수로 치면 **argv 자리임.
여기선 뭐 이중 포인터가 의미는 없다. 다만 저기에 위치한 문자열을 읽을 뿐.
system함수는 프로그램을 실행하는 함수이다.
저 자리에는 system함수가 불러올 프로그램 이름 문자열의 첫번째 문자주소가 들어가 있다.
문자열(x/s)로 찍어보면 뭐 이상한 문자가 들어있다.
우리가 실행시킬 놈은 셸을 실행시키는 프로그램인데,
"t? ?" 이런 이름의 프로그램이 어딨노. 없다.
그래서 셸을 실행시키는 프로그램을 만들었고, 그걸 심볼릭 링크를 저 곳에다가 걸어주면
(여기서 말하는 '저 곳'은 시스템함수로 실행될 프로그램 이름이다.)
무난하게 셸이 실행 될 것이다.
그럼 일단 심볼릭 링크를 걸어줄 쓰레기값의 이름을 뽑아내야지?
그전에 일단 페이로드를 작성하여 공격을해보자.
셸이 잘 실행되는지, 인자가 문제지 셸을 실행이 되어야 하니까.
perl 스크립트로 써야 주소로 읽히나보다. 그냥 쓰면 아예 그거자체로 문자열로 인식해버려서..
일단 이렇게 심볼릭 링크를 걸어두고 페이로드를 구성해서 때려보자.
[nop 260 (buffer + sfp)] [system 함수 주소]
이게 끝이다.
셸은 실행이 잘되는데 인자를 못읽고 있다.
이제 2 > dump 를 추가하여 핵스덤프를 떠보자.
3a20 사이에 있는게 시스템 함수에서 받아들이는 프로그램 이름이다. 3a = ':', 20 = 공백
저 놈을 심볼릭 링크 걸어주면 되겠지.
펄 스크립트로 적어야 주소로 인식을 한다.. 아니면 저거 자체로 그냥 문자열로 인식ㅡㅡ;
다됐따,. 근데 하나더 문제가 있다.
환경변수 때문이다.
sys라는 셸 실행프로그램 이름을 문자열로 받아오는데.. 그냥 프로그램 이름만으로는 저게 어딨는지
무슨 기능을 하는 프로그램인지 알 도리가 없다.
그래서 경로를 지정해주어야 하는데, 심볼릭 링크 걸때는 경로를 지정해줄 수가 없다.
경로까지 프로그램 이름으로 읽어버리니까.
그래서 심볼릭링크 부터 걸고 그다음에 환경변수로 경로를 지정해주어야 한다.
여기서 또 생각 해야 할게 하나 더있다.
LOB에서는 Setuid걸린 파일이 있는 디렉토리마다 권한이 다 독립적으로 부여되어있다.
그래서 tmp에다가 셸 실행 프로그램을 두고, gremlin을 실행 시킬때 /home/gate/gremlin 으로 해야함.
(환경 변수는 ./로 등록하니까.. tmp 디렉토리로 이동하여 거서 실행한다.)
다시해보자.
땡.
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
RTL(bypass NX-bit, ASCII Armor) (0) | 2021.04.15 |
---|---|
RET Sled (0) | 2021.04.15 |
RTL (Return-to-Libc) Attack (0) | 2021.04.15 |
Shellcode 작성 (0) | 2021.04.15 |
기계어코드 작성 (0) | 2021.04.15 |