RSA in CTF

Some useful links:

  1. Basic: https://crypto.stanford.edu/~dabo/papers/RSA-survey.pdf
  2. LSB oracle
    https://bitsdeep.com/posts/attacking-rsa-for-fun-and-ctf-points-part-3/
    https://github.com/ashutosh1206/Crypton/tree/master/RSA-encryption/Attack-LSBit-Oracle
    https://ctf.rip/sharif-ctf-2016-lsb-oracle-crypto-challenge/
    https://github.com/xelenonz/game/blob/master/50.Lottery%20Predictor/problem.py
  3. Partial key:
    https://www.iacr.org/archive/crypto2003/27290027/27290027.pdf
    https://github.com/HackThisSite/CTF-Writeups/tree/master/2017/EasyCTF/Premium%20RSA

[Viettel MATESCTF 2018 2nd Quals][Web Category] babyfirst

Fact #1: Mình chỉ xem đề và làm một bài này cho vui, nói thế thôi chứ thật ra là biết làm mỗi bài này :facepalm:

Fact #2: Mình không có ý định viết write-up, đến khi mình đọc được write-up của một team giải được mà không cần source code (blackbox). Mình khá là ngạc nhiên, nên mình viết. Ơ mà có vẻ không liên quan lắm nhỉ, :whatever:

Đề cho chúng ta một đường link (http://babyfirst.scoreboard.ns01.info/) và 2 users: batman – goodgirl có cùng password “123456”.

Theo kinh nghiệm vài tháng đi làm pentest web của mình thì, do the recon phase first, check những chỗ khả nghi:

  • Check robots.txt: Nothing.
  • Check .git: Nothing.
  • Check .svn/wc.db: BOOM!

Okay, access được wc.db thì chúng ta sẽ có code, mọi chuyện sẽ dễ hơn. Chắc chắn là vậy rồi, tên bài là babyfirst, chẳng lẽ làm khó người chơi 😦

More details: https://pen-testing.sans.org/blog/2012/12/06/all-your-svn-are-belong-to-us

Tiến hành dump database này bằng sqlite3:

Tiếp tục tìm kiếm đường dẫn đến source code:

Giờ thì chúng ta có thể access vào source code, có thể chọn wget về hoặc view trực tiếp trên browser. Do vô tình lỡ xoá mất source code, và server đã tắt, nên không có source code đầy đủ. Mình chỉ nhớ thế này:

...
$plaintext = json_encode(array('username' => $username));
$username_encrypted = base64_encode(mcrypt_encrypt("arcfour", $key, $plaintext , "stream"));
...

Đến đây thì chỉ cần giải quyết phần crypto trong bài này thôi. “arcfour” là RC4, một dạng stream cipher; thêm một dữ kiện nữa là đề bài cho 2 users, login vào thử, ta có được 2 cookies khác nhau. Dùng các dữ kiện đó để điểm lại những kỹ thuật tấn công stream cipher phổ biến, ta nhận thấy rất có khả năng có thể áp dụng bit flipping attack để giải bài này.

Kỹ thuật này mình đã dùng khá nhiều lần, cũng đã ra đề ở UIT Hacking Contest, nên không mất nhiều thời gian để mình giải quyết nó:

Copy cookie này, sửa lại và gởi đi, đây là kết quả:

Thanks for reading!

[SVATTT Final 2017] [Daemon] [Crypto] NotSideChannel

Tải source của challenge tại http://final.svattt.org/challs/notsidechannel.zip – mình tự gõ lại link luôn đấy 😥

Ok, nói trước là bài này mình không giải ra trong thời gian thi. Và thật ra là trong thời gian thi mình chả làm được bài nào, so sad.

Bóc phốt time: trong khi thi và sau khi thi xong mình vẫn nghĩ bài này không phải là ECC, ECC méo gì không cho p cũng chả có a, b, ai chơi 😥

Tóm tắt source: có một server cho ta nhập một số n, server sẽ trả về toạ độ x của point Q, với Q = nP. Nhiệm vụ của chúng ta, là tìm một số k sao cho Q.x() = SECRET = 0x636f7468616e(cho bạn nào chưa biết, secret là hex-encoded nickname của tác giả).

Tới thời điểm này thì mình buộc phải thừa nhận đây là một bài ECC (sorry bạn nào hôm đấy nghe mình nói nhảm nhé 😥 ). Và với một bài ECC “dị” thế này, không có p, a, b thì… tìm cách tìm được rồi tính tiếp vậy 😥

  1. Tìm p:
    Lợi dụng oracle ở hàm check, ta có thể có được p. Binary search có lẽ là cách tốt nhất để tìm p trong trường hợp này, tất nhiên, trừ cách chày cối làm tay. Mình thì tay to hơn não, nên, mình làm tay.
  2. Tìm a, b:

    Hàm calculate, như đã nói, sẽ trả về Q.x(), với Q = nP, n do chúng ta nhập.
    Thử nhập 1 và 2, server trả về như sau:

    Nhập 1, ta nhận được Q.x(), Q = 2P. Nhập 2, ta nhận được Q.x(), Q = 3P.
    Ok lượn qua Wiki để xem công thức point multiplication như thế nào: https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication

    Giây phút giấy bút lên ngôi:
    Dễ thấy, a, b của chúng ta bây giờ chỉ phụ thuộc duy nhất vào biến y. Tiếp tục khai triển trong trường hợp Q = 3P:

    Mọi chuyện đã trở nên dễ dàng hơn…


    Chỗ này có một lưu ý nhỏ, L2 và L3 đều có 2 giá trị căn bậc hai. Tại sao mình lại chọn như vậy?

Như đã nói ở trên, tìm được p, a, b, nghĩa là chúng ta mới chỉ giải quyết phần “dị” của bài toán ECC này. Phần còn lại, khó hơn, là phần attack.

Nếu tinh ý, chúng ta sẽ nhận ra đường cong này là một đường cong đặc biệt:

Rõ ràng đến đây, ta nhận ra mấu chốt để giải bài này là việc chọn các giá trị căn bậc hai sao cho thoả mãn E.order() == p, để có thể thực hiện Smart order attack, hay anomalous curve attack.

May mắn cho mình, dù chơi ECC không nhiều, chỉ biết vài attack cơ bản, nhưng bài toán lần này vô tình lại trùng với một trong những bài mình đã làm, ở đây: https://hxp.io/blog/25/SharifCTF%202016:%20crypto350%20%22British%20Elevator%22%20writeup/

Vậy không có lý do gì không modify lại script có sẵn:

Gởi kết quả tìm được lên server (nhớ trừ 1, còn nếu bạn không biết lý do tại sao thì kéo lên đọc lại từ đầu nhé).

Conclusion: Cám ơn các anh VNSecurity, các anh Viettel đã tổ chức một kỳ SVATTT với nhiều bài hay, đặc biệt cám ơn anh @cothan vì hai challenges Crypto xuất sắc. Mong cho mong ước của anh trong flag sẽ thành hiện thực. Cám ơn tất cả các anh em đã tham dự kỳ thi SVATTT này. Lần nữa, xin chúc mừng UIT-r3s0L đã giành chiến thắng xứng đáng!

[SVATTT Quals 2017]

Không như thường lệ, lần nếu này bạn nào vào đây đọc để kiếm #thịphi thì có lẽ sẽ thất vọng =))

À thì nói chung là lần này đi thi thì cũng may mắn, được vào chung kết, nên cũng cảm thấy vui vẻ, cũng có tí #thịphi mà thôi, bỏ qua cho cuộc đời tươi sáng.

Nhân có mấy bạn hỏi write-up, nên mình viết vài bài mình làm được, cho nó vui nhà vui cửa. Cuộc sống mà, cứ vui đi, có gì đâu mà buồn.

1. Forensics 100.

Mặc dù trong team mình hay làm crypto, nhưng gặp một bài forensics, và chỉ có 100 điểm thì dại gì không làm, nhỉ =))

À ờ, đó là trong trường hợp bình thường thôi. Chứ trường hợp cái file pcap đề cho nó đến hai mươi mấy MB thì cũng hơi… ngán đó =))

