Description

Category: Crypto

Source: Pragyan CTF 19

Points: 200

Author: Jisoon Park(js00n.park)

Description:

Ram has something to show you, which can be of great help. It definitely contains the piece of text "pctf" and whatever follows it is the flag. Can you figure out what it is?

Note: Enclose it in pctf{}

ciphertext.txt
encrypt.py

Write-up

먼저 encrypt.py 파일을 살펴보자.

[...]

flag = ""
for i in secret:
    if i.isalpha():
        flag += i
l = len(flag)

key = [[int(random.random()*10000) for e in range(2)] for e in range(2)]

i = 0
ciphertext = ""

while i <= (l-2):
    x = ord(flag[i]) - 97
    y = ord(flag[i+1]) - 97
    z = (x*key[0][0] + y*key[0][1])%26 + 97
    w = (x*key[1][0] + y*key[1][1])%26 + 97
    ciphertext = ciphertext + chr(z) + chr(w)
    i = i+2

[...]

key list에 있는 4가지 key 값을 찾아야 한다. 각각의 key 값은 (0, 10000) 범위에 있어서, 얼핏 보면 10000 * 10000 * 10000 * 10000 가지 경우에 대한 brute force를 시도해야 할 것 같다. 하지만 문제를 그렇게 내지는 않았겠지.

코드를 좀 더 살펴보자.

각 key 값들은 한 번만 사용되고, key 값에 대한 곱셈 및 덧셈 후에 %26 연산을 한다. 나머지 연산은 아래와 같은 성질을 가진다.

  • (a + b) % c = ((a % c) + (b % c)) % c
  • (a * b) % c = ((a % c) * (b % c)) % c

즉, z와 w를 계산할 때, key[a][b]에 %26을 먼저 적용하고 계산해도 결과는 동일하다는 뜻이다. 그리고 z와 w는 상호 의존성이 없으므로, brute force할 값의 범위는 26 * 26이 된다.

문제에 flag 값에 pctf가 들어있다고 했으므로 앞에서부터 4글자씩 넣어 보았을 때 pctf가 되는 key 값을 찾아보고, 그걸 이용해서 이후의 문자열을 decrypt 하는 코드를 작성하여 돌려보자.

몇 가지의 가능한 후보 문자열을 얻을 수 있는데, pctf 부분을 떼고 봤을 때 말이 되는 문자열을 submit 했더니 point를 획득할 수 있었다. (submit 할때는 문제에 나와있는대로 pctf{}로 감싸주자.)

Flag : pctf{ilikeclimbinghillswhataboutyou}

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

Help Rabin  (0) 2019.11.26
Easy RSA  (0) 2019.11.25
:)  (0) 2019.11.25
Revolutional Secure Angou  (0) 2019.11.25
drinks  (0) 2019.11.25

Description

Category: Web

Source: Pragyan CTF 19

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Do prepare to see cookies lurking everywhere.

http://159.89.166.12:13500/

Write-up

미리 Burp suite proxy를 설정하고 문제 페이지에 들어가 보았다.

response에 flag를 지정하는 데이터가 실려온다.

이게 왜 100점이지 하면서 submit 해보았으나 flag가 아니었다. 뭔가 한번 처리를 해야 하나 보다.

막상 들여다보니 ascii data도 아니어서, 다른 데이터 형인가 싶어 검색해 보았더니 문자열 "pc"에 대한 md5 hash 결과였다.

"pc"를 다시 제출해 보았으나 이것도 올바른 flag가 아니었다. 생각해보니 flag 형식이 pctf() 이니, flag의 첫 두글자인 것 같다. 나머지 글자들은 어떻게 얻을 수 있을까 고민하다가 새로고침을 했더니, cookie의 flag가 업데이트 되었는데, 역시나 "tf"에 대한 md5 hash였다.

첫번째로 얻은 md5 hash가 다시 나올때까지 계속 request하는 코드를 만들어서 돌려봤더니, 아래와 같은 md5 hash들을 얻을 수 있었다.

