[SuNiNaTaS(써니나타스)] 1번 문제

오늘은 [Webhacking] 문제가 아닌 "Suninatas(써니나타스)"라는 워게임에서 문제를 풀었다.

아래의 화면처럼 1번부터 문제가 쭉 나열되어있었고, 문제를 해결할 시 나처럼 바탕색이 파란색으로 바뀐다. 문제를 못 풀었으면 1번을 제외한 나머지 화면처럼 바탕색이 흰색이다.

(Suninatas 문제 목록)

 

 

1번 문제는 100point 문제로 옆에 'PASS'는 지금까지 푼 사람인 것 같다. (4298명인 것 같은데, 많은 사람이 풀었다. 쉬운 문제일 것 같지만 어제처럼 방심하지 않고 정신 차리고 문제를 풀었다.)

 

1번 문제는 아래의 화면처럼 소스코드가 주어져있었다. 그 외에 기능들은 'main', 'Back', 'Check' 이렇게 3가지가 있다. 

(1번 문제)

 

각각 클릭하게 된다면 

'main' 은 "Suninatas(써니나타스)"의 메인 화면으로 이동하는 것이다.

'Back'은 이전 화면으로 이동하는 것이다.

'Check'은 답을 제출하때 사용되는 것이다.

 

 

문제를 해결하려면 소스코드의 이해부터 필요하다.


(아직 정확하게 모르기 때문에 설명에서 잘못된 부분이 있으면 알려주세요!)

Request 값을 받아오는 함수
Replace 값의 문자를 바꿔주는 함수
Mid 원하는 부분의 값을 가져오는 함수
& 두 값을 합치는 함수

 

더 부연설명을 하자면


Replace(abcd, "a" , "fg") 라고 하면

adcd에서 a를 fg로 치환하는 것이다.

그러면 해당 값의 출력은 "fgdcd" 가 출력되는 것이다.

 


Mid(abcd, 2, 2) 라고 하면

a가 1번, b가 2번, c가 3번, d가 4번이다.

그러면 2번째부터 2개만 가져와서 출력하는 것이기 때문에

해당 값의 출력은 "bc" 가 출력되는 것이다.

 


a = 노랭이

b = 라바

result = a & b 일 경우

result 값은 a와 b의 문자열이 합쳐진 "노랑이 라바"가 출력되는 것이다.

 

 

그러면 해당 1번 문제의 소스코드를 분석하면 아래와 같다.


str = Request("str") // 문자열을 받아서 'str'에 값을 집어넣는다.

If not str = "" Then // 받아온 문자열(str)이 아무것도 없으면 실행하지 않는다.

    result = Replace(str, "a", "aad") // 받아온 문자열(str)에서 "a" 문자를 "aad"로 바꿔준 다음 'result'에 값을 넣어준다.

    result = Replace(result, "i", "in") // 받아온 문자열(result)에서 "i" 문자를 "in"로 바꿔준 다음 'result'에 다시 넣어준다.

    result1 = Mid(result, 2, 2) // 받아온 문자열(result)에서 2번째부터 2개를 반환해 'result1'에 값을 넣어준다.

    result2 = Mid(result, 4, 6) // 받아온 문자열(result)에서 4번째부터 2개를 반환해 'result2'에 값을 넣어준다.

    result = result1 & result2 // 'result1'과 'result2'의 문자를 합친다.

    Response.write result

    If result = "admin" Then // 'result' 값이 admin 일 경우 실행

         PW = "????????"       // PW 값 출력

    End if // if문 종료

End if // if문 종료

그러면 나는 'result' 값에 admin이 출력되도록 값을 만들어 주면 되는 것이다.

그래서 내가 선택한 방법은 처음에 admin 값을 넣어서 순서대로 코딩을 진행하고 나서 거꾸로 문제를 해결하기로 했다.

str 값이 admin일 경우

result -> aaddmin

result -> aaddminn

result1 -> ad

result2 -> dmi

result -> addmi

위와 같은 방법으로 진행했을 경우에는 출력 값이 admin이 아닌 addmi이 출력되었다. 그래서 나는 최종적으로 result 값이 admin이 나오도록 고민해 봤고, 결국 답을 얻어냈다.

 


str = ami

result -> aadmi

result -> aadmin

result1 -> ad

result2 -> min

result -> admin