Load vào wireshark, nói thật là file pcap trừ khi có mấy protocol lạ lạ, còn lại thì cũng có mấy dạng, làm nhiều thì quen tay thôi. File pcap này có khá nhiều http protocol, nên việc đầu tiên mình làm là File / Export Objects / HTTP

Screen Shot 2017-11-05 at 3.32.55 PM

Forensics, giống như người ta ném bạn vào đống rác, sau đó bảo bạn tìm cho ra cờ, nằm trong tờ giấy gói bánh mì vậy. Bới tung đống rác lên để tìm:

Screen Shot 2017-11-05 at 3.36.06 PM

nothing.py à =)) không tin, lừa nhau à =)) Save file lại, mở ra xem thử:

Screen Shot 2017-11-05 at 3.39.15 PM

Thuật toán chỉ đơn giản là cộng xong xor, vậy giờ làm ngược lại thôi, xor xong trừ thôi. Mình thì lười, nên mình copy hàm cộng, đổi tên biến, sửa dấu cộng thành dấu trừ…

Screen Shot 2017-11-05 at 3.44.32 PM

2. Crypto 100.

Mình khá là bất ngờ khi nhìn vào dashboard, chỉ có một bài forensics và đến ba bài crypto, lại có đến hai bài 100. Hy vọng không quá khó, chứ mang tiếng chơi crypto, làm không được thì cũng… ahihi.

Download file về, giải nén, mở source encrypt.py lên đọc:

e, có N, chắc là RSA. Quăng vào factordb.com, tạch =))

Xem kỹ hơn, ta thấy e quá nhỏ và N không quá lớn, đây là nguồn gốc của đủ thể loại tấn công RSA trên đời. c ban đầu bằng 0, vậy block đầu tiên của message sẽ là căn bậc ba của block ciphertext đầu tiên.

Screen Shot 2017-11-05 at 4.00.05 PM

Ơ nhưng mà tới đây rồi sao nữa =)) thấy hơi ngáo ngáo rồi =)) mình stuck ở đây luôn =))

Và rồi một tiếng sau đó, mình nhận ra rằng, cuộc sống này thật đáng buồn. Đã code sẵn cái lib chuyên trị RSA, tự nhiên tới lúc cần thì không lấy ra xài =))

Screen Shot 2017-11-05 at 4.05.02 PM

Mọi chuyện đã quá dễ dàng khi ta có pq

3. Web 100.

Bài này, là cái bài mình thấy khó hiểu nhất. Lần đầu tiên, mình thấy tất cả đề cho đều là thật, trừ cái flag troll.

Tóm tắt ngắn gọn: check robots.txt, thấy /.git/, dùng gitdumper lôi source về, vào trang admin.php, có flag.

Screen Shot 2017-11-05 at 4.13.06 PM

Submit, fail -_- bị lừa.

Qua trang index.php:

Screen Shot 2017-11-05 at 4.14.17 PM

Mình chỉ muốn nói, đôi khi chúng ta không tin vào những thứ mắt mình đang thấy, nhưng nó lại là sự thật.

Server tắt mất rồi, nên xem tạm log qua Burp nhé các bạn =))

Screen Shot 2017-11-05 at 4.17.04 PM

Screen Shot 2017-11-05 at 4.17.52 PM

Conclusion: Nói chung là cũng vui, teammates great, các trường bạn cũng rất tuyệt. Hẹn các bạn miền Bắc ở Đà Nẵng.

P.s: À nếu bạn nữ team áo trắng #Akira có đọc được bài này thì cho mình xin fb, sđt các kiểu nha :ethen:

Update: Unsolved problem

4. Crypto100

  1. DES-CBC, blocksize = 8.
  2. Seed (dùng để sinh key) chỉ có 2 bytes, có thể brute-force được.
  3. Xác định length của challenge: len(challenge) in range(24, 48). Trong trường hợp len(challenge) == 48, cấu trúc ciphertext trả về sẽ là:8 bytes IV | 48 bytes challenge | 8 bytes padding ("\x08" * 8)

—> Request lên server đến khi nào nhận được ciphertext có length là 256 (hex-encoded), brute-force key để decrypt last 2-blocks của ciphertext (một block là IV, block còn lại là ciphertext), nếu 8 bytes cuối sau khi decrypt là “\x08” * 8 thì xác định được key.