LEVEL 1
/ -perm +4000 -user level2 -ls 2>/dev/null (2번은 에러스크립터를 제외하게 해줌)
을 이용해서 level2권한이 걸린곳을 찾고
my-pass 명령어를 직접 실행시키는것은 막혀잇으니 level2 권한으로
shell(커맨드)를 실행시킨후 my-pass를 입력한다
LEVEL 2
LEVEL1과 마찬가지로 권한을 찾은 후 권한이 걸린 /usr/bin/editor로 이동한다
vi 편집기를 이용해서 :! < 쉘 명령을 한줄만 입력할 수 있다
:!my-pass 를 쳐서 한다 .
LEVEL 3
힌트를 열어보면
-동시에 여러 명령어를 사용하려면?
-문자열 형태로 명령어를 전달하려면 ? 이라는 문구가 들어있다
마찬가지로 권한을 찾은뒤 권한이 걸려있는 /bin/autodig로 접근한 뒤
쉘에 my-pass를 전달해야 하므로 ./autoding "bin/bash;my-pass"를 이용한다.
동시에 여러 명령어 전달 - argv[1]>>;<<argv[2] 이런식으로 세미콜론사용
문자열 형태로 전달 "argv[1]" 이런 식으로 따옴표 안에 넣어줌
LEVEL 4
백도어를 누군가가 심어놨다고 한다 cat 명령어로 백도어를 열어보니
level5권한이 걸려있는 파일이 /home/level4/tmp/backdoor에 있다고 한다 . 또한 service finger 이다
tmp에 가면 backdoor 파일이 없다 그래서 시스템 함수에 "my-pass"를 전달해줘서
my-pass를 level5의 권한으로 실행시켜줘야한다.
#include <stido.h>
#incldue <stdlib.h>
int main()
{
system("my-pass")
return 0;
}
LEVEL 5
/tmp 디렉토리에 level5.tmp라는 이름의 임시파일을 생성한다고 한다
level5를 실행시킨후 tmp에 가서 확인하면 임시 파일이 존재 하지 않는데
level5.tmp 라는 동일한 이름을 가진 임시 파일을 생성하여서
내용만 바뀐 level5.tmp를 읽어서 풀 수 있다
LEVEL 6
텔넷 창이 뜨기 이전에 hint에서 ctrl+ c를 이용해서 인터럽트(중단)을 시키면
패스워드를 얻을 수 있다
LEVEL 7
단순히 창의력 문제였다
아스키 코드와 모스부호는 2진수라고 생각하고 10진수로 변환한뒤 풀면 된다
LEVEL 8
용량이 2700인 파일을 찾아야한다
find / -size 2700c 2>/dev/null 을 사용한다
그 후에 나오는 암호화 된 것을 존 더 리퍼를 이용해서 푼다
LEVEL 9
버퍼 오버 플로우가 시작됐다
buf1 , buf2에 각자 10씩 할당되어있고 buf2의 첫 2자리에 go가 들어가면
/bin/bash가 열린다
gdb분석으로 더미값 파악후 풀면된다
LEVEL 10
공유 메모리 공부 후 소스를 짜 풀어야한다
LEVEL 11
포맷스트링버그 기법
print( str ) 에서 취약점이 발생한다
LEVEL 12
RTL
gets 함수 에서 취약점 발생 [엔터를 입력받을 때까지 모두 문자열로 인식해서 받아들이므로 버퍼 값을 넘어서도 넣을 수 있음
LEVEL 13
스택 가드 , 쉘코드(에그쉘)
더미 파악후 스택 가드 값을 맞춰주고 RET에 에그쉘에서 얻은 코드를 넣어줌
LEVEL 14
buf에 20이 할당 되엇으나 fgets로 45까지 넣어줄 수 잇으므로 오버플로우 발생 가능하다. gdb분석해서 0xdeadbeef 의 위치를 알아낸 후에
gets 함수이고 소스에 권한이 할당되잇으므로 파이프로 묶은뒤 cat을 이용한다
LEVEL 15가 안보인다..?
차후에 추가
LEVEL 16
shell , printit 함수와 *call 포인터가있음
shell에는 권한이 담겨있고 printit은 필요없음 *call포인터가 printit을 저장할때
printit의 주소 대신에 shell의 주소를 넣으면 풀림
LEVEL 17
저번 문제와 똑같은데 shell함수가 없어짐 (권한이 없음)
고로 에그쉘로 쉘코드를 구한 후 LEVEL16에 shell함수 주소 대신
쉘코드의 주소를 구하면 됨
LEVEL 18
check에 0xdeadbeef 를 넣어주면 쉘코드가 실행됨
하지만 check는 string밑에 존재 하기 때문에 버퍼 오버 플로우가 불가능하다
하지만 소스 상에서 보면 0x08을 넣으면 count--가 된다
check와 string은 100 104 즉 4의 차이가난다 고로 \x08을 네 번 넣고
데드 비프를 넣으면 된다 (100지점에 서로 꽉 달라붙어 잇었을 것으로 예상 그렇지 않앗다면 4~8만큼 값을 조절하면서 넣어보자!) // 추가로 공부 필요가 할거같음
LEVEL 19
GETS 함수를 쓴다 에그쉘을 이용해서 그냥 RET에 넣으면 된다
LEVEL 20
포맷 스트링 버그
fgets(bleh,79,stdin); 으로 79의 크기밖에 사용못하게 보안 코딩이 되어있음
printf(bleh) 으로 취약점이 있음 그냥 또 포맷스트링버그를 쓰면됨
'해커스쿨 ftz' 카테고리의 다른 글
FTZ - level19 Chaining RTL (1) | 2016.06.12 |
---|---|
FTZ-LEVEL20 (0) | 2016.04.26 |
FTZ-LEVEL19 (0) | 2016.04.25 |
FTZ-LEVEL18 (0) | 2016.04.24 |
FTZ-LEVEL17 (0) | 2016.04.24 |