Description

Category: Web

Source: webhacking.kr

Points: 150

Author: Jisoon Park(js00n.park)

Description:

Write-up

뭔지 모를 코드가 주어지는데, 대소문자 숫자가 섞여있고 ==로 끝나는걸로 봐서는 base64 인코딩된 문자열인것 같다.

일단 디코드 해보면 20바이트의 값인 것을 알 수 있다.

20바이트 길이인것으로 미루어 SHA-1의 message digest가 아닐지 의심되어서

레인보우테이블에서 해당 값을 검색해보면 또다른 20바이트 메세지에 대한 hash임을 알 수 있다.

동일한 방법으로 해당 메세지를 다시 한번 decrypt 하면 test라는 값을 얻을 수 있다.

즉, 주어진 메세지는 "test"라는 문자열을 SHA-1으로 두 번 hash한 값이다.

문제 페이지로 돌아가서, 해당 문자열을 제출하면 flag를 얻을 수 있(을 것이)다.

예전에 풀어놨던거라 flag가 뭔지 모르겠다...(미안)

'writeups > Web' 카테고리의 다른 글

webhacking.kr 015  (0) 2019.11.23
webhacking.kr 014  (0) 2019.11.23
webhacking.kr 001  (0) 2019.11.23
tmitter  (0) 2019.11.23
strcmp  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 200

Author: Jisoon Park(js00n.park)

Description:

level : 1

Write-up

<?
if(!$_COOKIE[user_lv])
{
SetCookie("user_lv","1");
echo("<meta http-equiv=refresh content=0>");
}
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?

$password="????";

if(eregi("[^0-9,.]",$_COOKIE[user_lv])) $_COOKIE[user_lv]=1;

if($_COOKIE[user_lv]>=6) $_COOKIE[user_lv]=1;

if($_COOKIE[user_lv]>5) @solve();

echo("<br>level : $_COOKIE[user_lv]");

?>
<br>
<pre>
<a onclick=location.href='index.phps'>----- index.phps -----</a>
</body>
</html>

php 코드를 보면 cookie의 user_lv 값을 5보다 크게 하면 되는것 같다.

다만, 바로 윗라인에서 user_lv의 값이 6 이상일 때는 user_lv를 초기화하므로,

아래와 같이 5보다 크고 6보다 작은 수를 적당히 넣어주면 된다.

burp suite에서 request를 잡아서 cookie의 user_lv를 5.5로 수정하였다.

예전에 풀어놨던거라 flag가 뭔지 모르겠다...(미안)

'writeups > Web' 카테고리의 다른 글

webhacking.kr 014  (0) 2019.11.23
webhacking.kr 004  (0) 2019.11.23
tmitter  (0) 2019.11.23
strcmp  (0) 2019.11.23
flee button  (0) 2019.11.23

Description

tmitter

Category: Web

Source: wargame.kr

Points: 272

Author: Jisoon Park(js00n.park)

Description:

you need login with "admin"s id!

===========================

create table tmitter_user( idx int auto_increment primary key, id char(32), ps char(32) );

Write-up

DB 테이블 구조가 문제에 주어지고, 문제 페이지에 접속해보면 가입과 로그인 메뉴가 있다.

소스 코드를 살펴보면 DB와 마찬가지로 최대 32byte 길이의 id와 패스워드를 입력받도록 되어있다.

이 문제에서 주어지는 가장 큰 힌트는 테이블 구조에서의 char 타입이다. mysql에서 char 타입은 길이가 정해진 문자열 데이터 형으로, 지정된 길이보다 짧은 문자열은 공백으로 padding하여 저장한다. 그렇기 때문에 문자열 뒤에 붙는 공백은 padding 된 공백과 구분이 불가능한 문제가 생긴다.

예를 들면, "admin(공백)"이라는 문자열은 "admin"과 동일한 문자열로 취급된다.

이제, sign up 메뉴로 들어가서 "admin(공백 27개)"이라는 아이디와 대충 아무 비밀번호를 넣고 join을 해보자.

... (admin 계정이 이미 존재한다는) 오류가 발생한다. ㅡ_ㅡ;;

