Write-Up/FTZ 14

FTZ:Level 19

1. hint 로 attackme 소스코드 확인 stdin에서 값을 입력받아 buf 배열에 저장한 후, printf 함수를 이용하여 출력한다. 쉽게 생각하면 RTL 기법을 이용하여 system("/bin/sh"); 를 ret 부분에 넣으면 될 것 같지만 코드 내부에 권한 상승을 시켜주는 setreuid() 함수가 없어 총 두번의 함수를 강제로 호출시켜주어야 하는 문제이다. => RTL Chaining 기법 필요. 2. RTL Chaining RTL 기법은 ret에 공유 라이브러리의 함수 주소를 넣어 임의의 함수 호출을 한번만 진행한다. 하지만 RTL Chaining 기법에서는 새로 호출한 함수의 RET 부분에 지속적으로 RTL 기법을 이용하며 스택의 포인터를 다음 함수로 보내는 방법을 사용할 수 있다. ..

Write-Up/FTZ 2019.11.28

FTZ: Level17

setreuid 함수가 level18로 권한을 올려주는 함수. 이 뒤에 call이 호출되므로 미리 buf에 쉘코드를 넣어놓고 call에 buf의 주소를 넣으면 될 줄 알았으나..! FTZ 상태가 이상한건지 내가 주소를 읽는 눈치가 이상한건지 한번도 맞아떨어지지 않으므로 마음 편하게 쉘코드를 환경변수로 저장하기로 했다. 다음과 같이 환경변수를 만들고, getenv라는 $SHELLCODE 전용 주소 알아내기 코드를 짠다. 다음과 같이 코드를 찾을 수 있다. 다음과 같이 nop sled를 40바이트 넘기고, call이 가리키는 위치에 환경변수의 주소를 넣어주면 바로 익스플로잇 되어 비밀번호를 탈취할 수 있다. 쉘코드 출처 더보기 http://blog.naver.com/PostView.nhn?blogId=sth..

Write-Up/FTZ 2019.11.20

FTZ: Level15

*level14 와 차이점 : check가 가진 주소를 받느냐 or check가 가리키고 있는 곳 내부의 값을 받느냐 1. buf에 0xdeadbeef를 입력한 후, BOF를 통해 check가 buf의 주소를 가지게 함. (문제 : 스택 주소는 실행시마다 바뀜. 프로그램이랑 눈치싸움 필요) 간단하게, buf에서 check까지는 40바이트 거리니 0xdeadbeef*10+(buf 주소 - 4바이트) 를 해주자. 그럼 중요한 것은 buf의 주소를 어떻게 찾느냐. if문 안에서 deadbeef가 맞는지 비교하기 직전에 브레이크 포인트를 걸고, 프로그램 실행. 인자값으로는 찾기 편하게 AAAAA를 넣어줄 예정 (메모리에 0x41로 들어감) 딱 버퍼자리에 AAAAA가 잘 들어간 것을 확인할 수 있음. check는..

Write-Up/FTZ 2019.11.20

FTZ: Level11

이제는 hint를 출력하면 설명이 없이 소스코드를 출력한다. 아마 폴더에 같이 있던 attackme의 소스코드일 것으로 판단한다. 이번에는 3092번으로 uid를 설정한다. 확인해보면 level12의 uid인 것을 확인할 수 있다. 코드는 간단하게 프로그램 실행할 동시 parameter를 받고, 그 첫번째 값을 str에 저장하고, 출력한다. uid는 level12의 것으로 바뀌지만, 그외에 명령을 실행할 수 있는 방법이 없다. 인자값에 쉘코드를 박아, printf를 리턴할 때 쉘코드로 넘어가 쉘을 올리면 level12의 권한을 가진 쉘을 실행할 수 있다. argv[1]의 값을 str에 저장하기 때문에, argv[1]에 쉘코드를 입력하여 놉슬레드를 태워 ret까지 넘기는 방법이 존재하는데 스택의 주소가 실..

Write-Up/FTZ 2019.11.13

FTZ: Level 9

