System Hacking (pwnable) 84

[FTZ] level12 ( write - up )

printf 부분에 뭔가 깨진다... 어쨌든 gets에서 얼마나 입력받는지 검사하지 않아서 취약점이 발생한다. 코어파일을 열어보려고 ulmit -c unlimited 명령어로 코어파일이 생성 될 수 있도록 만들어 주었다.실제로 코어파일이 생성되는것을 알 수 있다. 이렇게 생성된 코어파일로, 버퍼의 시작주소를 알아보자. 노란색으로 표시한 부분이 다음과 같다.일단은 쉘을 땄다.이 기법은 NOP sled 라는 기법이다. 말그대로 NOP코드에 shell코드를 썰매를 태우는 것이다. NOP코드는 아무것도 안한다는 의미로, ret가 NOP의 어딘가로 변조되었을때, 그대로 놉코드를 따라서 쉘을 실행한다. 안전성을 위해 앞뒤로 NOP코드를 넣어주어서, Exploit은 다음과 같다. NOP + Shellcode + RE..

[FTZ] level11 ( write - up )

level11부터는 홈에 다음 레벨의 setuid가 걸려있고 취약점이 있는 attackme 파일이 주어진다.이 프로그램의 취약점은 strcpy함수에서 터진다. str 변수는 char 형으로 256만큼 선언되어있다. 하지만 입력받을때 256을 넘어가는 수를 입력하면 strcpy 함수로 문자열을 복사할때 256을 넘어가서 복사해버린다. 즉, 잘못된 메모리 공간을 변조 시킬 수 있는것이다. 쉘코드를 실행시켜주는 eggshell의 소스를 복사해서 컴파일시키고, 실행시킨다. 그러면 환경변수에 EGG라는 이름의 환경변수가 등록된다하지만, eggshell을 실행시킬때마다 eggshell의 주소는 달라지게 된다. 따라서, 정확한 환경변수의 주소를 알아오기 위해, 코딩을 해준다. getenv함수는 환경변수의 주소를 가져..

[FTZ] level10 ( write - up )

우리가 했던 1번~9번문제와는 다르게 여기서는 setuid가 걸려있는 취약점이 없다.하지만 여기서 현재 두명의 사용자가 비밀스러운 대화를 나누고 있다고 하였고, 공유메모리의 key값도 주었다.따라서 우리는 코딩으로 두사람의 대화를 도청할 수 있다. 코드는 다음과 같다.코드를 대략적으로 설명해보면.. key_t key : 공유메모리를 구별하는 key값이다. // ★몹시중요★문제에서 주어짐! int size : 공유메모리 크기를 결정한다. // 보통 0으로 함. int shmflg : 여러가지 옵션을 추가할 수 있다. // 현재 공유메모리가 돌고있으므로 CREATE로 옵션 추가!- IPC_CREATE : 퍼미션 0666을 설정한다. 첫번째인수 key에 해당하는 메모리가 없으면 공유메모리를 생성한다.- IPC..

[FTZ] level9 ( write - up )

buf2와 go가같으면 setuid를 level10으로 설정해주고 /bin/sh를 실행해준다!따라서 우리는 buf2 == go로 만들어주어야 한다. 위의 소스코드는 fgets 부분에서 bof가 터진다.buf를 40만큼 입력받는데 buf의 크기는 10이다.따라서 10을 넘어서 입력을 받으면 언젠가는 buf2를 침범하게 될것이다.buf와 buf2사이의 거리는 10이지만, 리눅스 자체에서 생성된 dummy data로 인해 값이 약간 다르다.하지만 이러한 dummy data가 크지는 않을것임을 두 변수사이의 거리가 10밖에 되지 않으므로 예측할수있다.따라서 약간의 게싱을 해주었다. 풀었다!

[FTZ] level8 ( wirte - up )

하던대로 힌트를 확인해본다. 일단 shadow 파일은 암호에 관한 정보가 저장되어있는 파일이다.그리고 그 파일의 크기가 2700이라고 한다.우리는 find 명령어를 이용하여 파일의 크기를 입력하여 찾을 생각을 해볼수있다.-size 2700으로 2700이라는 크기를 지정해주고 크기의 단위 w,d,k,c를 하나하나씩 입력해가며 출력값을 찾아본다. -size 2700c를 했을때 .txt파일이 나온다. 이건 누가봐도 cat하고싶게 생겼다.그래서 cat을 해보면..아까 말했듯이 shadow파일은 패스워드에 관한 정보를 담고있다고 했다. 따라서 출력된 문자열은 암호화된 문자열임을 알수있다.이걸 John the Ripper 라는암호 복호화 툴을 사용하면 해독할 수 있다.john the ripper로 복호화 하였다.중..

