files/pixel.png



files/



users.txt


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

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

PythonChallenge

Level3



책이 있네요.

소스를 확인해봅시다.



흔하지 않은 문자들을 찾아보라고 하네요.

아래 주석 안에 있는 문자열은 총 97545의 길이를 가지고 있었습니다.



input.txt에 문자열을 저장한 후, 스크립트로 불러와서 카운팅을 해보았습니다.



중간중간에 1개씩 있는 것을 보니 특수문자가 아닌 알파벳인 것을 추측 할 수 있었습니다.



그래서 알파벳만 추려 순서대로 출력해보았습니다.



equality라는 단어가 나왔네요!



짠!


[*] FLAG : equality.html



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

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

SuNiNaTaS

System Level2(Prob_24)




시스템 파트 2번째 문제입니다.

첫 번째 문제와는 달리 아무런 힌트도 주어지지 않은 상태에서 다운로드만 가능합니다.

다운로드명은 suninatas로, rwxrwxrwx권한이 주어져있지만 실행이 되지 않는 바이너리 형태였습니다.



혹시나 하는 마음에 .zip으로 확장자를 바꾼 후 압축 해제를 했더니 아니나 다를까, *.jar, *.apk를 압축해제 했을 때의 파일 구조를 보여주었습니다.

classes.dex 파일을 dex2jar 툴로 jar파일로 바꿔주도록 합시다.



classes-dex2jar.jar 파일을 jd-gui 툴을 이용하여 열어보았습니다.

해당 jar 파일 안에는 suninatas.class 파일이 존재했는데, 확인 해 보니 localObject1와 localObject2, paramAnonymousView 값에 각각 id, pw, key값을 받아내는 부분이 있었습니다. 그리고 정해진 key값이 들어오면 ~/chk_key.asp로 request요청을 날려주는데, id와 pw, key값을 모두 날려주는 것을 확인 할 수 있었습니다. 빨간 밑줄의 뒷 부분이 key값을 GET 형식으로 보내주는 부분입니다.



해당 url을 그대로 suninatas 웹페이지의 id, pw 그리고 class파일의 key값을 넣어 요청을 때렸더니 Wrong!Wrong!이라는 경고 메시지를 띄워줄 뿐 Auth Key를 뱉어주진 않았습니다.



그래서 직접 request를 때리지 않고 apk파일인만큼 직접 안드로이드에서 돌려보자는 생각을 해 보았습니다.



이클립스의 AVD 툴을 이용해 안드로이드 예뮬 환경 구축 후 직접 돌려보았습니다.



request 요청을 직접 때렸을 때와 달리 Auth Key값을 뱉어내는 것을 확인 할 수 있었습니다.

이번 문제는 가상 안드로이드 환경을 구축 할 수 있는지 없는지의 여부를 확인하는 문제였던 것 같습니다.

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