bc54f4d60f1cec0f9a6cb70e13f2127a
114d6a415b3d04db792ca7c0da0c7a55
b2984e12969ad3a3a2a4d334b8fb385a
6f570c477ab64d17825ef2d2dfcb6fe4
988287f7a1eb966ffc4e19bdbdeec7c3
0d4896d431044c92de2840ed53b6fbbd
f355d719add62ceea8c150e5fbfae819
12eccbdd9b32918131341f38907cbbb5
639307d281416ad0642faeaae1f098c4
96bc320e4d72edda450c7a9abc8a214f
c716fb29298ad96a3b31757ec9755763
51de5514f3c808babd19f42217fcba49
05cb7dc333ca611d0a8969704e39a9f0
bc781c76baf5589eef4fb7b9247b89a0
ff108b961a844f859bd7c203b7366f8e
2349277280263dff980b0c8a4a10674b
0b1cdc9fe1f929e469c5a54ffe0b2ed5
364641d04574146d9f88001e66b4410f
c758807125330006a4375357104f9a82
fcfdc12fb4030a8c8a2e19cf7b075926
440c5c247c708c6e46783e47e3986889
97a7bf81a216e803adfed8bd013f4b85
c1d12de20210d8c1b35c367536e1c255
a8655da06c5080d3f1eb6af7b514e309

이 hash들에 대한 message를 얻어보았더니 flag를 구성하는 데이터들을 얻을 수 있었다.

각 글자들을 순서대로 조합하면 flag를 얻을 수 있다.
(No Match라고 나온 hash들은 다른 사이트에서 값을 찾았다.)

Flag : pctf{c0oki3s_@re_yUm_bUt_tHEy_@ls0_r3vEaL_@_l0t}

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

You Already Know  (0) 2019.11.26
My admin panel  (0) 2019.11.26
Stop and Listen  (0) 2019.11.25
ReadingRainbow  (0) 2019.11.25
webhacking.kr 024  (0) 2019.11.25

Description

Category: Misc/SSL Certificate

Source: TAMUctf 2019

Points: 194

Description:

Who issued the certificate to tamuctf.com?
(Not in standard gigem{flag} format)

Difficulty: easy

Write-up

tamuctf.com의 인증서를 누가 발급했는지 묻고 있다.

주소표시줄 옆의 자물쇠 마크를 클릭하여 인증서 정보를 얻어보자.

인증서 정보를 보면 발급자 정보를 바로 확인할 수 있다.

Flag : Let's Encrypt Authority X3

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

Flag collision  (0) 2019.11.26
Project Eulernt  (0) 2019.11.26
SQL  (0) 2019.11.25
plz variable  (0) 2019.11.25
input  (0) 2019.11.25

Description

Category: Web/Network

Source: TAMUctf 2019

Points: 348

Author: Jisoon Park(js00n.park)

Description:

Sometimes you just need to stop and listen.

This challenge is an introduction to our network exploit challenges, which are hosted over OpenVPN.

Instructions: * Install OpenVPN. Make sure to install the TAP driver. * Debian (Ubuntu/Kali) linux CLI: apt install openvpn * Windows GUI installer * Obtain your OpenVPN configuration in the challenge modal. * You will obtain a separate config for each challenge containing connection info and certificates for authentication. * Launch OpenVPN: * CLI: sudo openvpn --config ${challenge}.ovpn * Windows GUI: Place the config file in %HOMEPATH%and right-click the VPN icon on the status bar, then select the config for this challenge

The virtual tap0 interface will be assigned the IP address 172.30.0.14/28 by default. If multiple team members connect you will need to choose a unique IP for both.

The standard subnet is 172.30.0.0/28, so give that a scan ;)

If you have any issues, please let me (nategraf) know in the Discord chat

Some tools to get started: * Wireshark * tcpdump * nmap * ettercap * bettercap

OpenVPN Config

Write-up

일단 OpenVPN을 이용해서 VPN에 접속하자. VPN에 접속하는 방법은 나같은 newbie들을 위해 문제에서 자세히 알려준 방법을 참고했다. (안내에는 TAP driver를 설치하라고 나와 있는데, Ubuntu 18.04에는 별도로 설치하지 않아도 VPN 접속에 문제가 없었다.)