문제의 힌트를 보면 바로 소스코드를 보여준다. char형 배열을 두개 선언해주고, 40크기의 문자열을 표준 입력(키보드)로부터 입력받는다. 이때 배열은 둘 다 10바이트인데 40바이트를 입력받으니, buf에 입력을 받아도 버퍼 오버플로우를 이용하여 buf2의 값을 임의로 수정할 수 있을 것이라 생각된다. if문을 살펴보면, go와 buf2의 문자열을 앞 2글자만 비교하는데 즉 buf2에 go라는 문자열을 입력시키면 if문 안으로 진입할 수 있다. if문 안에서는 uid를 3010(level10의 권한)으로 변경시킨 상태에서 bash쉘을 띄운다. 즉, if문 안으로 들어가기만 하면 level10의 권한으로 쉘을 실행할 수 있는 것. /usr/bin/bof 파일은 디버거를 할 수 없으므로, 동일 코드를 le..

Write-Up/FTZ 2019.11.12

FTZ: Level 8

Level 8로 로그인해서 hint 파일을 열어보면 다음과 같은 힌트를 얻을 수 있다. 용량이 정확하게 2700인 파일은 많지 않을것이라 생각하고, find 명령어와 옵션을 이용해서 이 파일을 찾아보도록 하자. 다음과 같이 find / -size 2700c 2> /dev/null 명령어를 사용하면 다음 옵션들이 조합되어 실행된다 1. 루트에서부터 2. 사이즈가 2700c(= 2700바이트)인 파일을 찾는다 3. 표준 에러일 경우(2>) 4. 화면이 아닌 /dev/null 에 저장한다 결과는 다음과 같이 /etc/rc.d/found.txt라는 파일을 찾을 수 있었다. 해당 파일을 열어보면 다음과 같이 shadow 형태의 내용이 들어있는 것을 알 수 있다. shadow 파일은 /etc/passwd에서 암호화..

Write-Up/FTZ 2019.09.26

FTZ: Level 7

** wrong.txt 에러 관련 ...더보기 , FTZ 문제를 풀다 보면 level7에서 wrong.txt 파일이 존재하지 않는다는 에러를 볼 수 있다. 원래 아래와 같은 내용이 포함되어있어야 하며 직접 root 권한으로 해당 위치에 wrong.txt 파일을 작성해도 되고, 그냥 아래 내용을 참고해도 된다. 올바르지 않은 패스워드 입니다. 패스워드는 가까운곳에... --_--_- --____- ---_-__ --__-_- level 7에 로그인하여 바로 힌트를 확인하면 다음과 같은 내용이 적혀있다. 바로 /bin/level7 명령을 실행하면 다음과 같이 패스워드를 입력하라는 문구가 뜬다. 우리는 아직 비밀번호에 대한 어떠한 정보도 없으니 아무 값이나 입력하면 비밀번호에 대한 정보가 출력된다. * 원래 ..

Write-Up/FTZ 2019.09.26

FTZ: Level6

레벨 6는 로그인하자마자 힌트가 출력된다. 그 상태에서 아무 키나 누르면 BBS 연결 메뉴로 진입하게 되는데, 이 메뉴로 진입하게 되면 어떤 키를 누르던 연결이 끊긴다. (ctrl+c는 막혀 있음) 그렇다면, 힌트가 출력되는 부분은 어떨까? ctrl+c가 막혀있지 않아 실행중이던 프로그램을 취소하고 level6의 쉘로 돌아가게 된다. level6의 홈디렉토리에는 password라는 파일이 있었는데, 이 파일은 권한이 level6로 되어있어 별다른 작업 없이 바로 파일을 열어볼 수 있다.

Write-Up/FTZ 2019.09.26

FTZ: Level 5

가장 먼저 힌트를 읽어본다. 힌트에서 명시한 파일을 ls를 통해 살펴보니 setuid가 설정되어 있었다. 파일의 소유주가 level6이니, level6에 대한 권한이 주어진 것을 알 수 있다. 위와 같이 생성될 level5.tmp 파일에 대한 심볼릭 링크를 만들어두면 usr/bin/level5 에서 level5.tmp 파일을 만들고 삭제해도, 만든 내용은 심볼릭 링크를 통해 tmp에 저장되어있을 것이다. 위와 같이 /usr/bin/level5 를 실행한 후, tmp 파일을 열어보면 다음 비밀번호가 저장되어 있는 것을 확인할 수 있다. 이 문제가 레이스 컨디션 공격 조건을 갖춰서 그 방법으로도 진행해봄 *헛짓거리 해서 조사한 레이스 컨디션 개념 ...더보기 레이스 컨디션이라는 공격은 setuid를 이용하여..

Write-Up/FTZ 2019.09.19