이런저런 테스트를 해보면, id 앞뒤의 공백을 trim으로 지우고 "admin"인지 확인하는 것 같다. burp suite를 이용해서 request를 수정해보자.

admin 뒤에 공백을 이용해서 32글자를 채우고, 마지막에 아무 글자나 붙여서 서버에서 이루어지는 trim을 방지하도록 했다.

별 문제 없이 join이 된것 같다. 이제 로그인 페이지로 가서 admin과 입력했던 password를 입력하면 admin 계정으로 로그인 되고 flag를 획득할 수 있다.

Flag : 607c1e84eef597ef5120b066e1901c5baae59968

'writeups > Web' 카테고리의 다른 글

webhacking.kr 004  (0) 2019.11.23
webhacking.kr 001  (0) 2019.11.23
strcmp  (0) 2019.11.23
flee button  (0) 2019.11.23
DB is really GOOD  (0) 2019.11.23

Description

Category: Web

Source: wargame.kr

Points: 229

Author: Jisoon Park(js00n.park)

Description:

if you can bypass the strcmp function, you get the flag.

Write-up

password를 입력 할 수 있고, 문제의 소스가 제공된다.

소스 코드를 살펴보자.

<?php
    require("../lib.php"); // for auth_code function

    $password = sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());

    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }else if(isset($_POST['password'])){
        sleep(1); // do not brute force!
        if (strcmp($_POST['password'], $password) == 0) {
            echo "Congratulations! Flag is <b>" . auth_code("strcmp") ."</b>";
            exit();
        } else {
            echo "Wrong password..";
        }
    }

?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>

strcmp() 함수가 0을 리턴하도록 해야 하는데, $password 변수는 예측할 수가 없다.

strcmp() 함수의 오래된 취약점(일부 버전에서만 동작한다.)인 type confusion을 이용해서 공격해보자.

취약점이 있는 strcmp 함수는 문자열과 배열을 비교할 경우 NULL을 리턴하고, == 연산자는 NULL == 0을 true로 인식한다.

burp suite를 이용해서, password 파라미터를 배열로 전송해보자.

성공적으로 if 문을 통과하여 flag를 얻을 수 있다.

Flag : 03361f76c1f4e2c3bca7c5351f48be854adee710

'writeups > Web' 카테고리의 다른 글

webhacking.kr 001  (0) 2019.11.23
tmitter  (0) 2019.11.23
flee button  (0) 2019.11.23
DB is really GOOD  (0) 2019.11.23
already got  (0) 2019.11.23

Description

Category: Web

Source: wargame.kr

Points: 93

Author: Jisoon Park(js00n.park)

Description:

click the button!

i can't catch it!

Write-up

문제 페이지에 들어가보면, 버튼을 클릭하라는 텍스트와 마우스 포인터를 따라다니는 버튼이 있다.

물론 문제를 그렇게 냈겠지만, 열심히 마우스 포인터를 움직여 보아도 버튼에 닿지는 않는다.

버튼에 닿았다 치고, 버튼을 눌렀을 때 무슨 일이 생기는지 확인해보자.

chrome의 개발자 도구를 열어보면 관련 코드를 확인할 수 있다.

버튼을 누르면 '?key=57ab'라는 주소로 이동하도록 되어 있다고 한다.

주소표시줄에 해당 주소를 직접 입력하여 이동하면 flag를 얻을 수 있다.

Flag : 2c21c50674bf9c62d845f4e6fdc41da2242424c2

'writeups > Web' 카테고리의 다른 글

webhacking.kr 001  (0) 2019.11.23
tmitter  (0) 2019.11.23
strcmp  (0) 2019.11.23
DB is really GOOD  (0) 2019.11.23
already got  (0) 2019.11.23

Description

Category: Web

Source: wargame.kr

Points: 221

Author: Jisoon Park(js00n.park)

Description:

What kind of this Database?

you have to find correlation between user name and database.

Write-up

로그인을 위한 페이지가 주어지고, 로그인 해보면 메모를 입력할 수 있는 텍스트 박스와 이전에 입력했었던 히스토리가 보여진다.

