2014年12月13日 星期六

CTF 筆記

前言

近日來解 CTF 時,時常會用到一些工具及 python 的 module 因此先記下來作為日後參考用

Python modules

socket

  • 說明:
    • 解 ctf 幾乎是必用的一個 module,主要用來 create 一個 tcp 連線
    • 一般來說比 netcat 更為方便,更好送出 payload
    • 以下僅列出常使用的,其餘部分請參考官方文件
  • 使用方式:
    • class:
      • socket(family,type[,protocal])
    • family :
      • socket.AF_INET (IPV4)
      • socket.AF_INET6 (IPV6)
    • type :
      • socket.SOCK_STREAM (TCP)
      • socket.SOCK_DGRAM (UDP)
    • 範例:
      • 創立一個 TCP socket :
        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        
      • 創立一個 UDP socket :
        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        
    • 函式:
      • sock.connect((host,port))
        • 與 host:port 建立連線
      • sock.recv(buffersize)
        • 接收 socket 所傳來的訊息,接收量為 buffersize
      • sock.send(string)
        • 發送訊息
      • sock.close()
        • 關閉 socket

struct

  • 說明:
    • 用來將數值以 binary 的方式輸出( ex:\x54\x01\x05\x08 ) ,原先主要是用來讀入 c 語言的 data ,轉成 python 看得懂的數值,詳情可參考官方文件
    • 製作 payload 時非常好用
    • 可指定要 little-endian 還是 big-endian
  • 使用方式:
    • 格式:
    • 函式:
    • struct.pack(fmt,v1,v2,...)
      • fmt 為上述格式,要輸出的字串格式,可加入 order
      • Ex :
        struct.pack("<I",0x8048580) //\x80\x85\x04\x08
        
    • struct.unpack(fmt,string)
      • fmt 為上述格式,並給入二進位的字串,即可取得原先數值
      • Ex :
        struct.unpack("<I","\x80\x85\x04\x08") //(134514048,) = 0x8048580
        

telnetlib

  • 說明:
    • 很久以前就有在用了,以前在當網管時常常使用它來管理各項設備,不過後來沒再用了,畢竟安全性上是一項問題,不過就單純的 telnet 連線來說,是個非常方便的 module,詳細的內容一樣可參考官方文件
    • 搭配 socket 可是 ctf 中很常用的方法,當在遠端成功執行 shell 時,需要靠它來保持連線
  • 用法:
    • class
      • telnetlib.Telnet([host[, port[, timeout]]]) #創立一個連到 host 的 telnet 物件
    • 函式:
      • Telnet.read_until(string)
        • 讀入 host 端傳來的訊息,直到讀到 string
      • Telnet.write(buffer)
        • 送出 buffer 的訊息到 host 端
      • Telnet.interact()
        • 使 telent 的控制權交給使用者,使連線像是直接遠端過去的命令互動模式
      • Telnet.close()
        • 關閉 telnet 連線
    • 範例:
      telnet = telnetlib.Telnet()
      telnet.sock = sock  #sock 為 socket 物件
      telnet.interact()
      

Tool

2014年12月8日 星期一

SECCON 2014 CTF Write-up

前言

這是我第一次開始解國外的 CTF,兩天時間內只接了部分 100 分的題目,不過同時也是 HITCON Girls 的活動時間,能解的時間也不多,以下是我有解出的題目:
  • Easy Cipher (Crypto)
  • Shuffle (binary)
  • Get the key.txt (Forensics)
  • Choose the number (Programming)
  • Get the key (Network)

