no image
FTZ Level19 //Chaining RTL Calls
문제확인우선 문제는 아래와 같이 단순한 형태를 띄고 있다. 하지만 여기에서 주의 해야할 것은 기존과는 다르게도 setreuid가 존재 하지 않는 것을 유의 하여야 한다. 이제 아래와 같이 GDB를 통하여 스택을 확인해보면 40바이트가 할당이 되어 있는 것을 확인 할 수가 있다. 이는 buf[20] - Dummy[20] - SFP - RET의 형태로 존재하는 것을 확인 할 수가 있다. RTL - 실패우선 RTL을 통하여 공격을 하여보자. 기존과 같이 system( ) 함수를 이용한 공격을 할 경우 권한 상승이 이루어지지 않은 것을 확인 할 수가 있다. 바로 setreuid가 존재하지 않기 떄문이다. 따라서 system()함수를 이용한 공격은 현재 이 자체만으로는 효력이 부족하다는 것을 알 수 있다. 따라서..
2015.05.28
no image
FTZ Level13 //RTL, EGG
문제확인 Level13의 힌트를 확인하면 아래와 같은 소스가 출력이 된다. 인자를 입력 받고 그 인자를 buf에 복사하여 넣는 것으로 strcpy가 취약점이 있는 함수의 위치이다. 그리고 i 의 값 0x1234567이 변화 될경우 "Warnning Buffer Overflow !!!를 출력하며 그대로 프로그램이 종료가 된다. 여기서 i 와 같은 것을 바로 Stack Guard 라고 부른다. 이제 이 프로그램을 GDB로 분석하여 보자 디버깅 권한을 위하여 cp 명령어를 통하여 tmp 로 복사한 후에 분석을 시작하면 된다. 아래 사진과 같이 프롤로그에서 0x418(1048)만큼의 스택이 할당 되는 것을 확인 할 수가 있다. 그렇다면 스택의 구조는 1048 + SFP + RET 라는 것을 이제는 충분히 예상 ..
2015.05.13
no image
FTZ Level12 //BOF,RTL,EGG,Backdoor
문제확인이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자. 이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다. EGG Shell을 이용한 방법Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"getaddr.c #include main(){char *p=getenv("EGG");printf("Address : %p\n",p);} RTL ( Return to Libc)을 이용한 방법RTL은 리턴 주소를 공유 라이브러..
2015.05.10

문제확인


우선 문제는 아래와 같이 단순한 형태를 띄고 있다. 하지만 여기에서 주의 해야할 것은 기존과는 다르게도 setreuid가 존재 하지 않는 것을 유의 하여야 한다. 이제 아래와 같이 GDB를 통하여 스택을 확인해보면 40바이트가 할당이 되어 있는 것을 확인 할 수가 있다. 이는 buf[20] - Dummy[20] - SFP - RET의 형태로 존재하는 것을 확인 할 수가 있다.





RTL - 실패


우선 RTL을 통하여 공격을 하여보자. 기존과 같이 system( ) 함수를 이용한 공격을 할 경우 권한 상승이 이루어지지 않은 것을 확인 할 수가 있다. 바로 setreuid가 존재하지 않기 떄문이다. 따라서 system()함수를 이용한 공격은 현재 이 자체만으로는 효력이 부족하다는 것을 알 수 있다.


따라서 이번에는 execl() 함수를 통한 공격을 해보려 했다. 하지만 깔끔하게 Segmentation fault가 발생 한 것을 확인 할 수가 있다. //사실 이 방법은 첫 시도 였는데...실패..





Chaining RTL Calls


위 와 같이 그냥 공격으로는 공격이 성공하지 않는 다는 것을 확인 했다. 그래서 RTL과는 비슷하면서도 좀더 고급기법인 ROP를 공부하던 도중에 Chaining RTL Calls 라는 방식을 알게 되었다. 이는 RTL을 체인처럼 이어 여러 함수를 호출 하게 하는 것이고 그것을 가능하게 하는것이 바로 POP-RET 이다. 

대략적인 페이로드는 아래와 같이 구성을 하면 된다. 여기서 pop-pop-ret를 통하여 argv1,argv2를 Setreuid()함수에 인자로 전달을 해주고 마지막의 ret를 통하여 다시 system() 함수를 이어서 호출하게 된다. 그렇게 호출된 system()함수는 4바이트의 Exit()를 지나 "/bin/sh"를 인자로 전달 받게 되면서 결국 RTL을 통하여 한개가 아닌 함수를 호출하는 것을 볼 수가 있다. 


아래와 같이 연속된 주소로 구성된 지점을 찾아야 한다. objdump를 통하여 찾을 수가 있으며 여기서 우리는 setreuid가 인자를 2개 전달받아야 하기 떄문에 붉은 테두리 안에 표시한 지점을 사용 할 것이다. 만약 인자 수가 더 많으면 pop-pop-pop-ret를 사용하면 되고 더 여러개의 함수를 사용하고자 할 경우에는 exit()의 위치에 다시 pop-ret를 넣어주면 된다. 저 붉은 상자에서 맨위의 pop주소가 우리가 사용할 주소가 되는 것이다.








EGG


Shell Code에 setreuid를 추가한 새로운 쉘코드이다. 기존의 쉘코드에 Setreuid(3100,3100)만 추가하면 되는 것으로 이 부분의 쉘코드는 아래와 같다. 쉘 코드는 다른 블로그를 찾다가 발견한 것 >> http://geundi.tistory.com/132 

"\x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80"

따라서 여기에 기존의 25바이트 코드를 추가하면 된다. (붉게 표시한 부분이 해당 uid의 번호인 것 같다.)

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

따라서 최종 쉘코드는 다음과 같다.

