view-source:[URL]






'Wargame > Natas:OverTheWire' 카테고리의 다른 글

[Natas] Level5  (0) 2016.10.22
[Natas] Level4  (0) 2016.10.22
[Natas] Level3  (0) 2016.10.22
[Natas] Level2  (0) 2016.10.22
[Natas] Level0  (0) 2016.10.22

PythonChallenge

Level1



노트에 적혀있는 글자들을 확인 해 보니 k와 m, o와 q, e와 g의 거리는 모두 2였습니다.

따라서 아래 있는 분홍 글씨들에 +2씩을 해주면 뭔가 문장이 나올 것 같습니다.



손으로 하기는 귀찮으니 스크립트를 돌려봅시다.



string.maketrans()와 같은 함수를 사용하면 쉽게 바꿀 수 있었다고 합니다.

map.html을 위의 규칙대로 돌려주면 ocr.html이 나타납니다.





[*] FLAG : ocr.html

'Wargame > PythonChallenge' 카테고리의 다른 글

[PythonChallenge] Level5  (0) 2016.06.27
[PythonChallenge] Level4  (0) 2016.06.27
[PythonChallenge] Level3  (0) 2016.06.27
[PythonChallenge] Level2  (0) 2016.06.27
[PythonChallenge] Level0  (0) 2016.06.27

SuNiNaTaS

System Level1(Prob_16)




써니나타스 시스템 카테고리 첫 번째 문제입니다.

SuNiNaTaS.com에 속해있는 멤버의 패스워드를 알아내는 것이 우리의 목표입니다.

Download 버튼을 누르면 packet_dump.pcap 파일이 담겨있는 압축 파일이 받아집니다. 이 파일을 분석하여 패스워드를 알아내도록 하죠.



필터링은 http.request.full_uri contains "suninatas" 로 걸고 suninatas.com에 해당하는 패킷을 살펴보았습니다.

당연히 id/pw를 보내는 요청이기에 POST 요청만 확인하였으며, 맨 아래의 POST 패킷을 제외한 나머지 패킷에는 로그아웃을 한 흔적이 없었습니다.

따라서 맨 아래에 나와있는 id/pw가 실제로 로그인 되는 계정으로 추측 할 수 있습니다.

여기서 구해낸 ultrashark/=SharkPass01 로 suninatas 메인 페이지에서 로그인을 하면 아래와 같이 Key 값을 얻어낼 수 있습니다.



'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level2(Prob_24)  (0) 2016.05.10
SuNiNaTaS Web Level10(Prob_23)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

SuNiNaTas

Web Level1




첫 번째 문제입니다. <%를 봐선 asp로 짜인 소스인것같습니다. 인증 루틴을 확인 해 보니 result 변수에 "admin"이 들어가 있을 때 Authkey를 뱉어내는 것 같습니다.

그 위를 확인 해 보니 result 변수에는 result1과 result2를 &연산 한 값이 들어가는데, 얼핏 보면 문자열끼리 비트연산을 하는 것 같지만 ASP에서는 &가 문자열의 연결을 뜻합니다. PHP의 .과 같은 역할을 한다고 보면 되겠네요.

result1과 result2는 모두 Mid연산으로 문자열을 잘라내는데, result1은 2번째 인덱스부터 2개의 문자를 빼오고 result2는 4번째 인덱스부터 6개의 문자를 빼옵니다. 이렇게 빼내온 문자열을 연결했을 때 admin이라는 문자열이 나와야하네요.

처음에 우리가 입력한 str 변수를 a -> aad, i -> in으로 치환하니, 치환 된 상태에서 어떻게 result1, 2가 구성 될 지 생각을 해야합니다.

만약 str에 'ami'를 입력한다면 다음과 같이 result 값이 나옵니다.


aadmin


여기서 result1, result2를 생각 해 본다면 아래와 같습니다.


result1

  ↓

a[ad][min]

        ↑   

      result2



ami를 입력하니, 우리가 생각 했던 대로 Authkey를 내뱉고 Level1이 종료됩니다.



'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level6  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09
SuNiNaTaS Web Level4  (3) 2016.05.07
SuNiNaTaS Web Level3  (0) 2016.05.06
SuNiNaTas Web Level2  (0) 2016.05.06