str의 값으로 "ami"을 넣었을 때, result 값이 "admin" 출력되는 것을 알 수 있다.

 

ami 값을 넣으면 아래의 화면처럼 문제가 풀렸다고 팝업창이 뜨게 된다.

(문제 해결 팝업)

 

그리고 문제 밑에 'Authkey' 값이 출력되는 데 이 값을 드래그해서 답을 제출하면 점수를 획득할 수 있다.

 

처음에 문제를 풀고 나서 점수가 안 올라가 의문점이 들었는데, 아래의 화면에 'AUTH'를 클릭해서 들어가야 한다.

 

들어가게 된다면 방금 전에 드래그한 값을 여기다가 제출하면 점수가 올라갈 것이다. 처음에는 답을 입력만 하면 끝인 줄 알았는데 해당 코드를 제출까지 해야만 문제가 해결되는 것을 알 수 있었다.

(Authkey 값 제출해야하는 화면)
(코드값을 제출하면 뜨게 되는 팝업창)

 

 

문제를 풀고 나면 점수가 올라가는 것을 확인할 수 있다. 

()

 

 

[궁금증]

문제를 풀 다보다가 result 값이 똑같이 admin이 나왔지만 문제의 답이 되지 않았다.

str = amin

result -> aadmin

result -> aadminn

result 1-> ad

result 2 -> min

result -> admin

str 값이 amin을 넣었을 시 result 값이 admin이 나왔다. 하지만 답이 되지 않는 걸 보니, "첫 번째 Request 값에서 str이 세 글자이니 'ami'만 가능한 것 아닌가"라는 생각을 했다. 왜냐하면 'amin'은 네 글자이기 때문이다. 혹시 알고 있으신 분들은 알려주실 수 있으신가요?

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

[Webhacking.kr] 6번 문제풀이

webhacking 6번 문제의 배점이 100점이어서 한번 풀어보기로 했다.

(old-06 100점 문제)

 

6번 문제를 들어가 보면 아래의 화면이 보인다.

(Webhacking.kr 6번 문제)

ID와 PW 값이 있는 거 보니, 이것을 이용하는 문제일 것 같았다.

화면에 'view-source' 링크가 있어서 들어가 보았다.

아래의 화면은 'view-source'의 소스코드이다.

('view-source'의 소스코드)

소스코드가 한눈에 들어오지 않고 엄청 길다. 간단하게 해석해보자면 오른쪽 화면에 보이는 소스코드에서 decode_id의 값이 admin이고 decode_pw의 값이 nimda일때 문제가 해결되는 문제인 것 같다. 그러면 나는 Cookie에서 id와 pw 값에 정확한 값을 입력하면 문제를 풀 수 있을 것 같았다.

 

아래의 화면에서 for문을 보게 되면 id와 pw를 20번씩 base64_decode을 하는 것을 알 수 있다.

(for문)

그러면 나는 반대로 생각해봐야 할 것이다. base64_decode를 이용하지 않고 base64_encode를 20번 돌려야 할 것이다. 

id에는 "admin"을, pw에는 "nimda" 값을 입력해서 base64_encode를 20번 하면 될 것이다.

 

나는 PHPTester 사이트를 이용하여 php 구문을 실행시켜 보았다. 아래 PHPTester를 이용하면 php 구문을 쉽게 동작시켜 볼 수 있다.

http://phptester.net/

 

PHPTESTER - Test PHP code online

Lorem Ipsum alternative : gaddafipsum.com       This application is free so please don't break it ! Contact :phptester.net@gmail.com Result

phptester.net

 

아래의 화면은 id에 "admin"의 값을, pw에 "nimda"의 값을 넣어 base64_encode를 20번 한 것이다. 문제의 소스코드를 보면 !,@,$,^,&,*,(,) 와 같은 문자를 치환할 수 있기에 base64_encode이 끝나면 곧바로 치환 할 수 있게 코드를 수정했다. 

(왼쪽화면 id를 20번 encode, 오른쪽 화면 pw를 20번 encode)

php 구문의 코드를 돌리고 화면에서 보이는 'Click to test your php code'를 누르면 내가 짠 코드가 실행된다. 출력된 값을 Cookie 값에 'user' 값과 'password' 값에 넣으면 된다.

 

('admin'을 20번 base64_encode 한 값)
('nimda'을 20번 base64_encode 한 값)

 

