CTF-writeups icon indicating copy to clipboard operation
CTF-writeups copied to clipboard

SVATTT2019-Finals: hellovietnam và simplemessage

Open vinhjaxt opened this issue 4 years ago • 0 comments

Xin chào mọi người, mình là Vịnh (@vinhjaxt), thuộc team KMA PeBois Sau đây mình xin đại diện team, viết writeup cho SVATTT2019-Finals mà đội mình tham gia.

HelloVietNam

Tác giả: anh @ducnt Source code: hellovietnam.zip

Định hình

  • Ngay khi đọc source của bài này, thấy tác giả sử dụng khá nhiều procedure, team mình đã nghĩ ngay đến racing boy. Mình ngay lập tức test race để đăng ký/đăng nhập và... failed.
  • Nhưng có một điều không đúng, vì sao mình failed?
  • Mình xác nhận là đã chắc chắn đăng nhập thành công (bởi vì ở router validateLogin) không in ra lỗi đăng nhập không thành công
  • Thay vào đó, route validateLogin này lại in ra cho mình trang login (trong khi đó, code của router này làm gì có đoạn này đâu).
  • Bắt đầu nghi vấn rằng BTC config thọt, mình nghĩ là sau khi mình đăng nhập, nó route đến dashboard, proxy của BTC đã tự động follow redirect, và do proxy nó không giữ lại cookie session để gửi đến dashboard, nên router này trả về trang login
  • May mắn là anh @jang đã setup khá nhanh môi trường local để test race và lúc đó đội mình confirm là chall này config bị thọt :v. (Đáng tiếc là đội mình không báo với BTC ngay mà lại làm bài khác khiến thế cục sau này thay đổi xấu đi :((( )
  • Một lúc lâu sau, BTC thông báo đang fix bài này. Team mình lúc đó đang nhảy qua bài simplemessage
  • Đến chiều, BTC thông báo đã fix xong. Mình test lại thì đã thành công.

Team mình đã race như thế này

  • Một mặt, ra sức đăng ký với cùng 1 email để trên db lúc nào đó, có account của mình tồn tại image
  • Một mặt khác, ra sức đăng nhập với email đó image
  • Sau khi nhận được redirect, mình save lại cookie đó image Và kết quả là: image Và thật bất ngờ, đội mình bị tấn công, má, đội nào nhanh dữ, và tất nhiên, đội mình đã bắt được request và thực hiện replay lại thôi @@ Đây là request anh @jang gửi cho mình image Ngay lập tức mình code và replay lại kiếm điểm image Công việc sau này của mình chỉ có vậy, chạy script, copy output, paste lên bot submit flag :((( vô dụng vcđ image May mắn có bài này mà team mình có thể leo từ top 15 lên top 5 bằng việc attack các đội khác :v:

Simple message

Tác giả: anh @tsug0d Mô tả sơ qua bài này:

  • Mình có 1 trang (và source của trang này) để lưu message lại với file .txt Screenshot at 2019-11-29 16-02-42
<html>
<meta http-equiv=Content-Security-Policy content="default-src 'self'; style-src 'self'; img-src 'self'; script-src 'self';">
<link rel="stylesheet" type="text/css" href="assets/tsu.css">
<center>
    <h1 class="simple">Simple Message Storage Service</h1>
<form action="index.php" id="usrform" method="GET">
</form>
<textarea name="message" form="usrform"  rows="15" cols="70"></textarea><br><br>
<input class='new-button' type="submit" form="usrform" value="submit">
<?php

if(!isset($_COOKIE['Test_cookie']))
{
    setcookie('Test_cookie', 'tsutsutsu', time() + (86400 * 30), "/", false, false, 1);
}
//If admin
//setcookie('fl4g', 'xxxxxxxxxxxxxxxxx', time() + (86400 * 30), "/", false , false, 1);

if(isset($_GET['message']) && !empty($_GET['message']))
{
    if(strlen($_GET['message'])>220)
    {
        die('<br><br>Too Long :(</br>');
    }
    $filename = './message/'.uniqid().'.txt';
    file_put_contents($filename, $_GET['message']);
    echo "<br><br><strong>Your Message '". $_GET['message'] . "'' is located <a href='$filename' target=_blank >here</a>, wanna share it with <a href='contact.php' target=_blank>me</a>?</strong>";
}

?>

<br><br>We implement many security solutions on this site, so no worries, you are safe by default even somebody hack you!<br>
- Here our Client-side protection info: <a href="clientinfo.php" target=_blank >Click here</a><br>
- Here our Server-side protection info: <a href="serverinfo.php" target=_blank >Click here</a><br>

</center>
</html>
  • Mình có 1 trang để share link gì đó với bot Screenshot at 2019-11-29 16-01-39
  • Ngay lập tức, team mình biết ngay trang submit message có XSS và cần bypass CSP (khá dễ)
  • Và nữa, mình có 1 trang phpinfo (serverinfo.php): Mình ngỡ ngỡ, what, xss cho phpinfo làm gì ta @@

Để thực thi alert(1), team mình làm như sau

  • Submit một message với nội dung alert(1) rồi lấy link của message đó (.txt)

  • Submit một message với nội dung <script src="link message.txt"></script> Rồi, vậy là popup hiện lên, lếy cookie và submit thôi, ez challenge :v:, nhưng mà đời không như là mơ, document.cookie rỗng? Do tác giả đã set httpOnly cho cookie (ơ wtf)

  • Lại nghi vấn BTC setup hỏng, mình mail bằng miệng đến anh @ducnt, anh reply bằng miệng: Anh chỉ có thể nói, đó là một phần của challenge. Òa, thông não, OK anh, em đi về.

  • Ban đầu, mình nghĩ, tác giả sử dụng phantomjs1.9.8 (vì mình đã submit và biết UA), có khi nào phantomjs bị gì đó leak đươc cookie, hì hục google... bất thành... no hope

  • Sau đó anh @jang, phát hiện rất bất ngờ, phpinfo có in ra HTTP_COOKIE của mình, thôi xong, ez challenge rồi. Screenshot at 2019-11-29 16-02-28

  • Mình ngay lập tức dùnh fetch + regex để lấy cookie của mình trước, okie, thành công. Submit bot thôi,...chờ đợi,....chờ đợi,... không thấy gì cả,... (có thể do mình sử dụng fetch)

  • Mình lại lõng tõng chạy lên hỏi anh @ducnt về con bot, anh bảo: ok anh xem lại

  • Ngồi chờ,...

  • Sau đó mình thử submit xhr + regex nữa,..

  • Ngồi chờ,...

  • Sau đó đúng lúc anh @ducnt xuống xem tình hình, bot lại hoạt động như mơ ước, có flag submit để may mắn trên được một đội :/ Screenshot at 2019-11-29 16-01-57 Screenshot at 2019-11-29 16-01-19

  • Ơ mà source code setcookie là fl4g, mà BOT lại có cookie là FLAG kìa =))) Chính vì điều này mà mình sử dụng regex để bắt chuỗi fl4g không thành công, may mắn là mình chuyển qua bắt cả HTTP_COOKIE không thì @toang

  • Có thể do mình nghĩ cookie là fl4g nên regex sai, cộng thêm với việc sử dụng fetch, và việc bot loop các request nên tưởng bot không hoạt động khiến làm phiền btc khá nhiều =))) Sau khi kết thúc cuộc thi, mình nghe nói rằng anh @tsug0d muốn payload sử dụng jQuery để send ajax, cơ mà team mình vẫn sử dụng xhr thành công @@ image

Lời cuối cùng

  • Cảm ơn 2 tác giả anh @ducnt và anh @tsug0d
  • Cảm ơn anh @ducnt đã support em khá nhiều
  • Cảm ơn BTC đã rất nỗ lực, vất vả setup challenge và hệ thống

vinhjaxt avatar Dec 01 '19 18:12 vinhjaxt