OverTheWire Behemoth 

[ level1 -> level2 ]


behemoth 레벨1입니다. narnia와 달리 소스코드가 주어지지 않아 gdb로만 분석을 해야하는 불편함이 있습니다.

바로 확인 해 보도록 합시다. 



/behemoth 디렉토리로 이동하여 behemoth1 바이너리를 실행시켰을 때의 결과입니다.

패스워드를 요구하며, 패스워드에 부합하지 않을 시 "Authentication failure." 라는 메시지를 내뱉고 프로그램을 종료시키는 듯 합니다.

소스코드가 없으니 gdb를 이용해서 main 부분을 확인 해 보도록 하죠.



main 함수를 보니 인증 부분 자체가 없습니다. 그냥 gets 함수로 값을 입력받고, puts 함수로 오류 메시지를 내뱉고 종료시키네요.

인증이고 뭐고 BOF를 이용해서 쉘을 띄우라는 의도인 것 같습니다.

BOF를 위해 입력받은 값이 어디로 들어가는 지 확인 해 보았습니다.



ebp-0x50 부분을 확인 해 보니, 0xffffd5fe부터 값이 차례로 들어가는 것을 알 수 있었습니다.

이제 main 함수의 return address를 찾아야 하는데, 하나씩 확인 해 보니 0xf7e3da63 부분이 __libc_start_main 함수로 이어지는 것을 알 수 있었습니다.

다음 그림을 보도록 하죠.



__libc_start_main 함수에서 main 함수를 호출 한 이후 모든 루틴을 끝냈을 때 다시 __libc_start_main 함수로 돌아와 exit함수를 호출하며 프로그램을 종료시키는 형태입니다.

이를 return address로 간주하고 풀이하도록 하겠습니다.

이 return address와 buffer 사이의 간격이 79byte이기 때문에 문자 'A'를 총 79번 입력 한 이후 쉘코드가 있는 주소를 적어주면 쉘이 띄워질 것입니다.



gdb상에서 A를 79번 입력하기 위해 임시로 'a'라는 파일을 만들어 주었습니다.



gdb로 실행시켜 해당 return 값의 직전까지 값이 들어가는 것을 확인한 결과 화면입니다.

다음으로, 쉘코드를 담을 공간을 확보하는 것인데, 첫번째 방법으로는 우리가 A로 집어 넣은 버퍼 공간에 쉘코드를 집어 넣는 방법이 있으며, 두번째는 환경변수를 이용하여 쉘코드를 입력 한 후, 그 주소를 ret 값에 덮어 씌우는 방식입니다. 저는 두번째 방법인 환경변수를 이용하는 공격 기법으로 풀이하도록 하겠습니다.



export 명령어를 이용해 EGG라는 이름의 환경변수를 만들어주고, 그 값으로 0x90을 100번 반복하고 그 뒤에 쉘코드를 입력해주었습니다. 0x90을 여러번 입력 해 주는 이유는 0x90이 NOP(아무 행동도 하지 않고 다음에 나오는 명령을 실행)의 의미이기 때문에 주소의 오차 범위를 줄임과 동시에, 스택 상에서 환경변수의 주소를 찾기 용이하게 하기 위해 입력 해 주었습니다.



gdb에서 스택을 확인하였더니 그림과 같이 0x90의 반복되는 부분을 확인 할 수 있었습니다. 이 중 아무 주소나 선택하면 되는데, 저는 0xffffd8b8을 리턴 주소로 선택하여 exploit 하도록 하겠습니다.



위에서 구한 EGG 환경변수의 주소를 ret 값에 덮어 씌워주면 behemoth2 권한의 쉘을 띄울 수 있습니다.





'Wargame > Behemoth:OverTheWire' 카테고리의 다른 글

OverTheWire Behemoth [level2 -> level3]  (0) 2016.04.29
OverTheWire Behemoth [level0 -> level1]  (0) 2016.04.07
OverTheWire_Wargame Narnia

[ level1 -> level2 ]




이번 문제는 'EGG'라는 환경변수에 들어있는 값을 ret 포인터 변수에 값을 집어 넣은 후 해당 주소를 호출하는 형태를 띄고 있습니다.

