Steganografi dalam paket IP

Suatu kali, sebelum membela pekerjaan laboratorium lain, mereka bertanya kepada saya: bidang apa dari paket IP yang dapat digunakan untuk berlapis? Saya tidak tahu dan hanya mengangkat bahu. Namun segera saya masih memutuskan untuk mempelajari masalah ini.

Di bawah potongan Anda akan menemukan studi tentang header paket-IP, utilitas ping Python sendiri dan beberapa cara untuk mentransfer data tanpa menarik perhatian.

Isi


  1. Struktur paket IP
  2. Pengaturan lingkungan
  3. Ping: Opsi mudah
  4. Ping: Opsi sulit
  5. Perbaikan?

Struktur Paket IPv4




Pilih bidang, perubahan yang tidak akan sangat mempengaruhi paket:

IHL dapat bervariasi dari 5 hingga 15.
Bidang ToS digunakan untuk memprioritaskan lalu lintas dan pemberitahuan kemacetan tanpa menjatuhkan paket. Paling sering, bidang ini adalah 0. Secara teoritis, ini dapat digunakan untuk mengirimkan seluruh byte informasi.
Panjang paket adalah bidang yang sangat baik untuk mentransmisikan angka dari 20 hingga 65535.
TTL dapat mengirimkan hingga 7 bit informasi. Anda perlu mengetahui jumlah hop ke host dan memperhitungkannya.

Pengaturan lingkungan


Untuk mengulangi percobaan, Anda akan membutuhkan dua mesin dengan Python dan kerangka scapy.

Anda dapat menginstalnya dengan mengikuti instruksi dari dokumentasi . Dalam kasus saya, ini adalah dua tetesan pada DO dengan jaringan lokal dihidupkan. Untuk menguji operabilitas stegano, dua rute dipilih: melalui jaringan lokal untuk 1 hop dan melalui Internet untuk 2 hop.

Ping: Opsi mudah


Pertama kita mengimplementasikan sender.py, yang akan mengirim paket ICMP tanpa pesan tersembunyi.

from scapy.all import * #    10.0.0.2  icmp-type 8 (echo-request) pkt = IP(src="10.0.0.1", dst="10.0.0.2") / ICMP(type = 8) #      sr1(pkt) 

Scapy akan mengisi kolom yang tersisa dengan nilai default sebelum mengirim dan akan menghitung checksum.

Di sisi penerima, tulis listener.py, yang akan mendengarkan dan menampilkan semua paket ICMP yang masuk.

 from scapy.all import * #    # filter --  icmp # timeout --   10  # count --    100  # iface --    eth1 packets = sniff(filter = "icmp", timeout = 10, count = 100, iface = "eth1") #      for pkt in packets: #     echo-request if pkt[ICMP].type != 8: continue #    pkt.show() 

Output pendengar
 ###[ Ethernet ]### dst = hh:hh:hh:hh:hh:hh src = gg:gg:gg:gg:gg:gg type = 0x800 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 28 id = 24923 flags = frag = 0 ttl = 64 proto = icmp chksum = 0x4364 src = 10.0.0.1 dst = 10.0.0.2 \options \ ###[ ICMP ]### type = echo-request code = 0 chksum = 0xf7ff id = 0x0 seq = 0x0 ###[ Padding ]### load = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 


Header paket IP memiliki bidang pengidentifikasi. Isi dengan simbol "A" dan "B":

 payload = ord("A") * 0x100 + ord("B") pkt = IP(src="10.0.0.1", dst="10.0.0.2", id = payload) / ICMP(type = 8) 

Selain itu, di header ICMP ada bidang yang persis sama di mana dua byte juga dapat dimuat.

Ubah pendengar untuk menampilkan data yang diterima:

 from scapy.all import * import sys packets = sniff(filter="icmp", timeout = 10, count = 100, iface="eth0") for pkt in packets: if pkt[ICMP].type != 8: continue #    a, b = divmod(pkt[IP].id, 0x100) sys.stdout.write(chr(a)) sys.stdout.write(chr(b)) sys.stdout.flush() 

