Цель занятия: знакомство с командами анализа сетевой активности и хостов в TCP/IP-сети и интстументами управления межсетевым экраном в Linux.
Изучаемые команды: iptables, nmap, tcpdump
Сценарий описывает возможности по просмотру сетевого трафика, проходящего через присутствующие в системе сетевые интерфейсы.
Начальные условия: Командная строка суперпользователя после входа в систему, настроенные сетевой интерфейс и таблица маршрутизации.
Выведем все пакеты, проходящие через интерфейс eth0, с помощью команды tcpdump -i eth0 -l -n:
desktop ~ # tcpdump -i eth0 -l -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 14:37:23.929208 IP 192.168.0.204.32791 > 192.168.0.1.53: 40133+ A? ya.ru. (23) 14:37:23.931050 IP 192.168.0.1.53 > 192.168.0.204.32791: 40133- 1/0/0 A 213.180.204.8 (39) 14:37:23.932778 IP 192.168.0.204 > 213.180.204.8: ICMP echo request, id 12586, seq 1, length 64 14:37:23.954412 IP 213.180.204.8 > 192.168.0.204: ICMP echo reply, id 12586, seq 1, length 64 14:37:23.954784 IP 192.168.0.204.32791 > 192.168.0.1.53: 29723+ PTR? 8.204.180.213.in-addr.arpa. (44) 14:37:23.956530 IP 192.168.0.1.53 > 192.168.0.204.32791: 29723- 1/0/0 (63) ...
Прервать выполнение команды можно нажатием Ctrl-C.
Используем фильтр по уалённому порту для просмотра всего трафика в сети, генерируемого данной машиной, tcpdump -i eth0 -l -n src host 192.168.0.204:
desktop ~ # tcpdump -i eth0 -l -n src host 192.168.0.204 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 14:43:02.492487 IP 192.168.0.204.32791 > 192.168.0.1.53: 13524+ AAAA? yandex.ru. (27) 14:43:02.520278 IP 192.168.0.204.32791 > 192.168.0.1.53: 12908+ AAAA? yandex.ru. (27) 14:43:02.522799 IP 192.168.0.204.32791 > 192.168.0.1.53: 48501+ A? yandex.ru. (27) 14:43:02.525069 IP 192.168.0.204.57521 > 1.0.0.0.80: S 1379873941:1379873941(0) win 5840 <mss 1460,sackOK,timestamp 2563967 0,nop,wscale 2> ...
Условия можно объёдинять, например, посмотрим все обращения по протоколу http на хост ya.ru, tcpdump -i eth0 -l -n src host 192.168.0.204 and dst port 80:
desktop ~ # tcpdump -i eth0 -l -n src host 192.168.0.204 and dst port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 14:49:39.015251 IP 192.168.0.204.38172 > 213.180.204.11.80: S 1789772982:1789772982(0) win 5840 <mss 1460,sackOK,timestamp 2663083 0,nop,wscale 2> 14:49:39.054551 IP 192.168.0.204.38172 > 213.180.204.11.80: . ack 851659167 win 5840 14:49:39.056486 IP 192.168.0.204.38172 > 213.180.204.11.80: P 0:626(626) ack 1 win 5840 14:49:39.598337 IP 192.168.0.204.38172 > 213.180.204.11.80: . ack 1411 win 8460 14:49:39.604713 IP 192.168.0.204.38172 > 213.180.204.11.80: . ack 2821 win 11280 14:49:39.659811 IP 192.168.0.204.38172 > 213.180.204.11.80: . ack 4231 win 14100 14:49:39.784351 IP 192.168.0.204.38172 > 213.180.204.11.80: . ack 5641 win 16920 14:49:39.848824 IP 192.168.0.204.38172 > 213.180.204.11.80: . ack 7051 win 19740 14:49:39.966120 IP 192.168.0.204.38172 > 213.180.204.11.80: F 626:626(0) ack 8118 win 22560
В данном примере можно увидеть одно последовательное TCP-соединение.
С помощью параметров -X
и -s
можно просмотреть содержимое
пакетов, tcpdump -i eth0 -l -n -X -s 2048 src host 192.168.0.204 and
dst port 80:
desktop ~ # tcpdump -i eth0 -l -n -X -s 2048 src host 192.168.0.204 and dst port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 2048 bytes 15:00:20.150901 IP 192.168.0.204.58273 > 213.180.204.11.80: S 2473175603:2473175603(0) win 5840 <mss 1460,sackOK,timestamp 2823357 0,nop,wscale 2> 0x0000: 4500 003c be8e 4000 4006 18f9 c0a8 00cc E..<..@.@....... 0x0010: d5b4 cc0b e3a1 0050 9369 aa33 0000 0000 .......P.i.3.... 0x0020: a002 16d0 9789 0000 0204 05b4 0402 080a ................ 0x0030: 002b 14bd 0000 0000 0103 0302 .+.......... 15:00:20.172752 IP 192.168.0.204.58273 > 213.180.204.11.80: . ack 2349139833 win 5840 0x0000: 4500 0028 be8f 4000 4006 190c c0a8 00cc E..(..@.@....... 0x0010: d5b4 cc0b e3a1 0050 9369 aa34 8c05 0779 .......P.i.4...y 0x0020: 5010 16d0 80c1 0000 P....... 15:00:20.172815 IP 192.168.0.204.58273 > 213.180.204.11.80: P 0:624(624) ack 1 win 5840 0x0000: 4500 0298 be90 4000 4006 169b c0a8 00cc E.....@.@....... 0x0010: d5b4 cc0b e3a1 0050 9369 aa34 8c05 0779 .......P.i.4...y 0x0020: 5018 16d0 023e 0000 4745 5420 2f79 616e P....>..GET./yan 0x0030: 6473 6561 7263 683f 7465 7874 3d74 6573 dsearch?text=tes 0x0040: 7426 7374 7970 653d 7777 7720 4854 5450 t&stype=www.HTTP 0x0050: 2f31 2e31 0d0a 486f 7374 3a20 7777 772e /1.1..Host:.www. 0x0060: 7961 6e64 6578 2e72 750d 0a55 7365 722d yandex.ru..User- 0x0070: 4167 656e 743a 204d 6f7a 696c 6c61 2f35 Agent:.Mozilla/5 0x0080: 2e30 2028 5831 313b 2055 3b20 4c69 6e75 .0.(X11;.U;.Linu 0x0090: 7820 6936 3836 3b20 656e 2d55 533b 2072 x.i686;.en-US;.r 0x00a0: 763a 312e 372e 3132 2920 4765 636b 6f2f v:1.7.12).Gecko/ ...
Начальные условия: Командная строка суперпользователя после входа в систему, настроенные сетевой интерфейс и таблица маршрутизации.
Простое сканирование хоста можно произвести, если указать его IP-адрес в аргументе команды nmap: nmap 192.168.0.120:
user@desktop ~ $ nmap 192.168.0.120 Starting nmap 3.75 ( http://www.insecure.org/nmap/ ) at 2006-02-06 23:21 MSK Interesting ports on gate.localnet (192.168.0.120): (The 1658 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http 443/tcp open https 873/tcp open rsync Nmap run completed -- 1 IP address (1 host up) scanned in 0.555 seconds
При этом nmap производит попытки соединения с портами, что может быть обнаружено на стороне хоста.
Более «тихим» способом сканирования является SYN-сканирование, когда вместо настоящего соединения посылается только SYN-пакет. Этот способ сканировани доступен только суперпользователю: nmap -sS 192.168.0.120
desktop ~ # nmap -sS 192.168.0.120 Starting nmap 3.75 ( http://www.insecure.org/nmap/ ) at 2006-02-06 23:28 MSK Interesting ports on gate.localnet (192.168.0.120): (The 1658 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http 443/tcp open https 873/tcp open rsync MAC Address: 00:11:2F:F4:4B:55 (Asustek Computer) Nmap run completed -- 1 IP address (1 host up) scanned in 0.405 seconds
Самую полную информацию о тестируемом хосте можно узнать, если использовать
ключи -v
(дважды)
и -O
, nmap -sS -v -v -O
192.168.0.120:
desktop ~ # nmap -sS -v -v -O 192.168.0.120 Starting nmap 3.75 ( http://www.insecure.org/nmap/ ) at 2006-02-06 23:31 MSK Initiating SYN Stealth Scan against gate.localnet (192.168.0.120) [1663 ports] at 23:31 Discovered open port 80/tcp on 192.168.0.120 Discovered open port 21/tcp on 192.168.0.120 Discovered open port 443/tcp on 192.168.0.120 Discovered open port 22/tcp on 192.168.0.120 Discovered open port 873/tcp on 192.168.0.120 The SYN Stealth Scan took 0.08s to scan 1663 total ports. For OSScan assuming port 21 is open, 1 is closed, and neither are firewalled Host gate.localnet (192.168.0.120) appears to be up ... good. Interesting ports on gate.localnet (192.168.0.120): (The 1658 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http 443/tcp open https 873/tcp open rsync MAC Address: 00:11:2F:F4:4B:55 (Asustek Computer) Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.4.18 - 2.6.7 OS Fingerprint: TSeq(Class=RI%gcd=1%SI=2E7845%IPID=Z%TS=1000HZ) T1(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW) T2(Resp=N) T3(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW) T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=) T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=) T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=) T7(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=) PU(Resp=Y%DF=N%TOS=C0%IPLEN=164%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Uptime 24.662 days (since Fri Jan 13 07:38:30 2006) TCP Sequence Prediction: Class=random positive increments Difficulty=3045445 (Good luck!) TCP ISN Seq. Numbers: FC47E005 FC966A63 FC61563D FBC11ADD FC5E53A5 FBBE2AA2 IPID Sequence Generation: All zeros Nmap run completed -- 1 IP address (1 host up) scanned in 2.340 seconds
На основании анализа поведения системы программа делает предположение о типе операционной системы, запущенной на хосте.
Начальные условия: Командная строка суперпользователя после входа в систему, настроенные сетевой интерфейс и таблица маршрутизации.
Для просмотра текущей таблицы правил сетевого экрана воспользуемся командой iptables -L:
desktop ~ # iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Все три цепочки не содержат правил и имеют политику разрешения всех пакетов по умолчанию.
Запретим весь сетевой трафик как на вход, так и на выход командами iptables -P INPUT DROP, iptables -P OUTPUT DROP:
desktop ~ # iptables -P INPUT DROP desktop ~ # iptables -P OUTPUT DROP desktop ~ # iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Любой сетевой обмен (даже команда ping 127.0.0.1) будет запрещён:
desktop ~ # ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted
Разрешим вход и выход всем пакетам, связанным с локальным интерфейсом (lo) с помощью команд: iptables -A INPUT -i lo -j ACCEPT и iptables -A OUTPUT -o lo -j ACCEPT.
desktop ~ # iptables -A INPUT -i lo -j ACCEPT desktop ~ # iptables -A OUTPUT -o lo -j ACCEPT desktop ~ # ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.056 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.043 ms
Разрешим вход и выход всем пакетам, относящимся к протоколу ICMP: iptables -A INPUT -p icmp -j ACCEPT и iptables -A OUTPUT -p icmp -j ACCEPT.
desktop ~ # iptables -A INPUT -p icmp -j ACCEPT desktop ~ # iptables -A OUTPUT -p icmp -j ACCEPT
Чтобы пропускать пакеты, относящиеся ко всем установленным соединениям, добавим два правила: iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT и iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
desktop ~ # iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT desktop ~ # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
Теперь осталось только разрешить входящие и исходящие соединения на определённые порты. Например, для исходящего доступа по протоколу HTTP выполним iptables -A OUTPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT:
desktop ~ # iptables -A OUTPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
В завершение можно очистить все заданные правила с помощью iptables -F:
desktop ~ # iptables -F desktop ~ # iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Обратите внимание, что это не изменило политики по умолчанию.