위의 화면 처럼 Cookie 값에 base64_encode 한 값을 넣으면 아래의 화면처럼 문제가 해결됐다고 출력된다.

(old-06 Pwned 화면)
(100point 획득 화면)

 

[시행착오]

처음에는 100점짜리 문제여서 가볍게 생각하고 접근했다. 소스 코드에서 'user'값에 admin이을 'password'값이 nimda을 넣으면 쉽게 풀 수 있을 줄 알았다.

(잘못된 값을 넣었을 때 화면)

잘못된 값을 넣으니 위의 세번째 화면처럼 ID와 PW에는 아무런 변화가 없었다. 이번 문제는 어제 풀었던 문제보다 쉽게 생각해서 접근을 했더니, 문제의 접근 방법이 잘 못 되었던 것 같다. 또한 이번 기회에 'PHPTester'라는 사이트를 알게 되어서, 간단한 php 구문을 어렵지 않게 동작시킬 수 있었다. 

아무리 배점이 낮은 문제일지라도 가볍게 생각하면서 문제를 풀면 안되는 것일 이번 기회에 알게 되었다.

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 24번 문제풀이  (6) 2020.03.10
[Webhacking.kr] 26번 문제풀이  (6) 2020.03.08
[Webhacking.kr] 1번 문제풀이  (2) 2020.03.03

[Webhacking.kr] 1번 문제풀이

Webhacking 문제를 처음 들어가면 아래와 같은 화면이다. 처음에 보이는 화면은 'level : 1'과 'view-source' 밖에 없다. 1번 문제에서 특이한 점은 링크로 연결되어 있는 'view-source'를 클릭해보기로 했다.

(1번 문제 화면)

'view-source'를 들어가보면 아래와 같은 소스코드를 볼 수 있다.

('view-source' 소스코드)

 

php로 구성되어있는 해당 소스코드는 php구문을 잘 모르지만 알고 있는 선에서 해석해보기로 했다. 

 

(첫번째 문장)

php 아래에 있는 부분에서 첫번째 문장인 is_numeric()은 숫자형 데이터 값인 경우 'true'를 반환하고, 숫자형 데이터 값이 아닌 경우 'false'를 반환하는 함수이다. 그래서 Cookie 값을 숫자를 넣어야지만 문제를 풀 수 있을 것 같았다. 

 

(두번째 문장)

두번째 세번째 문장에서는 Cookie 값에 'user_lv' 값이 6보다 크거나 같을 경우 'user_lv'값을 1을 반환하고, 5보다 큰 값을 넣을 때 문제가 해결된다는 것을 알 수 있다. 

 

(세번째 문장)

마지막 문장에서는 level 옆에 있는 값은 Cookie에서 'user_lv' 값을 넣어준 값을 출력해주는 것을 알 수 있다.

그래서 나는 Cookie 값에 'user_lv'에 4,5,6 이라는 값을 넣어보기로 했다.

(Cookie에서 'user_lv'에다가 4를 넣었을 때)

'user_lv'에 4를 넣었을 때, level 옆 값이 4로 바뀌는 것을 알 수 있다.

 

(Cookie에서 'user_lv'에다가 5를 넣었을 때)

'user_lv'에 5를 넣었을 때, level 옆 값이 5로 바뀌는 것을 알 수 있다.

 

(Cookie에서 'user_lv'에다가 6를 넣었을 때)

'user_lv'에 6를 넣었을 때, level 옆 값이 1로 바뀌는 것을 알 수 있다. 왜냐하면 php 첫번째 문장에서 'user_lv' 값에 6을 넣을 시 'user_lv' 값이 1로 바뀌도록 소스 코드가 짜여있기 때문이다.

 

소스코드에서 5보다 큰 값을 넣었을 때, 문제가 해결된다고 했는 데, 정수로는 문제가 풀리지 않았다. 그래서 Cookie 값에 5.1이라는 실수 값을 넣었더니 아래의 화면처럼 200point를 얻으면서 문제가 해결됐다.

(문제 해결 화면)

 

 

[해결방안]

[webhacking] 1번 문제를 풀기 위해서는 Cookie 값을 임의로 설정 할 수 있는 툴을 이용해야한다. 나는 크롬에서 사용할 수 있는 "Edit This Cookie" 툴을 이용했다. 아래의 링크를 통해 Cookie 툴을 다운받아서 설치 할 수 있다.

https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ko

 

EditThisCookie