Dalam gambar dan rupa, Anda dapat mengisi hampir semua bidang yang sebelumnya dicatat sebagai cocok untuk quilting.

Ping: Opsi sulit


Transfer data dari paragraf sebelumnya bukan yang paling jelas, tetapi kita bisa membuatnya lebih tidak jelas. Anda dapat menyembunyikan data di bidang untuk checksum. Menurut RFC1071, sebuah checksum adalah (tiba-tiba!) Sebuah inversi bitwise dari jumlah aritmatika yang sedikit lebih kompleks.

Penjelasan dengan contoh
Misalkan kita memiliki tajuk yang ingin kita hitung checksumnya. Pada saat perhitungan, bidang checksum diatur ulang.

 4500 003c 000a 0000 8001 [checksum] c0a8 000d c0a8 000d 

1. Tambahkan semua kata 16-bit, mengingat transfer dari urutan tinggi:

 4500 + 003c + 000a + 0000 + 8001 + [checksum=0000] + c0a8 + 000d + c0a8 + 000e = = (2) 46b2 

2. Tambahkan hasilnya dengan transfer:

 46b2 + 2 = 46b4 

3. Balikkan:

 ~(46b4) = b94b 

b94b adalah checksum yang kami cari . Untuk verifikasi, Anda dapat mengganti di header dan melakukan langkah 1 dan 2. Jika Anda mendapatkan FFFF, maka jumlah yang ditemukan sudah benar.

Verifikasi:

 1. 4500 + 003c + 000a + 0000 + 8001 + [checksum=b94b] + c0a8 + 000d + c0a8 + 000e = = (2) FFFD 2. FFFD + 2 = FFFF 


Kita tahu bahwa checksum dari paket berubah ketika node melewati jaringan, seperti perubahan TTL. Juga, ketika melewati NAT dalam paket, "alamat sumber" diganti, yang juga mempengaruhi checksum. Dan berapa banyak TTL akan berkurang setelah mencapai pendengar kita ... Ceri pada kue adalah bahwa bitness dari "identifier" bertepatan dengan bitness dari checksum. Fakta ini memungkinkan kita untuk mempengaruhi checksum dan mengubahnya ke nilai apa pun dari area definisi. Karena checksum (payload) akan dihitung hanya ketika melewati node terakhir dalam rute, penting untuk memperhitungkan segala sesuatu yang dapat diubah dalam paket selama rute saat menghitung.

Algoritma untuk menemukan "pengidentifikasi", yang akan memberi kita checksum yang diinginkan:

  1. Kami mengkonfigurasi paket seperti ketika melewati node terakhir (IP, TTL, dll)
  2. Dalam "pengidentifikasi" tulis payload
  3. Kami menghitung checksum
  4. Hasilnya harus ditulis dalam "pengidentifikasi" dari paket yang dikirim

Kami akan menulis fungsi yang akan membentuk sebuah paket dengan jumlah harapan, IP di belakang NAT dan dua byte payload.

 # src -   # src_nat -    NAT # dst -   # dttl -       # a, b --      def send_stegano(src, src_nat, dst, dttl, a, b): #       payload = ord(a)*0x100 + ord(b) #         pkt = IP(dst=dst, src=src_nat, ttl=64-dttl, id = payload) / ICMP(type=8) #  Scapy  chksum pkt = IP(raw(pkt)) #     pkt[IP].src = src pkt[IP].ttl = 64 pkt[IP].id = pkt[IP].chksum #   chksum,  Scapy   del pkt[IP].chksum # Scapy      pkt = IP(raw(pkt)) #      sr1(pkt) 

Perbaikan?


  • bidang chksum, seq, id di header protokol ICMP juga dapat digunakan untuk mengirimkan data
  • ToS dapat digunakan untuk mengidentifikasi paket "dari mereka sendiri" dan mengabaikan permintaan gema orang lain.

Source: https://habr.com/ru/post/id413851/


All Articles