[FTZ] level7 ( write - up )

늘 그랬듯이 힌트를 확인했더니 이렇다고 한다. 그래서 /usr/bin에 들어가서 level7을 실행시켰더니 wrong.txt라는 파일이 없다고 한다.이건 개인이 직접 구축한 서버라 파일을 찾을수가 없다.원래 FTZ서버에만 있는 파일인데, 파일이 터져버려서 구글을 이용해서 파일을 가져왔다.어쨌든, 무슨값을 입력해도 오류가 뜬다. 패스워드가 틀렸다고 함과 동시에 모스부호같은 이상한 칭구가 뜬다. 힌트를 통해 정보를 얻으면 모스부호같은 친구가 2진수일거라는 생각이 든다.-와 _두개로만 이루어져있기 때문이다. -를 1, _를 0이라고 하면..1101101 1100001 1110100 1100101 -2진수로는! 109 97 116 101 -10진수로는! 이다.근데 숫자 범위가 너무 아스키코드 스럽다. 그래서 아..

[FTZ] level6 ( write - up )

시작하면 바로 이런 화면이 뜬다.그리고 아무키나 누르면!!바로 텔넷 접속 서비스로 넘어가지게 된다.하이텔, 나우누리, 천리안은 모두 서비스가 종료된 텔넷 서비스라 어떤 값을 입력해도 변화가 없다.이상황에서는 패스워드를 절대로 알아낼수없을듯 하다.그러면 접속서비스 화면으로 넘어가기 전에 문제를 해결할 방법을 찾아야겠다. 그것은 바로 Ctrl + C 시그널을 보내는것이다.Ctrl + D 시그널도 보내보았는데 Ctrl + C 시그널만 정상적으로 작동하였다.그 후 ls로 파일을 확인해보았더니 password가 있어서 password를 알 수 있었다.

[FTZ] level5 ( write - up )

/usr/bin/level5 프로그램은 level6의 setuid가 걸려있다.따라서 이 프로그램이 만드는 임시파일은 level6의 권한이다.하지만 .tmp 확장자인것으로 보아 임시파일이라 파일이 생성되자마자 사라진다. ㅠㅠ 실제로 실행시키자마자 확인해도 파일이 없는것을 볼수있다. 따라서 우리는 심볼릭 링크를 이용해서 문제를 해결할수있다.juntae라는 파일을 하나 만들어주고, level5.tmp라는 이름의 심볼릭링크를 하나 만든다.이 심볼릭 링크는 juntae라는 파일을 참조하게 된다. 만약 level5 프로그램을 실행시키면 level5.tmp라는 프로그램이 이미 만들어둔 심볼릭 링크에 값을 쓰게 될것이다.그 후 level5.tmp는 다시 삭제될것이다. 하지만 이미 심볼릭링크로 juntae에 값을 연결해..

[FTZ] level4 ( write - up )

힌트를 확인하고, 확인해본다.xinetd.d이 디렉토리였다는것을 알수있다.따라서 디렉토리로 들어가서, 안에 파일을 찾던 도중 backdoor파일을 찾을 수 있었다.백도어 파일을 확인해보니 finger service를 설정해주고있었다.일단 핵심 부분만 말하면 level5의 권한으로 /home/level4/tmp/backdoor파일을 실행시키는 서비스이다.하지만 /home/level4/tmp에는 아무런 파일도 존재하지 않는다.따라서 우리가 직접 프로그래밍을 통해 패스워드를 출력해주는 프로그램을 만들면 될듯 하다. vi로 backdoor.c 를 만든다.쓱쓱싹싹 코딩을 하고, :wq를 입력하여 나간다. 그리고나서 gcc로 컴파일하여 finger 서비스를 실행시키면 패스워드를 볼 수 있다.level5 passwo..

[FTZ] level3 ( write - up )

이번 힌트는 좀 길다. 간단하게 말하자면 이 프로그램은 인자로 host를 넘겨받는다.그 후 dig @ host version.bind chaos txt를 실행시키는 것이다.dig는 DNS 서버의 정보를 가져와준다. ( 이런것이 있다는것만 알아두면 될듯 하다 )하지만 여기서 핵심은 인자로 호스트를 넘겨받으면서 문자열 형태로 여러 명령어를 전달할수있다는것에 있다. 핵심이 될 두가지는 " " 와 ; 이다.리눅스에서 ; 는 첫번째로 ; 앞에있는 명령어를 실행시키고, 두번째로 ; 뒤에있는 명령어를 실행시킨다는 의미이다.그리고 이걸 문자열로 전달하려면 " " 와같이 전달해주어야 한다.따라서.. 이렇게 level4의 패스워드를 얻을수있었다.level4 password is suck my brain