텍스트박스에 이런저런 것들을 넣어봐도 딱히 되는게 없는데, 로그인을 다른 이름으로 해보면 각 id별로 메모가 별도로 관리되는 것을 알 수 있다. 아마도 db를 별도로 운영하지 않을까 하는 의심이 든다.

메모 입력 창에서는 별게 없었으니, 로그인창에 이런저런 것들을 넣어본다. #(샵)이나 '(쿼트) 같은걸 넣었을 때는 별다른 문제가 없었는데, /(슬래시)를 넣었더니 아래와 같은 오류가 발생했다.

메세지를 잘 보면 db 파일을 못열어서 오류가 발생한 것을 알 수 있다.

정확한 db 이름 생성 규칙을 알기 위해 이런저런(/a라던가.. a/라던가...) 것들을 넣어보고 메세지를 살펴보면, ./db/wkrm_[id].db 파일을 열려고 하는 것을 알 수 있다.

이거다 싶으니, http://wargame.kr:8080/db_is_really_good/./db/wkrm_admin.db 파일에 접근해보면, db 파일이 다운로드된다.

db 안의 데이터를 보면 flag가 들어있는 주소를 돌려주는데, 여기에 접속해보면 flag를 얻을 수 있다.

Flag : 45d76a4af292fcb3a510d07ef1c46435343fc1a6

'writeups > Web' 카테고리의 다른 글

webhacking.kr 001  (0) 2019.11.23
tmitter  (0) 2019.11.23
strcmp  (0) 2019.11.23
flee button  (0) 2019.11.23
already got  (0) 2019.11.23

Description

Category: Web

Source: wargame.kr

Points: 88

Author: Jisoon Park(js00n.park)

Description:

can you see HTTP Response header?

Write-up

HTTP Response header를 볼 수 있냐고 묻는다.

당연히 볼 수 있으므로, flag에 yes를 넣어봤지만 오답이었다.(...)

Response header를 확인하기 위해 burpsuite를 켜고 Start를 누르면 새로운 창이 열린다.

burpsuite에서 이 창에 대한 response를 확인해보면 flag가 있는 것을 확인할 수 있다.

Flag : 8cb12e8f70f6fdc842fc4492060d9529139484f1

'writeups > Web' 카테고리의 다른 글

webhacking.kr 001  (0) 2019.11.23
tmitter  (0) 2019.11.23
strcmp  (0) 2019.11.23
flee button  (0) 2019.11.23
DB is really GOOD  (0) 2019.11.23

Description

Category: Misc

Source: SECCON CTF 2017 Quals.

Points: 30

Author: Jisoon Park(js00n.park)

Description:

RunMe.py

import sys
sys.setrecursionlimit(99999)
def f(n):
    return n if n < 2 else f(n-2) + f(n-1)
print "SECCON{" + str(f(11011))[:32] + "}"

source : SECCON CTF 2017 Quals.

Write-up

간단한 프로그래밍 워밍업 문제이다.
코드를 보면 피보나치 수열을 구하는 함수가 재귀적으로 구현되어 있고, 실행해보면 상당히 오랜 시간 동안 프로그램이 실행되고, 값을 구하는데 실패한다.

재귀적으로 구현된 프로그램을 반복문을 이용하도록 수정하면 쉽게 답을 알아낼 수 있다.

def f(n):
        i = 0
        rn = 1
        rn1 = 1
        n = n - 2
        while (i < n):
                rn = rn + rn1
                rn1 = rn - rn1
                i = i + 1
        return rn

print "SECCON{" + str(f(11011))[:32] + "}"

문제에 있는 바와 같이, 피보나치 수열의 11011번째 항을 구하면 된다.

Flag : SECCON{65076140832331717667772761541872}

'writeups > Coding|misc.' 카테고리의 다른 글

plz variable  (0) 2019.11.25
input  (0) 2019.11.25
algo-auth  (0) 2019.11.25
PWN  (0) 2019.11.23
JPEG file  (0) 2019.11.23

+ Recent posts