VPN 접속 후 ifconfig를 해보면 내 IP는 172.30.0.14인 것을 알 수 있다. 문제에서 알려준 것은 여기까지. 이후로는 스스로 찾아봐야 한다.

일단 접속 가능한 서버가 뭐가 있을지 찾기 위해 IP Scanning을 해보자.

나(172.30.0.14) 외에 172.30.0.2 서버가 존재하는 것을 알 수 있다.

해당 서버에 어떤 포트가 열려있는지 알기 위해 nmap(zenmap)을 이용해 Port Scanning을 해보자.

열려있는 포트가 없다.

아무리 뒤져봐도 다른 IP나 열려있는 포트를 찾지 못했다. 한참을 고민하다가, wireshark를 이용하여 tap0 인터페이스를 관찰했더니 172.30.0.2 PC가 172.30.0.15번으로 UDP 패킷을 계속 날리는 것을 볼 수 있었다.

해당 UDP Packet들을 follow 한 결과, 중간에 flag로 보이는 것을 발견하여 submit 하였다.

Flag : gigem{f0rty_tw0_c9d950b61ea83}

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

My admin panel  (0) 2019.11.26
Cookie Monster  (0) 2019.11.25
ReadingRainbow  (0) 2019.11.25
webhacking.kr 024  (0) 2019.11.25
webhacking.kr 027  (0) 2019.11.25

Description

Category: Misc/Secure Coding

Source: TAMUctf 2019

Points: 454

Description:

https://gitlab.tamuctf.com/root/sql

Write-up

PWN 문제와 비슷하게 Secure Coding을 확인하면 된다.

주어진 Project를 fork해서 코드를 살펴보자. (PWN 문제와 마찬가지로 팀 계정으로 로그인 할 수 있다.)

Project 코드를 fork 한 후, 문제 코드를 살펴보자. 봐야할 것 같은 코드는 login.php 하나 밖에 없다.

<?php
  ini_set('display_errors', 'On');
  error_reporting(E_ALL | E_STRICT);
  echo "<html>";
  if (isset($_POST["username"]) && isset($_POST["password"])) {
    $servername = "localhost";
    $username = "sqli-user";
    $password = 'AxU3a9w-azMC7LKzxrVJ^tu5qnM_98Eb';
    $dbname = "SqliDB";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error)
        die("Connection failed: " . $conn->connect_error);
    $user = $_POST['username'];
    $pass = $_POST['password'];
    $sql = "SELECT * FROM login WHERE User='$user' AND Password='$pass'";
    if ($result = $conn->query($sql))
    {
      if ($result->num_rows >= 1)
      {
        $row = $result->fetch_assoc(); 
        echo "You logged in as " . $row["User"];
        $row = $result->fetch_assoc();
        echo "<html>You logged in as " . $row["User"] . "</html>\n";
      }
      else {
        echo "Sorry to say, that's invalid login info!";
      }
    }
    $conn->close();
  }
  else
    echo "Must supply username and password...";
  echo "</html>";
?>

위와 같은 코드가 주어지는데, 가만 보면 sql문에서 입력받은 문자열을 그대로 query에 집어넣기 때문에 sql injection이 가능하다는 취약점이 있다.

이 부분을 prepared statement를 이용해서 안전하게 수정해보자.

<?php
  ini_set('display_errors', 'On');
  error_reporting(E_ALL | E_STRICT);
  echo "<html>";
  if (isset($_POST["username"]) && isset($_POST["password"])) {
    $servername = "localhost";
    $username = "sqli-user";
    $password = 'AxU3a9w-azMC7LKzxrVJ^tu5qnM_98Eb';
    $dbname = "SqliDB";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error)
        die("Connection failed: " . $conn->connect_error);
    $user = $_POST['username'];
    $pass = $_POST['password'];
    $stmt = $conn->prepare("SELECT User FROM login WHERE User = ? AND Password = ?");
    $stmt->bind_param("ss", $user, $pass);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($username);
    if ($stmt->fetch())
    {
      echo "You logged in as " . $username;
      echo "<html>You logged in as " . $username . "</html>\n";
    }
    else {
      echo "Sorry to say, that's invalid login info!";
    }
    $stmt->close();
    $conn->close();
  }
  else
    echo "Must supply username and password...";
  echo "</html>";