"\x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"



'Hacking > System Hacking' 카테고리의 다른 글

Cracking Windows Password Hash with Kali linux Live Booting  (1) 2015.08.22
FTZ Level20 //FSB  (0) 2015.05.31
FTZ Level18  (0) 2015.05.25
FTZ Level17  (0) 2015.05.24
FTZ Level16  (0) 2015.05.22
문제확인


Level13의 힌트를 확인하면 아래와 같은 소스가 출력이 된다. 인자를 입력 받고 그 인자를 buf에 복사하여 넣는 것으로 strcpy가 취약점이 있는 함수의 위치이다. 그리고 i 의 값 0x1234567이 변화 될경우 "Warnning Buffer Overflow !!!를 출력하며 그대로 프로그램이 종료가 된다. 여기서 i 와 같은 것을 바로 Stack Guard 라고 부른다. 이제 이 프로그램을 GDB로 분석하여 보자 디버깅 권한을 위하여 cp 명령어를 통하여 tmp 로 복사한 후에 분석을 시작하면 된다. 



아래 사진과 같이 프롤로그에서 0x418(1048)만큼의 스택이 할당 되는 것을 확인 할 수가 있다. 그렇다면 스택의 구조는 1048 + SFP + RET 라는 것을 이제는 충분히 예상 할 수가 있다. 하지만 여기서 중요한 것은 바로 i의 값이 변하면 안된다는 것이다. 그렇다면 i의 값을 찾기위해서 디버깅을 계속 실행하여 보자.



i를 찾기 위하여 buf[1024]에 A의 값을 넣고 BP를 걸어 실행을 해보자. r `python -c 'print "A"*1024'`를 입력하여 준다. 그리고 esp의 값을 확인하여 보면 아래와 같이 A(ASCII:41)의 값이 연속적으로 잘 입력된 것을 확인 할 수가 있다. 그렇게 쭉 따라 내려가보자.



0xbfffefc0로부터 "41"의 값이 입력되어서 0xbffff3c0 바로 전까지 "41"이 입력 된 것을 확인 할 수가 있다. 그리고 붉게 표시한 부분에 바로 i의 값이 저장이 되어있는 것을 확인 할 수가 있다. 그렇게 총 1048만큼 버퍼 뒤에는 SFP와 RET가 위치하고 있는 것을 확인 할 수가 있다. 이제 이 값은 유지한 채로 공격을 진행하여 보자.



RTL



디버깅을 통하여 system()과 exit()의 주소를 구한 다음에 "/bin/sh"의 주소를 구하여 공격을 진행하면 된다. 명령어에 대한 설명을 하자면 우선 i 의 값을 유지하기 위하여 i 바로 앞까지 1036만큼은 A로 채워주고 그 후 기존의 i 값을 다시 써준 후에 RET까지의 이동을 위하여 A를 12바이트 더 추가하여 준다. 그 후 system() 함수의 주소를 입력하여 주고 잘못된 종류로 인하여 로그에 기록이 되지 않게 하기 위하여 exit()의 주소를 넣어주고 그 후에 "/bin/sh"의 주소를 넣어 주면 쉽게 공격에 성공 한 것을 확인 할 수가 있다.






ENV-EGG Shell



에그쉘의 경우는 추가적인 설명을 하지는 않겠다.

'Hacking > System Hacking' 카테고리의 다른 글

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level12 //BOF,RTL,EGG,Backdoor  (0) 2015.05.10
FTZ Level11 //BOF,EGG,Format String  (0) 2015.05.09
#25 Bytes Shell Code  (0) 2015.05.07

문제확인


이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자.


이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다.




EGG Shell을 이용한 방법


Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.

Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

getaddr.c

#include <stdio.h>

main(){

char *p=getenv("EGG");

printf("Address : %p\n",p);}




RTL ( Return to Libc)을 이용한 방법


RTL은 리턴 주소를 공유 라이브러리 함수의 주소로 적어 해당 함수를 실행시키는 방법이다. 스택의 구조에서 system()함수를 ret에 덮어 씀으로 인하여 프로세스가 종료되고 리턴할 때 system()함수로 가게 된다. 그리고 system()함수가 끝나게 되면 그 다음 4바이트가 리턴주소이기 떄문에 정상적으로 종료될 수 있게 하기 위하여 exit()를 붙여준다.

system()는 쉘을 실행할수가 있고 인자로 /bin/sh를 넣어주면 된다.

결국 ----str[256]-dummy[8]-SFP[4]-RET[4]    >>> ---A[256]-A[8]-A[4]-System()[4]-exit()[4]-"/bin/sh"[4]로 덮어준다고 볼 수 있다.

아래에는 system() 의 안에 있는 /bin/sh 문자열의 주소를 구하는 코드이다.




Cat을 붙이는 이유


Pipe( | ) 사용시 왼쪽 프로그램의 stdout이 오른쪽 프로그램의 stdin으로 들어가게 되는데 python 이 실행되고 종료되면서 pipe broken 오류로 인하여 종료가 일어난다 따라서 사용자의 입력을 출력해주는 cat이나 te를 이용하여 stdin을 유지 시켜야한다.

<분명히 캡쳐를 한 것인데, 출처를 잊어버렸..>


BackDoor 생성


위의 방법들을 통하여 쉘을 얻은 후에 추가적으로 입력을 해주면 아래와 같이 Backdoor를 생성 할 수가 있다.


참고

http://smleenull.tistory.com/276          //RTL

http://peonix120.tistory.com/3            //RTL


'Hacking > System Hacking' 카테고리의 다른 글

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13
FTZ Level11 //BOF,EGG,Format String  (0) 2015.05.09
#25 Bytes Shell Code  (0) 2015.05.07