PicoCTF - scrambled-bytes
Background
只發不收
1
2
3
4
5
6
7send(pkt, inter=0, loop=0, count=1, iface=N) pkt:數據包 inter:發包間隔時間 count:發包數量 iface:網卡接口名稱 send(),在第三層發包,沒有接收功能;send(IP(dst="www.baidu.com",ttl=2)/ICMP()) sendp(),在第二層發包,沒有接收功能。sr(Ether()/IP(dst="www.baidu.com"))
Source code
1 | |
Recon
這一題真的沒必要出的那麼複雜,有點硬要的感覺,不喜歡…,不看1我已經猜到八成了,但我感受到一股惡意…
-
Recon pcapng & Source Code
一開始我先做基本的packet的recon,然後沒啥發現,他的description寫說:
I sent my secret flag over the wires, but the bytes got all mixed up!代表他應該是傳了一些東西,然後把network flow記錄下來,可以看一下source code也的確是這樣,但標題和內文就有提示,說明他有打亂要transfer的東西,不過因為我不知道實際執行這支程式後,wireshark到底會錄到怎麼樣的東西,應該說形式上到底長怎樣,所以為了確定就直接reproduce一下
-
Reproduce the outcome
Q1: 先說,如果用wsl的環境下command,但會出現以下error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16$ python send.py 192.168.137.2 8888 test_flag.txt Sending | | 0/22 Traceback (most recent call last): File "send.py", line 46, in <module> main(parser.parse_args()) File "send.py", line 34, in main send( File "/home/sbk6401/.local/lib/python3.8/site-packages/scapy/sendrecv.py", line 445, in send return _send( File "/home/sbk6401/.local/lib/python3.8/site-packages/scapy/sendrecv.py", line 414, in _send socket = socket or _func(iface)(iface=iface, **kargs) File "/home/sbk6401/.local/lib/python3.8/site-packages/scapy/arch/linux.py", line 484, in __init__ self.ins = socket.socket( File "/home/sbk6401/anaconda3/envs/CTF/lib/python3.8/socket.py", line 231, in __init__ _socket.socket.__init__(self, family, type, proto, fileno) PermissionError: [Errno 1] Operation not permitted根據2的說明,應該是沒有用sudo,但如果用sudo又會出現
no module named scapy或是no module named progress的問題,解決方式就是直接進入root然後安裝這兩個library,如果沒有進入root然後看pip list其實會看到這兩個library我之前就裝過了,但root好像不是找一般放library的地方1
2
3$ sudo su # pip install scapy; pip install progress # exitQ2: 另外一個問題可能會是如[^env-python\r-no-such-file-or-directory]提到的,因為unix系統的換行和一般的windows不一樣,所以要轉換一下
以上問題都解決之後,就可以利用wireshark抓一下中間過程會有甚麼特別的東西,首先我傳送的
test_flag.txt的內容是picoCTF{test_12345678},總共要傳送22個bytes,可以看到的確他一次是傳送一個bytes,然後是用UDP傳送,destination IP也是我們指定的192.168.137.2,但是會發現他每一個packet所帶的data,都和我們的flag沒有任何關聯,再回去看一下他在傳送前做了哪些事情,首先他在31行做了shuffle,然後在傳送前和產生的random number進行XOR,所以才會看起來都不一樣
-
Extract Data
到這邊我們就成功一半了,接著就是把data dump下來進行還原就好(開始感受痛苦吧!一袋米要扛幾樓),我們把data印出來後就可以直接拿來用
1
2
3
4
5
6
7
8
9
10
11import pyshark capture = pyshark.FileCapture('./capture.pcapng', display_filter='udp and ip.dst == 172.17.0.3 and !icmp') data = [] for pkt in capture: try: data.append(pkt.data.data) except: pass print(data)- 陷阱一: 如果觀察data的length會發現他只有==1990==,但是用wireshark卻filter出==1992==,仔細看會發現有兩個data是unknown(No.1943那個不算)
他應該是抓不到No. 4777的0x23和No.10562的0x0f,所以要手動把這兩個數值插入我們的list中
- 陷阱一: 如果觀察data的length會發現他只有==1990==,但是用wireshark卻filter出==1992==,仔細看會發現有兩個data是unknown(No.1943那個不算)
-
Recover input.txt
首先他有先利用time()的epoch當作random的seed,所以我是先看第一個傳送的packet他的時間是==1614044650==,當作他的seed,接下來只要有關random的操作都要和send.py一模一樣
由於我們還要考慮到他有事先進行shuffle,所以還要想辦法把順序調整回來,這邊我是參考1的方式,先建立一個大小為len(data)的list,再針對這個list進行shuffle,就可以得到一模一樣的順序,接著我們就把data和random所產出的東西做XOR就可以放回去到對應的index
Exploit
1 | |
Flag: picoCTF{n0_t1m3_t0_w4st3_5hufflin9_ar0und}