export로 EGG 환경변수에 쉘코드를 박아주면 될 것 같습니다.



짜잔!

OverTheWire_Wargame Narnia

[ level0 -> level1 ]


Bandit와 Leviathan을 지나 드디어 Narnia로 넘어왔습니다.

level0부터 바로 시작하도록 하겠습니다.


OverTheWire 웹페이지 narnia 카테고리를 눌러보면 하단에 위와 같은 문구가 있습니다.

지금까지는 보통 홈 디렉토리에 다음 레벨로 넘어갈 수 있는 바이너리나 정보가 있었는데, 이번에는 /narnia/ 디렉토리에 전부 몰려있는 듯 합니다.

/narnia/ 디렉토리에서 level1로 넘어갈 수 있는 정보를 찾아보도록 하죠.



홈 디렉토리에는 아무 정보도 있지 않고, /narnia 디렉토리로 가 보니 level8까지의 정보가 모두 들어있습니다.

바이너리와 소스코드 모두 주어져 있으니 narnia0.c를 살펴보도록 합시다.



첫번째로 long형 데이터인 val이 'AAAA'로 선언 되어 있으며, buf변수는 20바이트로 선언이 되어있습니다. 그리고 쉘을 띄워주는 조건으로 val 변수가 0xdeadbeef가 되길 원하고 있습니다. 바로 위의 scanf 부분에서 24바이트만큼 입력을 받는 것을 보니 char 배열과 long형 변수 사이에 dummy byte는 따로 없는듯 합니다. 바로 20바이트 dummy + 0xdeadbeef를 입력해주면 쉘이 띄워질 것 같습니다.



짜잔!

OverTheWire_Wargame Leviathan

[ level1 -> level2 ]




Level1입니다. ls를 때려보니 check라는 바이너리가 떡 하고 자리 잡고 있네요.

게다가 leviathan2의 id로 setuid가 걸려있습니다. 이 check 바이너리를 가지고 요리 하면 level2의 패스워드를 획득 할 수 있을것만 같습니다.

gdb로 까보도록 하죠.



check 바이너리를 실행했을 때 password가 맞지 않으면 에러를 내뱉는 구조이기 때문에 strcmp는 당연히 들어있을 것입니다.

main 함수를 disassemble 했을 때 strcmp@plt의 위치를 잡고 breakpoint를 걸어주도록 합시다.

그리고 strcmp의 구조 상 스택에 들어가는 순서는 source, destination, function call 입니다.

그러므로 자연스럽게 $esp+0x18(=$esp+4)는 src, $esp+0x14(=$esp)는 dst가 될 것입니다.

스택을 확인하면서 보도록 합시다.



일단 string값을 확인 해 보았는데, sex, god, love, secret 등 우리가 알아 볼 수 있는 단어들이 여럿 나열 되어 있습니다.

이 중 하나가 우리가 찾는 이 바이너리의 password 일 것입니다.



hex값으로 보면 esp+0과 esp+4만 확인하면 됩니다.

esp+4의 위치에 있는 'sex'가 바로 우리가 찾는 password였습니다.



'sex'를 password로 입력하자 bash shell이 떨어졌고, euid와 groups 권한을 보니 leviathan2로 상승 되어 있었습니다. 이제 leviathan2의 패스워드만 알아 내면 될 것입니다.

find로 leviathan2의 유저 권한을 가지고 있는 파일을 찾아보았더니 bandit과 유사한 경로에 leviathan2의 패스워드가 자리 잡고 있는 것을 확인 할 수 있었습니다.

cat으로 깔끔하게 패스워드를 뱉어줍시다.

OverTheWire_Wargame Leviathan

[ level0 -> level1 ]


Leviathan 시작합니다.



홈 디렉토리를 확인하니 backup 폴더가 숨김 속성으로 고스란히 자리잡고 있습니다.

들어 가 보니, bookmarks.html 파일이 하나 있는데, 용량이 큰 것으로 봐서 cat으로 출력하면 있던 답도 노답이 될것만 같습니다.

grep으로 왠지 있을것만 같은 leviathan을 필터링 해 봅시다.



아니나 다를까, leviathan1의 패스워드를 뱉어줍니다.

+ Recent posts