From 0e7c8ab024257e1db7f25872904a1afa4b57c49d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20R=C3=A9thelyi?= <rethelyibalint@gmail.com> Date: Mon, 7 Mar 2022 20:34:35 +0100 Subject: [PATCH] 3 b --- README.md | 30 +++++++++++++++++++++ solutions/1_feladat.md | 4 +-- solutions/2_feladat.md | 2 +- solutions/3_feladat.md | 59 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ddf4b62..245ad16 100644 --- a/README.md +++ b/README.md @@ -211,3 +211,33 @@ Ehhez használjuk a beépített `argparse` csomagot! Dokumentáció és példak a szervert (`server.shutdown()`)! - Teszteléshez használjuk a `telnet` programot. Pl.: `$ telnet localhost 8000` +## 3.b Feladat - Port szkenner + +**Feladat:** Valósítsunk meg egy port szkanner funkciót, amely egy megadott hoszton ("www.google.hu") +végigszkenneli a "jól ismert" (well-known) portokat (1 - 1023). Eredményként írassuk ki a nyitott portokat. +Dolgozzunk a Python konzolban az egyszerűség végett. + +- Ehhez használjuk a segédletben emített `scapy` csomagot, amit a következő paranccsal telepíthetünk: +`pip3 install scapy` +- A feladathoz nem kell szkriptet írni, elég interaktívan megvalósítani! +- A `scapy` szintaktikára a segédletben linkelt oldalon találunk példákat vagy használjuk ezt az összefoglalót: +[scapy_cheatsheet.pdf](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/scapy_cheatsheet2.pdf) +- A csomagok összeállítására használjunk Layer 2-4 megközelítést (Ethenet + IP + TCP), az összefűzésre +a `/` operátor használható (**Basic Packet Crafting / Viewing, Altering Packets** blokk). +- Érdekességképpen mentsük el a csomagot egy változóban és vizsgáljuk meg az automatikusan kitöltött mezőket +a `.show()` paranccsal. +- Lehetőség van egy összefogott csomaghalmaz definiálására is: A vizsgálandó portokat `tuple` ként is megadhatjuk +(`start`, `stop`) formátumban(**Altering Packets** blokk). A `scapy` képes kezelni a mezőkhöz definiált +listákat/tupleket és Descartes-szorzatkét generálja ki az összes csomagot. +- Küldésre használjuk a `srp` parancsot (**Sending Packets** blokk), a szkennelés végeztével állítsuk le a +próbálkozást CTRL+C kombinációval vagy a preferáltabb módon adjunk meg `timeout` értéket a küldéshez, 1s bőven elég. +- Eredményként az `srp` parancs 2 értékkel tér vissza: 1. Sikeres request-response párok, 2. Válasz nélküli kérések. +Az eredmények a `scapy` saját osztályaiban vannak megvalósítva, de kezelhetőek listaként is a következő formátummal: +`srp() --> [ [ ( sikeres kérés1, kapott válasz1 ), ( sikeres kérés2, kapott válasz2 ), .... ], [ sikertelen kérések ...] ]` +- Eredmény kiíratásához használhatjuk a `.summary()` vagy `.show()` függvényeit. +- Vegyük a sikeresek listáját, azokból vegyük a válaszokat (**Receiving and Analyzing Packets** blokk). +A TCP részhez a `.payload` attribútumokon végigjárva vagy az általánosabb `[]` operátorral férhetünk hozzá, +aminek a kikért payload osztályát kell megadnunk (`packet[TCP]`). +- Eredményként írassuk ki a kapott válaszok source portját (`.sport` attribútum), azaz a nyitott portokat, +amelyekről érkezett válasz. + diff --git a/solutions/1_feladat.md b/solutions/1_feladat.md index 33f9b49..56d9f98 100644 --- a/solutions/1_feladat.md +++ b/solutions/1_feladat.md @@ -49,7 +49,7 @@ néven az előző feladatban megvalósított funkcióhoz! A forráskód: -```python3 +```python from dns.resolver import query from dns.exception import DNSException @@ -104,7 +104,7 @@ dns_tool.get_mx = get_mx(dns_name, type='MX') A forráskód: -```python3 +```python #!/usr/bin/env python3 from dns.resolver import query diff --git a/solutions/2_feladat.md b/solutions/2_feladat.md index a31b1f4..a9fc5f1 100644 --- a/solutions/2_feladat.md +++ b/solutions/2_feladat.md @@ -5,7 +5,7 @@ Debian mirror szerverek elérhetőségéről, amit a futása végén ki is list A forráskód: -```python3 +```python #!/usr/bin/env python3 import ping3 import pprint diff --git a/solutions/3_feladat.md b/solutions/3_feladat.md index 9934e70..ed47d86 100644 --- a/solutions/3_feladat.md +++ b/solutions/3_feladat.md @@ -47,4 +47,61 @@ Tesztelés: ```bash $ nc localhost 9999 Mon Mar 7 17:56:58 2022 -``` \ No newline at end of file +``` + +## 3.b Feladat - Port szkenner + +**Feladat:** Valósítsunk meg egy port szkanner funkciót, amely egy megadott hoszton ("www.google.hu") +végigszkenneli a "jól ismert" (well-known) portokat (1 - 1023). Eredményként írassuk ki a nyitott portokat. + +A megoldás: + +```bash +$ pip3 install scapy +$ sudo python3 +>>> from scapy.all import * +>>> packet = Ether() / IP(dst="www.google.hu") / TCP(dport=(1,1023)) +>>> packet.show() +###[ Ethernet ]### + dst = 00:00:0c:9f:f0:b6 + src = 00:50:b6:8d:fb:1a + type = IPv4 +###[ IP ]### + version = 4 + ihl = None + tos = 0x0 + len = None + id = 1 + flags = + frag = 0 + ttl = 64 + proto = tcp + chksum = None + src = 152.66.182.33 + dst = Net("www.google.hu/32") + \options \ +###[ TCP ]### + sport = ftp_data + dport = (1, 1023) + seq = 0 + ack = 0 + dataofs = None + reserved = 0 + flags = S + window = 8192 + chksum = None + urgptr = 0 + options = '' +>>> ans,unans = srp(packet,timeout=1) +Begin emission: +Finished sending 1023 packets. +.......*..................*................................................ +Received 251 packets, got 2 answers, remaining 1021 packets +>>> ans +<Results: TCP:2 UDP:0 ICMP:0 Other:0> +>>> for a in ans: +... print(a[1][TCP].sport) +80 +443 +>>> +``` -- GitLab