SuNiNaTaS System Level1(Prob_16)  (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 Level2




2번째 문제입니다. 겉으로만 보면 SQLi 문제로 보이는데.. Join밖에 없네요. 소스를 한번 확인 해 보도록 하죠.



소스상에는 js로 가입 하는 부분이 구현되어있습니다. 따로 db에 저장하거나 하진 않고, id와 pw가 같을 경우 해당 값들을 초기화시키는 부분이 있습니다.

그런데 아래 힌트를 보니 id와 pw가 같게 만들라고 합니다.

chrome의 개발자 도구를 이용하여 직접 때려박으면 쉽게 우회가 가능합니다.



위와 같이 직접 js 코드를 때려박아주면 Authkey를 뱉어줍니다.


'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 Level1  (0) 2016.05.06

OverTheWire Behemoth 

[ level2 -> level3 ]




베히모스 lv2입니다. 실행 시켜보니 touch 명령어로 2520이라는 이름의 파일을 만들며, sleep을 긴 시간 넣어 둔 것 같습니다. 실행을 멈추고 gdb로 disassemble 해보도록 합시다. 



sprintf 부분에서 buffer에 "touch %d"를 넣어주고 있습니다. %d의 값으로는 getpid로 가져 온 pid 값을 집어 넣어 주고 있습니다.

두 번째 박스에서는 system 함수로 아까 저장한 buffer의 내용을 실행시켜줍니다. 즉, "touch PID"를 실행 시키는거죠.

여기서 touch 명령어는 절대 경로가 아닌 'PATH' 환경변수에 지정된 경로에 존재하는 touch 바이너리를 실행시키는 것입니다. 따라서 PATH의 값을 바꿔준다면 이 touch를 이용해서 다른 행위를 할 수 있을 것입니다.



env 명령어를 이용해 환경변수를 확인 해 본 결과입니다. 원하는 경로에 touch 명령어를 생성해주고, 이 명령어를 통해 다음 레벨로 갈 수 있는 패스워드를 알아내는 쉘스크립트를 작성한 후 PATH의 값을 변경해주면 다음 레벨의 패스워드를 알아 낼 수 있을 것 같습니다.



환경변수는 앞에 있는 값부터 확인 하기 때문에 += 연산이 아닌 =연산으로 모두 뜯어고칠 예정이므로, cat 명령어도 절대경로로 지정해주었습니다.



export명령어를 이용하여 PATH의 값을 우리가 만들어준 touch 명령어가 있는 경로로 바꿔주고, behemoth2 바이너리를 실행시키면 다음 레벨로 갈 수 있는 패스워드를 알아 낼 수 있습니다.



[ * ] Specially thanks to Zairo!

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

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

[ level2 -> level3 ]



이번 문제는 기본적인 BOF 문제입니다. strcpy 함수로 buf 변수에 argv[1]의 값을 넣어주는데, 인자 길이를 제한하지 않기 때문에 BOF 취약점이 존재합니다.

이를 이용하여 스택에서 쉘코드를 실행시키는 형태로 풀이하도록 하겠습니다.



먼저 스택의 크기를 가늠하기 위해 4바이트씩 늘려 가며 A를 출력해줍니다.

140바이트를 출력했을 때 segmentation fault가 터지는 것으로 보아 buffer 128byte + dummy 8byte + sfp 4byte + ret 4byte 의 구조를 띄고 있는 것 같습니다.

ret 값에 들어갈 리턴 값의 위치를 구하기 위해 gdb로 스택을 살펴보도록 하겠습니다.



main 함수의 strcpy 부분에 breapoint를 걸고, argv[1]의 위치를 찾아봅니다.

140개의 A를 지나 return address(BBBB) 뒤의 0x90이 있는 지점을 찾아 그 중 한 곳의 주소를 집어줍니다.

이렇게 특정 스택 주소를 집어주는 이유는 여러 번 실행한 결과 랜덤 스택이 적용되어있지 않기 때문에 0x90중 한 곳에만 return 시켜준다면 뒤에 있는 쉘코드가 실행 될 것입니다.


payload : ./narnia2 A*140 + 0xffffd872 + 0x90*100 + 25byte shellcode



짜잔!

OverTheWire_Wargame Narnia

[ level1 -> level2 ]




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

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



짜잔!

OverTheWire_Wargame Leviathan

[ level2 -> level3 ]




레벨2에는 printfile이라는 바이너리가 자리 잡고 있습니다. 레벨1과 마찬가지로 setuid bit가 걸려있기 때문에 이 파일을 이용해서 레벨3로의 패스워드를 알아 내야 할 것입니다.

gdb로 한번 까 보도록 하겠습니다.



먼저 main을 disassemble 한 상태입니다.

위쪽은 파라미터 갯수 검증하는 부분이고, 빨간 체크박스부터 살펴보면 access 함수를 호출하는 것을 알 수 있습니다.

access 함수의 원형을 살펴보죠.

int access(const char *pathname, int mode);

2가지 인자를 받는데, 경로를 포인터로 받고 mode 또한 숫자 또는 상수로 받습니다.


R_OK(0x01)

 읽기 권한 여부

 W_OK(0x02)

 쓰기 권한 여부

 X_OK(0x03)

 실행 권한 여부

 F_OK(0x04)

 파일 존재 여부


함수 호출 규약에 따라 먼저 들어간 0x04가 mode, eax가 *pathname이 되겠군요.

스택에서 한번 어떤 값이 들어가는 지 살펴보도록 하겠습니다.



eax에 들어가는 값을 따라가 보니 argv[1]에 우리가 넣어줬던 파일 경로의 값이 들어갑니다.

그렇다면 여기서 호출하는 access 함수의 목적은 파일이 존재하는지 존재하지 않는지의 여부를 파악하고, 만약 존재하지 않을 경우 프로그램을 종료시키는 것이 될 것입니다.

사실 여기서 바로 /etc/leviathan_pass/leviathan3 로 넣어주면 깔끔하지 않느냐?

라는 질문이 있을 수도 있는데, 이유는 모르겠지만 그렇게 넣어주면 파일 미존재로 인해 프로그램이 종료되었습니다. 뭔가 다른 장치를 해 놓은 듯 합니다.

혹시 아시는 분이 계시면 댓글 부탁드립니다.


자, 그럼 이제 access 함수 이후에 어떤 행동을 하는지 더 살펴보도록 하죠.



access 함수 이후에 snprintf 함수를 호출하는데, sprintf와 동일하지만 버퍼의 길이를 제한하여 넣어준다는 차이가 있습니다.

이 함수는 대충 이런 모양이 될 것 같습니다.


snprintf(buffer, 0x1ff, "/bin/cat %s", argv[1]);


우리가 넣어 준 파일 경로 앞에 /bin/cat을 넣어주고 buffer 변수에 넣는거죠.

그리고 마지막엔 system함수의 인자로 buffer을 넣어줘서 결국 "/bin/cat 파일"을 실행하는 것입니다.

자, 여기까지 이해를 했다면 어떤식으로 문제를 풀어야 할 지 감이 오지 않나요?



/tmp/ 경로에 fstr3am_2라는 디렉토리를 만들어주고, 그 곳에 ".bashrc;sh"라는 이름의 파일을 하나 던져줍니다.

세미콜론 앞에 오는 문자열은 어떤 문자가 오던 간에 상관은 없습니다.

이렇게 한 이유는 access 함수를 우회하기 위해 실제로 존재하는 파일을 생성해주는것이고, 파일명을 /bin/cat에 붙여주기 때문에 결과적으로 버퍼에 들어가는 문자열은 아래와 같이 될 것입니다.


"/bin/cat .bashrc;sh"


이 프로그램에서는 실행을 위해 system 함수를 이용하기 때문에 system("/bin/cat .bashrc;sh") 라는 명령어가 완성이 되는군요.

결과적으로 /bin/cat .bashrc, sh 두 가지의 명령어가 따로 실행이 되는것입니다.



깔끔하게 쉘을 떨어뜨렸습니다. 권한이 leviathan3로 정상적으로 상승된 것을 확인하고, leviathan3의 패스워드를 뱉어내도록 합시다.

+ Recent posts