Easy Cipher

  • 題目:解讀下列訊息
    87 101 108 1100011 0157 6d 0145 040 116 0157 100000 0164 104 1100101 32 0123 69 67 0103 1001111 1001110 040 062 060 49 064 100000 0157 110 6c 0151 1101110 101 040 0103 1010100 70 101110 0124 1101000 101 100000 1010011 1000101 67 0103 4f 4e 100000 105 1110011 040 116 1101000 0145 040 1100010 0151 103 103 0145 1110011 0164 100000 1101000 0141 99 6b 1100101 0162 32 0143 111 1101110 1110100 101 0163 0164 040 0151 0156 040 74 0141 1110000 1100001 0156 056 4f 0157 0160 115 44 040 0171 1101111 117 100000 1110111 0141 0156 1110100 32 0164 6f 32 6b 1101110 1101111 1110111 100000 0164 1101000 0145 040 0146 6c 97 1100111 2c 100000 0144 111 110 100111 116 100000 1111001 6f 117 63 0110 1100101 0162 0145 100000 1111001 111 117 100000 97 114 0145 46 1010011 0105 0103 67 79 1001110 123 87 110011 110001 67 110000 1001101 32 55 060 100000 110111 0110 110011 32 53 51 0103 0103 060 0116 040 5a 0117 73 0101 7d 1001000 0141 1110110 1100101 100000 102 0165 0156 33 
    
  • 想法及過程:
    • 很明顯的這段文字是由四種不同進位的數字所組成,必須判斷出他是屬於哪個進位在轉換成 ASCII code 印出,不過起初在解的時候沒有發現有特別的規則,導致剛開始一直判別不出來,仔細觀察過後可發現每個進位的數字有不同的特徵:
      • 2 進位:字串長度 >= 6
      • 8 進位:開頭一定是 0
      • 16 進位:必有英文字
      • 10 進位:上述之外的
  • 解法:
    • 利用上述的特徵及 python script 即可解出訊息
    • crypt.py
  • 結果:
    Welcome to the SECCON 2014 online CTF.The SECCON is the biggest hacker contest in Japan.Oops, you want to know the flag, don't you?Here you are.SECCON{W31C0M 70 7H3 53CC0N ZOIA}Have fun!
    

Shuffle

  • 題目:
    • find the string before randomizing.
    • Shuffle
  • 想法及過程:
    • 已 binary 類型的題目來說,這題已經算是相對簡單的,題目意思大概是,這個 binary 檔會將 flag 不斷做 random 你必須找到在 random 之前的 flag 找出來,只要在 gdb 中,random() 之前下好 breakpoint,將 stack 中的字串 dump 出來就好。
  • 解法:
    • gdb ./shuffle
    • disas main
    • b *(address of call random)
    • r
    • x/15s $esp
    • then you can see the flag
  • Answer : SECCON{Welcome to the SECCON 2014 CTF!}

Get the key.txt

  • 題目:
  • 想法及過程:
    • 題目就只有單單給一個壓縮檔,其他什麼東西都沒有,於是就直接解壓縮看看,並可發現到裡面不知道是什麼檔案類型的檔案,直接使用 file 指令去看他,卻意外發現到他是 Linux rev 1.0 ext2 filesystem data ,直接 mount 上去之後,可發現到裡面內含許多檔名為數字的檔案,針對裡面其中幾個檔案來看,利用 strings 指令可看到裡面為 keyxx.txt 的檔案,不過題目既然叫做 get the key.txt 想必是要我們去尋找裡面為 key.txt 那個檔案,就可以找出這題的 flag
  • 解法
    • unzip forensic100.zip
    • file forensic100
      forensic100: Linux rev 1.0 ext2 filesystem data (mounted or unclean), UUID=0b92a753-7ec9-4b20-8c0b-79c1fa140869
      
    • mount -o loop forensic100 /mnt/
    • cd /mnt/
    • for file in * ; do echo $file && strings $file; done;
    • 可發現到 1 這個檔案內有 key.txt
    • 解壓縮就可獲得結果
  • Answer
    • SECCON{@]NL7n+-s75FrET]vU=7Z}

Choose the number

  • 題目:
    • nc number.quals.seccon.jp 31337
    • 連上去之後,會給你幾個數字叫你判斷最大值和最小值,大概要解二三十次左右,數字也會越來越大
  • 想法和過程:
    • 非常直覺,要我們寫程式去判斷並回傳
  • 解法:

Get the key

  • 題目:
  • 想法及過程:
    • 分析封包,可看見該 source 要連去某個網頁,但連上去卻都需要輸入密碼,而在看其他封包後,有不少都是 401 ,但仔細一看可以看見有個封包是要 GET /nw100/ 卻是 200 OK 的,仔細比對一下可以發現到 http header 中有多了 :
      • Authorization : Basic c2VjY29uMjAxNDpZb3VyQmF0dGxlRmllbGQ=
    • 只要再送出時將這段加入 header 中,就可 Capture The Flag 了
  • 解法 :
    • modify the http header
    • get the page of http://133.242.224.21:6809/nw100/
  • Answer :
    • SECCON{BasicNWChallenge_Done!}