?>

원래의 코드와 동일한 동작을 수행하도록 위와 같이 코드를 수정해서 commint 하면 CI/CD 메뉴에서 flag를 확인할 수 있다.

Flag : gigem{the_best_damn_sql_anywhere}

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

Project Eulernt  (0) 2019.11.26
Who do I trust?  (0) 2019.11.25
plz variable  (0) 2019.11.25
input  (0) 2019.11.25
algo-auth  (0) 2019.11.25

Description

Category: Reversing

Source: TAMUctf 2019

Points: 370

Author: Jisoon Park(js00n.park)

Description:

What kind of file is this?

reversing2.pyc

Write-up

pyc 파일이 주어졌다. pyc 파일은 디컴파일이 가능하다. 해보자.

# Source Generated with Decompyle++
# File: reversing2.pyc (Python 2.7)

from datetime import datetime
Fqaa = [
    102,
    108,
    97,
    103,
    123,
    100,
    101,
    99,
    111,
    109,
    112,
    105,
    108,
    101,
    125]
XidT = [
    83,
    117,
    112,
    101,
    114,
    83,
    101,
    99,
    114,
    101,
    116,
    75,
    101,
    121]

def main():
    print 'Clock.exe'
    input = raw_input('>: ').strip()
    kUIl = ''
    for i in XidT:
        kUIl += chr(i)

    if input == kUIl:
        alYe = ''
        for i in Fqaa:
            alYe += chr(i)

        print alYe
    else:
        print datetime.now()

if __name__ == '__main__':
    main()

파일을 실행했을 때 입력한 값이 XidT 배열의 문자열과 같으면 Fqaa 배열을 보여준다.

Fqaa 배열의 내용을 확인해보자.

$ python -c 'import reversing2; print "".join(map(chr, reversing2.Fqaa))'
flag{decompile}
$

flag를 얻었다.

Flag : flag{decompile}

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

Super Secure Vault  (0) 2019.11.26
Feed_me  (0) 2019.11.25
Secrets  (0) 2019.11.25
Local News  (0) 2019.11.25
KeyGenMe  (0) 2019.11.25

Description

Category: Crypto

Source: TAMUctf 2019

Points: 481

Author: Jisoon Park(js00n.park)

Description:

Look at what I found! XUBdTFdScw5XCVRGTglJXEpMSFpOQE5AVVxJBRpLT10aYBpIVwlbCVZATl1WTBpaTkBOQFVcSQdH

Difficulty: easy

Write-up

딱 보면 bas64 인코딩 된 문자열이다. 바로 디코딩을 해서 살펴보자.

별달리 의미있는 텍스트 데이터 같지는 않다. hex 문자열로 살펴보자.

무슨 의미일지 한참을 바라보다가, 맨 앞의 첫번째 글자와 세번째 글자가 동일하다는 것을 깨달았다.

이 대회의 flag 포멧이 gigem{} 이니 각 글자들이 바로 flag로 치환 되는 것 같다.

NeverLAN CTF의 Alphabet Soup 문제처럼 치환 테이블을 찾아야 하는 건가 싶어 0x5d:g, 0x40:i, 0x4c:e, 0x57:m 등을 이용해서 flag를 찾아보려고 했지만, 문장을 유추하기에는 힌트가 너무 적었다.

한참을 이래저래 끼워맞춰보다가, 이 방향이 아닌가 싶어 xor을 해보았다.

58과 41이 번갈아가면서 등장한다. 58과 41에 해당하는 ascii 문자는 각각 ":"와 ")"로, 문제 제목과 동일하다.

제대로 찾은 것 같으니, 주어진 데이터의 끝까지 XOR을 수행하는 code를 작성하여 flag를 찾아보자.

Flag : gigem{I'm not superstitious, but I am a little stitious.}

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

Easy RSA  (0) 2019.11.25
Decode This  (0) 2019.11.25
Revolutional Secure Angou  (0) 2019.11.25
drinks  (0) 2019.11.25
RSAaaay  (0) 2019.11.23

+ Recent posts