EditThisCookie는 쿠키 관리자입니다. 이것을 이용하여 쿠키를 추가하고, 삭제하고, 편집하고, 찾고, 보호하거나 막을 수 있습니다!

chrome.google.com

해당 툴을 다운받으면 쿠키 모양의 아이콘이 크롬 오른쪽 위에 생성이 된다. 아래의 화면 처럼 쿠키 모양의 아이콘이 생성된 것을 확인 할 수 있다.

(Cookie 아이콘 생성 화면)

처음에 문제를 해결할 때 'user_lv' 값에 정수값만 넣는 것을 생각했다. 하지만 해당 문제는 실수의 범위까지 생각하게끔 만들었다. 단순하게 생각해서 문제를 풀었던 나에게 좋은 경험을 안겨주었다. 다음에 문제를 풀때 넓은 방면에서 접근해서 풀어야겠다.

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 24번 문제풀이  (6) 2020.03.10
[Webhacking.kr] 26번 문제풀이  (6) 2020.03.08
[webhacking.kr] 6번 문제풀이  (4) 2020.03.04

[CODEGATE2020] CTF #LOL (27pt) Write up

코드게이트 예선전 문제인 LOL 문제를 풀어 보았다.

(가장 밑에 있는 LOL 문제)

점수 배점도 낮아서 풀 수 있을 정도의 문제일 거 같았다.

(LOL 문제)

해당 문제는 gif 파일에서 key를 찾으라는 문제였다.

다운로드 링크가 있어서 다운받아 보았다.

(다운로드 파일)

다운로드 한 파일 내부에는 gif 파일이 존재했다.

압축을 풀고 나서 바로 gif 파일을 열어보았다.

(gif 파일)

gif 파일이어서 움직임이 있을 줄 알았지만 아무것도 일어나지 않았다. 그래서 해당 파일 종류가 잘 못 되었을 거 같은 생각에 "Exeinfope" 툴을 이용했다.

(Exeinfope PE 툴을 이용한 모습)

분석 툴을 이용해서 확인해보니 JPG 파일이라고 나왔다. 그래서 파일명을 gif에서 jpg로 바꿔보았다

(왼쪽은 gif파일, 오른쪽은 jpg파일)

파일명을 바꿔보았지만 달라진 것이 없었다.

그래서 파일 속성에 들어가 확인해보기로 했다.

(파일 속성)

파일 크기가 jpg 하나의 크기가 아닌 여러개가 뭉처있는 듯한 양이었다. 그래서 윈도우에서 파일을 분할 할 수 있는 "WinHex" 툴을 이용하기로 했다.

(이미지 파일을 WinHex에 옮긴 모습)

'Tool' -> 'Disk Tools' -> 'File Recovery by Type' 순으로 클릭해주면 된다.

(분할 과정)

'File Recovery by Type'에 들어가면 아래와 같은 창이 뜨는데, 'Pictures'에 체크하고 'Output folder'를 설정한 뒤 'OK' 버튼을 누르면 된다. 

'Pictures' 선택 -> 'Output folder' 설정 -> 'OK' 버튼 클릭

(분할 과정)

이 과정을 거치면 아래와 같이 파일이 분할되어서 추출된다. 각 이미지를 들어가 보면 Flag 값을 찾을 수 있다.

(추출된 파일들)

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > CODEGATE 2020' 카테고리의 다른 글

[CODEGATE 2020] CTF #Check_check Write up  (6) 2020.03.01

[CODEGATE 2020] CTF #Check_check (1pt) Write up

코드게이트 예선전 문제인 Check_check 문제를 풀어보았다.

(CODEGATE 첫화면)

CODEGATE에서 첫번째 문제로 있어서 바로 들어가 보았다. 

(Check_check 문제)


문제를 보니 이미지 링크와 유튜브 링크가 있어서 둘다 들어가 보기로 했다.



이미지는 QR코드였고, 유튜브 링크는 Billie Eilish의 bad guy였다.

문제에서 QR코드를 준것은 문제를 풀 수 있는 단서가 될 수 있어서, 바로 QR코드를 스캔해 보았다.


(QR코드 스캔)

QR코드를 확인해보니 Flag를 확인 할 수 있었다.



*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > CODEGATE 2020' 카테고리의 다른 글

[CODEGATE 2020] CTF #LOL Write up  (4) 2020.03.01

+ Recent posts